Зарегистрирован: Вт мар 23, 2010 01:17:44 Сообщений: 46
Рейтинг сообщения:0
Здравствуйте!
Я столкнулся с проблемой в работе датчика температуры и влажности DHT-22 — «то работает, то не работает». Может быть, кто-нибудь сможет посоветовать, в чём проблема? Третий день мучаюсь.
1). Датчиков две штуки, подключены к ATmega328p (На плате Arduino Nano 3). 2). Подключены через трёхжильные аудиокабели длиной ~30 и ~60 см. 3). Опрашиваются раз в 5 секунд. 4). Подтяжка 4,7 кОм(убирать пробовал), напряжение работы ~5,3В. 5). Соединения пропаивал, кабель менял. 6). Все остальные функции системы работают нормально. 7). Если замкнуть хотя бы 2 контакта DHT языком, она работает. Пробовал заземлять линию данных через резистор в 33 кОм (примерное сопротивление языка) — не помогает. Пробовал ставить конденсаторы разных ёмкостей между шиной и землёй, или между землёй и питанием — тоже не помогает. Проблема остаётся одна и та же: иногда несколько минут работают оба датчика, иногда — только один, иногда перестают работать оба. Когда не работают — или вообще не отвечают (ошибка уже на этапе if (DHT_PIN&(1<<bit)) {*h=0x8000; *t=0; return 0;} ), или непонятным образом возвращают "влажность 0, температура 0" (последнее время добился того, что другой ошибки нет).
Функция опроса датчиков: Спойлер
Код:
/* Name: dht.c Пример чтения датчиков DHT11 и DHT22 - автоматическое разпознавание. Взято с http://homes-smart.ru/index.php/oborudovanie/datchiki/datchiki-vlazhnosti-dht11-i-dht22 Проверено на м/к AVR
#define DHT_PORT PORTD // порт #define DHT_DDR DDRD #define DHT_PIN PIND
int dhtread (char bit, int *h, int *t) //bit — номер бита порта, // в *h будет влажность (в десятых долях %), в *t — температура, в десятых долях *. // соответственно, надо результат на 10 разделить. // если в программе имеются прерывания,то не забывайте их отлючать перед чтением датчика {
DHT_DDR|=(1<<bit); //pin as output DHT_PORT&=~(1<<bit); _delay_ms(18);
DHT_PORT|=(1<<bit); DHT_DDR&=~(1<<bit);
_delay_us(50); // +1 для attiny(коррекция без кварца) if (DHT_PIN&(1<<bit)) {*h=0x8000; *t=0; return 0;} _delay_us(80); // +1 для attiny(коррекция без кварца) if (!(DHT_PIN&(1<<bit))){*h=0x8000; *t=0x8000; return 0;};
while (DHT_PIN&(1<<bit)); for (j=0; j<5; j++) { datadht[j]=0; for(i=0; i<8; i++) { while (!(DHT_PIN&(1<<bit))); _delay_us (30); if (DHT_PIN&(1<<bit)) datadht[j]|=1<<(7-i); while (DHT_PIN&(1<<bit)); } }
Зарегистрирован: Вт мар 23, 2010 01:17:44 Сообщений: 46
Рейтинг сообщения:0
Ага, проблема решена. Внимательное наблюдение за DHT22 показало, что они перестают работать при температуре ниже определённой (примерно 22-26 С). Я погуглил и выяснил, что это — стандартная проблема, связанная с неправильным таймингом сигналов. Разбираться, что именно не так, не стал, просто подключил другую библиотеку (вот эту, отредактированную для совместимости с WinAVR).
Теперь всё работает — по крайней мере, при температуре 9 градусов тепла и выше.
Подниму тему с этим DHT22, тоже долго воевал с этим датчиком, причем разные датчики отваливаются с разной периодичность. У меня причина - наводки на проводах, расстояние до датчика примерно 60 см, снимает данные ESP32. Датчик находится в РЩ с кучей автоматов и контакторов. Простенький фильтр по питанию улучшил ситуацию, но датчик продолжил отваливаться, может неделю проработать, а может 2 раза за 1 час отвалиться. Так вот, сделал выключатель на двух транзисторах полевых, отключают и землю и питание датчика. Одного питания почему-не достаточно. Транзисторы управляются с контроллера, в коде проверка NaN и при условии присутствия NaN передергиваются пины на которых висят затворы транзисторов, NaN не попадает в показания, вместо него подставляются старые показания, пока датчик перезагружается. Другого решения не нашел, качество датчиков этих очень испортилось. Может за 9 лет есть другое решение? Я перелопатив интернет не нашел. Причем у меня 12 датчиков по дому развешено и где расстояние 10 - 15 см все отлично. С увеличением расстояния начинаются отвалы датчика в виде NaN.
Может за 9 лет есть другое решение? Я перелопатив интернет не нашел. Причем у меня 12 датчиков по дому развешено и где расстояние 10 - 15 см все отлично. С увеличением расстояния начинаются отвалы датчика в виде NaN.
Естественно - интерфейс DHT22 не рассчитан на такие расстояния. Решение всегда было: Возьмите любой простой дешёвый МК. Поставьте его на плату с датчиком. Простая программа опроса. А дальше - передавайте данные на свой ESP32 как угодно: хоть через UART, хоть через RS-485 на километр.
Да и не хочется городить огород с UART и т.д. На ESP32 свободных пинов нет уже. Да и если кабель до DHT22 лежит не рядом с электропроводкой, то на 1-1,5 метра нормально работает. На али есть DHT22 с ESP01, но там с измерениями беда.
Да и если кабель до DHT22 лежит не рядом с электропроводкой, то на 1-1,5 метра нормально работает.
Тогда остаётся покупать бубен. Иначе нормальной работы не добиться. Даже даташит рекомендует кабель не более 1м. А лучше (при таком интерфейсе и таком окружении) - максимум несколько см.
"Проверка на NaN?" Это вы видимо какую-то "библиотеку" используете? Так как в посылке DHT22 нет никакой плавучки. А если посылка исказилась помехой так, что NaN не возникло, а только данные изменились? Примете эти данные как нормальные?
Во влагометре с PIC16F628 (без чиполин и пр. дурИн...) DHT22 работает без "пропаданий" и зависаний... уже не один месяц. Конечно, точность этого датчика, вернее его НЕточность, оставляет желать лучшего. Причем, если в первой полусотне процентов недобор против эталона составляет 5-8%, то после 50% это самое отставание значения - 8-10%. Врёт (гадюка) нелинейно/безбожно! Для снижения собственного нагрева DHT22, питание на него подано минимальное - 3,3В через резистор со стабилитроном. Есть задумка вынести датчик от платы проводками сантиметров на пять, да всё не до него... В термометре с DS18B20 небольшое отдаление оного от "вроде бы не греющейся" платы довело точность до 0,1 градуса. Измерительная техника - она такая.
Для снижения собственного нагрева DHT22, питание на него подано минимальное - 3,3В через резистор со стабилитроном.
Интересно - зачем??? Потребление моего DHT22 во сне = ~12мкА. Не думаю, что этот ток его как-то заметно греет. А вот запитка через резистор может приводить к проблемам. Может и неточность ваша из-за этого.
Есть задумка вынести датчик от платы проводками сантиметров на пять, да всё не до него... В термометре с DS18B20 небольшое отдаление оного от "вроде бы не греющейся" платы довело точность до 0,1 градуса.
Мой девайс с DHT22 - на батарейном питании. На MSP430FR5739. Почти всё время спит. Просыпается каждые 5 минут, на буквально пару секунд, чтобы сделать замер и опять в сон. Суммарное потребление всего девайса во сне = ~30мкА. Не греется.
Насчёт погрешности: В одном помещении работает этот мой девайс с DHT22 и другой девайс - с BME280. Разница в показаниях влажности между ними сейчас = ~0.5% (50% vs 50.5%). Может конечно врут в одну сторону, кто его знает....
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения