Датчик DHT11 является недорогим цифровым датчиком для измерения температуры и относительной влажности воздуха.
dht11
Диапазон измерения температуры составляет от 0 до +50 °С, влажности — от 20 до 90%. Датчик характеризуется низким энергопотреблением — до 2,5 мA.
Учитывая большую погрешность при измерении подходит для любительских тестов. Существенным недостатком датчика является то, что он может регистрировать температуры выше 0 градусов.
Датчик DHT22 является более дорогим вариантом и имеет улучшенные характеристики по сравнению с DHT11.
dht22
Диапазон измерения температуры составляет от -40 до +125 °С, влажности — от 0 до 100%. Рабочее напряжение составляет от 3 до 5 вольт, максимальный ток 2.5 mA.

Сравнительная характеристика датчиков DHT11 и DHT22

Параметр DHT11 DHT22
Диапазон температуры 0 — 50 -40 — +125
Диапазон влажности 20-80% 0-100%
Частота выборки 1,0 Hz 0,5 Hz
Вольтаж 3-5V 3-5V
Ток 2,5 mA 2,5 mA

Принцип работы датчика температуры/влажности

Датчик состоит из резистивного влагочувствительного компонента и температурочувствительного компонента (NTC-термистор).

dht22

Термистор является переменным резистором, который изменяет свое сопротивление при изменении температуры. Датчики изготовлены путем соединения полупроводниковых материалов, таких как керамика или полимеры.

dht22

Калибровка датчика осуществляется в высокоточной калибровочной камере. Коэффициенты калибровки сохраняются в OTP памяти и вызываются во время считывания сигнала с датчика.

Необходимые детали и материалы

Arduino Nano CH340

arduino_nano

Дисплей для Arduino 1602LCD на микросхеме Hitachi HD44780

1602_LED_display_44780

Плата последовательного интерфейса IIC/I2C/TWI/SP​​I для 1602LCD дисплея

I2c

Спецификация
  • I2C адрес: 0x20~0x27 (оригинальный 0X20)
  • Питание: 5V
  • Регулируемая контрастность с помощью потенциометра

I2c

Датчик DHT11 или DHT22

dht11_dht22

Резистор 10 кОМ

resistor

Для подключения датчика к Arduino между 1 и 2 ножкой необходимо поставить резистор номиналом 10 кОм.

Соединительные кабели

cables

Схема подключения

schema_dht22

Пояснительная таблица

l2C плата Arduino Датчик DHT11
GND GND 4
VCC 5V 1
SDA A4
SCL A5
A0 2

Скетч для загрузки в Arduino

Необходимые библиотеки

LiquidCrystal.h
DHT.h


#include <FastIO.h>
#include <I2CIO.h>
#include <LCD.h>
#include <LiquidCrystal.h>
#include <LiquidCrystal_I2C.h>
#include <LiquidCrystal_SR.h>
#include <LiquidCrystal_SR2W.h>
#include <LiquidCrystal_SR3W.h>
#include <DHT.h>

#define DHTPIN 2 // к какому пину будет подключен сигнальный выход датчика
#define DHTTYPE DHT22 // DHT 22 (AM2302)

//инициализация датчика
DHT dht(DHTPIN, DHTTYPE);

byte temp[8] = //код иконки термометра
{
   0b01110,
   0b01010,
   0b01010,
   0b01010,
   0b01110,
   0b01110,
   0b01110,
   0b00000
};
  
byte hum[8] = //код иконки влажности
{
    B00100,
    B00100,
    B01010,
    B01010,
    B10001,
    B10001,
    B10001,
    B01110,
};

// Задаем адрес и размерность дисплея
LiquidCrystal_I2C  lcd(0x3F,2,1,0,4,5,6,7); 

void setup()
{
// Активируем LCD модуль
  lcd.begin (16,2); // for 16 x 2 LCD module
  lcd.setBacklightPin(3,POSITIVE);
  lcd.setBacklight(HIGH);

  lcd.createChar(1,temp);
  lcd.createChar(2,hum);
  
dht.begin();
}

void loop() {
  float h = dht.readHumidity();
  float t = dht.readTemperature();

// Выводим показания влажности и температуры

lcd.setCursor(0, 0);
lcd.print("Temp  ");
 lcd.write(1);
 lcd.setCursor(8, 0);
 lcd.print(t);
 lcd.print( (char)223);
 lcd.print("C");

lcd.setCursor(0, 1);
lcd.print("Hum   ");
  lcd.write(2);
  lcd.setCursor(8, 1);
  lcd.print(h);
  lcd.print(" %");
  delay(2000);
}

arduino

Генератор символов для LCD HD44780

Результат нашей работы:

hd44780_lcd1602

Сканер интерфейса I2C

Для определения 7-битного адреса контроллера и корректного вывода информации на дисплей используем код:

#include  <Wire.h>

void setup() {

  // put your setup code here, to run once:
Serial.begin(9600);
 while (!Serial) 
    {
    }

  Serial.println ();
  Serial.println ("I2C scanner. Scanning ...");
  byte count = 0;
  
  Wire.begin();
  for (byte i = 8; i < 120; i++)
  {
    Wire.beginTransmission (i);
    if (Wire.endTransmission () == 0)
      {
      Serial.print ("Found address: ");
      Serial.print (i, DEC);
      Serial.print (" (0x");
      Serial.print (i, HEX);
      Serial.println (")");
      count++;
      delay (1);  // maybe unneeded?
      } // end of good response
  } // end of for loop
  Serial.println ("Done.");
  Serial.print ("Found ");
  Serial.print (count, DEC);
  Serial.println (" device(s).");
}  // end of setup

void loop() {}

Для просмотра I2C адреса открываем "Инструменты" > "Монитор порта". Если все подключено правильно увидим результат:

I2C scanner. Scanning…
Found address: 39 (0x27)
Done.
Found 1 device(s).

В строке LiquidCrystal_I2C lcd(0x3F,2,1,0,4,5,6,7); меняем I2C адрес c 0x3F на 0x27 согласно данным сканера.