ESP32/ESP8266: Отображение температуры и влажности DHT на OLED-дисплее
Узнайте, как отображать показания температуры и влажности с датчика DHT11/DHT22 на OLED-дисплее SSD1306 с помощью ESP32 или ESP8266 в Arduino IDE.
Идея использования OLED-дисплея с ESP32 или ESP8266 состоит в том, чтобы показать, как можно создать физический пользовательский интерфейс для ваших плат.
Обзор проекта
В этом проекте мы будем использовать I2C SSD1306 128x64 OLED-дисплей, как показано на следующем изображении.
Температура и влажность будут измеряться с помощью датчика температуры и влажности DHT22 (вы также можете использовать DHT11).
Если вы не знакомы с датчиком DHT11/DHT22, рекомендуем прочитать следующее руководство:
Необходимые компоненты
Для этого руководства вам понадобятся следующие компоненты:
ESP32 или ESP8266 (читайте ESP32 vs ESP8266)
Вы можете использовать ссылки выше или перейти непосредственно на MakerAdvisor.com/tools, чтобы найти все компоненты для ваших проектов по лучшей цене!
Схема подключения
OLED-дисплей, который мы используем, взаимодействует по протоколу I2C, поэтому вам нужно подключить его к выводам I2C на ESP32 или ESP8266.
По умолчанию выводы I2C на ESP32:
GPIO 22: SCL
GPIO 21: SDA
Если вы используете ESP8266, выводы I2C по умолчанию:
GPIO 5 (D1): SCL
GPIO 4 (D2): SDA
Следуйте следующей схеме подключения, если вы используете плату ESP32:
Рекомендуемое чтение: Справочник по выводам ESP32
Если вы используете ESP8266, следуйте следующей схеме.
В данном случае мы подключаем вывод данных DHT к GPIO 14, но вы можете использовать любой другой подходящий GPIO.
Рекомендуемое чтение: Справочник по выводам ESP8266
Установка библиотек
Перед загрузкой кода необходимо установить библиотеки для работы с OLED-дисплеем и библиотеки для чтения данных с датчика DHT.
Установка библиотек OLED
Существует несколько библиотек для управления OLED-дисплеем с ESP8266. В этом руководстве мы будем использовать библиотеки от Adafruit: библиотеку Adafruit_SSD1306 и библиотеку Adafruit_GFX. Выполните следующие шаги для установки этих библиотек:
1. Откройте Arduino IDE и перейдите в Sketch > Include Library > Manage Libraries. Откроется менеджер библиотек.
2. Введите «SSD1306» в поле поиска и установите библиотеку SSD1306 от Adafruit.
3. После установки библиотеки SSD1306 от Adafruit введите «GFX» в поле поиска и установите библиотеку.
Установка библиотек датчика DHT
Для чтения данных с датчика DHT мы будем использовать библиотеки от Adafruit.
1. Откройте Arduino IDE и перейдите в Sketch > Include Library > Manage Libraries. Откроется менеджер библиотек.
2. Найдите «DHT» в поле поиска и установите библиотеку DHT от Adafruit.
3. После установки библиотеки DHT от Adafruit введите «Adafruit Unified Sensor» в поле поиска. Прокрутите вниз, чтобы найти библиотеку, и установите её.
Установка плат ESP
Мы будем программировать ESP32/ESP8266 с помощью Arduino IDE, поэтому у вас должно быть установлено дополнение ESP32/ESP8266 в вашей Arduino IDE. Если нет, сначала следуйте нужному руководству:
Установка платы ESP32 в Arduino IDE (инструкции для Windows)
Установка платы ESP32 в Arduino IDE (инструкции для Mac OS X и Linux)
После установки перезапустите Arduino IDE.
Код
После установки необходимых библиотек вы можете скопировать следующий код в Arduino IDE и загрузить его на плату ESP32 или ESP8266.
/*********
Rui Santos
Complete project details at https://randomnerdtutorials.com
*********/
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Adafruit_Sensor.h>
#include <DHT.h>
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
#define DHTPIN 14 // Digital pin connected to the DHT sensor
// Uncomment the type of sensor in use:
//#define DHTTYPE DHT11 // DHT 11
#define DHTTYPE DHT22 // DHT 22 (AM2302)
//#define DHTTYPE DHT21 // DHT 21 (AM2301)
DHT dht(DHTPIN, DHTTYPE);
void setup() {
Serial.begin(115200);
dht.begin();
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 allocation failed"));
for(;;);
}
delay(2000);
display.clearDisplay();
display.setTextColor(WHITE);
}
void loop() {
delay(5000);
//read temperature and humidity
float t = dht.readTemperature();
float h = dht.readHumidity();
if (isnan(h) || isnan(t)) {
Serial.println("Failed to read from DHT sensor!");
}
// clear display
display.clearDisplay();
// display temperature
display.setTextSize(1);
display.setCursor(0,0);
display.print("Temperature: ");
display.setTextSize(2);
display.setCursor(0,10);
display.print(t);
display.print(" ");
display.setTextSize(1);
display.cp437(true);
display.write(167);
display.setTextSize(2);
display.print("C");
// display humidity
display.setTextSize(1);
display.setCursor(0, 35);
display.print("Humidity: ");
display.setTextSize(2);
display.setCursor(0, 45);
display.print(h);
display.print(" %");
display.display();
}
Как работает код
Давайте кратко рассмотрим, как работает код.
Импорт библиотек
Код начинается с подключения необходимых библиотек. Wire, Adafruit_GFX и Adafruit_SSD1306 используются для взаимодействия с OLED-дисплеем. Adafruit_Sensor и DHT используются для взаимодействия с датчиками DHT22 или DHT11.
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Adafruit_Sensor.h>
#include <DHT.h>
Создание объекта дисплея
Затем определите размеры OLED-дисплея. В данном случае мы используем дисплей 128x64 пикселей.
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
Затем инициализируйте объект дисплея с шириной и высотой, определёнными ранее, с протоколом связи I2C (&Wire).
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
Параметр (-1) означает, что ваш OLED-дисплей не имеет вывода RESET. Если ваш OLED-дисплей имеет вывод RESET, он должен быть подключён к GPIO. В этом случае передайте номер GPIO в качестве параметра.
Создание объекта DHT
Затем определите тип используемого датчика DHT. Если вы используете DHT22, вам не нужно ничего менять в коде. Если вы используете другой датчик, просто раскомментируйте нужный датчик и закомментируйте остальные.
//#define DHTTYPE DHT11 // DHT 11
#define DHTTYPE DHT22 // DHT 22 (AM2302)
//#define DHTTYPE DHT21 // DHT 21 (AM2301)
Инициализируйте объект датчика DHT с выводом и типом, определёнными ранее.
DHT dht(DHTPIN, DHTTYPE);
setup()
В функции setup() инициализируйте последовательный монитор для отладки.
Serial.begin(115200);
Инициализируйте датчик DHT:
dht.begin();
Затем инициализируйте OLED-дисплей.
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Address 0x3D for 128x64
Serial.println(F("SSD1306 allocation failed"));
for(;;);
}
В данном случае адрес OLED-дисплея, который мы используем, — 0x3C. Если этот адрес не работает, вы можете запустить скетч I2C-сканера, чтобы найти адрес вашего OLED-дисплея. Скетч I2C-сканера можно найти здесь.
Добавьте задержку для инициализации дисплея, очистите дисплей и установите белый цвет текста:
delay(2000);
display.clearDisplay();
display.setTextColor(WHITE)
В функции loop() мы читаем данные с датчика и отображаем температуру и влажность на дисплее.
Получение показаний температуры и влажности от DHT
Температура и влажность сохраняются в переменных t и h соответственно. Чтение температуры и влажности выполняется с помощью методов readTemperature() и readHumidity() объекта dht.
float t = dht.readTemperature();
float h = dht.readHumidity();
Если не удаётся получить показания, выводится сообщение об ошибке:
if (isnan(h) || isnan(t)) {
Serial.println("Failed to read from DHT sensor!");
}
Если вы получаете это сообщение об ошибке, прочитайте наше руководство по устранению неполадок: как исправить «Failed to read from DHT sensor».
Отображение показаний датчика на OLED-дисплее
Следующие строки отображают температуру на OLED-дисплее.
display.setTextSize(1);
display.setCursor(0,0);
display.print("Temperature: ");
display.setTextSize(2);
display.setCursor(0,10);
display.print(t);
display.print(" ");
display.setTextSize(1);
display.cp437(true);
display.write(167);
display.setTextSize(2);
display.print("C");
Мы используем метод setTextSize() для определения размера шрифта, setCursor() устанавливает начальную позицию текста, а метод print() используется для записи данных на дисплей.
Для вывода температуры и влажности достаточно передать их переменные в метод print():
display.print(t);
Метка «Temperature» отображается размером 1, а само значение — размером 2.
Для отображения символа градуса (°) мы используем шрифт Code Page 437. Для этого нужно установить cp437 в true:
display.cp437(true);
Затем используйте метод write() для отображения выбранного символа. Символ ° соответствует символу 167.
display.write(167);
Аналогичный подход используется для отображения влажности:
display.setTextSize(1);
display.setCursor(0, 35);
display.print("Humidity: ");
display.setTextSize(2);
display.setCursor(0, 45);
display.print(h);
display.print(" %");
Не забудьте вызвать display.display() в конце, чтобы фактически отобразить данные на OLED.
display.display();
Рекомендуемое чтение: ESP32 с датчиком DHT11/DHT22 температуры и влажности в Arduino IDE
Демонстрация
На следующем изображении показано, что вы должны получить в конце этого руководства. Показания влажности и температуры отображаются на OLED-дисплее.
Устранение неполадок
Если ваш датчик DHT не может получить показания или вы видите сообщение «Failed to read from DHT sensor», прочитайте наше **руководство по устранению неполадок DHT**, которое поможет решить эту проблему.
Если вы получаете ошибку «SSD1306 allocation failed» или OLED-дисплей ничего не отображает, это может быть одна из следующих проблем:
Неправильный I2C-адрес
I2C-адрес OLED-дисплея, который мы используем, — 0x3C. Однако ваш может отличаться. Поэтому убедитесь, что вы проверили I2C-адрес вашего дисплея с помощью скетча I2C-сканера.
SDA и SCL подключены неправильно
Пожалуйста, убедитесь, что выводы SDA и SCL OLED-дисплея подключены правильно. Если вы используете:
ESP32: подключите SDA к GPIO 21 и SCL к GPIO 22
ESP8266: подключите SDA к GPIO 4 (D2) и SCL к GPIO 5 (D1)
Заключение
Надеемся, что это руководство по отображению показаний датчиков на OLED-дисплее было полезным. OLED-дисплей — отличный способ добавить пользовательский интерфейс в ваши проекты. Если вам понравился этот проект, вам также может быть интересно узнать, как отображать показания датчиков в браузере с помощью веб-сервера ESP:
Вы можете узнать больше об ESP32 и ESP8266 из наших курсов:
Примечание
Данная статья является переводом оригинальной публикации ESP32/ESP8266: DHT Temperature and Humidity Readings in OLED Display с сайта Random Nerd Tutorials, автор — Rui Santos.