Продолжаю модернизацию скетча, размещённого на предыдущей странице #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 контактов внизу экрана.
Напряжение питания Nokia 5110 составляет 3.3В, как и у модуля BMP280.
Для вывода информации на экран, используются библиотеки <Adafruit_GFX.h> и <Adafruit_PCD8544.h>.
Все соединения модуля и экрана с Arduino указаны на схеме. Контакты Arduino можно использовать не обязательно такие как у меня, а любые свободные, при условии соответствующего изменения в скетче, однако, указанные контакты используют аппаратное подключение по SPI, что работает быстрее, чем программное подключение на других контактах.
На монтажную панельку добавляем ещё одну кнопку SB2, с помощью которой будем управлять яркостью подсветки экрана.
Вывод информации на экране осуществляется в три строки....
Четвёртая строка внизу используется для вывода шага подсветки. Шаг подсветки равен 10%. После 100% яркости подсветки, нажатие кнопки SB2 переводит в отключение подсветки, т.е. яркость равна 0%. Изменение градации подсветки циклическое.
После всех подключений модулей к плате 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 точки.
При использовании библиотеки <iarduino_OLED_txt.h> можно установить шрифт SmallFontRus, который выводит на экран символы 6*8 пикселей, что позволяет вывести на экран 8 строк информации. Мелковато, конечно, лучше бы использовать, больший дисплей, что позволит вывести символы с разрешением 12*16 пикселей. При использовании OLED дисплея есть приятное преимущество – нет необходимости использования подсветки, в итоге используется лишь одна кнопка для обнуления высоты.
Использование дисплея TFT ST7735 128*160 1.8 дюйма
Это уже более качественный графический диспей. Позволяет выводить любые изображения в цвете.
Получил посылку из Китая с новым цветным TFT ЖК-дисплеем. Контроллер обработки дисплея ST7735. Разрешение 128*160 точек размером 1.8 дюйма.
Ниже представлена схема соединений. Контакты Ардуино выбраны для использования аппаратного подключения дисплея для быстроты обновления экрана.
Предыдущий дисплейчик слишком маленький, а этот в самый раз, причём оказалось, что довольно недорогой для его размера и качества. При использовании библиотеки <Adafruit_ST7735.h> можно устанавливать шрифты разных размеров и использовать любые из 65 тысяч цветов в формате RGB565 – красный и синий по 5 бит, а зелёный 6 бит. Недостаток этой библиотеки – отсутствие русского шрифта.
В скетче использую разный цвет при выводе значения влажности. До 30% – красный, от 30% до 60% – жёлтый, от 60% до 75% – зелёный, свыше 75% – синий. Так визуально легко ориентироваться на диапазон влажности..
При использовании этого дисплея вернул кнопку подсветки, как с дисплеем 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. В остальном схема подобна предыдущей.
На фото видно использование самодельного модуля стабилизатора на 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 В, две кнопки.
Ниже публикую скетч, его можно скопировать в 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. Его и применим в дальнейшей модернизации этого барометра, который уже превращается в погодную станцию.
Прихожу к мнению, что пора делать конструкцию этого устройства. Как будет свободное время, то займусь разработкой.