ESP32/ESP8266: Отображение температуры и влажности DHT на OLED-дисплее

Узнайте, как отображать показания температуры и влажности с датчика DHT11/DHT22 на OLED-дисплее SSD1306 с помощью ESP32 или ESP8266 в Arduino IDE.

ESP32 ESP8266 отображение температуры и влажности DHT11 DHT22 на OLED-дисплее

Идея использования OLED-дисплея с ESP32 или ESP8266 состоит в том, чтобы показать, как можно создать физический пользовательский интерфейс для ваших плат.

Обзор проекта

В этом проекте мы будем использовать I2C SSD1306 128x64 OLED-дисплей, как показано на следующем изображении.

I2C SSD1306 128x64 0.96 дюйма OLED-дисплей для ESP32 ESP8266

Температура и влажность будут измеряться с помощью датчика температуры и влажности DHT22 (вы также можете использовать DHT11).

Датчик температуры и влажности DHT11 DHT22 для ESP32 ESP8266

Если вы не знакомы с датчиком DHT11/DHT22, рекомендуем прочитать следующее руководство:

Необходимые компоненты

Для этого руководства вам понадобятся следующие компоненты:

Вы можете использовать ссылки выше или перейти непосредственно на 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 OLED DHT11 DHT22

Рекомендуемое чтение: Справочник по выводам ESP32

Если вы используете ESP8266, следуйте следующей схеме.

Схема подключения ESP8266 OLED DHT11 DHT22

В данном случае мы подключаем вывод данных 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.

Установка библиотеки SSD1306 Adafruit в Arduino IDE

3. После установки библиотеки SSD1306 от Adafruit введите «GFX» в поле поиска и установите библиотеку.

Установка библиотеки GFX Adafruit в Arduino IDE

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

Для чтения данных с датчика DHT мы будем использовать библиотеки от Adafruit.

1. Откройте Arduino IDE и перейдите в Sketch > Include Library > Manage Libraries. Откроется менеджер библиотек.

2. Найдите «DHT» в поле поиска и установите библиотеку DHT от Adafruit.

Установка библиотеки Adafruit DHT в Arduino IDE

3. После установки библиотеки DHT от Adafruit введите «Adafruit Unified Sensor» в поле поиска. Прокрутите вниз, чтобы найти библиотеку, и установите её.

Установка библиотеки Adafruit Unified Sensor в Arduino IDE

Установка плат ESP

Мы будем программировать ESP32/ESP8266 с помощью Arduino IDE, поэтому у вас должно быть установлено дополнение ESP32/ESP8266 в вашей Arduino IDE. Если нет, сначала следуйте нужному руководству:

После установки перезапустите 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-дисплее.

Отображение показаний температуры и влажности DHT11 DHT22 на OLED-дисплее ESP8266 ESP32

Устранение неполадок

Если ваш датчик 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.