DHT12 — это улучшенная версия датчика температуры и влажности DHT11 с интерфейсом I2C/TWI. Более подробное описание этого модуля можете найти на странице DHT12 — I2C датчик влажности и температуры. А в этом посте мы подключим по I2C датчик DHT12 к Arduino, установим необходимую библиотеку и будем выводить значения в последовательный порт компьютера и на дисплей LCD1602 используя I2C модуль — PCF8574.
Установка библиотеки DHT12
Для работы с датчиком я использую библиотеку DHT12.zip. Библиотеку можно установить из самой среды следующим образом:
- В Arduino IDE открываем менеджер библиотек: Скетч->Подключить библиотеку->Добавить .ZIP библиотеку…

- Выбираем .ZIP архив (DHT12.zip) и кликаем Open/Открыть.

- Библиотека установлена.

Ещё можно распаковать архив и добавить в папку «libraries» в папке с Arduino IDE. Не забывайте перезагрузить среду, если на момент добавления Arduino IDE была открыта.
Описание методов библиотеки DHT12.zip
begin(uint8_t, uint8_t)
Инициализация DHT12 на ESP8266
void begin(uint8_t sda, uint8_t scl);
begin()
Инициализация DHT12
void begin();
read()
Читает, преобразовывает и сохраняет данные с DHT12. Возвращает статус DHT12_OK, если всё прошло нормально или DHT12_ERROR_CHECKSUM, DHT12_ERROR_CONNECT, DHT12_MISSING_BYTES в случае ошибки.
int8_t read();
getHumidity()
Возвращает относительную влажность. Данные обновляются при вызове метода read().
float getHumidity();
getTemperature()
Возвращает температуру. Данные обновляются при вызове метода read().
float getTemperature();
Схема подключения DHT12 к Arduino
Подключается датчик температуры и влажности DHT12 к Arduino достаточно просто. Схема подключения показана на рисунке.
Не нужно забывать про подтягивающие резисторы на 10кОм на линии SDA и SCL.
| Arduino | DHT12 |
|---|---|
| VCC | VCC |
| A4 | SDA |
| GND | GND |
| A5 | SCL |
Пример скетча
В приведенном ниже скетче мы будем измерять и отсылать данные о состоянии температуры и влажности на компьютер через последовательный порт.
/*
Добавляем необходимые библиотеки
*/
#include <DHT12.h>
/*
Создаём экземпляр класса DHT12
*/
DHT12 dht12;
void setup() {
/*
Инициализируем DHT12
*/
dht12.begin();
Serial.begin(9600);
delay(2000);
}
void loop() {
/*
Читаем данные с DHT12 и получаем статус
*/
int status = dht12.read();
switch (status) {
case DHT12_OK:
/*
Выводим данные в терминал
*/
Serial.println(F("Status : OK"));
Serial.print(F("T = "));
Serial.print(dht12.getTemperature());
Serial.println(F("*C"));
Serial.print(F("H = "));
Serial.print(dht12.getHumidity());
Serial.println(F(" %"));
break;
case DHT12_ERROR_CHECKSUM:
Serial.print(F("Checksum error"));
break;
case DHT12_ERROR_CONNECT:
Serial.print(F("Connect error"));
break;
case DHT12_MISSING_BYTES:
Serial.print(F("Missing bytes"));
break;
default:
Serial.print(F("Unknown error"));
break;
}
delay(2000);
}
Результат
Открываем монитор порта. В него будут выводиться значения влажности и температуры.
Подключение DHT12 к Arduino и вывод на LCD1602
Чтобы сделать устройство автономным, мы будем выводить данные на ЖК дисплей, в моём случае — это LCD1602 (два ряда по 16 символов) который управляется по интерфейсу I2C (PCF8574). Для подключения данного LCD модуля требуется всего 4 линии: питания (Vcc), земля (GND), последовательная линия данных SDA (Serial Data) и последовательная линия тактирования SCL (Serial CLock). Подробнее в статье Подключение LCD1602 к Arduino по I2C (HD44780/PCF8574).
Схема подключения LCD1602 и DHT12 к Arduino
Схема подключения ЖК, DHT12 и Arduino Pro Mini выглядит следующим образом:
В данном случае можно не использовать дополнительные подтягивающие резисторы, так как они присутствуют на модуле PCF8574.
Пример скетча
В приведенном ниже скетче мы будем измерять и отсылать данные о состоянии температуры и влажности по I2C на ЖК дисплей.
/*
Добавляем необходимые библиотеки
*/
#include <DHT12.h>
#include <LiquidCrystal_I2C.h>
#define DEGREE (char)0
/*
Создаём знак градуса
..OO.
.O..O
.O..O
..OO.
.....
.....
.....
*/
uint8_t degree[8] = {
0b00110,
0b01001,
0b01001,
0b00110,
0b00000,
0b00000,
0b00000
};
/*
Создаём экземпляр класса DHT12
*/
DHT12 dht12;
/*
Устанавливаем ЖК-дисплей по адресу 0x27, 16 символов и 2 строки
*/
LiquidCrystal_I2C lcd(0x27, 16, 2);
void setup() {
/*
Инициализируем DHT12
*/
dht12.begin();
/*
Инициализируем ЖК-дисплей
*/
lcd.init();
/*
Включаем подсветку дисплея
*/
lcd.backlight();
/*
Добавляем символ градуса
*/
lcd.createChar(DEGREE, degree);
}
void loop() {
/*
Читаем данные с DHT12 и получаем статус
*/
int status = dht12.read();
lcd.clear();
switch (status) {
case DHT12_OK:
/*
Выводим данные на дисплей
*/
lcd.setCursor(0, 0);
lcd.print(F("T = "));
lcd.print(dht12.getTemperature());
lcd.print(DEGREE);
lcd.print(F("C"));
lcd.setCursor(0, 1);
lcd.print(F("H = "));
lcd.print(dht12.getHumidity());
lcd.print(F(" %"));
break;
case DHT12_ERROR_CHECKSUM:
lcd.setCursor(0, 0);
lcd.print(F("Checksum error"));
break;
case DHT12_ERROR_CONNECT:
lcd.setCursor(0, 0);
lcd.print(F("Connect error"));
break;
case DHT12_MISSING_BYTES:
lcd.setCursor(0, 0);
lcd.print(F("Missing bytes"));
break;
default:
lcd.setCursor(0, 0);
lcd.print(F("Unknown error"));
break;
}
delay(2000);
}
Результат
Материалы
DHT12 — I2C датчик влажности и температуры
Подключение LCD1602 к Arduino по I2C (HD44780/PCF8574)
LiquidCrystal_I2C

