dht11 Датчик влажности не могу запустить
- Войдите на сайт для отправки комментариев
Втр, 08/12/2015 - 13:17
Добрый день!
написал программку для включения вентилятора в ванной по датчику влажности.
она запустилась, хорошо работала. а через две недели ардуина зависла (пришлось перезагрузить ее).
и после этого вентилятор включаться перестал.
Причем показания идут с датчика (проверял по выводу в ком порт командой Serial.println),
вентилятор по команде включается нормально.
а через программку автоматически не включается. то есть подозреваю, что условие включения не наступает. но вроде бы должно наступать, так как показания 70-90 процентов должны включать вентилятор по моему разумению.
может, дело в преобразовании типов?
подскажите, пожалуйста, что можно попоробовать! вот код:
#include <dht11.h> // библиотечка управления датчиком влажности dht11 dht11 DHT; // Объявление переменной класса dht11 для датчика влажности в ванной. взял из примера в интернете как есть. не разобрался толком как это работает. #define DHT11_PIN 5 // Датчик DHT11 подключен к цифровому пину номер 5 в ванной #define vannacooler 6 // pin реле включения вентилятора в ванной #define vannatimeshift 5*60*1000UL // через сколько минут после наступления влажности в ванной включаем вентилятор int vannaflag=0; // проверка наступила ли влажность в ванной unsigned long vannatime; // время, когда наступила влажность в ванной int vannacoolerstate=0; // когда только включили ардуину, вентилятор выключен int chk; // служебная переменная при считывании в влажности. брал ее из примера - как есть. не разобрался толком как она работает int vannahumidity; //влажность в ванной void setup() { pinMode(vannacooler, OUTPUT); //определяем пин вентилятора на вывод. digitalWrite(vannacooler,!vannacoolerstate); // при включении ардуины вентилятор выключен. } void loop() { chk = DHT.read(DHT11_PIN); // Чтение данных vannahumidity=DHT.humidity; // переменная считывает показания влажности if (vannaflag==0 && vannahumidity>60 && vannahumidity<100) //если влажность в первый раз превысила 60 процентов (<100 включил, так как датчик почему то иногда выдает показания 145, 189 и т д. то есть влажность больше 100 процентов. не разобрался почему. просто поставил заглушку. при этом все работало изначально. { vannaflag=1; // признак включенности вентилятора vannatime=millis(); // засекаем время когда уровень влажности превысил 60 процентов } if (vannaflag==1 && millis()-vannatime>vannatimeshift) // если прошло более 5 минут с момента превышения влажности 60 процентов { vannacoolerstate=1; // включаем вентилятор } if (vannahumidity<40) // если влажность меньше 40 процентов { vannacoolerstate=0; //выключаем вентилятор vannaflag=0; // признак включенности вентилятора: выключен. } digitalWrite(vannacooler,!vannacoolerstate); // включаем выключаем вентилятор в ванной //Serial.println(vannahumidity); // Выводим текст //Serial.println("///"); // Выводим текст }
а вот библиотека DHT11
// // FILE: dht11.cpp // VERSION: 0.4.1 // PURPOSE: DHT11 Temperature & Humidity Sensor library for Arduino // LICENSE: GPL v3 (http://www.gnu.org/licenses/gpl.html) // // DATASHEET: http://www.micro4you.com/files/sensor/DHT11.pdf // // HISTORY: // George Hadjikyriacou - Original version (??) // Mod by SimKard - Version 0.2 (24/11/2010) // Mod by Rob Tillaart - Version 0.3 (28/03/2011) // + added comments // + removed all non DHT11 specific code // + added references // Mod by Rob Tillaart - Version 0.4 (17/03/2012) // + added 1.0 support // Mod by Rob Tillaart - Version 0.4.1 (19/05/2012) // + added error codes // #include "dht11.h" // Return values: // DHTLIB_OK // DHTLIB_ERROR_CHECKSUM // DHTLIB_ERROR_TIMEOUT int dht11::read(int pin) { // BUFFER TO RECEIVE uint8_t bits[5]; uint8_t cnt = 7; uint8_t idx = 0; // EMPTY BUFFER for (int i=0; i< 5; i++) bits[i] = 0; // REQUEST SAMPLE pinMode(pin, OUTPUT); digitalWrite(pin, LOW); delay(18); digitalWrite(pin, HIGH); delayMicroseconds(40); pinMode(pin, INPUT); // ACKNOWLEDGE or TIMEOUT unsigned int loopCnt = 10000; while(digitalRead(pin) == LOW) if (loopCnt-- == 0) return DHTLIB_ERROR_TIMEOUT; loopCnt = 10000; while(digitalRead(pin) == HIGH) if (loopCnt-- == 0) return DHTLIB_ERROR_TIMEOUT; // READ OUTPUT - 40 BITS => 5 BYTES or TIMEOUT for (int i=0; i<40; i++) { loopCnt = 10000; while(digitalRead(pin) == LOW) if (loopCnt-- == 0) return DHTLIB_ERROR_TIMEOUT; unsigned long t = micros(); loopCnt = 10000; while(digitalRead(pin) == HIGH) if (loopCnt-- == 0) return DHTLIB_ERROR_TIMEOUT; if ((micros() - t) > 40) bits[idx] |= (1 << cnt); if (cnt == 0) // next byte? { cnt = 7; // restart at MSB idx++; // next byte! } else cnt--; } // WRITE TO RIGHT VARS // as bits[1] and bits[3] are allways zero they are omitted in formulas. humidity = bits[0]; temperature = bits[2]; uint8_t sum = bits[0] + bits[2]; if (bits[4] != sum) return DHTLIB_ERROR_CHECKSUM; return DHTLIB_OK; } // // END OF FILE
А чему равно значение тут?
pinMode(vannacooler, OUTPUT);
//определяем пин вентилятора на вывод.
А вобще не понимаю зачем такие сложности??
я бы написал примерно так:
к стати глючить в выдаче показаний может при сильно частых запросах. я когда с этим датчиком работал обратил внимание, если его опрашивать чаще чем раз в секунду он выдает пургу. пришлось поставить задержку.
vannacooler=6 (определил pin вверху через define)
delay не могу поставить, так как параллельно еще плата управляет светом и вентилятором в туалете по датчику движения.
но готов реализовать более редкие запросы через millis, если это повлияет.
предлагаемый вами алгоритм немного другой, чем хочется мне. хочу чтобы включалось через 5 минут после того как будет влажность 60 процентов. и высасывало влагу вентилятором до тех пор пока влажность не опустится до 40 процентов. поэтому написал именно такой код. в принципе не считаю его сильно сложным :)
я бы написал примерно так:
По мне, так лучше бы гистерезис оставить, а то, если так, боюсь дрыгаться будет много раз при переходе влажности через 60
Я правильно понимаю, что строка 15 включает вентиллятор при включении ардуины? Зачем?
Чтобы включить Вам что нужно потать на пин vannacooler, HIGN или LOW? А то меня смущает отрицание (!vannacoolerstate) в строке 36 (да и в 15 тоже).
А так, замечаний по коду нет. кроме того что спрашивать надо не чаще. чем раз в 5 секунд, и строку 36 я бы оттуда уьрал, а внёс бы в соотевтствуюие if'ы, но это не критично.
На Вашем емсте я бы поставил печати (или включения сведиодов) внутрь if'ов в строках 27 и 31 и понаблюдал бы. Если управление туда не попадает, разбирался бы с тем, что там за показания датчик выдаёт, а если попадает, тогда разбирался бы почему не включается. Надо отсекать возможные причины неприятностей.
Евгений,
строка 15 выключает вентилятор. просто реле работает наоборот :) поэтому пришлось использовать !coolerstate вместо coolerstate. То есть 1 - это выключено. а 0 - это включено. чтобы не было путаницы в коде, я вынес заглушку этой проблемы в digitalwrite.
попробовал щас поморгать лампочкой в строке 27. влажность дошла до 70 процентов, но лампочка не загорелась.
думаю, что условие в строке 22 if
(vannaflag==0 && vannahumidity>60 && vannahumidity<100) не выполнилось.
при этом показания считывал строчкой
Serial.println(vannahumidity); // Выводим текст
может ли быть что vannahumidity передается в каком нибудь текстовом формате или в процентном формате (значения от 0 до 1) и неверно преобразовывается, поэтому никогда не становится больше 60?
как правильно преобразовать типы данных?
я бы написал примерно так:
По мне, так лучше бы гистерезис оставить, а то, если так, боюсь дрыгаться будет много раз при переходе влажности через 60
Евгений! Я раскомментировал печать в скетче. так и узнал о влажности.
сейчас полез ковыряться с платой, и получил вообще неизменные показания влажности: 32.
вне зависимости от влажности.
похоже на то, что датчик накрылся.
дальнейшие эксперименты продолжу, когда приобрету новый датчик.
добрый день!
только что поменял датчик - и все корректно заработало!
вопрос: может ли датчик выйти из строя из за слишком частого обращения к нему?
просто так как щас работает меня устраивает и не хочется переделывать программу на опрос датчика раз в секунду.
но грызет меня вопрос: из за чего тогда мог выйти из строя датчик??
Из за слишком частого обращения, это вряд ли. Быстрее, на него кто то водичкой плеснул, зависла при вас или сама при ком то? Попробуйте разобрать и с лупой рассмотреть внимательно.
в рекомендации к данному датчику обращаться не раз в 2 секунды.
ошибки которые у вас выскакивают (влажность больше 100%) могут быть из-за частых запростов.
датчик на плате или на ногах? Если на ногах тогда сопротивление 10 К Ом между +5 и сигн ногой должно быть ( у меня без него выдает неверные данные)
вместо Вашего
chk = DHT.read(DHT11_PIN);
тогда все остальное будет работать, а к датчику будем обращаться раз в 2 секунды
И еще, у меня влажность выводится в float, а у Вас в int, не знаю насколько это критично...
Если производитель рекомендует что-либо я стараюсь так сразу делать, а не делать неправильно и ждать пока что-то накроется...
спасибо!
BWN, водой капнуть не могли, если только супервлажность в ванной.
Mr.Privet, спасибо за кусочек кода! сохранил себе. как полезу в потолок в туалете еще раз - обязательно вставлю апдейт в скетч :) а датчик на плате!
Датчик все таки разберите и посмотрите, не исключается и 220 где нибудь по конденсату. У меня такое на заводском вентиляторе с датчиком было, а это совсем нехорошо.
BWN, разобрал, но там внутри все чистенькое и красивенькое :) как понять проблему?
Тогда ищите непропай-коротыш и тому подобное. Ну не верю я в саму по себе погоревшую деталь. Это почти из области фантастики. ИМХО.
Здравствуйте!
DHT11 под nano (китайский клон) выдаёт у меня в комнате влажность 512% (при питании 5V) или 793% (при питании 3V3 от платы nano). На прижатый палец реагирует, показания изменяются раза в три. Я сделал лог в Экселе, графики, но не вижу куда их здесь можно прицепить. Какие данные ещё нужны для того, чтобы можно было дать какое-то заключение?
Вот библиотека, которой пользуюсь в данном случае:
Вот сам скетч:
в скетче закомментируйте строку 10 и раскомментируйте строку 9
Хаха... Вот спасибо. Даже я понял, что имеется в виду. Универсальный скетч, на три датчика - выбирай, какой надо. Но это для ПОЛЬЗОВАТЕЛЕЙ, а не для таких как я, умельцев от напильника... Пробую!
Всё работает. 33%, 23 С
Температура немного задрана, но это такое - будем разбираться дальше... Влажность тоже будем пытаться откалибровать по парам над реперными растворами.
Спасибо огромное!
зы: А ведь в комментариях чёрным по белому, ангельским языком написано ВСЁ. Стыдно...
Обернул влажной тряпкой. Примерно через час температура упала до 18 С, а влажность поднялась до 93%. Похоже, всё работает. Осталось проверить по реперам, вот здесь есть таблица насыщенных растворов солей:
http://chip.tomsk.ru/chip/chipdoc.nsf/cae24731d248549fc6256d53006dcde3/e0800ceba558ac1247257967002484fc!OpenDocument
В принципе, пока нужна одна, максимум две точки. Думаю, что в случае необходимости формулой можно добиться хорошей точности срабатывания реле увлажнителя.
Ещё раз большое спасибо за подсказку!
Бег с препятствиями, очередной барьер. Оставил логиться на ночь. Всю ночь в закрытой комнате работал увлажнитель. Открываю дверь - висит явно видимый невооружённым глазом туман. Увлажнитель остановился от автостопа (кончилась вода, 1 л - вечером банка была полная).
Открываю файл - НИЧЕГО. 33 .. 35 % - равнина. Никакого горба. Датчик просто лежал на столе мордой вверх, в десяти сантиметрах от увлажнителя. Накрываешь пальцем - через несколько секунд влажность лезет вверх, и бодро. Кратковременно подставляешь в струю выхлопа увлажнителя - примерно та же картина. А так - не реагирует совершенно. Удивлён. К нему что, кулер нужен? Воздушный поток прямо в решётку корпуса?
Принёс датчик на работу. Тоже 35%. )) Направил на него работающий кулер, дистанция 3 см, 9В, дует вполне ощутимо. 35%. Повесил на всас кулера мокрую тряпочку, почти вплотную, только чтобы лопасти не задевали. 35%. ))))) А на обёртывание в мокрую тряпку реагирует прекрасно. И на палец. Чюдеса...
берите AM2320 и все будет в порядке
Да, надо менять коней. По цифровой части, как я понимаю, проблем нет - всё передаётся и читается нормально, только датчик никуда не годен. Это какой-то влагомер зерна получился, а не гигрометр. Но вообще я был к этому готов, потому и заказал на Али si7021 неделю назад. Скоро должен приехать. Нашёл к нему хорошую библиотеку и туториал на ЮТ, вот ссылки (может кому-то будет нужно):
http://elchupanibrei.livejournal.com/23293.html
https://www.youtube.com/watch?v=kKjX2AiGm9g
А dht купил чисто попробовать - убедиться, действительно ли всё так печально. Убедился.
зы: Спасибо за AM2320, будет пока запасным вариантом.
Заказал и АМ2320 - гулять так гулять. На целый доллар дешевле, чем si7021. Надо пробовать.
Правильно ли я понимаю, что библиотека, скетч и схема подключения для АМ2320 остаются ровно те же, что и для DHT11? Или он подключается по I2C, и, соответственно, требует другой схемы подключения (A4, A5 для Нано)? Или он может подключаться И по I2C, И по 1wire, как DHT11, и надо только поправить (закомментить) скетч?
можно и по I2C или по 1 Wire, по 1Wire выбираете DHT22 и все