Из серии статей про измерения температуры незаслуженно выпал сенсор DHT11, представляющий собой недорогой цифровой датчик температуры и влажности в одном корпусе:
В принципе - одновременно измерять температуру и относительную влажность выглядит логично, поскольку второе напрямую зависит от первого. Стоит только начать работать батареям центрального отопления, как температура в квартире повышается, а вот количество влаги в воздухе - нет, оттого и говорят, что, мол, "батареи сушат воздух". Правильнее - "нагревают" и, таким образом, понижают относительную влажность.
Насколько важна влажность в помещении? Считается, что оптимум лежит около 50% - именно при такой влажности растения, люди и животные будут чувствовать себя комфортно. В частности - люди меньше болеют вирусными заболеваниями, а растения не рискуют превратиться в экибану.
Вот так устроен этот датчик внутри (а ведь он заменяет собой целый психрометр):
С одной стороны микроплатки - аналоговый сенсор, с другой - микросхема, оцифровывающая измерения и реализующая интерфейс с MCU.
Протокол обмена - однопроводный, по структуре сильно похож на DS18B20, но с важными оговорками:
- DHT11 не умеет работать в "паразитном" режиме (питание по линии данных);
- каждый DS18B20 имеет персональный идентификатор, что дает возможность подключения нескольких таких датчиков к одному пину Arduino - у DHT11 такой возможности нет - один датчик будет использовать строго один цифровой пин.
DHT11 медленнее конвертирует измеренные значения - считывать их можно не чаще, чем раз в секунду. Погрешность у него тоже больше:
Показатель | DS18B20 | DHT11 |
---|---|---|
Допустимый диапазон t,°C | -55..+125 | 0..+50 |
Погрешность измерения t, min | ±0.5°C@-10..+85°C | ±2°C@0..+50°C |
Погрешность измерения t, max | ±2°C | ±2°C |
Разрешение шкалы t,°C | 0.5/0.25/0.125,/0.0625 | 1 |
Допустимый диапазон RH, % | - | 20..95 |
Погрешность измерения RH, min | - | ±4% +25°C |
Погрешность измерения RH, max | - | ±5% |
Разрешение шкалы RH, % | - | 1 |
(для тех, кто склонен путать разрешающую способность и точность: хотя DS18B20 можно настроить таким образом, чтобы он отдавал 12-битные значения с разрешением 0,0625 градуса, его точность не станет лучше 0.5С. Но можно сделать "более живой" дисплей с отображением двух знаков после запятой ;)
Из характеристик видно невооруженным глазом, что DHT11 практически идеально подходит для жилых помещений и комнатных температур. Если датчик попадает в условия, выходящие за допустимые пределы, он начинает врать (попутно ускорится процесс старения аналогового сенсора), после чего требуется несложный процесс восстановления. Более подробно про это можно прочесть в описании: DHT11.pdf.
Как подключить DHT11 к Arduino? Начнем с расположения его пинов:
(третий пин не надо никуда подключать)
Рекомендуемая схема подключения содержит обязательный для однопроводных линий резистор-подтяжку к VCC и, в качестве опции, рекомендуется конденсатор (фильтр по питанию между VCC и GND):
На макетке это выглядит так (сенсор подключен к цифровому пину D8 платы Freeduino Nano):
Кстати, если вам в руки попал DHT11 на небольшой платке, можно подключать его напрямую к Arduino - скорее всего, резистор и конденсатор там уже и так есть:
Разберемся, как происходит обмен DHT11 с Arduino. Логически, это представляется такой последовательностью:
- Arduino запускает считывание показаний, переводя свой пин в режим выхода - как минимум на 18 миллисекунд переводит его в LOW, затем на 40 мкс в HIGH - и, после этого, переключает его в режим входа;
- Через 20..40 мкс DHT11 отвечает подтверждением, также сначала переводя шину в LOW на 80 мкс, а затем в HIGH на 80 мкс;
- DHT11 начинает побитную передачу информации, каждый бит начинается с уровня LOW в течение 50 мкс, и затем HIGH разной продолжительности: если 26-28 мкс, то это ноль, если же 70 мкс - единица;
- По окончании передачи 40 бит информации DHT11 "на прощание" еще раз переводит шину в LOW на 50 мкс и освобождает ее.
Полученная от DHT11 пачка из 40 бит представляется в виде последовательности из 5 байт следующего содержания:
- Целая часть значения влажности;
- Дробная часть значения влажности;
- Целая часть значения температуры;
- Дробная часть значения температуры;
- Контрольная сумма.
Как всегда, можно воспользоваться готовой библиотекой, которая считывает показания и вычисляет контрольную сумму для проверки. Что характерно, байты с дробной частью приходят всегда нулевые - пусть вас это не смущает, так и задумано ;)
Примеры использования DHT11 с Arduino: во-первых, данные можно выводить в последовательный порт и наблюдать на Serial Monitor:
#include <dht11.h> dht11 sensor; #define DHT11PIN 8 void setup() { Serial.begin(115200); Serial.println("DHT11 TEST PROGRAM "); Serial.print("LIBRARY VERSION: "); Serial.println(DHT11LIB_VERSION); Serial.println(); } void loop() { Serial.println("\n"); int chk = sensor.read(DHT11PIN); Serial.print("Read sensor: "); switch (chk) { case DHTLIB_OK: Serial.println("OK"); break; case DHTLIB_ERROR_CHECKSUM: Serial.println("Checksum error"); break; case DHTLIB_ERROR_TIMEOUT: Serial.println("Time out error"); break; default: Serial.println("Unknown error"); break; } Serial.print("Humidity (%): "); Serial.println(sensor.humidity); Serial.print("Temperature (oC): "); Serial.println(sensor.temperature); delay(2000); }
Во-вторых, немного усложнив схему, можно выводить данные на LCD-дисплей:
#include <LiquidCrystalRus.h> #include <dht11.h> LiquidCrystalRus lcd(12, 11, 5, 4, 3, 2); dht11 sensor; #define DHT11PIN 8 void setup() { lcd.begin(16, 2); lcd.clear(); } void loop() { switch (sensor.read(DHT11PIN)) { case DHTLIB_OK: break; case DHTLIB_ERROR_CHECKSUM: lcd.print("Checksum error"); delay(2000); return; case DHTLIB_ERROR_TIMEOUT: lcd.print("Time out error"); delay(2000); return; default: lcd.print("Unknown error"); delay(2000); return; } lcd.setCursor(0, 0); lcd.print("Влажность,%:"); lcd.print(sensor.humidity); lcd.setCursor(0, 1); lcd.print("Температура,C:"); lcd.print(sensor.temperature); delay(2000); }
Куда двигаться дальше?
Если стремиться к увеличению точности, можно найти достаточное количество датчиков, наиболее близкие по исполнению - DHT21/22. Они же, соответственно, и более дороги.
Купить DHT11 можно, например, здесь.
Комментариев нет:
Отправить комментарий