DHT22 (AM2302) представляет собой откалиброванный датчик влажности и температуры с цифровым выходом, для измерения используется емкостной датчик влажности и термистор, все показания передаются по цифровой информационной шине. Сверхмалый размер, низкое энергопотребление, дальность передачи сигнала до 20 метров. Сделало его лучшим выбором для всех видов приложений.
DHT22 имеет 3 вывода. Один предназначен для питания (VCC), другой — для выхода данных (DOUT), а третий — для заземления (GND).
Технические параметры
Модель: DHT22
Напряжение питания: 3.3 В … 5 В
Выходной сигнал: цифровой
Чувствительный элемент: полимерный конденсатор
Диапазон измерения влажности: 0 … 100%, погрешность ±2%
Диапазон измерения температуры: -40°С … +80°С, погрешность ±0.5°С
Задержка: 2с
Принцип работы датчика
DHT22 (AM2302) использует упрощенную технологию единой шины для связи, в которой для обмена и управления данными в системе применяется только одна линия данных. В приложениях обычно требуется внешний подтягивающий резистор, около 5,1 кОм. Когда шина свободна, ее статус переключится на HIGH. SDA используется для передачи данных и синхронизации между микропроцессором и AM2302. Он принимает формат данных с одной шиной, 40 бит данных в одной передаче, старший бит первым. Соответствующая временная диаграмма показана ниже.
Название
Данные по одной шине и формат сигнала
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
Датчик 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)
Настроив аппаратное обеспечение, нам нужно настроить программную часть.
Код C для выводов GPIO
Для того, чтобы прочитать данные , переданные с помощью датчика надо написать программу C. Для этого нам нужно установить библиотеку C, которая поможет получить доступ к выводам GPIO. Для Orange Pi соответствующая библиотека называется WiringOP . Установим его, выполнив команду в домашней папке:
Можно подтвердить расположение выводов, выполнив команду, которая выведет макет таблицы 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!
заебала скачущая реклама
Компилить лучше так (см.ниже). Без последних библиотек выдает ошибку.
cc -Wall -o dht dht.c -lwiringPi -lwiringPiDev -pthread -lpthread