Вытяжка в туалете на 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 час.
Будет тупо и цинично, но основная задача будет выполнена, этого времени будет вполне достаточно, что бы убрать избыточную влажность(ну я просто не напишу код для двух датчиков влажности, а этот можно попробовать сделать).
Через датчик света не сделаю(было бы проще всего) - у меня окно в ванной.
Вы описание этого реле читали?
Если нет, то почитайте. особенно Вам должно понравиться вот это место:
каких двигателей? почему не предназначены? для чего предназначены вообще?
если не предназначены для коммутации высоко-индуктивной нагрузки - насколько высоко? в метрах, пжлта!
*какой дыбил писал это описалово?
Я про второй датчик не зря сказал. У меня нечто подобное для сарая, так там бывает так, что вроде и владность внутри высокая, но на улице ещё выше и чего толку вентилировать. Там вентилляция нужна только если на улице меньше. чем внутри :)
ЕвгенийП - я же и говорю, что идея классная, но сам я такой код не напишу, мне придётся упростить код до своих возможностей.
#include "DHT.h" #define DHTPIN1 1 // датчик в ванной #define DHTPIN2 2 // датчик на кухне #define fan 4 #define DHTTYPE DHT11 // DHT 11 //#define DHTTYPE DHT22 // DHT 22 (AM2302) //#define DHTTYPE DHT21 // DHT 21 (AM2301) DHT dht1(DHTPIN1, DHTTYPE); DHT dht2(DHTPIN2, DHTTYPE); void setup() { pinMode(fan, OUTPUT); Serial.begin(9600); Serial.println("test!"); dht1.begin(); dht2.begin(); } void loop() { delay(2000); float h1 = dht1.readHumidity(); float h2 = dht2.readHumidity(); } // если влажность ванной + 10 (сюда включена заводская погрешность двух DHT между собой //и лишняя влажность, которую убираем) больше влажности на кухне включаем вентилятор if(h1+10 > h2) { digitalWrite(fan, HIGH); } else { digitalWrite(fan, LOW); } // блок вывода на "экран" Serial.print(h1); Serial.print(" sensor 2, "); Serial.print(h2); Serial.print(" sensor 3, "); }В строки 31-35 надо бы гистерезис добавить. А то при пограничном значении влажности она задолбает дёргать вентиллятор туда-сюда каждые две секунды.
Из того, что смогу написать в голову пришло только задать паузу во время которой мы должны отойти от пограничного значения:
if(h1+10 > h2) //влажность в туалете + 10 > влажности на кухне digitalWrite(fan, HIGH); delay(1500000); // задержка 15 минут } else { digitalWrite(fan, LOW); }Нет, я не про паузу, а про гистерезис.
Вот смотрите, допустим Вы включаете при влажности > 50
Нельзя писать
потому что она когда дойдёт до 50 она же не сразу проскочит, а будет колебаться то 51, то снова 50 и так несколько раз - любой физический процесс так немного "колеблется". И вот она будет у Вас в этот момент десять раз включаться и выключться из-за каждой случайной флуктуации.
Надо
1) посмотреть насколько процесс реально "дергается" (Попечатайте в Serial.print и понаблюдайте)
2) оставить ему зазор на "дергание".
Вот допустим, при росте она у Вас "в целом растёт", но иногда туда-сюда дергается на 2. Тогда можно написать.
остался зазор в 4 единицы. Пока влажность в этом зазоре вентиллятор не изменяет своего состояния каково бы оно ни было. Этот зазор спасёт Вас от многократных ключений-выключений при пограничной влажности.
Я сразу понял что Вы имеете ввиду, но не знаю как это описать.
Ведь при значении 48 вентилятор и так не включится, т.к. 48 < 52. Ааааа, понял )
#include "DHT.h" #define DHTPIN1 1 // датчик в ванной #define DHTPIN2 2 // датчик на кухне #define fan 4 #define DHTTYPE DHT11 // DHT 11 //#define DHTTYPE DHT22 // DHT 22 (AM2302) //#define DHTTYPE DHT21 // DHT 21 (AM2301) DHT dht1(DHTPIN1, DHTTYPE); DHT dht2(DHTPIN2, DHTTYPE); void setup() { pinMode(fan, OUTPUT); Serial.begin(9600); Serial.println("test!"); dht1.begin(); dht2.begin(); } void loop() { delay(2000); float h1 = dht1.readHumidity(); float h2 = dht2.readHumidity(); } // если влажность ванной + 10 (сюда включена заводская погрешность двух DHT между собой //+ лишняя влажность,которую убираем) if(h1+10 >= h2) { digitalWrite(fan, HIGH); } else if ((h1+10 < h2) && (h1+10 >= h2-2)) //к примеру (60+10 < 70%) и (60+10 >=68) = fan off { digitalWrite(fan, LOW); } // блок вывода на "экран" Serial.print(h1); Serial.print(" sensor 2, "); Serial.print(h2); Serial.print(" sensor 3, "); }Ну, я же написал Вам как делать. Вот так и делайте с if и else if
А про точность - абсолютно верно. Я взял несколько самых дешёвых и просто подобрал более или менее одинаковые. Нам же важно не значение, а разница.
Понимаю, что теме уже два года, но тем не менее хочу узнать получилась ли задумка с двумя датчиками и гистирезисом, есть желание повторить, нет понятия в програмировании.
if (v > 52) Vkluchit();
Как сюда вписать показания двух датчиков?
Как сюда вписать показания двух датчиков?
Откройте для себя http://arduino.ru/Reference/Boolean
Ecolog - да не, я просто забил, оказалось, что и без вентилятора вытяжка норм тянет.
Pashtet- у меня без него никак
[code] #include "DHT.h" #define DHTPIN2 2 // датчик в ванной #define DHTPIN3 3 // датчик на кухн #define fan 4 #define DHTTYPE DHT22 // DHT 22 //#define DHTTYPE DHT22 // DHT 22 (AM2302) //#define DHTTYPE DHT22 // DHT 22 (AM2302) DHT dht2(DHTPIN2, DHTTYPE); DHT dht3(DHTPIN3, DHTTYPE); void setup() { pinMode(fan, OUTPUT); digitalWrite(fan, HIGH); Serial.begin(9600); Serial.println("test!"); dht2.begin(); dht3.begin(); } boolean flag1 = true; boolean flag2 = true; boolean h2On = false; boolean h2Off = false; void loop() { float h1=0, h2=0; h1 = dht2.readHumidity(); h2 = dht3.readHumidity(); Serial.print(h1); Serial.print(" "); Serial.println(h2); if(h2 > (h1+10)){ h2On = true; h2Off = false; } if((h2 > (h1+5)) && (h2 < (h1+10))){ h2Off = true; h2On = false; } if(h1 > h2){ h2Off = true; h2On = false; } /////////////////////////////////////// if(h2On == true && flag1 != h2On){ digitalWrite(4, LOW); Serial.println("ON"); } flag1 = h2On; if(h2Off == true && flag2 != h2Off){ digitalWrite(4, HIGH); Serial.println("OFF"); } flag2 = h2Off; // блок вывода на "экран" Serial.print("h2On:"); Serial.print(h2On); Serial.print(", h2Off:"); Serial.println(h2Off); delay(500); } [/code]думаю, что в строке 42 чтото не так, вент. выключается в разнице на 10 единиц, а не на пяти
[code] if((h2 > (h1+2)) && (h2 < (h1+4))){ [/code]Сделал такие значения, вроде стал адекватно выключать, еще потестирую.