Comments
Hi Nikolo,
For the DHT11 these values should always be zero as the humidity and temperature have no decimal part in the DHT11 according to the datasheet. OK the datasheet indicates that these bytes should taken into account for the checksum
Can you give a temperature or humidity for which this is not the case?
Or does the DHT11 suddenly support a decimal part?
This is the first time in 6 years that this is reported as a problem.
(fix is not difficult and would hardly impact size, but if not needed I would prefer not to do it)
Hi!
Yes i have problem with DHT11. But when I added bits 1 and 3 into the check sum, all was normalized.
I did not find in datasheet where would be said that 1 and 3 bytes always 0, only in an example.
But in the same example it is indicated that the check sum must be counted on all bytes.
If it is interesting that I can send the photo of sensor and load any your example for the checking.
Fixed in DHTlib and DHTStable
2 participants
-
#1
Имеется: NODEMCU V3, датчик температуры и влажности DHT11
Прошивка:
Код:
NodeMCU custom build by frightanic.com
branch: master
commit: 11592951b90707cdcb6d751876170bf4da82850d
SSL: false
modules: dht,file,gpio,http,i2c,mqtt,net,node,sjson,tmr,uart,websocket,wifi
build created on 2018-12-30 19:20
powered by Lua 5.1.4 on SDK 2.2.1(6ab97e9)
Скетч самый простой отсюда:
Код:
pin = 5
status, temp, humi, temp_dec, humi_dec = dht.read(pin)
if status == dht.OK then
-- Integer firmware using this example
print(string.format("DHT Temperature:%d.%03d;Humidity:%d.%03drn",
math.floor(temp),
temp_dec,
math.floor(humi),
humi_dec
))
-- Float firmware using this example
print("DHT Temperature:"..temp..";".."Humidity:"..humi)
elseif status == dht.ERROR_CHECKSUM then
print( "DHT Checksum error." )
elseif status == dht.ERROR_TIMEOUT then
print( "DHT timed out." )
end
Вот такие значения приходят с датчика:
DHT Temperature:665.900;Humidity:947.200
Значения увеличиваются/уменьшаются в соответствии с изменениями окруж. среды. Вот только приходят в неверном формате. Может кто сталкивался?
Последнее редактирование: 3 Янв 2019
-
#2
Перепрошил на AT v0.23 SDK 1.0.1. С бибилиотекой DHT-sensor-library для Arduino IDE все работает нормально. Показатели с датчика приходят корректные. А вот с LUA прошивкой успехов так и не добился…
Последнее редактирование: 3 Янв 2019
-
#3
Попробуйте время опроса датчика сделать не чаще чем две секунды.
-
#4
Попробуйте время опроса датчика сделать не чаще чем две секунды.
Сначала тоже так подумал. Так вот мой скрипт не выполняется циклично, а только один раз, если отправить команду dofile(«script1.lua»). Соответственно датчик опрашивается единожды. Наверно дело не в частоте опроса датчика..
-
#5
Сначала тоже так подумал. Так вот мой скрипт не выполняется циклично, а только один раз, если отправить команду dofile(«script1.lua»). Соответственно датчик опрашивается единожды. Наверно дело не в частоте опроса датчика..
Считайте два раза. Посмотрите результат второго считывания. Конечно с промежутком в 2 секунды.
-
#6
Считайте два раза. Посмотрите результат второго считывания. Конечно с промежутком в 2 секунды.
Изменил скрипт, как вы сказали: опрашиваю теперь дважды с паузой в 2 сек. Паузу вызываю следующим методом:
Код:
socket = require("socket")
function sleep(sec)
socket.sleep(sec)
end
sleep(2)
Ответ приходит все такой же:
DHT Temperature:665.900;Humidity:947.200
DHT Temperature:671.000;Humidity:1150.300
Подышал на датчик в промежутке между двумя запросами показаний — видно, что показания меняются
Пробовал использовать функцию dht.read11() вместо dht.read() для считывания показаний — приходит ошибка dht.ERROR_CHECKSUM
Последнее редактирование: 3 Янв 2019
-
#7
Интересует такая же проблема.
Прошивку NodeMCU Lua SDK 2.2.1 брал отсюда NodeMCU custom builds
Я еще кроме этого подцепил резистор 10 кОм на +3,3В на Дата выход датчика DHT11.
Всё равно не помогло, датчик возвращает левые цифры.
Иногда (может раз в 10 минут) появляются корректная Температура и Влажность.
Последнее редактирование: 27 Янв 2019
-
#8
у меня тоже с dht11какието левые значения.. лежит на окне, показывает 8-10-15 влажность.. если подышать влажность растет..
-
35.1 KB
Просмотры: 3
-
#9
у меня тоже с dht11какието левые значения.. лежит на окне, показывает 8-10-15 влажность.. если подышать влажность растет..
смотрите программу
вот здесь есть пример как выводить данные датчика в луа.
dht — NodeMCU Documentation
-
#10
Пробовал использовать функцию dht.read11() вместо dht.read() для считывания показаний — приходит ошибка dht.ERROR_CHECKSUM
А у меня только этот вариант прокатил. Просто добавит «11», и всё.
01 | На заметку: |
|
02 |
В статье показывается работа с датчиком температуры и влажности DHT11 в модульном исполнении: |
04 |
Отличие в исполнениях заключается лишь в том, что в модуле линия данных уже притянута подтягивающим резистором к линии питания: |
07 |
А если использовать только датчик, то резистор придется устанавливать самостоятельно — номинал резистора 5 кОм: |
09 |
И пусть вас не смущает тот факт, что у модуля 3 выходных пина, а у самостоятельного датчика 4 пина — один пин (на схеме NC) не используется. |
10 |
В силу своей дешевизны он обладает невпечатляющими техническими характеристиками, и вполне пригоден в ознакомительных целях, либо проектах, непритязательных к прецизионности данных. |
11 |
Датчики температуры и влажности DHT11 и DHT22 практически идентичны за исключением некоторых технических характеристик: |
12 |
|
13 |
Как видно из таблицы более дорогой датчик DHT22 обладает улучшенными по сравнению с DHT11 характеристиками. |
14 |
Взаимодействие с датчиком. Процесс получения информации с датчика DHT11 очень прост и подробно описан в даташите (842 KB). Чтобы начать получать данные с датчика микроконтроллер должен отправить датчику запрос и дождаться ответа от датчика о том, что датчик готов передавать информацию. Происходит это следующим образом. |
15 |
Когда микроконтроллер собрался принимать данные, он должен притянуть линию данных к нулю на 18 мс, и после отпустить её обратно к 1. Микроконтроллер переходит в режим ожидания и следит за тем, что происходит с линией данных. Через 20-40 мкс, если все в порядке, датчик отвечает притягиванием уже со своей стороны линии данных к нулю на 80 мкс, и отпускает её на 80 мкс. Таким образом датчик дает понять микроконтроллеру, что с ним все в порядке и он начинает передачу данных. Данные передаются побитно. |
17 |
Перед передачей каждого нового бита датчик притягивает линию данных к нулю на 50 мкс, после этого отпускает её к 1. В зависимости от того на сколько датчик отпускает дата-линию к 1 микроконтроллер распознает какой бит был передан. Если длительность временного промежутка до следующего притягивания к нулю — 26-28 мкс, то передан 0, если 70 мкс — передана 1. |
18 |
Передаваемые данные содержат как целую, так и дробную часть цифровых данных о температуре/влажности. Общий объем переданной информации составляет 40 бит: 1 и 2 байт содержат соответственно целую и дробную часть информации о влажности, 3 и 4 байт содержат целую и дробную часть информации о температуре и в 5 байте передается контрольная хеш-сумма, которая представляет из себя последние 8 бит от сложения предыдущих 4 байт. |
19 |
После передачи пакета данных датчик переходит в спящий режим, до следующего запроса со стороны микроконтроллера. |
20 |
Библиотека dht.h и принцип работы. Для того, чтобы понять устройство библиотек по работе с датчиком DHT11 — напишем свой фрагмент кода, который без библиотеки сможет получать данные с датчика. Код прокомментирован очень детально: |
21 | Arduino (C++) |
1
#define DHT_OK 0 int pinData = 12; int humidity; void setup() { void loop() { int getTempDate(int pin) { byte data[40]; pinMode(pinData, OUTPUT); digitalWrite(pinData, LOW); digitalWrite(pinData, HIGH); unsigned int timeoutInt = 10000; while (digitalRead(pin) == LOW) timeoutInt = 10000; for (int i = 0; i < 40; i++) while (digitalRead(pin) == LOW) unsigned long t = micros(); while (digitalRead(pin) == HIGH) if ((micros() — t) > 40) data[i] = 1; byte bytes[5] = {0, 0, 0, 0, 0}; uint8_t sum = bytes[0] + bytes[2]; if (bytes[4] != sum) return DHT_ERROR_CHECKSUM; humidity = bytes[0]; return DHT_OK; |
24 |
Так как необходимо отображать данные и температуры и влажности, будем менять значения на дисплее, к примеру, каждые 2 сек. А поскольку значения обоих показателей не будет превышать 2 цифр, будем подставлять в начало и конец отображаемых данных символы, позволяющие их идентифицировать — t (temperature) и h (humidity) в начале, и с и % в конце. И для ещё большего удобства перевернем индикатор вверх ногами, чтобы точка (разделитель разрядов, который не используется из-за отображения целых чисел) была вверху и зажигалась, имитируя значок градуса: |
27 |
Снова обращаю внимание, что если используется датчик на модуле, то резистор не нужен, и наоборот, если только датчик, то резистор обязателен! |
28 |
Так как необходимо отображать данные и температуры и влажности, будем менять значения на дисплее каждые 2 сек. А поскольку значения обоих показателей не будет превышать 2 цифр, будем подставлять в начало и конец отображаемых данных символы, позволяющие их идентифицировать — t и h в начале, и с и % в конце. |
30 |
Код (будем использовать библиотеку dht11.zip (2,58 KB)): |
31 | Arduino (C++) |
1 #include <dht11.h> int anodPins[] = {A1, A2, A3, A4}; int state; unsigned long ms_mode = 0; void setup() { ms_mode = millis(); state = DHT.read(PIN_DATA); byte seg[15] = { int err[4] = { static byte arr[4]; int mode = 0; void loop() { if ((millis() — ms_mode) > changemodeperiod) { if ((millis() — ms_dht) > refreshdataperiod) { void getDigits () { } void displayMessage(byte dig[4]) { for (int k = 0; k < 8; k++) { } |
33 |
. Подписывайтесь на канал , чтобы быть в курсе обновлений! |
35 |
Похожие запросы:
|
Для Arduino существует большое количество датчиков и модулей измерения температуры. Модули KY-001, KY-013 мы уже рассмотрели в предыдущих уроках. Сегодня поговорим о модуле KY-015, который оснащен датчиком DHT11, он может измерять не только температуру, но и влажность воздуха.
Описание модуля KY-015 с датчиком DHT11.
Модуль датчика температуры и влажности KY-015 обеспечен цифровым последовательным интерфейсом для измерения влажности и температуры и передачи показаний Arduino.
Технические характеристики KY-015.
Модуль KY-015 состоит из цифрового датчика влажности и температуры DHT11 и резистора 1 кОм. DHT11 использует внутренний термистор и емкостной датчик влажности для определения условий окружающей среды, а внутренний чип отвечает за преобразование показаний в последовательный цифровой сигнал.
Рабочее напряжение |
От 3,3 до 5,5 В |
Диапазон измерения влажности |
От 20% до 90% |
Точность измерения влажности |
± 5% |
Разрешение измерения влажности |
1% |
Диапазон измерения температуры |
От 0 ºC до 50 ºC |
Точность измерения температуры |
± 2 ºC |
Разрешение измерения температуры |
1 ºC |
Дальность передачи сигнала |
20 м |
Схема подключения модуля KY-015 с датчиком DHT11 к Arduino UNO.
Схема подключения модуля KY-015 с датчиком DHT11 к Arduino NANO.
Подключаем линию питания (посередине) и землю (-) к +5 и GND соответственно. Сигнал (S) подключаем к контакту 2 на Arduino.
Пример скетча KY-015 для Arduino без использования библиотек.
int DHpin = 2; // pin ввода/вывода byte dat[5]; byte read_data() { byte i = 0; byte result = 0; for (i = 0; i < 8; i++) { while (digitalRead(DHpin) == LOW); // ждать 50 микрсек. delayMicroseconds(30); //Продолжительность высокого уровня оценивается для определения того, являются ли данные " 0 " или "1" if (digitalRead(DHpin) == HIGH) result |= (1 << (8 - i)); //Высоко в начале, низко в посте while (digitalRead(DHpin) == HIGH); //Данные '1', ожидание следующего бита приема } return result; } void start_test() { digitalWrite(DHpin, LOW); //Потяните вниз шину, чтобы отправить сигнал запуска delay(30); //Задержка превышает 30 мс, так что DHT 11 может обнаружить сигнал запуска digitalWrite(DHpin, HIGH); delayMicroseconds(40); //Дождитесь ответа DHT11 pinMode(DHpin, INPUT); while(digitalRead(DHpin) == HIGH); delayMicroseconds(80); // DHT11 реагирует, потянув шину низко на 80 микрсек. if(digitalRead(DHpin) == LOW) delayMicroseconds(80); //DHT11 подтянут 80 микрсек, чтобы начать отправку данных; for(int i = 0; i < 5; i++) //При получении данных о температуре и влажности контрольные биты не учитываются; dat[i] = read_data(); pinMode(DHpin, OUTPUT); digitalWrite(DHpin, HIGH); //После завершения отпускаем шины данных, ожидая, когда хост начнет следующий сигнал } void setup() { Serial.begin(9600); pinMode(DHpin, OUTPUT); } void loop() { start_test(); Serial.print("Humdity = "); Serial.print(dat[0], DEC); //Отображает целочисленные биты влажности; Serial.print('.'); Serial.print(dat[1], DEC); //Отображает десятичные знаки влажности; Serial.println('%'); Serial.print("Temperature = "); Serial.print(dat[2], DEC); //Отображает целочисленные биты температуры; Serial.print('.'); Serial.print(dat[3], DEC); //Отображает десятичные знаки температуры; Serial.println('C'); byte checksum = dat[0] + dat[1] + dat[2] + dat[3]; if (dat[4] != checksum) Serial.println("-- Checksum Error!"); else Serial.println("-- OK"); delay(1000); }
Данный пример кода можно загрузить в Arduino и получать показания с датчика DHT11. Предварительно ничего настраивать и устанавливать не нужно. В мониторе порта мы увидим значения температуры и влажности с датчика DHT11.
Пример кода с использованием библиотеки «DHT sensor library».
Для данного примера нам понадобиться библиотека «DHT sensor library». Установить ее можно через менеджер библиотек, для этого переходим «Скетч -> Подключить библиотеку -> Управлять библиотеками…».
В строке поиска указываем «DHT11» и устанавливаем библиотеку «DHT sensor library». Для этого нажимаем на кнопку «Установка».
Для работы библиотеки «DHT sensor library» нужна библиотека «Adafruit_Sensor», которую можно скачать с сайта github или внизу урока, в разделе «Файлы для скачивания».
Скачать библиотеку с github можно выбрав «Code -> Download ZIP».
После чего в Arduino IDE выбираем «Скетч -> Подключить библиотеку -> Добавить .ZIP библиотеку…».
Выбираем скаченный архив с библиотекой.
С библиотекой устанавливается 2 примера. Один из которых мы будем использовать в нашем уроке. Для этого переходим в меню «Файл -> Примеры -> DHT sensor library -> DHTtest».
В данном примере нам нужно указать пин подключения модуля. Также раскомментировать строчку подключения нашего датчика.
#include "DHT.h" #define DHTPIN 2 // контакт, к которому подключаемся // и расскомментировать строчку датчика: #define DHTTYPE DHT11 // DHT 11 //#define DHTTYPE DHT22 // DHT 22 (AM2302) //#define DHTTYPE DHT21 // DHT 21 (AM2301) // инициализируйте датчик DHT DHT dht(DHTPIN, DHTTYPE); void setup() { Serial.begin(9600); Serial.println("DHTxx test!"); dht.begin(); } void loop() { delay(2000); // считывание данных температуры и влажности float h = dht.readHumidity(); // температура в Цельсиях: float t = dht.readTemperature(); // температура в Фаренгейте: float f = dht.readTemperature(true); // проверяем, корректно ли прочитались данные, // и если нет, то пробуем еще раз: if (isnan(h) || isnan(t) || isnan(f)) { Serial.println("Failed to read from DHT sensor!"); // "Не данных с DHT!" return; } // рассчит теплового индекса; float hi = dht.computeHeatIndex(f, h); Serial.print("Humidity: "); // "Влажность: " Serial.print(h); Serial.print(" %t"); Serial.print("Temperature: "); // "Температура: " Serial.print(t); Serial.print(" *C "); Serial.print(f); Serial.print(" *Ft"); Serial.print("Heat index: "); // "Тепловой индекс: " Serial.print(hi); Serial.println(" *F"); }
Также не забудьте, чтобы строчки подключения других датчиков были закомментированы.
Загружаем пример и смотрим в мониторе порта.
Как видим все работает отлично и показания выводятся. При этом значения достаточно стабильные. Точность показаний я не стал проверять, как делал с модулем KY-013. Это вы можете сделать самостоятельно.
Вывод про модуль KY-015.
В связи с тем, что модуль оснащён датчиком DHT11, показания температуры и влажности не очень точные, но при этом применять его для измерения температуры и влажности в бытовых условиях можно. Например, настроить автоматическое включения вытяжки в ванной, данного модуля будет достаточно и не стоит покупать более дорогие аналоги.
Понравился Урок KY-015 — Модуль с датчиком температуры и влажности DHT11? Не забудь поделиться с друзьями в соц. сетях.
А также подписаться на наш канал на YouTube, вступить в группу Вконтакте, в группу на Facebook.
Спасибо за внимание!
Технологии начинаются с простого!
Фотографии к статье
Файлы для скачивания
Пример скетча KY-015 для Arduino без использования библиотек.ino | 3 Kb | 333 | Скачать | |
Пример кода с использованием библиотеки «DHT sensor library».ino | 2 Kb | 351 | Скачать |