Продолжаю модернизацию скетча, размещённого на предыдущей странице #4 Тестируем BMP280. Подключаем графический экран Nokia 5110, на который будем выводить информацию о давлении, температуре и высоте.
В процессе разработки и тестирования базовой программы, добавил пришедший из Китая датчик влажности DHT22. А из-за выявленной капризности дисплея Nokia5110, далее переделал программу для вывода информации на малюсенький дисплейчик типа OLED SSD1306 с разрешением 128*64. Мой вариант – как вывести полную информацию на русском языке .
На странице ниже переделка программы для вывода информации на дисплей типа TFT ST7735 1.8 дюйма с разрешением 128*160 точек.
Пришла посылка с датчиком BME280. Он позволяет измерять давление, высоту, температуру и влажность одновременно. Барометр на этом датчике.
По просьбам читателей у барометра на BME280 применён вывод давления в разных системах измерения (мм рт.ст. или кПа).
Для вывода большего количества информации удобно использовать графический дисплей.
Графический экран Nokia 5110 имеет размеры 84 * 84 пикселя (точки). Размер самой платы экрана 43 * 45 мм. Подключение осуществляется через 8 контактов внизу экрана.
Pic 1. Дисплей Nokia5110
Напряжение питания Nokia 5110 составляет 3.3В, как и у модуля BMP280.
Для вывода информации на экран, используются библиотеки <Adafruit_GFX.h> и <Adafruit_PCD8544.h>.
Все соединения модуля и экрана с Arduino указаны на схеме. Контакты Arduino можно использовать не обязательно такие как у меня, а любые свободные, при условии соответствующего изменения в скетче, однако, указанные контакты используют аппаратное подключение по SPI, что работает быстрее, чем программное подключение на других контактах.
Pic 2. Схема для скетча #5
На монтажную панельку добавляем ещё одну кнопку SB2, с помощью которой будем управлять яркостью подсветки экрана.
Pic 3. Реализация скетча #5
Вывод информации на экране осуществляется в три строки....
Pic 4. Работа дисплея Nokia5110
Четвёртая строка внизу используется для вывода шага подсветки. Шаг подсветки равен 10%. После 100% яркости подсветки, нажатие кнопки SB2 переводит в отключение подсветки, т.е. яркость равна 0%. Изменение градации подсветки циклическое.
Pic 5. Работа подсветки дисплея Nokia5110
После всех подключений модулей к плате Arduino, переходим к скетчу (программе).
Скетч барометра на модуле BMP280 и экране Nokia 5110
Особо трудных моментов при подключении дисплея нет. Используя библиотеки, делаем соответствующую настройку.
Ниже скетч барометра:
/***********************************************************
* 2018-05-24 Mr.ALB Тренировка в программировании Ардуино
*
* Arduino - BMP280
* A5 - SCL
* A4 - SDA
* 3.3V - VCC
* GND - GND
*
* Аппаратное подключение LCD
* ARDUINO - Nokia 5110 LCD
* PIN 10 - RST Pin 1
* PIN 9 - CE Pin 2
* PIN 8 - DC Pin 3
* PIN 11 - DIN Pin 4
* PIN 13 - CLK Pin 5
* PIN 3.3V - VCC Pin 6
* PIN 3 - BL Pin 7
* PIN GND - GND Pin 8
*
* 2018-05-26 v1.0 Вывод информации на Монитор порта
* 2018-06-03 v1.1 Вывод информации на дисплей Nokia 5110
* 2018-08-11 v1.2 Модернизация коррекции температуры
* 2018-10-07 v1.3 Обновление по времени
*
************************************************************/
/* Подключение библиотек */#include<Wire.h>// для I2C#include<Adafruit_BMP280.h>// для BMP280#include<Adafruit_GFX.h>// для графики#include<Adafruit_PCD8544.h>// для Nokia 5110#include<Button.h>// для кнопок// Создаём объект барометра
Adafruit_BMP280 bme;
// Создаём объект дисплея
// Adafruit_PCD8544
(
int8_t CLK,
int8_t DIN,
int8_t DC,
int8_t CS,
int8_t RST
);
Adafruit_PCD8544 lcdDisplay = Adafruit_PCD8544
(
13,
11,
8,
9,
10
);
// Кнопка обнуления текущего давления#define BUTTON_SET_LEVEL 5
// Кнопка подсветки дисплея#define BUTTON_LIGHT 4
// Вывод PWM для подсветки дисплея#define LIGHT_PIN 3
// Создание объектов для кнопкок
Button buttonSetLevel(BUTTON_SET_LEVEL,18);
Button buttonLight(BUTTON_LIGHT,18);
/*******************************
* мБар - мм рт. ст.
* 1013.2472 - 760 k=1.33322
* 1005.24788 - 754
*
*******************************/// Нулевой уровень для давления
// 1005.24788 мБар => 754 мм рт.ст.double null_level = 1005.24788;
// Коэффициент для перевода Па в мм рт.ст.double kp = 133.322;
// Переменные давленияdouble press_now, press_last, press_tmp, altit;
// Переменные температурыdouble temp, temp_last;
double temp_correct =-2.94;// Коррекция температуры// Позиция вывода значенийbyte xinf = 36;
// Уровень подсветкиint level_light = 0;
// Счётчик шагов подсветкиbyte count_level_light = 0;
unsignedlong time_now, time_check;
// Для обновления по времениunsignedlong time_delta = 27000;
// Флаг для обновления по времениboolean flagcheck =false;
// Версия программыchar vers[] ="v1.3";
char vers_date[] ="2018-10-07";// Дата создания/*****************************************************
* Настроечная функция, выполняется один раз вначале
*****************************************************/voidsetup()
{
Wire.begin(); // Запуск I2CpinMode(LIGHT_PIN,OUTPUT);
/* Установки дисплея */
// Старт дисплея
lcdDisplay.begin();
// Установить контраст фона экрана
// Очень важный параметр!// Установить от 40 до 60
lcdDisplay.setContrast(45);
// Очистить экран
lcdDisplay.clearDisplay();
/* Заставка на экране */// Крупный шрифт
lcdDisplay.setTextSize(2);
lcdDisplay.setTextColor(BLACK);
// (0,0)=> лево-верх
lcdDisplay.setCursor(8,0);
lcdDisplay.print("BMP280");
// Обычный шрифт
lcdDisplay.setTextSize(1);
lcdDisplay.setCursor(24,20);
lcdDisplay.println("Mr.ALB");
lcdDisplay.setCursor(30,28);
lcdDisplay.println(vers);
lcdDisplay.setCursor(12,36);
lcdDisplay.print(vers_date);
// Вывод на экран
lcdDisplay.display();
// Задержка на 2 секdelay(2000);
// Очистка экрана
lcdDisplay.clearDisplay();
Serial.begin(9600);
if(!bme.begin())
{
Serial.println
(
"Не найден датчик BMP280, проверьте соединение!"
);
lcdDisplay.setCursor(0,0);
lcdDisplay.println("Not find...");
lcdDisplay.println("BMP280 sensor!");
lcdDisplay.println("Check contacts");
lcdDisplay.println();
lcdDisplay.println("Click Reset");
lcdDisplay.display();
while(1);// Остановка программы
}
}
/*****************************************
* Функция loop() выполняется постоянно
*****************************************/voidloop()
{
time_now =millis();
// Проверка интервала времениif(time_now - time_check > time_delta)
{
time_check = time_now;
// Флаг на обновление
flagcheck =true;
}
// Считывание состояния кнопки SB1
buttonSetLevel.scanState();
// Считывание состояния кнопки SB2
buttonLight.scanState();
/* Было нажатие кнопки SB2 - подсветка экрана */if(buttonLight.flagClick ==true)
{
buttonLight.flagClick =false;// Сброс признака клика
count_level_light++;// Шаг яркостиif(count_level_light > 10)
{
// Выключаем подсветку
count_level_light=0;
level_light=0;
lcdDisplay.fillRect(0, 40, 83, 5,WHITE);
}
else
{
level_light = count_level_light*25;
// Максимальная яркостьif(level_light == 250) level_light = 255;
}
// Установка яркостиanalogWrite(LIGHT_PIN, level_light);
/* 2018-10-07 Прогресс бар яркости подсветки */byte bar_step = 0;
for(byte ip = 0; ip < count_level_light; ip++)
{
lcdDisplay.fillRect(bar_step+1, 40, 7, 5, BLACK);
bar_step += 8;
}
// Выводим на дисплей
lcdDisplay.display();
}
// Считывание давления
press_now = bme.readPressure()/kp;
// Считывание температуры
temp = bme.readTemperature();
// Коррекция t° 2018-08-11if(temp_correct!=0) temp+=temp_correct;
/********************************************************
* Если давление изменилось больше чем на 0,2 мм рт.ст.
* или нажата кнопка обнуления высоты...
* или температура изменилась больше чем на 0,1°С
********************************************************/if((press_now<(press_last-.2))||
(press_now>(press_last+.2))||
(temp<(temp_last-.1))||(temp>(temp_last+.1))||
buttonSetLevel.flagClick ==true||
flagcheck ==true
)
{
// Сброс флага проверки по времени
flagcheck=false;
// Было нажатие кнопки SB1if(buttonSetLevel.flagClick ==true)
{
// Сброс признака клика
buttonSetLevel.flagClick =false;
// Обнуляем значение высоты при текущем давлении
null_level=press_now*kp/100;// В мБарах
}
// Считывание высоты
altit = bme.readAltitude(null_level);
Serial.print("Температура = ");
// Вывод скорректированной температурыSerial.print(temp);
Serial.println("°C");
Serial.print("Давление = ");
Serial.print(press_now);// В мм рт.ст.Serial.print(" мм рт.ст., ");
Serial.print(press_now*kp/100);// Перевод Па в мБарSerial.println(" мБар");
Serial.print("Приблизительная высота = ");
Serial.print(altit);
Serial.println(" м");
Serial.println();
/* Вывод на LCD */
lcdDisplay.clearDisplay();// Очистить экран// Устанавливаем на дисплей температуру
lcdDisplay.setCursor(0,0);
lcdDisplay.print("Temp:");
lcdDisplay.setCursor(xinf,0);
if(temp > 0) lcdDisplay.print("+");
lcdDisplay.print(temp);
lcdDisplay.print("oC");
// Устанавливаем на дисплей давление в мм рт.ст.
lcdDisplay.setCursor(0,14);
lcdDisplay.print("Press:");
lcdDisplay.setCursor(xinf,14);
lcdDisplay.print(press_now);
lcdDisplay.print("mm");
// Устанавливаем на дисплей высоту в м
lcdDisplay.setCursor(0,26);
lcdDisplay.print("Alt:");
lcdDisplay.setCursor(xinf,26);
lcdDisplay.print(altit);
lcdDisplay.print(" m");
// Вывод на дисплей новой информации
lcdDisplay.display();
/* Перезаписываем бывшие значения */
press_last = press_now;
temp_last = temp;
delay(50);
}
}// Конец loop()
Теперь в моей программе значение выводится ещё и на дисплей, и если оформить всю конструкцию в корпус с автономным питанием (батарея или аккумулятор), то будет небольшой электронный барометр-высотомер.
Если необходимо уменьшить код, то вывод информации в последовательный порт можно удалить и оставить лишь вывод на дисплей.
Для модернизации этого скетча можно предложить создать барограф, то есть на графический экран выводить кроме цифрового значения ещё и график изменения давления, к примеру, через час. По резкости изменения давления можно уже судить об изменении погоды. Ещё можно добавить свои пиктограммки: облако, солнышко, дождь, ветер и т.п.
Возможно сделаю такую модернизацию программы и ниже на странице её размещу, если будет интерес продолжить это направление.
Код закоментирован достаточно подробно и понятно.
2018-06-10
P.S. Попользовался таким дисплеем и обратил внимание, что он какой-то капризный. Всё время у него гуляет контакт на индикатор. Всё время плавает контрастность от совсем невидимого до чёрного даже фона. Может быть это мне такой попался экземпляр.
P.P.S. Программу изменил и дополнил. Теперь у меня добавлен датчик влажности DHT22. На дисплей выводится температура и значение влажности и с него. А яркость подсветки дисплея выводится на чистый экран с дополнительным прогресс баром.
Из-за капризности дисплея Nokia5110, переделал программу для вывода информации на малюсенький графический дисплейчик типа OLED SSD1306 с разрешением 128*64 точки.
Pic 6. Использование дисплея OLED SSD1306
При использовании библиотеки <iarduino_OLED_txt.h> можно установить шрифт SmallFontRus, который выводит на экран символы 6*8 пикселей, что позволяет вывести на экран 8 строк информации. Мелковато, конечно, лучше бы использовать, больший дисплей, что позволит вывести символы с разрешением 12*16 пикселей. При использовании OLED дисплея есть приятное преимущество – нет необходимости использования подсветки, в итоге используется лишь одна кнопка для обнуления высоты.
Использование дисплея TFT ST7735 128*160 1.8 дюйма
Это уже более качественный графический диспей. Позволяет выводить любые изображения в цвете.
Получил посылку из Китая с новым цветным TFT ЖК-дисплеем. Контроллер обработки дисплея ST7735. Разрешение 128*160 точек размером 1.8 дюйма.
Ниже представлена схема соединений. Контакты Ардуино выбраны для использования аппаратного подключения дисплея для быстроты обновления экрана.
Pic 7. Схема для скетча #5 v3.2
Предыдущий дисплейчик слишком маленький, а этот в самый раз, причём оказалось, что довольно недорогой для его размера и качества. При использовании библиотеки <Adafruit_ST7735.h> можно устанавливать шрифты разных размеров и использовать любые из 65 тысяч цветов в формате RGB565 – красный и синий по 5 бит, а зелёный 6 бит. Недостаток этой библиотеки – отсутствие русского шрифта.
В скетче использую разный цвет при выводе значения влажности. До 30% – красный, от 30% до 60% – жёлтый, от 60% до 75% – зелёный, свыше 75% – синий. Так визуально легко ориентироваться на диапазон влажности..
Pic 8. Использование дисплея TFT ST7735 128*160 Pic 9. Использование дисплея TFT ST7735 128*160
При использовании этого дисплея вернул кнопку подсветки, как с дисплеем Nikia5110. Этой кнопкой можно регулировать подсветку ЖК-дисплея, подавая ШИМ на вывод BL. По умолчанию поставил на 10% – для экономии энергии. При нажатии на кнопку прибавляется 10% яркости, после почти 100%(реальная 98%) яркость выключается (0%) и т.д. по кругу.
Модернизировал скетч под мобильный вариант. Теперь можно собрать конструкцию и получится карманный барометр-погодная станция. Через порт А0 (контакт 14) происходит измерение напряжения питания Li-Ion +3.7В батареи и выводится значение на экран в виде цифрового значения и пиктограммки. Li-Ion батарея питает DC-DC преобразователь выдающий +5В, которым запитывается Arduino с дисплеем и модулями. Скетч обновлённой программы тут: TFT_128_160_bmp280_v3.1.zip
2018-09-06
Ещё одна модернизация. Заметил, что не совсем хорошо, когда обновляются все надписи на экране, поэтому в новой версии обновляются только изменяющиеся значения. Дополнительно основные блоки выделены в функции. Ещё, если Arduino подключено к компьютеру, то значение напряжения питания батареи и её пиктограмка не выводятся. Скетч обновлённой программы тут: TFT_128_160_bmp280_v3.2.zip
Барометр на Arduino Pro Mini и датчиках BMP280 и DHT22
Схема этого варианта создана на базе Arduino Pro Mini, она включает в себя стабилизатор на +3.3В, подробнее про который можно посмотреть на странице Ардуино (Arduino). #7. В остальном схема подобна предыдущей.
Pic 11. Схема для скетча #5 v3.3 на Arduino Pro Mini Pic 12. Вариант на Arduino Pro Mini Pic 13. Вариант на Arduino Pro Mini
На фото видно использование самодельного модуля стабилизатора на 3.3В, для питания модуля барометра BMP280.
Так дело пойдёт, то ещё немного и оформлю всю конструкцию в корпус как законченное устройство, пока же идёт тестирование работоспособности и удобства эксплуатации ... если дело дойдёт до корпуса, то обязательно опубликую законченную конструкцию.
Некоторые читатели просили сделать вариант на датчике BME280. Поэтому купил на Алиэкспрессе такой датчик и построил новый вариант барометра.
Схема этого варианта создана на основе предыдущего. Вместо датчиков BMP280 и DHT22 применён датчик BME280, который позволяет измерять одновременно давление, высоту, температуру и влажность, что очень удобно для создания карманного варианта барометра.
Для правильного управления цветом дисплеев TFT на контроллере ST7735, был создан вычислитель соответствия цветов кодировок RGB888 и RGB565 (Ардуино (Arduino). #9. Вычислитель RGB888 и RGB565), чем и воспользовался при программировании в этом варианте.
Этот барометр построен, как и предыдущий, на Ардуино Про Мини, но можно использовать любую другую плату, без особой переделки схемы.
У моего BME280 напряжение питания от 1.8 В до 5 В, поэтому отпадает необходимость в стабилизаторе на +3.3 В. Схема упрощается.
Ниже на фото видны компоненты барометра: Адруино Про Мини, BME280, DC-DC преобразователь на +5 В, аккумулятор от сотового телефона Li-Ion +3.7 В, две кнопки.
Pic 14. Вариант на Arduino Pro Mini и датчике BME280 Pic 15. Вариант на Arduino Pro Mini и датчике BME280
Ниже публикую скетч, его можно скопировать в ARDUINO IDE, но можно использовать уже готовый файл TFT_128x160_BME280.ino, см. ниже скетча.
/***********************************************************
* 2018-05-27 Mr.ALB Тренировка в программировании Ардуино
*
* BMP280 I2C:
* SCL - A5
* SDA - A4
* VCC - +3.3V
* GND - GND
*
* 2018-07-17 v1.2 Добавлен датчик влажности DHT22:
* между контактом OUT и VCC подключить 10к
*
* 2018-08-24 v3.0 Подключение дисплея TFT
* ST7735 128*160 1,8 дюйма
* 2018-09-05 v3.1 Автономная работа от батареии Li-Ion +3.7В
* 2018-09-08 v3.2 Перерисовка только меняющихся значений
* 2018-11-02 v3.2.1 Минимальная яркость = 1
* 2018-11-11 v3.2.2 Прогрессбар подсветки на главной странице
*
* 2019-05-09 v3.3 Использование модуля BME280
* BME280 I2C:
* SCL - A5
* SDA - A4
* VCC - +5V
* GND - GND
*
* Аппаратное подключение TFT:
* TFT ST7735 ARDUINO
* Pin 1 RST -[R 1k]- PIN 10
* Pin 2 CS -[R 1k]- PIN 9
* Pin 3 DC -[R 1k]- PIN 8
* Pin 4 DIN -[R 1k]- PIN 11
* Pin 5 CLK -[R 1k]- PIN 13
* Pin 6 VCC - PIN VCC +5V
* Pin 7 BL - PIN 3 - для регулировки подсветки
* Pin 8 GND - PIN GND
*
* Контакты TFT 1-5 подключать через резисторы 1к...2к
*
***********************************************************/
// Подключение библиотеки для I2C#include <Wire.h>
// Ядро графической библиотеки#include <Adafruit_GFX.h>
/* Графический дисплей TFT ST7735 1.8" */#include <Adafruit_ST7735.h>
#define TFT_RST 10
#define TFT_CS 9
#define TFT_DC 8
// Аппаратное подключение TFT // Создаём объект tft
Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST);
// Подключение библиотеки BME280#include <Adafruit_BME280.h>
/* Чтобы всё заработало необходимо:
* 1. Сканером I2C найти адрес BME280 и
* указать при инициализации или
* 2. В библиотеке <Adafruit_BME280.h>:
* 1) Изменить адрес #define BME280_ADDRESS (0x77)
* на адрес #define BME280_ADDRESS (0x76)
* 2) Закоментировать библиотеку
* #include <Adafruit_Sensor.h>
*/// Создаём объект барометра
Adafruit_BME280 bme;
/*
* мБар - мм рт. ст.
* 1013.2472 - 760 k=1.33322
* 1005.24788 - 754
******************************/// Нулевой уровень для 754 мм рт.ст.double null_level = 1005.24788;
// Коэффициент для перевода Па в мм рт.ст.float kp = 133.322;
// переменные давленияfloat press_now, press_last, press_tmp, altit;
// переменные температурыfloat temp, temp_last, temp_correct = -1;
// переменные влажностиfloat humidity_now, humidity_last, humidity_correct = 0;
// Подключение библиотеки кнопок#include <Button_2.h>
// Кнопка обнуления текущего давления#define BUTTON_SET_LEVEL 6
// Кнопка подсветки дисплея#define BUTTON_LIGHT 5
// Вывод PWM для подсветки дисплея#define LIGHT_PIN 3
// Ввод VCC батареи питания, через резистор 1к#define VCC_PIN A0
// Создание объектов для кнопок
Button_2 buttonSetLevel(BUTTON_SET_LEVEL,21);
Button_2 buttonLight(BUTTON_LIGHT,21);
// Позиция заставкиuint8_t bxlz = 2 * 6;
// Позиция вывода информации по yuint8_t byinfo = 27;
// Позиция вывода информации по хuint8_t bxinfo = 10 * 6;
// Уровень подсветки 0...10;uint8_t count_level_light = 1;
// Значение подсветки 0...250;int level_light = count_level_light * 25;
// Для обновления экрана по времениboolean flagcheck = false;
// Для вывода надписей после установки яркостиboolean flagSetLight = true;
// Строка прогресс-бара подсветкиuint8_t light_str = 15;
// Для обновления экрана по времениunsignedlong time_now, time_check, time_delta = 27000;
// Название программыchar prog_title1[] = "BME280";
// Авторchar author[] = "Mr.ALB";
// Версия программыchar vers[] = "v3.3";
// Дата версииchar vers_date[] = "2019-05-09";
#define SCREEN_W 160 // Ширина экрана в рх#define SCREEN_H 128 // Высота экрана в рхuint8_t font_size = 1; // Размер шрифта/***********************/
/* Настройка программы */
/***********************/voidsetup()
{
Wire.begin(); // Запуск I2C// Порт управления подсветкой экранаpinMode(LIGHT_PIN,OUTPUT);
// Порт для измерения батареи питанияpinMode(VCC_PIN,INPUT);
// Опорный источник - внутреннийanalogReference(DEFAULT);
// Инициируем работу с дисплеем 1.8" TFT
tft.initR(INITR_BLACKTAB);// initialize a ST7735S chip,
// black tab
fnClrScreen(); // Очистить экран
tft.setRotation(1); // Поворот экрана: // 0 - 0° книжный// 1 - 90° альбомный// 2 - 180° книжный// 3 - 270° альбомный// Установка яркостиanalogWrite(LIGHT_PIN,level_light);
if(!bme.begin()) // Старт датчика давления
{
//Если ошибка запуска
tft.setTextColor(ST7735_RED);
tft.setTextSize(2);
fnCenter(sizeof("Error!"),2,1,0);
tft.print("Error!");
tft.setTextSize(1);
fnCenter(sizeof("Not find BME280 sensor!"),1,7,0);
tft.print("Not find BME280 sensor!");
fnCenter(sizeof("Check contacts"),1,9,4);
tft.print("Check contacts");
fnCenter(sizeof("Click Reset"),1,14,0);
tft.setTextColor(ST7735_YELLOW);
tft.print("Click Reset");
while(1);
}
fnZastavka(); // Заставка
fnPrintText(); // Вывод основного текста на экран
}
/***********************//* Рабочая программа *//***********************/voidloop()
{
// Текущее время работы программы в мс
time_now=millis();
// Проверка интервала времениif(time_now - time_check > time_delta)
{
time_check = time_now;
flagcheck = true;
}
// Считывание состояния кнопки уровня
buttonSetLevel.scanState();
// Считывание состояния кнопки подсветки
buttonLight.scanState();
// Было нажатие кнопки подсветкиif(buttonLight.flagClick == true)
{
// Сброс признака клика
buttonLight.flagClick = false;
// Шаг яркости
count_level_light++;
if(count_level_light > 10)
{
count_level_light = 0; // Выключаем подсветку
level_light = 3; // Минимальная яркость
tft.fillRect(0, light_str * 8 + 2, 160, 3, ST7735_BLACK);
}
else
{
level_light=count_level_light * 25;
}
// Установка яркостиanalogWrite(LIGHT_PIN,level_light);
/* Прогресс бар яркости подсветки */uint8_t bar_step = 0;
uint8_t bar_step_const = 8 * 2;
tft.setTextSize(1);
for(uint8_t ip = 0; ip < count_level_light; ip++)
{
tft.fillRect
(
1 + bar_step,
light_str * 8 + 2,
bar_step_const - 2,
3,
ST7735_WHITE
);
bar_step += bar_step_const;
}
flagSetLight = true;
}
// Измерение параметров
press_now = bme.readPressure()/kp; // Давление в мм рт. ст.
temp = bme.readTemperature();// Температура в °С// Влажность в %
humidity_now = bme.readHumidity();
//Применение коррекции влажностиif(humidity_correct != 0) humidity_now += humidity_correct;
//Применение коррекции температурыif(temp_correct != 0) temp += temp_correct;
/* * Если давление изменилось больше чем на 0,2 мм рт.ст.,
* то выводим на дисплей... * или нажата кнопка обнуления высоты... * или температура изменилась больше чем на 0,1°С */if(
(press_now < (press_last - .2)) ||
(press_now > (press_last + .2)) ||
(temp < (temp_last - .1)) || (temp > (temp_last + .1)) ||
buttonSetLevel.flagClick == true||
flagcheck == true
)
{
// Сброс флага проверки по времени
flagcheck = false;
// Если была настройка яркостиif(flagSetLight)
{
tft.fillRect(0, light_str * 8 + 2, 160, 3, ST7735_BLACK);
flagSetLight=false;
}
// Было нажатие кнопки "Set Level 0 m"if(buttonSetLevel.flagClick == true)
{
// Сброс признака клика
buttonSetLevel.flagClick = false;
// Обнуляем значение высоты
null_level=press_now * kp/100;
}
// Высота в метрах
altit = bme.readAltitude(null_level);
tft.setTextColor(ST7735_YELLOW);
// Вывод значения давления
tft.fillRect(bxinfo, byinfo - 2, 6 * 12, 16, ST7735_BLACK);
tft.setTextSize(2);
tft.setCursor(10 * 6, byinfo - 2);
tft.print(press_now);
tft.setTextSize(1);
// Вывод высоты
tft.setTextColor(ST7735_WHITE);
tft.fillRect(bxinfo, byinfo + 20, 6 * 7, 8, ST7735_BLACK);
tft.setCursor(bxinfo, byinfo + 20);
tft.print(altit);
// Вывод значения температуры
tft.setTextColor(ST7735_ORANGE);
tft.fillRect(bxinfo, byinfo + 36, 6 * 6, 8, ST7735_BLACK);
tft.setCursor(bxinfo, byinfo + 36);
if(temp > 0) tft.print("+");
tft.print(temp);
/* Вывод влажности *//* Раскрашиваем значение в зависимости от % влажности */if(humidity_now < 30.0) // Сушь
tft.setTextColor(ST7735_RED);
if(humidity_now >= 30.0 && humidity_now < 60.0)// Сухо
tft.setTextColor(ST7735_YELLOW);
if(humidity_now >= 60.0 && humidity_now < 75.0)// Влажно
tft.setTextColor(ST7735_GREEN);
if(humidity_now >= 75.0) // Сыро
tft.setTextColor(ST7735_BLUE);
//Очистка места под значение
tft.setTextColor(ST7735_BLUE);
tft.fillRect(bxinfo, byinfo + 56, 6 * 12, 16, ST7735_BLACK);
tft.setTextSize(2);
tft.setCursor(bxinfo, byinfo + 56);
tft.print(humidity_now);
// Проверка напряжения питанияint v = analogRead(VCC_PIN);
// Перевод бит в вольтыfloat vcc = v * 5.0 / 1024;
// Вывод значения напряжения питания батареиif(vcc > 2.5) // Выводим, если запитываемся от батареи
{
uint8_t x_vcc = 20 * 6 + 3, y_vcc = 14;
tft.fillRect(x_vcc, y_vcc, 6 * 6, 8, ST7735_BLACK);
tft.setCursor(x_vcc, y_vcc);
tft.setTextSize(1);
if(vcc < 3.7) tft.setTextColor(ST7735_YELLOW);
if(vcc < 3.3) tft.setTextColor(ST7735_RED);
if(vcc >= 3.7) tft.setTextColor(ST7735_GREEN);
tft.print("+");
tft.print(vcc);
tft.print("V");
fnBattary(23 * 6, 3, vcc);//Вывод пиктограммки
}
// Перезаписываем бывшие значения
temp_last = temp;
press_last = press_now;
humidity_last = humidity_now;
delay(30);
}
}
/* Функция - Вывод °С */void fnChrDegree(int16_t x, int16_t y, uint16_t color)
{
uint8_t radius = 2;
tft.drawCircle(x += radius*2, y += radius*2 - 1, radius, color);
tft.setCursor(x + 3, y);
tft.setTextColor(color);
tft.print("C");
}
/* Функция символа батарейки */void fnBattary(int16_t x, int16_t y, float vcc)
{
int16_t w = 19, h = 8;
tft.drawRect(x, y, w, h, ST7735_WHITE); // Контур батарейки
tft.fillRect(x + w, y + 2, 2, 4, ST7735_WHITE); // Пимпочка// Вывод квадратиков наполнения if(vcc < 3.3) fnPrintFillRect(x,y,1,ST7735_RED);
if(vcc >= 3.3 && vcc < 3.5) fnPrintFillRect(x,y,1,ST7735_YELLOW);
if(vcc >= 3.5 && vcc < 3.7) fnPrintFillRect(x,y,2,ST7735_YELLOW);
if(vcc >= 3.7 && vcc < 3.9) fnPrintFillRect(x,y,3,ST7735_GREEN);
if(vcc >= 3.9) fnPrintFillRect(x, y, 4, ST7735_GREEN);
}
/* Функция вывода квадратиков для символа батарейки */void fnPrintFillRect
(
int16_t x,
int16_t y,
uint8_t max_i,
int16_t color
)
{
tft.fillRect(x + 1, y + 1, 17, 6, ST7735_BLACK);
for(uint8_t i = 0; i < max_i; i++)
{
tft.fillRect(x + 2 + i * 4, y + 2, 3, 4, color);
}
}
/* Функция - Заставка */void fnZastavka()
{
fnClrScreen(); // Очистить экран
tft.setTextWrap(false);
tft.setTextColor(ST7735_ORANGE);
font_size = 3;
tft.setTextSize(font_size);
fnCenter(sizeof(prog_title1) - 1, font_size, 1, 0);
tft.print(prog_title1);
font_size = 2;
tft.setTextSize(font_size);
fnCenter(sizeof(author) - 1, font_size, 4, 0);
tft.setTextColor(ST7735_DARKGREEN);
tft.print(author);
font_size = 1;
tft.setTextSize(font_size);
fnCenter(sizeof(vers) - 1, font_size, 11, 0);
tft.setTextColor(ST7735_GRAY);
tft.println(vers);
fnCenter(sizeof(vers_date) - 1, font_size, 12, 2);
tft.println(vers_date);
delay(3000);
fnClrScreen(); // Очистить экран
}
/* Функция - Вывод основных надписей на экран */void fnPrintText()
{
fnClrScreen(); // Очистить экран
tft.setTextSize(1);
tft.setCursor(8, 3);
tft.setTextColor(ST7735_GREEN);
tft.print("BME280 ");
tft.println(vers);
tft.setTextColor(ST7735_LIGHTGRAY);
/* Вывод давления */
tft.setCursor(0, byinfo);//24
tft.print("Pressure:");
tft.setCursor(bxinfo + 6 * 12, byinfo);
tft.setTextSize(1);
// Вывод размерности давления
tft.print(" mm");
/* Вывод высоты */
tft.setCursor(0, byinfo + 20);
tft.print("Altitude:");
tft.setCursor(bxinfo + 6 * 8, byinfo + 20);
// Вывод размерности высоты
tft.print("m");
/* Вывод температуры */
tft.setCursor(0, byinfo + 36);
tft.print("Temper. :");
// Вывод размерности температуры
fnChrDegree(bxinfo + 6 * 7, 60, ST7735_LIGHTGRAY);
/* Вывод влажности */
tft.setCursor(0, byinfo + 56);
tft.print("Humidity:");
tft.setTextSize(1);
tft.setCursor(bxinfo + 6 * 12, byinfo + 56);
// Вывод размерности влажности
tft.print("%");
//Разделитель давления и влажности
tft.drawFastHLine(0, byinfo + 50, 160, ST7735_DARKGRAY);
}
/* Функция - центрирование строки */void fnCenter
(
uint8_t lenght,
uint8_t fntsize,
uint8_t row,
uint8_t offset
)
{
tft.setCursor
(
(SCREEN_W - lenght * fntsize * 6)/2 + fntsize * 6/2,
fntsize * 8 * row + offset
);
}
/* Функция - Cтирание экрана чёрным цветом,
* т.е. закрасить чёрным
*/void fnClrScreen()
{
tft.fillScreen(ST7735_BLACK);
// Курсор в начало экрана
tft.setCursor(0, 0);
}
Думаю, что это не конец , ещё мне хочется сделать функцию барографа – выводить график изменения параметров во времени. Пока только желание, как будет благоприятное время, то буду делать. И ещё, конечно, все эти модули поместить бы в корпус, тут уже инженерно-конструкторская задача, всё просчитать и разработать. В принципе, можно делать и без функции барографа, программу всегда можно дописать и запрограммировать уже в готовой конструкции. Время покажет, как всё сложится.
2019-05-10
Барометр c разными системами измерения давления
Некоторые читатели просили сделать вариант, в котором бы давление измерялось не в мм рт. ст., как в России, а в Европейском варианте, к примеру, в Паскалях или кило Паскалях. Вариант с кПа более удобен.
Библиотеку с опросом кнопок я использую как и прежде, только переименовал, так как среда IDE пытается под именем Button обновить библиотеку от совершенно другого автора. Чтобы не перепуталось, переименовал в Buttons(На мой взгляд предыдущее название Button_2 несколько неудобное).
Особенностью новой версии является то, что кнопка установки нулевого уровня для измерения высоты применяется и для изменения системы измерения. При нажатии на эту кнопку в течении 2.1 секунды и более происходит смена системы измерения с мм рт. ст. на кПа. Если была система измерения в кПа, то по нажатии на кнопку происходит переход на измерение обратно в мм рт. ст.
При быстром клике на кнопке – происходит обнуление высоты, как и в передыдущей версии.
Модернизированный скетч представлен ниже и для скачивания имеется уже готовый вариант (см. ниже).
/********************************************************
* 2018-05-27 Mr.ALB Тренировка в программировании Ардуино
*
* BME280 I2C:
* SCL - A5
* SDA - A4
* VCC - 3.3V
* GND - GND
*
* 2018-07-17 v1.2 Добавлен датчик влажности DHT22:
* между контактом OUT и VCC
* подключить 10к
*
* 2018-08-24 v3.0 Подключение дисплея
* TFT ST7735 128*160 1,8 дюйма
* 2018-09-05 v3.1 Автономная работа от
* батареии Li-Ion +3.7В
* 2018-09-08 v3.2 Перерисовка только меняющихся значений
* 2018-11-02 v3.2.1 Минимальная яркость = 1
* 2018-11-11 v3.2.2 Прогрессбар подсветки
* на главной странице
*
* 2019-05-09 v3.3 Использование модуля BME280
* 2019-12-27 v3.4 Разные системы измерения давления
* (мм рт.ст. | кПа)
*
* Аппаратное подключение TFT:
* TFT ST7735 ARDUINO
* Pin 1 RST -[R 1k]- PIN 10
* Pin 2 CS -[R 1k]- PIN 9
* Pin 3 DC -[R 1k]- PIN 8
* Pin 4 DIN -[R 1k]- PIN 11
* Pin 5 CLK -[R 1k]- PIN 13
* Pin 6 VCC - PIN VCC +5V
* Pin 7 BL - PIN 3 - для регулировки подсветки
* использовать ШИМ
* Pin 8 GND - PIN GND
*
* Контакты TFT 1-5 подключать через резисторы 1к...2к
*
*
********************************************************/
// Подключение библиотеки для I2C#include<Wire.h>/* Графический дисплей TFT ST7735 1.8" */#include<Adafruit_GFX.h>// Ядро графической библиотеки#include<Adafruit_ST7735.h>// Библиотека для ST7735#define TFT_RST 10
#define TFT_CS 9
#define TFT_DC 8
// Аппаратное подключение TFT
// Создаём объект tft
Adafruit_ST7735 tft = Adafruit_ST7735
(
TFT_CS,
TFT_DC,
TFT_RST
);
// Подключение библиотеки BME280#include<Adafruit_BME280.h>/* Чтобы всё заработало необходимо
* 1. Сканером I2C найти адрес BME280
* или в библиотеке <Adafruit_BME280.h>:
* 1) Изменить адрес #define BME280_ADDRESS (0x77)
* на адрес #define BME280_ADDRESS (0x76)
* 2) Закоментировать библиотеку
* #include <Adafruit_Sensor.h>
*/
// Создаём объект барометра
Adafruit_BME280 bme;
/* мБар - мм рт. ст.
* 1013.2472 - 760 k=1.33322
* 1005.24788 - 754
*/// Нулевой уровень для давления 754 мм рт.ст.
// Задайте значение соответствующее вашему положению// В мБарdouble null_level=1005.24788;
// Коэффициент для перевода Па в мм рт.ст.float kp=133.322;
// переменные давленияfloat press_now,
press_last,
press_tmp,
altit;
// переменные температурыfloat temp,
temp_last,
temp_correct=-1;
// переменные влажностиfloat humidity_now,
humidity_last,
humidity_correct=0;
#include<Buttons.h>// Подключение библиотеки кнопок// Кнопка "установка уровня 0 м" #define BUTTON_SET_LEVEL 6
// Кнопка подсветки дисплея#define BUTTON_LIGHT 5
// Вывод PWM для подсветки дисплея#define LIGHT_PIN 3
#define VCC_PIN A0 // Ввод VCC батареи питания,
// через резистор 1к// Создание объекта для кнопки "установка уровня 0 м"
Buttons buttonSetLevel(BUTTON_SET_LEVEL,21);
// Создание объекта для кнопки подсветки
Buttons buttonLight(BUTTON_LIGHT,21);
uint8_t bxlz=2*6; // Позиция заставки// Позиция вывода информации по yuint8_t byinfo=27;
// Позиция вывода информации по хuint8_t bxinfo=10*6;
// Шаг подсветки 0...10;uint8_t count_level_light=1;
// Уровень подсветки 0...250;int level_light=count_level_light*25;
/* Флаги */
// Для обновления экрана по времениboolean flagcheck=false;
// Для вывода надписей после установки яркостиboolean flagSetLight=true;
// Для измерения в кило Паскалях (kPa)boolean flagPa=false;
// Строка вывода прогресс-бара подсветкиuint8_t light_str=15;
// Переменные для обновления экрана по времениunsignedlong time_now,
time_check,
time_button,
time_delta=21000;
char prog_title1[]="BME280"; // Название программы 1char author[]="Mr.ALB"; // Авторchar vers[]="v3.4"; // Версия программыchar vers_date[]="2019-12-27"; // Дата версии#define SCREEN_W 160 // Ширина экрана в рх#define SCREEN_H 128 // Высота экрана в рхuint8_t font_size=1; // Размер шрифта/***********************/
/* Настройка программы */
/***********************/voidsetup()
{
Wire.begin(); // Запуск I2C// Порт управления подсветкой экранаpinMode(LIGHT_PIN,OUTPUT);
// Порт для измерения батареи питанияpinMode(VCC_PIN,INPUT);
// Опорный источник - внутреннийanalogReference(DEFAULT);
// Инициируем работу с дисплеем 1.8" TFT
// initialize a ST7735S chip, black tab
tft.initR(INITR_BLACKTAB);
fnClrScreen(); // Очистить экран
tft.setRotation(1); // Поворот экрана:
// 0 - 0° книжный
// 1 - 90° альбомный
// 2 - 180° книжный
// 3 - 270° альбомный
// Установка начальной яркостиanalogWrite(LIGHT_PIN,level_light);
if(!bme.begin()) // Старт датчика давления
{
//Если ошибка запуска
tft.setTextColor(ST7735_RED);
tft.setTextSize(2);
fnCenter(sizeof("Error!"),2,1,0);
tft.print("Error!");
tft.setTextSize(1);
fnCenter(sizeof("Not find BME280 sensor!"),1,7,0);
tft.print("Not find BME280 sensor!");
fnCenter(sizeof("Check contacts"),1,9,4);
tft.print("Check contacts");
fnCenter(sizeof("Click Reset"),1,14,0);
tft.setTextColor(ST7735_YELLOW);
tft.print("Click Reset");
while(1);
}
// Заставка
fnZastavka();
// Вывод основного текста на экран
fnPrintText();
}
/***********************/
/* Рабочая программа */
/***********************/voidloop()
{
// Текущее время работы программы в мс
time_now=millis();
// Проверка интервала времени для обновления экранаif(time_now-time_check>time_delta)
{
time_check=time_now;
flagcheck=true;
}
// Считывание состояния кнопки "установка уровня 0 м"
buttonSetLevel.scanState();
// Считывание состояния кнопки подсветки
buttonLight.scanState();
// Было нажатие кнопки подсветкиif(buttonLight.flagClick==true)
{
buttonLight.flagClick=false; // Сброс признака клика
count_level_light++;// Шаг яркостиif(count_level_light>10)
{
count_level_light=0; // Выключаем подсветку
level_light=3; // Минимальная яркость
tft.fillRect(0, light_str*8+2,160, 3, ST7735_BLACK);
}
else
{
level_light=count_level_light*25;
}
// Установка яркостиanalogWrite(LIGHT_PIN,level_light);
/* Прогресс бар яркости подсветки */uint8_t bar_step=0;
uint8_t bar_step_const=8*2;
tft.setTextSize(1);
for(uint8_t ip=0;ip<count_level_light;ip++)
{
tft.fillRect (1+bar_step,
light_str*8+2,
bar_step_const-2,
3,
ST7735_WHITE
);
bar_step+=bar_step_const;
}
flagSetLight=true;
}
// Было нажатие кнопки "Установка уровня 0"if(buttonSetLevel.flagPress==true)
{
time_button=millis();
// Пока кнопка нажатаwhile(buttonSetLevel.flagPress)
buttonSetLevel.scanState();
time_now=millis();
if(time_now-time_button>=time_delta/10)
{
// Если нажатие больше 2.1 сек,
// то смена размерности давления
flagPa=!flagPa; // Инверсия флага Па
fnPrintText(); // Вывод основных надписей
}
else
{
// Если нажатие меньше 2.1 сек,
// то обнуление высотыif(flagPa)
null_level=press_now*10;
else
null_level=press_now*kp/100;
}
flagcheck=true;
}
// Измерение параметров с BME280
press_now=bme.readPressure();
if(flagPa==false)
press_now/=kp; // Давление в мм рт. ст.else press_now/=1000; // Давление в кило Паскалях
temp = bme.readTemperature(); // Температура в °С
humidity_now = bme.readHumidity();// Влажность в %
// Конец измерения параметров с BME280
//Применение коррекции влажностиif(humidity_correct!=0) humidity_now += humidity_correct;
//Применение коррекции температурыif(temp_correct!=0) temp += temp_correct;
/*
* Если давление изменилось больше чем на 0,1 мм рт.ст.,
* или на 0,01 кПа, то выводим на дисплей...
* или если температура изменилась больше чем на 0,1°С
* или если нажата кнопка обнуления высоты...
* или если прошёл интервал времени >= 21 сек
*/if(
(flagPa==false)&&((press_now<(press_last-.1)) ||
(press_now>(press_last+.1))) ||
(flagPa==true)&&((press_now<(press_last-.01)) ||
(press_now>(press_last+.01))) ||
(temp<(temp_last-.1))||(temp>(temp_last+.1)) ||
flagcheck==true
)
{
flagcheck=false; // Сброс флага проверки по времениif(flagSetLight) // Если была настройка яркости
{
tft.fillRect(0, light_str*8+2,160, 3, ST7735_BLACK);
flagSetLight=false;
}
// Приблизительная высота в метрах
altit=bme.readAltitude(null_level);
// Вывод значения давления
tft.setTextColor(ST7735_YELLOW);
tft.fillRect(bxinfo, byinfo-2, 6*12, 16, ST7735_BLACK);
tft.setTextSize(2);
tft.setCursor(10*6, byinfo-2);
tft.print(press_now);
// Вывод высоты
tft.setTextColor(ST7735_WHITE);
tft.fillRect(bxinfo, byinfo+20, 6*7, 8, ST7735_BLACK);
tft.setTextSize(1);
tft.setCursor(bxinfo, byinfo+20);
tft.print(altit);
// Вывод значения температуры
tft.setTextColor(ST7735_ORANGE);
tft.fillRect(bxinfo, byinfo+36, 6*6, 8, ST7735_BLACK);
tft.setCursor(bxinfo, byinfo+36);
if(temp>0) tft.print("+");
tft.print(temp);
/* Вывод влажности */
/* Раскрашиваем значение в зависимости от % влажности */if(humidity_now<30.0) // Сушь
tft.setTextColor(ST7735_RED);
if(humidity_now>=30.0 && humidity_now<60.0) // Сухо
tft.setTextColor(ST7735_YELLOW);
if(humidity_now>=60.0 && humidity_now<75.0) // Влажно
tft.setTextColor(ST7735_GREEN);
if(humidity_now>=75.0) // Сыро
tft.setTextColor(ST7735_BLUE);
//Очистка места под значение
tft.fillRect(bxinfo, byinfo+56, 6*12, 16, ST7735_BLACK);
tft.setTextSize(2);
tft.setCursor(bxinfo, byinfo+56);
tft.print(humidity_now);
/* Проверка напряжения питания */int v=analogRead(VCC_PIN);
float vcc=v*5.0/1024; // Перевод бит в вольты
// Вывод значения напряжения питания батареиif(vcc>2.5) // Выводим, если запитываемся от батареи
{
uint8_t x_vcc=20*6+3,y_vcc=14;
tft.fillRect(x_vcc, y_vcc, 6*6, 8, ST7735_BLACK);
tft.setCursor(x_vcc, y_vcc);
tft.setTextSize(1);
if(vcc<3.7) tft.setTextColor(ST7735_YELLOW);
if(vcc<3.3) tft.setTextColor(ST7735_RED);
if(vcc>=3.7) tft.setTextColor(ST7735_GREEN);
tft.print("+");
tft.print(vcc);
tft.print("V");
fnBattary(23*6,3,vcc);//Вывод пиктограммки
}
/* Конец проверки питания */
// Перезаписываем бывшие значения
temp_last=temp;
press_last=press_now;
humidity_last=humidity_now;
delay(30);
}
}
/* Функция - Вывод °С */void fnChrDegree(
int16_t x,int16_t y,uint16_t color
)
{
uint8_t radius=2;
tft.drawCircle(x+=radius*2, y+=radius*2-1, radius, color);
tft.setCursor(x+3, y);
tft.setTextColor(color);
tft.print("C");
}
/* Функция символа батарейки */void fnBattary(
int16_t x,int16_t y,float vcc
)
{
int16_t w=19, h=8;
// Контур батарейки
tft.drawRect(x, y, w, h, ST7735_WHITE);
// Пимпочка
tft.fillRect(x+w, y+2, 2, 4, ST7735_WHITE);
// Вывод квадратиков наполненияif(vcc<3.3)
fnPrintFillRect(x,y,1,ST7735_RED);
if(vcc>=3.3 && vcc<3.5)
fnPrintFillRect(x,y,1,ST7735_YELLOW);
if(vcc>=3.5&&vcc<3.7)
fnPrintFillRect(x,y,2,ST7735_YELLOW);
if(vcc>=3.7&&vcc<3.9)
fnPrintFillRect(x,y,3,ST7735_GREEN);
if(vcc>=3.9)
fnPrintFillRect(x,y,4,ST7735_GREEN);
}
/* Функция вывода квадратиков для символа батарейки*/void fnPrintFillRect(
int16_t x,int16_t y,uint8_t max_i,int16_t color
)
{
tft.fillRect(x+1, y+1, 17, 6, ST7735_BLACK);
for(uint8_t i=0;i<max_i;i++)
{
tft.fillRect(x+2+i*4, y+2, 3, 4, color);
}
}
/* Функция - Заставка */void fnZastavka()
{
fnClrScreen(); // Очистить экран
tft.setTextWrap(false);
tft.setTextColor(ST7735_ORANGE);
font_size=3;
tft.setTextSize(font_size);
fnCenter(sizeof(prog_title1)-1,font_size,1,0);
tft.print(prog_title1);
font_size=2;
tft.setTextSize(font_size);
fnCenter(sizeof(author)-1,font_size,4,0);
tft.setTextColor(ST7735_DARKGREEN);
tft.print(author);
font_size=1;
tft.setTextSize(font_size);
fnCenter(sizeof(vers)-1,font_size,11,0);
tft.setTextColor(ST7735_GRAY);
tft.println(vers);
fnCenter(sizeof(vers_date)-1,font_size,12,2);
tft.println(vers_date);
delay(3600);
fnClrScreen(); // Очистить экран
}
/* Функция - Вывод основных надписей на экран */void fnPrintText()
{
fnClrScreen(); // Очистить экран
tft.setTextSize(1);
tft.setCursor(8, 3);
tft.setTextColor(ST7735_GREEN);
tft.print("BME280 ");
tft.println(vers);
tft.setTextColor(ST7735_LIGHTGRAY);
/* Вывод давления */
tft.setCursor(0, byinfo);//24
tft.print("Pressure:");
tft.setCursor(bxinfo+6*12, byinfo);
tft.setTextSize(1);
// Вывод размерности давленияif(flagPa)
tft.print(" kPa");
else
tft.print(" mm");
/* Вывод высоты */
tft.setCursor(0, byinfo+20);
tft.print("Altitude:");
tft.setCursor(bxinfo+6*8, byinfo+20);
// Вывод размерности высоты
tft.print("m");
/* Вывод температуры */
tft.setCursor(0, byinfo+36);
tft.print("Temper. :");
// Вывод размерности температуры
fnChrDegree(bxinfo+6*7,60,ST7735_LIGHTGRAY);
/* Вывод влажности */
tft.setCursor(0, byinfo+56);
tft.print("Humidity:");
tft.setTextSize(1);
tft.setCursor(bxinfo+6*12, byinfo+56);
// Вывод размерности влажности
tft.print("%");
//Разделитель давления и влажности
tft.drawFastHLine(0,byinfo+50,160,ST7735_DARKGRAY);
}
/* Функция - центрирование строки */void fnCenter(
uint8_t lenght,uint8_t fntsize,uint8_t row,uint8_t offset
)
{
tft.setCursor
(
(SCREEN_W-lenght*fntsize*6)/2+fntsize*6/2,
fntsize*8*row+offset
);
}
/* Функция - Cтирание экрана чёрным цветом */void fnClrScreen()
{
// Очистить экран, т.е. закрасить чёрным
tft.fillScreen(ST7735_BLACK);
// Курсор в начало экрана
tft.setCursor(0, 0);
}
Если использовать EEPROM, то можно сохранять систему измерения и при выключении питания, выбор системы будет сохранён. При последующем включении давление будет уже измеряться в выбранной системе.
Оказывается, что и это ещё не окончание, так как есть мысль добавить внешний датчик измерения температуры, тогда этот барометр станет более универсальным. Позволит измерять не только внутреннюю температуру по датчику BME280, но и внешнюю температуру. Для точных измерений подходит датчик ф. Даллас DS18B20 и ему подобные.
Такой датчик я уже использовал при разработке МТР-1.2. Его и применим в дальнейшей модернизации этого барометра, который уже превращается в погодную станцию.
Прихожу к мнению, что пора делать конструкцию этого устройства. Как будет свободное время, то займусь разработкой.