Подключение датчика температуры и влажности DHT11 к Arduino

В этой статье рассматривается работа с сенсором температуры и влажности, сделанном на базе датчика DHT11.

Сигнал

Этот сенсор имеет цифровой сигнал. И температура и влажность отдаются им по одному сигнальному проводу (S). DHT11 общается с принимающей стороной, такой как Arduino по собственному протоколу. Коммуникация двунаправлена и в общих чертах выглядит так:

  1. Микроконтроллер говорит о том, что хочет считать показания. Для этого он устанавливает сигнальную линию в 0 на некоторое время, а затем устанавливает её в 1
  2. Сенсор подтверждает готовность отдать данные. Для этого он аналогично сначала устанавливает сигнальную линию в 0, затем в 1
  3. После этого сенсор передаёт последовательность 0 и 1, последовательно формирующих 5 байт (40 бит). В первых двух байтах передаётся температура, в третьем-четвёртом — влажность, в пятом — контрольная сумма, чтобы микроконтроллер смог убедиться в отсутствии ошибок считывания

Благодаря тому, что сенсор делает измерения только по запросу, достигается энергоэффективность: пока общения нет, датчик потребляет очень небольшой ток.

Подключение

Сенсор имеет стандартный 3-проводной интерфейс и поэтому может быть легко подключен к IO Shield.

Несмотря на то, что DHT11 является цифровым, его коннектор и кабель распаяны так, что подходят для подключения только к аналоговым контактам на IO Shield. Это решение производителя связано с тем, что ранее существовали проблемы при подключении сенсора к цифровым контактам ATmega328p. В силу того, что аналоговые контакты могут также работать как цифровые, это не является большой проблемой. Однако если все они заняты, вы можете подключить сенсор к любому цифровому контакту, но для этого придётся либо самостоятельно переобжать кабель, либо сделать корректную разводку на breadboard’е.

Программирование

Для считывания данных датчика DTH11 с помощью Arduino, существует готовая библиотека. Она избавляет вас от необходимости задумываться о деталях протокола. Для её установки, как указано в файле README, скопируйте директорию lib/dht в директрорию libraries своего Arduino IDE.

После этого вы можете использовать простой интерфейс для общения с сенсором:

dht.pde
// подключаем библиотеку
#include <dht.h>
 
// создаём объект-сенсор
DHT sensor = DHT();
 
void setup()
{
    Serial.begin(9600);
 
    // методом attach объявляем к какому контакту подключен
    // сенсор. В нашем примере это нулевой аналоговый контакт
    sensor.attach(A0);
    //
    // после подачи питания ждём секунду до готовности сенсора к работе
    delay(1000);
}
 
void loop()
{
    // метод update заставляет сенсор выдать текущие измерения
    sensor.update();
 
    switch (sensor.getLastError())
    {
        case DHT_ERROR_OK:
            char msg[128];
            // данные последнего измерения можно считать соответствующими
            // методами
            sprintf(msg, "Temperature = %dC, Humidity = %d%%", 
                    sensor.getTemperatureInt(), sensor.getHumidityInt());
            Serial.println(msg);
            break;
        case DHT_ERROR_START_FAILED_1:
            Serial.println("Error: start failed (stage 1)");
            break;
        case DHT_ERROR_START_FAILED_2:
            Serial.println("Error: start failed (stage 2)");
            break;
        case DHT_ERROR_READ_TIMEOUT:
            Serial.println("Error: read timeout");
            break;
        case DHT_ERROR_CHECKSUM_FAILURE:
            Serial.println("Error: checksum error");
            break;
    }
 
    delay(2000);
}

Эта программа выводит на компьютер показания сенсора каждые 2 секунды