Зарегистрирован: Вт мар 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 градусов тепла и выше.
Использование модульных источников питания открытого типа широко распространено в современных устройствах. Присущие им компактность, гибкость в интеграции и высокая эффективность делают их отличным решением для систем промышленной автоматизации, телекоммуникационного оборудования, медицинской техники, устройств «умного дома» и прочих приложений. Рассмотрим подробнее характеристики и особенности трех самых популярных вариантов AC/DC-преобразователей MW открытого типа, подходящих для применения в промышленных устройствах - серий EPS, EPP и RPS представленных на Meanwell.market.
Подниму тему с этим 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%). Может конечно врут в одну сторону, кто его знает....
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения