Вытяжка в туалете на UNO+HTU21D+керамическое реле. Сезонная влажность.
- Войдите на сайт для отправки комментариев
Добрый день.
Хочется сделать вытяжку в туалете (частный дом, естественной вытяжки нет). В электронике я нуб, а ардуино включал один раз.
Изначально схему планировла сделать такой:
и такой код:
#include "DHT.h" #define DHTPIN 2 // вывод, к которому подключается датчик #define DHTTYPE DHT22 // DHT 22 (AM2302) #define fan 4 int maxHum = 60; int maxTemp = 40; DHT dht(DHTPIN, DHTTYPE); void setup() { pinMode(fan, OUTPUT); Serial.begin(9600); dht.begin(); } void loop() { // ждем пару секунд перед началом измерений delay(2000); // считывание температуры или влажности занимает примерно 250 мс! // считанные показания могут отличаться от актуальных примерно на 2 секунды (это очень медленный датчик) float h = dht.readHumidity(); // Считывание температуры в цельсиях float t = dht.readTemperature(); // проверяем, были ли ошибки при считывании и, если были, начинаем заново if (isnan(h) || isnan(t)) { Serial.println("Failed to read from DHT sensor!"); return; } if(h > maxHum || t > maxTemp) { digitalWrite(fan, HIGH); } else { digitalWrite(fan, LOW); } Serial.print("Humidity: "); Serial.print(h); Serial.print(" %\t"); Serial.print("Temperature: "); Serial.print(t); Serial.println(" *C "); }
Почти сразу схема переросла (из-за предполагаемой ущербности DHT11/22) в такую:
Вопрос появляется такой - а что считать за "влажность в туалете высокая, нужно включить вентилятор"?
За 6 лет наблюдений за домашней метеостанцией заметил, что среднее значение влажности зимой, при включенных батареях, 20-27%. Летом всегда больше 55-60%, в среднем ~65%.
Т.е. купаясь в ванной зимой мы никогда не превысим летние 65%, ну, разве что залить всю ванную комнату под потолок водой.
Предложили такую идею -
сть смысл отслеживать текущую влажность за сутки и усредненное значение использовать как опорное (с некоторым допуском) на следующие сутки?
я предложил ещё такой вариант:
Показания снимаются раз в минуту. Если 3 показания на 5% > чем среднее значение за последние 100 замеров, то включается вытяжка, которая должна за 20 минут должна достигнуть того среднего значения с сотни замеров.
Если значение за 20 минут работы вентилятора не достигнуто, то следующее включение будет через, допустим, 60 минут на 5 минут.
Если через 3 часа значение так и не было достигнуто, то значения обнуляются и рассчитываются заново (если естественная влажность начала увеличиваться, то вентилятор может достигнуть той влажности(полученной со ста замеров) только через пару месяцев)
Может есть у кого какие идеи как можно это упростить и что бы код смог написать полный дуб(это я) в программировании?
Заранее огромное спасибо.
Да, реле такое:
такое реле выбрал вместо одноканального что на первой схеме потому, что в своё время его заказывал и оно есть (безхозное).
Вы описание этого реле читали?
Если нет, то почитайте. особенно Вам должно понравиться вот это место:
Я читал подобное но, честно говоря, так и не понял можно через него подключать малую нагрузку или нет?
Вентилятор вытяжки:
ВЕНТС 100 К1
Если нет, то закажу обычное реле типа такого
https://ru.aliexpress.com/item/Free-shipping-5V-low-level-trigger-One-1-...
Самое главное это код - с ним полная засада.
Ну, запас по току у Вас почти в 400 раз. Я бы рискнул и подключил бы :)
Только вот знаете чего я не понимаю? Зачем Вам для такой простой штучки ставить такое дорогое решение? Это реле - оно ведь ...
Копеечный симистор вкупе с копеечной же оптопарой и несколькими резисторами закроет эту проблему раз в пять дешевле. И как дополнительный бонус, Вы совершенно бесплатно получите возможность управления мощностью работы вентиллятора (вруг захотите крутить его послабее. что не шумел, напмример). А с реле - фигвам - либо ВКЛ, либо ВЫКЛ. Если нужна схема с симистором - говорите.
Со скечтем я бы не мудрил со статистикой, а поставил бы контрольный датчик вне ванной комнаты и работал бы по принципу компаратора - задача вентиллятора сравнять влажность с той, что показывает контрольный датчик. Таким образом система не зависела бы от текущей (по сезону) естественной влажности.
У меня уже есть это реле, валяется бесхозное, не покупать же более дешевое только для того, что бы это продолжало лежать и пылиться ;)
Решение, кстати, дешевым никак не получится, к сожалению. Два датчика HTU21D получаются 400 руб + код я сам железобетонно не напишу, его нужно будет заказывать (если никто не согласится помочь, заодно и код будет полезен многим, кто хочет сделать вытяжку).
Если два датчика будет, то алгоритм, по идее, должен быть таким:
если значение первого датчика(туалет) отличается более чем на 10%(можно меньше, но наверняка у двух рядом лежащих датчиков будет разница в измерениях из-за погрешности изготовления датчика) от значения второго датчика, то включается вентилятор, который за, допустим, 20 минут должен достигнуть одинакового значения(с учётом 10% разницы), если нет, то пауза в 30 минут, затем очередное включение вентилятора.
Среднее знечение - штука тонкая...
Во-первых, в математике различают три средние величины: среднее гармоническе, среднее геометрическое и среднее арифметическое. И какое из них использовать - существенным образом зависит от задачи.
Но в Вашей задаче я бы порекомендовал не одно из перечисленных средних, а медиану. Это дешевле чем второй датчик. Кроме того, у датчиков существует неизбежный разброс, который нужно будет учитывать.
А ставить 2 DHT11/22 нет смысла, они будут работать ни в зуб ногой - положи их рядом и получи 30% разницы в измерениях.
А можно реализовать по другому.
На потолке ванной светодиодные светильники работающие от 12 вольт. Можно ли эти 12 вольт как-то подвести к ардуине, что бы она их "видела"?
Включаем свет в ванной на период < 7 минут, после выключения света вентилятор включается на 5 минут.
Включаем свет в ванной на период >7 минут(купаемся), после выключения света включаем вентилятор в ванной на 1 час.
Будет тупо и цинично, но основная задача будет выполнена, этого времени будет вполне достаточно, что бы убрать избыточную влажность(ну я просто не напишу код для двух датчиков влажности, а этот можно попробовать сделать).
Через датчик света не сделаю(было бы проще всего) - у меня окно в ванной.
Вы описание этого реле читали?
Если нет, то почитайте. особенно Вам должно понравиться вот это место:
каких двигателей? почему не предназначены? для чего предназначены вообще?
если не предназначены для коммутации высоко-индуктивной нагрузки - насколько высоко? в метрах, пжлта!
*какой дыбил писал это описалово?
Я про второй датчик не зря сказал. У меня нечто подобное для сарая, так там бывает так, что вроде и владность внутри высокая, но на улице ещё выше и чего толку вентилировать. Там вентилляция нужна только если на улице меньше. чем внутри :)
ЕвгенийП - я же и говорю, что идея классная, но сам я такой код не напишу, мне придётся упростить код до своих возможностей.
В строки 31-35 надо бы гистерезис добавить. А то при пограничном значении влажности она задолбает дёргать вентиллятор туда-сюда каждые две секунды.
Из того, что смогу написать в голову пришло только задать паузу во время которой мы должны отойти от пограничного значения:
Нет, я не про паузу, а про гистерезис.
Вот смотрите, допустим Вы включаете при влажности > 50
Нельзя писать
потому что она когда дойдёт до 50 она же не сразу проскочит, а будет колебаться то 51, то снова 50 и так несколько раз - любой физический процесс так немного "колеблется". И вот она будет у Вас в этот момент десять раз включаться и выключться из-за каждой случайной флуктуации.
Надо
1) посмотреть насколько процесс реально "дергается" (Попечатайте в Serial.print и понаблюдайте)
2) оставить ему зазор на "дергание".
Вот допустим, при росте она у Вас "в целом растёт", но иногда туда-сюда дергается на 2. Тогда можно написать.
остался зазор в 4 единицы. Пока влажность в этом зазоре вентиллятор не изменяет своего состояния каково бы оно ни было. Этот зазор спасёт Вас от многократных ключений-выключений при пограничной влажности.
Я сразу понял что Вы имеете ввиду, но не знаю как это описать.
Ведь при значении 48 вентилятор и так не включится, т.к. 48 < 52. Ааааа, понял )
Ну, я же написал Вам как делать. Вот так и делайте с if и else if
А про точность - абсолютно верно. Я взял несколько самых дешёвых и просто подобрал более или менее одинаковые. Нам же важно не значение, а разница.
Понимаю, что теме уже два года, но тем не менее хочу узнать получилась ли задумка с двумя датчиками и гистирезисом, есть желание повторить, нет понятия в програмировании.
if (v > 52) Vkluchit();
Как сюда вписать показания двух датчиков?
Как сюда вписать показания двух датчиков?
Откройте для себя http://arduino.ru/Reference/Boolean
Ecolog - да не, я просто забил, оказалось, что и без вентилятора вытяжка норм тянет.
Pashtet- у меня без него никак
думаю, что в строке 42 чтото не так, вент. выключается в разнице на 10 единиц, а не на пяти
Сделал такие значения, вроде стал адекватно выключать, еще потестирую.