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.