Сегодня рассмотрим датчики DHT11 и DHT22, а также сделаем тестовый проект в котором будем измерять температуру и влажность.
Возможно тема уже «расжована» вдоль и поперек, но полагаю лишним не будет тестовый проект.
Немного о датчиках:
Датчики DH11 и DH22 не отличаются высоким быстродействием, однако могут найти свое применение в радиолюбительских проектах из-за своей невысокой стоимости. Датчики состоят из емкостного датчика влажности и термистора.
Датчик DHT имеет 4 вывода стандарта 2,54 мм:
1 — VDD (от 3В до 5 В);
2 — DATA (данные);
3 — NC;
4 — GND (общий).
Протокол обмена — однопроводный, по структуре очень похож на DS18B20, но очень упрощённый и неимеет возможности соединения датчиков в сеть (подключение на одну линию) — каждый датчик должен подключен к отдельному выводу.
DHT11:
• питание и I/O: 3–5 В;
• определение влажности 20–80 % с точностью 5 %;
• определение температуры 0–50 °С с точностью 2 %;
• частота опроса не более 1 Гц (не более одного раза в 1 сек.);
DHT22:
• питание и I/O: 3–5 В;
• определение влажности 0–100 % с точностью 2–5 %;
• определение температуры –40…+125 °С с точностью ±0,5 °С;
• частота опроса не более 0,5 Гц (не более одного раза в 2 сек);
Как видно из характеристик датчик DHT22 лучше, но он немного и дороже. Например если DHT11 на AliExpress можно купить за 25-30грн то за DHT22 уже придется отдать раза в два больше 55-60грн.
Перейдем к нашему тестовому проекту и коду соответственно.
Схема тестового стенда предоставлена ниже, она имеет минимум элементов.
Приведу здесь часть кода, которая отвечает за общение с датчиком:
#define DHT_PORT PORTD #define DHT_DDR DDRD #define DHT_PIN PIND #define DHT_BIT 1 uint8_t data[5]={0,0,0,0,0}; int read_dht_hum() //функция чтения данных датчика { unsigned char i,j; //=============MCU send START DHT_DDR|=(1<<DHT_BIT); //pin as output DHT_PORT&=~(1<<DHT_BIT); //0 delay_ms(18); DHT_PORT|=(1<<DHT_BIT); //1 DHT_DDR&=~(1<<DHT_BIT); //pin as input //=============check DHT11 response delay_us(50); if (DHT_PIN&(1<<DHT_BIT)) { return 0; } delay_us(80); if (!(DHT_PIN&(1<<DHT_BIT))) { return 0; } //===============receive 40 data bits while (DHT_PIN&(1<<DHT_BIT)); for (j=0; j<5; j++) { data[j]=0; for(i=0; i<8; i++) { while (!(DHT_PIN&(1<<DHT_BIT))); delay_us (30); if (DHT_PIN&(1<<DHT_BIT)) data[j]|=1<<(7-i); while (DHT_PIN&(1<<DHT_BIT)); } } return 1; //DHT11 data[0]-humidity, data[2]-temperature //DHT22 data[0]-data[1]-humidity, data[2]-data[3]-temperature }
В приложенной ниже программе реализована работа с датчиком DHT11, а так же с датчиком DHT22. Переключение между датчиками происходит при компиляции в #define.
Скачать проект примера работы с DHT11 и DHT22 в CVAVR Скачали 4244 раз
Ого как все запущено…
товарисч, вы забыли сделать фото собранной схемы
нихрена не работает функция одни нолики выдает что я не так делаю?