Датчик температуры и влажности DHT22 (AM2302)/DHT11 для Orange Pi

Описание и технические параметры датчика DHT22 (AM2302). Принцип работы и сравнение сенсоров. Подключение к Orange Pi с примером кода С.

Подключим датчик температуры и влажности к Orange Pi, напишем и скомпилируем фрагмент кода C, чтобы отобразить показания датчика.

Для этого проекта понадобится:

Датчик температуры и влажности DHT 22
Датчик температуры и влажности DHT 22

Описание датчика

DHT22 (AM2302)  представляет собой откалиброванный датчик влажности и температуры с цифровым выходом, для измерения используется емкостной датчик влажности и термистор, все показания передаются по цифровой информационной шине. Сверхмалый размер, низкое энергопотребление, дальность передачи сигнала до 20 метров. Сделало его лучшим выбором для всех видов приложений.

DHT22 имеет 3 вывода. Один предназначен для питания (VCC), другой — для выхода данных (DOUT), а третий — для заземления (GND).

Датчик температуры и влажности DHT22 (AM2302)/DHT11 для Orange Pi
Схема обвязки датчика температуры и влажности

Технические параметры

  • Модель: DHT22
  • Напряжение питания: 3.3 В … 5 В
  • Выходной сигнал: цифровой
  • Чувствительный элемент: полимерный конденсатор
  • Диапазон измерения влажности: 0 … 100%, погрешность ±2%
  • Диапазон измерения температуры:  -40°С … +80°С, погрешность  ±0.5°С
  • Задержка: 2с

Принцип работы датчика

DHT22 (AM2302) использует упрощенную технологию единой шины для связи, в которой для обмена и управления данными в системе применяется только одна линия данных. В приложениях обычно требуется внешний подтягивающий резистор, около 5,1 кОм. Когда шина свободна, ее статус переключится на HIGH. SDA используется для передачи данных и синхронизации между микропроцессором и AM2302. Он принимает формат данных с одной шиной, 40 бит данных в одной передаче, старший бит первым. Соответствующая временная диаграмма показана ниже.

Датчик температуры и влажности DHT22 (AM2302)/DHT11 для Orange Pi

НазваниеДанные по одной шине и формат сигнала
Start signal
(Стартовый сигнал )
Микропроцессор устанавливает SDA на LOW на период времени (не менее 800 мкс), чтобы информировать датчик для подготовки данных.
Response signal
(Ответный сигнал)
Датчик устанавливает SDA на LOW на 80 мкс, а затем на HIGH на 80 мкс, чтобы ответить на сигнал запуска.
Data format
(Формат данных)
После получения сигнала запуска датчик считывает строку данных (40 бит) через SDA, старший бит выводится сначала.
Humidity
(Влажность)
Разрешение по влажности 16 бит, старший бит первым; Значение, считываемое датчиком, в 10 раз превышает фактическую влажность.
Temp.
(Температура)
Разрешение по температуре составляет 16 бит, старший бит первый; Значение, считываемое датчиком, в 10 раз превышает фактическую температуру. Когда MSB (бит 15) равен «1», это указывает на отрицательную температуру; Когда MSB (бит 15) равен «0», это указывает на положительную температуру; Другие биты (бит 14 ~ бит 0) указывают на обнаруженное значение температуры.
Parity bit
(Бит четности)
Бит четности = влажность высокая + влажность низкая + температура высокая + температура низкая

Сравнение датчиков DHT22 и DHT11

Датчик температуры и влажности DHT22 (AM2302)/DHT11 для Orange Pi
Сравнение датчиков DHT22 и DHT11

Датчик DHT11:

  • определение влажности в диапозоне 20-80%
  • определение температуры от 0°C до +50°C
  • частота опроса 1 раз в секунду

Датчик DHT22:

  • определение влажности в диапазоне 0-100%
  • определение температуры от -40°C до +125°C
  • частота опроса 1 раз в 2 секунды

Подключение к Orange Pi

Для подключения будем использовать контакты GPIO. Orange Pi имеет 40 контактов GPIO. Можно использовать контакты GPIO для связи и передачи питания на светодиоды, датчики, двигатели и даже другие микроконтроллеры, такие как Arduino. Расположение выводов для Orange Pi, более подробно описано здесь .

Прежде всего, отключим питание Orange Pi при подключении датчиков. С помощью соединительных проводов соединим следующие контакты (датчик с пи):

  • DOUT к PIN 7 (GPCLK)
  • GND к PIN 6 (GND)
  • VCC к PIN 1 (VCC-3.3V)
Датчик температуры и влажности DHT22 (AM2302)/DHT11 для Orange Pi
Схема подключения DHT к Orange Pi

Настроив аппаратное обеспечение, нам нужно настроить программную часть.

Код C для выводов GPIO

Для того, чтобы прочитать данные , переданные с помощью датчика надо написать программу C. Для этого нам нужно установить библиотеку C, которая поможет получить доступ к выводам GPIO. Для Orange Pi соответствующая библиотека называется WiringOP . Установим его, выполнив команду в домашней папке:

git clone https://github.com/zhaolei/WiringOP.git -b h3

Затем, следуя инструкциям на Github, запустим:

cd WiringOP
chmod +x ./build
sudo ./build

Можно подтвердить расположение выводов, выполнив команду, которая выведет макет таблицы GPIO:

gpio readall

Теперь можно написать и скомпилировать скрипт C, который считывает данные с датчика. Вернемся в домашнюю папку и откроем файл C с именем dht с помощью nano:

cd
nano dht.c

Затем, запишем в файл:

#include <wiringPi.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
 
#define MAX_TIMINGS 85
#define DHT_PIN 7
int data[5] = { 0, 0, 0, 0, 0 };
 
void read_dht_data()
{
    uint8_t laststate    = HIGH;
    uint8_t counter        = 0;
    uint8_t j            = 0, i;
 
    data[0] = data[1] = data[2] = data[3] = data[4] = 0;
 
    /* pull pin down for 18 milliseconds */
    pinMode( DHT_PIN, OUTPUT );
    digitalWrite( DHT_PIN, LOW );
    delay( 18 );
 
    /* prepare to read the pin */
    pinMode( DHT_PIN, INPUT );
 
    /* detect change and read data */
    for ( i = 0; i < MAX_TIMINGS; i++ )
    {
        counter = 0;
        while ( digitalRead( DHT_PIN ) == laststate )
        {
            counter++;
            delayMicroseconds( 1 );
            if ( counter == 255 )
            {
                break;
            }
        }
        laststate = digitalRead( DHT_PIN );
 
        if ( counter == 255 )
            break;
 
        /* ignore first 3 transitions */
        if ( (i >= 4) && (i % 2 == 0) )
        {
            /* shove each bit into the storage bytes */
            data[j / 8] <<= 1;
            if ( counter > 16 )
                data[j / 8] |= 1;
            j++;
        }
    }
 
    /*
     * check we read 40 bits (8bit x 5 ) + verify checksum in the last byte
     * print it out if data is good
     */
 
    if ( (j >= 40) &&
         (data[4] == ( (data[0] + data[1] + data[2] + data[3]) & 0xFF) ) )
    {
        float h = (float)((data[0] << 8) + data[1]) / 10;
        if ( h > 100 )
        {
            h = data[0];    // for DHT11
        }
        float c = (float)(((data[2] & 0x7F) << 8) + data[3]) / 10;
        if ( c > 125 )
        {
            c = data[2];    // for DHT11
        }
        if ( data[2] & 0x80 )
        {
            c = -c;
        }
        float f = c * 1.8f + 32;
        printf( "Humidity = %.1f %% Temperature = %.1f *C (%.1f *F)\n", h, c, f );
    }
    else  {
       printf( "Data not good, skip\n" );
    }
}
 
int main( void )
{
    printf( "DHT22 temperature/humidity test\n" );
 
    if ( wiringPiSetup() == -1 )
        exit( 1 );
 
    while ( 1 )
    {
        read_dht_data();
        delay( 2000 ); /* wait 2 seconds before next read */
    }
    return(0);
}

Затем сохраним код с помощью Ctrl + O, закроем командой Ctrl + X и скомпилируем командой:

cc -Wall -o dht dht.c -lwiringPi

Чтобы выполнить, просто запустим:

sudo ./dht

Результат должен быть:

Датчик температуры и влажности DHT22 (AM2302)/DHT11 для Orange Pi

И готово, скрипт выводит влажность и температуру из DHT22!

Руководство пользователя и Datasheet

Купить датчик температуры и влажности DHT22/DHT11

Купить DHT22 датчик температуры и влажности
Купить DHT11 датчик температуры и влажности
40PIN Dupont
Оцените статью
( 1 оценка, среднее 5 из 5 )
PcMiniPro
Добавить комментарий

  1. net

    заебала скачущая реклама

    Ответить
    1. Sniffy автор

      Исправили )

      Ответить
  2. Alex

    Компилить лучше так (см.ниже). Без последних библиотек выдает ошибку.

    cc -Wall -o dht dht.c -lwiringPi -lwiringPiDev -pthread -lpthread

    Ответить
283 / 0,596 / 16.97mb