Метеостанции на Arduino с использованием дисплея DWIN и датчика BME280
В этой статье создадим компактную метеостанцию, используя контроллер Arduino UNO и датчиком BME280 (в прошлых подробно рассказывал о данном датчике). С помощью BME280 можно получать показатели атмосферного давления, температуры воздуха и уровня влажности. Дополнительно BME280 позволяет вычислять высоту относительно уровня моря, но в статье его не будет. Все полученные измерения будут отображены на экране дисплея DWIN.

Необходимые детали
- Контроллер Arduino UNO R3 x 1 шт.
- Провода DuPont, 2,54 мм, 20 см x 1 шт.
- Датчик атмосферного давления, влажности и температуры BME280 x 1 шт.
- Дисплей DWIN 7 дюймов x 1 шт.
- Блок питания (сетевой адаптер) универсальный 5В 5А, штекер 5.5 х 2.5 x 1 шт.
Описание
В данном проекте мы рассмотрим процесс взаимодействия микроконтроллера Arduino UNO с датчиком температуры, влажности и атмосферного давления BME280, а также передачу полученных данных на графический дисплей DWIN. Данный проект является отличным примером того, как современные устройства позволяют собирать важные показатели окружающей среды и отображать их удобным образом.
Подключение
Схема подключения не сложная, сначала подключаем питание датчика, выводы VCC и GND присоединяется к выводам 5V и GND платы Arduino UNO, затем выводы SCL и SDA модуля подключаем к выводам A5 и A4 Arduino UNO. Теперь осталось подключить дисплей DWIN, для модуля необходимо отдельный блок питания на 5В выводы VCC и GND присоединяется к выводам 5V и GND, затем выводы RX и TX подключаем к контактам D3 и D2 и не забываем объединить землю между дисплеем и Arduino. Для удобства вывел схему подключения ниже.

Установка библиотеки
Для работы с датчиком BME280 необходимо установить библиотеку Adafruit BME280. Проще всего это сделать, используя интегрированную среду разработки Arduino IDE, для этого откройте Скетч → Подключение библиотеки → Менеджер библиотек

Откроется новое окно нажмите скачать все

Программа
Запустите программу Arduino IDE, вставьте приведенный ниже код и загрузите его на вашу плату Arduino UNO.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 |
#include <Adafruit_Sensor.h> // Подключаем библиотеку Adafruit_Sensor #include <Adafruit_BME280.h> // Подключаем библиотеку BME280 #include <SoftwareSerial.h> // Подключаем библиотеку для создания программного последовательного порта const byte rxPin = 2; // Пин RX для приёма данных const byte txPin = 3; // Пин TX для передачи данных SoftwareSerial mySerial(rxPin, txPin); // Сздаем объект mySerial Adafruit_BME280 bme280; // Сздаем объект bme280 // Создаем массивы для передачи данных через последовательный порт, где 0x10, 0x20, 0x30 это адрес unsigned char Temperature[8] = {0x5A, 0xA5, 0x05, 0x82, 0x10, 0x00, 0x00, 0x00}; // Данные о температуре unsigned char Humidity[8] = {0x5A, 0xA5, 0x05, 0x82, 0x20, 0x00, 0x00, 0x00}; // Данные о влажности unsigned char Pressure[8] = {0x5A, 0xA5, 0x05, 0x82, 0x30, 0x00, 0x00, 0x00}; // Данные о давлении void setup() { Serial.begin(115200); // Инициализируем последовательного порт на скорости 115200 mySerial.begin(115200); // Инициализируем программного последовательного порта на скорости 115200 // Проверяем подключение к датчику BME280 bool status = bme280.begin(0x76); // Адрес датчика по умолчанию 0x76 if (!status) { Serial.println("Ошибка! Не обнаружен датчик BME280"); while (true) delay(10); // Блокируем выполнение, пока проблема не устранится } } void loop() { // Чтение данных с датчика float t = bme280.readTemperature(); // Измеряем температура float h = bme280.readHumidity(); // Измеряем влажность воздуха float p = bme280.readPressure() / 133.3F; // Высота относительно уровня моря // Отправка температуры в массив Temperature[6] = highByte((int)t); // Старший байт температуры Temperature[7] = lowByte((int)t); // Младший байт температуры mySerial.write(Temperature, 8); // Передача данных температуры через программный serial // Отправка температуры на монитор порта Serial.print("Температура = "); Serial.print(t); Serial.println(" °C"); // Отправка влажности в массив Humidity[6] = highByte((int)h); // Старший байт влажности Humidity[7] = lowByte((int)h); // Младший байт влажности mySerial.write(Humidity, 8); // Передача данных влажности через программный serial // Отправка влажности на монитор порта Serial.print("Относительная влажность = "); Serial.print(h); Serial.println(" %"); // Отправка давления Pressure[6] = highByte((int)p); // Старший байт давления Pressure[7] = lowByte((int)p); // Младший байт давления mySerial.write(Pressure, 8); // Передача данных давления через программный serial // Отправка давления на монитор порта Serial.print("Давление (вычисленная высота): "); Serial.print(p); Serial.println(" м"); delay (1000); // Пауза 1 секунду } |
Если все правильно сделали при открытия мониторинга порта увидим показания с датчика BME280

Описание скетча
Сначала подключаются необходимые библиотеки для работы с датчиком BME280 (Adafruit_BME280) и сенсорами вообще (Adafruit_Sensor).
1 2 |
#include <Adafruit_Sensor.h> #include <Adafruit_BME280.h> |
Для работы с дисплеем DWIN будем использовать программный последовательный порт, для этого подключаем библиотеку SoftwareSerial и указываем в каким портам подключен дисплей.
1 2 3 4 |
#include <SoftwareSerial.h> const byte rxPin = 2; const byte txPin = 3; SoftwareSerial mySerial(rxPin, txPin); |
Создается объект для работы с датчиком BME280.
1 |
Adafruit_BME280 bme280; |
Создаем три массива для передачи температуры, влажности и давления, в котором указываем адрес отображения, в моем случае это 0x10, 0x20 и 0x30
1 2 3 |
unsigned char Temperature[8] = {0x5A, 0xA5, 0x05, 0x82, 0x10, 0x00, 0x00, 0x00}; unsigned char Humidity[8] = {0x5A, 0xA5, 0x05, 0x82, 0x20, 0x00, 0x00, 0x00}; unsigned char Pressure[8] = {0x5A, 0xA5, 0x05, 0x82, 0x30, 0x00, 0x00, 0x00}; |
В функции setup, инициализируем два последовательного порта со скорость 115200 бит/с. и производится проверка доступности датчика BME280. Если датчик не найден, выводится сообщение об ошибке.
1 2 3 4 5 6 7 8 9 10 11 |
{ Serial.begin(115200); mySerial.begin(115200); // Проверяем подключение к датчику BME280 bool status = bme280.begin(0x76); if (!status) { Serial.println("Ошибка! Не обнаружен датчик BME280"); while (true) delay(10); } } |
Следующая командами считываем показания температуры, влажность и атмосферного давления с датчика BME280.
1 2 3 |
float t = bme280.readTemperature(); float h = bme280.readHumidity(); float p = bme280.readPressure() / 133.3F; |
Далее поочередно отправляем данные температуры, влажности и давления на дисплей DWIN и дублируем данные на последовательный порт, в конце делаем небольшую задержку в 1 секунду.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
Temperature[6] = highByte((int)t); Temperature[7] = lowByte((int)t); mySerial.write(Temperature, 8); Serial.print("Температура = "); Serial.print(t); Serial.println(" °C"); Humidity[6] = highByte((int)h); Humidity[7] = lowByte((int)h); mySerial.write(Humidity, 8); Serial.print("Относительная влажность = "); Serial.print(h); Serial.println(" %"); Pressure[6] = highByte((int)p); Pressure[7] = lowByte((int)p); mySerial.write(Pressure, 8); Serial.print("Давление (вычисленная высота): "); Serial.print(p); Serial.println(" м"); delay (1000); |
Настройка дисплея DWIN
В предыдущей публикации подробно описал процесс разработки прошивки для экрана в среде DGUS. Сейчас так описывать не стану, однако хочу отметить, что в данном проекте используются фон и шрифты без иконок. Если возникнут трудности с каким-либо инструментом, задавайте вопросы в комментариях.
Подготовка дисплея
Первым делом важно обратить внимание на небольшую перемычку, присутствующую практически на всех экранах. Эта перемычка определяет режим функционирования последовательного порта.

При установленной перемычке устанавливается режим TTL/UART (то есть 0-5В), тогда как разомкнутый контакт соответствует режиму RS232 (-12В — +12В). Дисплеи поступают с завода без установленной перемычки, следовательно, её потребуется соединить самостоятельно, например, путём пайки либо установки SMD-резистора сопротивлением 0 Ом.
Подготовка файлов для прошивки
В предыдущей статье писал о начальных этапах работы с дисплеем, настоятельно рекомендую ознакомиться с ней перед продолжением, так как полностью не буду описывать создание проекта. Для продолжения настройки, добавляем главную страницу.

Чтобы отображать необходимую информацию, воспользуемся инструментом — «Data variables».

Указываем место где будет отображаться температура, далее в поле «VP (0x)» задаем адрес «1000», в поле «Show colour» задаем цвет «FFFFF» (белый), в поле «Variable tyre» задаем «int (2 bytes)» и в последнем поле «integer digits» значение «2».

Указываем место где будет отображаться влажность, далее в поле «VP (0x)» задаем адрес «2000», в поле «Show colour» задаем цвет «FFFFF» (белый), в поле «Variable tyre» задаем «int (2 bytes)» и в последнем поле «integer digits» значение «2».

Указываем место где будет отображаться давление, далее в поле «VP (0x)» задаем адрес «3000», в поле «Show colour» задаем цвет «FFFFF» (белый), в поле «Variable tyre» задаем «int (2 bytes)» и в последнем поле «integer digits» значение «2».

Подготовка SD карты
Для прошивки дисплея DWIN необходимо SD-карта объемом от 1 гигабайта до 16 гигабайт. Использование карт большей емкости, например, на 32 гигабайта, приведет к невозможности загрузки прошивки.Первым делом необходимо отформатировать флешку, откройте раздел «Мой компьютер». Затем щелкните правой кнопкой мыши по пункту «SD карта» и выберите опцию «Форматировать…».

Далее установите файловую систему FAT32 и укажите размер кластера 4096 байт, затем нажмите кнопку «Начать».

Скопируйте ваш проект DWIN_SET на флешку.

Установите SD-карту и подключите питание.

Появится синий экран с надписями. Дождитесь появления строки «SD Card Process… END!» на дисплее. При успешной загрузке вы увидите такую информацию.

Подаем питание, если все правильно сделано, на дисплее отобразится информация температуры, влажности и давления.
