Метеостанции на 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. Для удобства вывел схему подключения ниже.

Скетч можно изменить и использовать не программный последовательный порт, а железный D0 и D1 но при прошивке Arduino необходимо отключать выводы D0 и D1 от дисплея иначе прошить не получится.

Установка библиотеки

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

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

Программа

Запустите программу Arduino IDE, вставьте приведенный ниже код и загрузите его на вашу плату Arduino UNO.

#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).

#include <Adafruit_Sensor.h>          
#include <Adafruit_BME280.h>                  

Для работы с дисплеем DWIN будем использовать программный последовательный порт, для этого подключаем библиотеку SoftwareSerial и указываем в каким портам подключен дисплей.

#include <SoftwareSerial.h>  
const byte rxPin = 2;                 
const byte txPin = 3; 
SoftwareSerial mySerial(rxPin, txPin);                

Создается объект для работы с датчиком BME280.

Adafruit_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};     

В функции setup, инициализируем два последовательного порта со скорость 115200 бит/с. и производится проверка доступности датчика BME280. Если датчик не найден, выводится сообщение об ошибке.

{
  Serial.begin(115200);                
  mySerial.begin(115200);             

  // Проверяем подключение к датчику BME280
  bool status = bme280.begin(0x76);    
  if (!status) {
    Serial.println("Ошибка! Не обнаружен датчик BME280");
    while (true) delay(10);           
  }
}

Следующая командами считываем показания температуры, влажность и атмосферного давления с датчика BME280.

float t = bme280.readTemperature();      
  float h = bme280.readHumidity();           
  float p = bme280.readPressure() / 133.3F;  

Далее поочередно отправляем данные температуры, влажности и давления на дисплей DWIN и дублируем данные на последовательный порт, в конце делаем небольшую задержку в 1 секунду.

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!» на дисплее. При успешной загрузке вы увидите такую информацию.

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

Полезные ссылки

Вам может также понравиться...

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *