Управление вытяжкой в санузле.
- Войдите на сайт для отправки комментариев
Пт, 21/01/2022 - 00:27
Здравствуйте, уважаемые!
Как говорится, первый пост, сильно не пинайте.... Пинайте, но не сильно. Пытаюсь для единственной тёщи. Задача - управлять вытяжкой в санузле.
Не могу разобраться с работой по времени.
Техзадание, сформулированное для себя.
0. Регистрация включения-выключения освещения фоторезистором, регистрация влажности датчиком DHT11
1. Включение вентиляции по отключению света в ванной на 10 мин
2. Включение вентиляции по отключению света при влажности > 70%, до её снижения ниже порога, но не более 30 мин.
3. При повторном включении света во время работы вентилятора - перезапуск его с п.1
4. Возможность принудительного запуска/остановки вентиляции без дополнительных выключателей - приятная плюшка, пока не придумал как
Значения влажности и длительность работы вентилятора - величины условные, будут подбираться по мере отладки.
Собственно, код:
#include <iarduino_DHT.h> // подключаем библиотеку для работы с датчиком DHT iarduino_DHT sensor(10); // объявляем переменную для работы с датчиком DHT, указывая номер цифрового вывода к которому подключён датчик int Light(3); // объявляем переменную для датчика света на (X) pin int Relay(12); // объявляем переменную для реле на (X) pin int Timer = 0; // объявляем переменную таймера, void lightOff() // функция, вызываемая освещением { Timer = 20; } void setup() { attachInterrupt(1, lightOff, FALLING); // аппаратное прерывание по освещению; Serial.begin(9600); // открываем последовательный порт на скорости 9600 бод delay(1000); // выполняем задержку для перехода датчика в активное состояние pinMode(12, OUTPUT); // Set Pin12 as output digitalWrite(12, 0); // Set Pin12 Low pinMode(Light, INPUT); // declare pushbutton as input Timer = 0; // устанавливаем таймер в 0 } void loop() { switch (sensor.read()) // читаем показания датчика { case DHT_OK: Serial.println((String) "CEHCOР: " + sensor.hum + "% - " + sensor.tem + "*C"); break; case DHT_ERROR_CHECKSUM: Serial.println( "CEHCOP: HE PABEHCTBO KC"); break; case DHT_ERROR_DATA: Serial.println( "CEHCOP: OTBET HE COOTBETCTB. CEHCOPAM 'DHT'"); break; case DHT_ERROR_NO_REPLY: Serial.println( "CEHCOP: HET OTBETA"); break; default: Serial.println( "CEHCOP: ERROR"); break; int val = digitalRead(Light); // читаем кнопку } if ((digitalRead(Light) == 1) // проверяем: освещение включено or (sensor.hum < 60.0)) // сравниваем влажность с произвольным эталоном { Serial.println(Timer); //выводим значение счетчика на экран digitalWrite(Relay, 0); // отключаем реле } else if ((Timer > 0) and (sensor.hum > 60.0)) { Serial.println(Timer); //выводим значение счетчика на экран Timer --; // увеличиваем таймер digitalWrite(Relay, 1); // включаем реле } sensor.read(); // чтение показаний датчика sensor.hum; // показания влажности delay(300); }
Направьте, пожалуйста, мысли в нужную сторону.
Спасибо!
Может "техзадание" сложновато? Я бы, для начала, сделал с двумя опциями:
1 - автомат. включение/выключение по влажности
2.-ручное включение/выключение.(возможно, варианты с таймером)
А где две , там и десять)). Хотя смысла добавлять что-то ещё как бы и не вижу(но это уже хозяин-барин)...
A.K., приветсвую.
Какие проблемы со временем? предположу, что срабатывает один раз и все? это связано с тем , что вы в коде переменную Timer уменьшаете до нуля, но больше нигде не устанавливаете.
И еще - строчки 29 и 47 абсолютно бессмысленны, обратите внимание.
Уважаемый Дим-мычъ! Ваше предложение - не вариант. Просто и потому не интересно!
Уважаемый b707! Спасибо за подсказку!
На текущий момент код несколько изменён. Чтобы здесь не перегружать, привожу по частям:
1. Таймер устанавливается в зависимости от влажности на 3 или на 7 "попугаев", работает правильно
2. Проблемная часть. Отключение реле происходит только по таймеру и не зависит от влажности, т.е. при снижении влажности ниже порога таймер продолжает считать.
В чём ошибка?
Как вариант можно посмотреть сюда
Может так?
Тогда не работает "короткая" часть кода, т.е. безусловное включение реле после света.
4. Возможность принудительного запуска/остановки вентиляции без дополнительных выключателей - приятная плюшка, пока не придумал как
Тогда не работает "короткая" часть кода, т.е. безусловное включение реле после света.
Пробуйте убрать else перед if, возможно "свет" блокирует
lilik Например, по двойному переключению освещения в течение 5-7 сек, нет? Но пока строится основная часть.
Дим-мычъ, тогда работает только по влажности
lilik Например, по двойному переключению освещения в течение 5-7 сек, нет?
... вызывать платного шамана ...
А научиться шаманить не возбраняется? ;)
lilik Например, по двойному переключению освещения в течение 5-7 сек, нет? Но пока строится основная часть.
Аааа..., ну это не принудительно, а по условию-стечения обстоятельств :-)
lilik, спасибо за уточнение! И правда, в этом случае - по условию.
Доброго здоровья!
Спасибо всем участникам обсуждения! Основная задача решена. Пока не реализована последняя задача, буду придумывать. Вместе с тем понимаю, что код далеко не идеален.
Буду рад любым советам по улучшению кода.
Как по мне, норм. для новичка. Я тоже вроде как новичёк ещё, скоро год, как увлекаюсь ардуино.
Вот набросал тоже. Не скажу,что лучше, но без прерываний и, главное без делей. Если что-то нужно будет
добавить, не будет блокировать.
Возможно, немного допилить придётся))
P.S. Но всё равно, если я всё правильно понял, в Вашем алгоритме есть недостаток(может я не прав?)
Допустим , идёт большая и долгая стирка, и никто не включает/выключает свет.
Тогда вентилятор сам не включится.
Поэтому, я, всё же останусь при своём мнении (#1), что лучше "дёшево и сердито"))
Если ванная исключается, то да, почему бы и нет, для любимой тёщи?
P.P.S. И ещё. В коде из #15 если выключаем свет при повышенной влажности, и ,допустим, через минуту влажность придёт в норму, реле выключит вытяжку. Т.е. вентилятор не отработает свои минимальные 10мин?
Для санузла логичнее включать вентиляцию при включении освещения (кто в потёмках то «дела» делает?). И любой таймер, чтобы ещё минут 20-30 после выключения освещения вентиляция работала. Всё.
Для санузла логичнее включать вентиляцию при включении освещения (кто в потёмках то «дела» делает?). И любой таймер, чтобы ещё минут 20-30 после выключения освещения вентиляция работала. Всё.
Функционал абсолютно любого бытового вытяжного вентилятора...
Уважаемый Дим-мычъ!
Попробовал залить Вашу версию прошивки и огорчился - не работает. Т.е., алгоритм из ТЗ не выполняется, а что и как выполняется, разобраться не получилось, увы! Иногда реле включается вне границ влажности и без связи с освещением. :(
Кстати, чем Вас смущает deley? Его можно и вовсе исключить: 1. экспериментально оценить длительность работы программы и задать соотв. значения таймеров, или 2. ввести millis с нужным "обвесом". Если Вы заметили, в последней версии кода millis исключены, т.к. были взяты из чужого кода.
Понятно, что в первом случае не будет точного времени, но он с такой точностью для такой задачи, ИМХО, и требуется.
Но и в моём коде (#15) есть недоработка. между 57 и 58 строками нужно добавить
После этого добавления первые 3 пункта ТЗ отрабатываются корректно.
Ещё на Хабре есть хорошая статья на эту тему, но там уж совсем красиво, по богатому и с яндексовой Алисой: https://habr.com/ru/post/597023/
Для санузла логичнее включать вентиляцию при включении освещения (кто в потёмках то «дела» делает?). И любой таймер, чтобы ещё минут 20-30 после выключения освещения вентиляция работала. Всё.
Может у ТС вентилятор шумный. Думать мешает.
Попробовал залить Вашу версию прошивки и огорчился - не работает. Т.е., алгоритм из ТЗ не выполняется,
А у вас ТЗ логически не полное.
- Вот если при выключении света влажность была > 70% но снизилась ниже порога меньше чем за 10 минут, то надо следовать п.3 или п.2?
- Чему равен порог?
- Почему в ТЗ упоминается 70% влажности, а в коде этого нет?
Для санузла логичнее включать вентиляцию при включении освещения (кто в потёмках то «дела» делает?). И любой таймер, чтобы ещё минут 20-30 после выключения освещения вентиляция работала. Всё.
Может у ТС вентилятор шумный. Думать мешает.
Ну значит запускать таймер после «думных дел» )))
Попробовал залить Вашу версию прошивки и огорчился - не работает.
В Протеусе работает. Возможно уже переназначили пины. Если что, Pro Mini 8MHz.
Ну а про делей- ясно дело, зацикливает работу процессора. Говорили ведь, что ещё планируете опции добавлять...
P.S. Ещё, как только выложил, в течении часа исправил ошибку. Не сказал, потому что не было ответа, думал Вас нет на форуме
Иногда реле включается вне границ влажности и без связи с освещением. :(
Подобные вещи удобно делать с использованием State Machine. Вот, набросал, правда не отлаживал.
При подобном подходе прикрутить включение/выключение по двойному миганию света - пара пустяков.
У друга ещё в 80-х на двух концевиках и реле с задержкой было сделано и нормально работало.
После этого добавления первые 3 пункта ТЗ отрабатываются корректно.
Если выключили свет(при повышенной влажности), и через минуту, влажность придёт в норму - вентилятор проработает минуту.
Надо корректировать таймер
В моём случае макс. время 80 у.е.)) мин. - 40. Т.е если прошло 3у.е. из 80 надо добавить 37 до 40
ну или просто добавить 40 а не просто обнулить
У друга ещё в 80-х на двух концевиках и реле с задержкой было сделано и нормально работало.
Это потому что у друга в 80х ардуины не было )
У друга ещё в 80-х на двух концевиках и реле с задержкой было сделано и нормально работало.
Это да. Не было. Зато были прямые руки не из жопы и голова светлая. Без форумов и советов обошёлся.
У друга ещё в 80-х на двух концевиках и реле с задержкой было сделано и нормально работало.
Я дико извиняюсь, а контроль влажности - был? Ни в коей мере не умаляю пряморукости, а равно и мыслительных способностей Вашего друга. Для 80-х такое решение было, да что там решение! - сама мысль была весьма достойной! Но наши-то с Вами возможности, кажется, отличаются от 80-х? Так что, если можете, передайте Вашему другу моё восхищение! Он опередил нас с Вами в формулировке проблемы.
[Если выключили свет(при повышенной влажности), и через минуту, влажность придёт в норму - вентилятор проработает минуту.
А что Вас смущает? В формулировке ТЗ я отталкивался от следующих соображений.
Когда человек принимает ванну или моется в душе поток воздуха, пусть даже небольшой, способен снизить температуру поверхности тела (люди - теплокровны), значит "сквозняка" быть не должно.
После дефекации запах должен быть ослаблен/удалён, а вводить датчик органики, как у профессионалов с Хабра, я сейчас не готов.
Настроить время работы вытяжки проще, чем менять алгоритм. Случай с затяжной влажностью можно быстро допилить звуковой тревогой.
Кажется, для первого "самостоятельного" проекта достаточно. Dixi.
P.S. Тестировал ранее предложенный Вами код на железе: Arduino Nano + датчики и реле из китайского набора Keystudio.
А что Вас смущает?
Уважаемый А.К.! Наоборот, я рад, что у Вас получилось! И, спасибо за то , что дали пример для тренировки))
У друга ещё в 80-х на двух концевиках и реле с задержкой было сделано и нормально работало.
Я дико извиняюсь, а контроль влажности - был? Ни в коей мере не умаляю пряморукости, а равно и мыслительных способностей Вашего друга. Для 80-х такое решение было, да что там решение! - сама мысль была весьма достойной! Но наши-то с Вами возможности, кажется, отличаются от 80-х? Так что, если можете, передайте Вашему другу моё восхищение! Он опередил нас с Вами в формулировке проблемы.
Я не понимаю необходимости контроля влажности в туалете. В ванной да, когда моешься влажность подпрыгивает. В туалете не видел ни разу подъёма влажности. Вытяжка постоянно подсасывает воздух из квартиры, который у меня выше 35% влажности не бывает с постоянно включенным увлажнителем. В туалете нет источника влажности что бы перебороть влажность комнат, соотношение объёмов туалета и комнат таково, что даже при открытии - закрытии двери воздух внутри становится такой же как в комнате.
Тестировал ранее предложенный Вами код на железе: Arduino Nano + датчики и реле из китайского набора Keystudio.
P.S. Наконец дошло, почему мой код не работал)) То что для меня само-собой разумеется, кому-то может быть не понятно. Так что извините, что не разъяснил.
Для меня как 2х2то, что если кнопка активна лог1, то "подтягиваем" пин к земле. А если лог0, то к +питания.
Это видно из логики кода, но новичку может и не видно. Я должен был сказать. У меня кнопка , активна при лог1. "Подтянута к земле" резистором 12,1кОм.(можно 5-15кОм) Со стороны питания ограничительный резистор(необязательно) 382 Ом.
Если этого не сделать, то на пине будут наводки, и работа схемы будет непредсказуемой.
Уважаемый nik812!
В "географии" санузла есть тонкость, которую я не упомянул и которая, должно быть, критически влияет на ТЗ. Санузел организован "трамвайчиком", т.е. вход в туалет - через ванную. Соответственно, свет при входе в туалет включается сразу и в ванной. Разумеется, влажность контролируется только в ванной. Поток вентиляции настраивается "диафрагмами" вентиляционной системы и затейливым учётом локальных условий, касающихся притока-оттока воздуха. Опять же, загляните на Хабр, в статью из #19, там красиво и 100% правильно. Я затачивал ТЗ под свои хотелки, ну или тёщины потребности (иногда бываю убедителен). Я - великий маркетолог!(шутка, никакого отношения, чур меня!)
... мой код не работал)) То что для меня само-собой разумеется, кому-то может быть не понятно.
Уважаемый Дим-мычъ !
Спасибо Вам за диалог! я пока слаб в программной части, но, благодаря Вашим советам, надеюсь научиться.
Посмотрел статью. Как всё слишком обще описано. Подобная система у меня уже несколько лет работает, завязанная на blynk. По крайней мере blynk выдаёт данные всех датчиков за последние 2 года. Прикольнее всего следить за СО2. Возможно это особенность моей квартиры, но влажность прыгает в ванной и коридоре около только если кто-нибудь принимает душ. В остальное время быстро приходит в норму. Была тоже идея включать вытяжку по влажности, но парадигма включение вентилятора руками в нужные моменты победила после полугода автоматического управления светом в туалете. Оказалось что всем удобнее самим включать - выключать. Уж не знаю почему, но отношение к автоматике с задержками отключения через какое то время от состояния прикольно перешла а состояние - нервирует. Сейчас остались только датчики и панели с индикацией.
Подтверждаю. У меня на входе всего лишь выключатель с задержкой отключения. Мы как то сразу привыкли, а вот посторонние и даже родственники... Постоянно норовят пощёлкать выключателем, сколько им не говори.)
Если реакция устройства на внешнее воздействие происходит с ощутимой задершкой, это, абычна, провоцирует у людей, лишонных яиц, панику и ступор, они почему-то сразу думают, что сделали что-то не так и пытаются сделать это снова и "так". Задершка - зло (по крайней мере, в моем доме). Я пытался, канеш, выдрессировать глупых самок, но швабра по коленям - очень ощутимый аргумент против, я отступился.
Дык свет и не нужно с задержкой отключать. Задержка нужна только вентилятору ))
P.S. Наконец дошло, почему мой код не работал)) То что для меня само-собой разумеется, кому-то может быть не понятно. Так что извините, что не разъяснил.
Для меня как 2х2то, что если кнопка активна лог1, то "подтягиваем" пин к земле. А если лог0, то к +питания.
Это видно из логики кода, но новичку может и не видно. Я должен был сказать. У меня кнопка , активна при лог1. "Подтянута к земле" резистором 12,1кОм.(можно 5-15кОм) Со стороны питания ограничительный резистор(необязательно) 382 Ом.будет непредсказуемой.
Мне вот непонятно. Чем не устраивает INPUT_PULLUP без обвешивания доп. резисторами?
input_pullup всем устраивает, но не всегда ведь нужен активный низкий уровень?
Да и "подтяжка" иногда нужна побольше (напр.1-wire 5кОм нужно)
А в этом случае - просто привычка. Мне проще раз поставить резистор, и знать, что есть напряжение-лог1
нет-лог0 (упрощённо конечно), чем всё время "переворачивать" кнопку в голове))
Ужос.( Есть же куча способов что бы отделить физику от логики и не страдать фигнёй. Простейший вариант:
Для того что бы поменять активный уровень KEY и/или LED правится только в одном месте, а вся логика остаётся ВООБЩЕ без изменений. И в голове ничего переворачивать не надо. Описал физику и всё. Напрочь о ней забыл!
Описал физику и всё. Напрочь о ней забыл!
Спасибо, буду теперь знать!
А если любите Ардуино, можно описать активность каждого.
А если любите Ардуино, можно описать активность каждого.
Спасибо за примеры, буду пробовать применять.
А к Ардуино да, не равнодушен, есть такое...