Вытяжка в туалете на UNO+HTU21D+керамическое реле. Сезонная влажность.

Pashtet
Offline
Зарегистрирован: 30.06.2016

Добрый день.

Хочется сделать вытяжку в туалете (частный дом, естественной вытяжки нет). В электронике я нуб, а ардуино включал один раз.

Изначально схему планировла сделать такой:

и такой код:

#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 часа значение так и не было достигнуто, то значения обнуляются и рассчитываются заново (если естественная влажность начала увеличиваться, то вентилятор может достигнуть той влажности(полученной со ста замеров) только через пару месяцев)

 

Может есть у кого какие идеи как можно это упростить и что бы код смог написать полный дуб(это я) в программировании?

 

Заранее огромное спасибо.

Pashtet
Offline
Зарегистрирован: 30.06.2016

Да, реле такое:

 

такое реле выбрал вместо одноканального что на первой схеме потому, что в своё время его заказывал и оно есть (безхозное).

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Вы описание этого реле читали?

Если нет, то почитайте. особенно Вам должно понравиться вот это место:

 

Pashtet
Offline
Зарегистрирован: 30.06.2016

Я читал подобное но, честно говоря, так и не понял можно через него подключать малую нагрузку или нет? 

Вентилятор вытяжки: 

ВЕНТС 100 К1

Максимальная мощность 14 Вт
Напряжение 220-240 В
Производительность 95 м3/ч
Размер патрубка 100 мм
Ток 0.085 А
Уровень шума на расстоянии 3 м 34 дБ(А)
Частота вращения 2300 мин-1
Частота тока 50 Гц

 

Если нет, то закажу обычное реле типа такого

https://ru.aliexpress.com/item/Free-shipping-5V-low-level-trigger-One-1-...

Pashtet
Offline
Зарегистрирован: 30.06.2016

Самое главное это код - с ним полная засада.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ну, запас по току у Вас почти в 400 раз. Я бы рискнул и подключил бы :)

Только вот знаете чего я не понимаю? Зачем Вам для такой простой штучки ставить такое дорогое решение? Это реле - оно ведь ...

Копеечный симистор вкупе с копеечной же оптопарой и несколькими резисторами закроет эту проблему раз в пять дешевле. И как дополнительный бонус, Вы совершенно бесплатно получите возможность управления мощностью работы вентиллятора (вруг захотите крутить его послабее. что не шумел, напмример). А с реле - фигвам - либо ВКЛ, либо ВЫКЛ. Если нужна схема с симистором - говорите.

Со скечтем я бы не мудрил со статистикой, а поставил бы контрольный датчик вне ванной комнаты и работал бы по принципу компаратора - задача вентиллятора сравнять влажность с той, что показывает контрольный датчик. Таким образом система не зависела бы от текущей (по сезону) естественной влажности.

Pashtet
Offline
Зарегистрирован: 30.06.2016

У меня уже есть это реле, валяется бесхозное, не покупать же более дешевое только для того, что бы это продолжало лежать и пылиться ;)

Решение, кстати, дешевым никак не получится, к сожалению. Два датчика HTU21D получаются 400 руб + код я сам железобетонно не напишу, его нужно будет заказывать (если никто не согласится помочь, заодно и код будет полезен многим, кто хочет сделать вытяжку).

Если два датчика будет, то алгоритм, по идее, должен быть таким:

если значение первого датчика(туалет) отличается более чем на 10%(можно меньше, но наверняка у двух рядом лежащих датчиков будет разница в измерениях из-за погрешности изготовления датчика) от значения второго датчика, то включается вентилятор, который за, допустим, 20 минут должен достигнуть одинакового значения(с учётом 10% разницы), если нет, то пауза в 30 минут, затем очередное включение вентилятора.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Среднее знечение - штука тонкая...

Во-первых, в математике различают три средние величины: среднее гармоническе, среднее геометрическое и среднее арифметическое. И какое из них использовать - существенным образом зависит от задачи.

Но в Вашей задаче я бы порекомендовал не одно из перечисленных средних, а медиану. Это дешевле чем второй датчик. Кроме того, у датчиков существует неизбежный разброс, который нужно будет учитывать.

Pashtet
Offline
Зарегистрирован: 30.06.2016

А ставить 2 DHT11/22 нет смысла, они будут работать ни в зуб ногой - положи их рядом и получи 30% разницы в измерениях.

Pashtet
Offline
Зарегистрирован: 30.06.2016

А можно реализовать по другому.

 

На потолке ванной светодиодные светильники работающие от 12 вольт. Можно ли эти 12 вольт как-то подвести к ардуине, что бы она их "видела"?

Включаем свет в ванной на период < 7 минут, после выключения света вентилятор включается на 5 минут.

Включаем свет в ванной на период >7 минут(купаемся), после выключения света включаем вентилятор в ванной на 1 час.

 

Будет тупо и цинично, но основная задача будет выполнена, этого времени будет вполне достаточно, что бы убрать избыточную влажность(ну я просто не напишу код для двух датчиков влажности, а этот можно попробовать сделать).

 

Через датчик света не сделаю(было бы проще всего) - у меня окно в ванной.

Клапауций 232
Offline
Зарегистрирован: 05.04.2016

ЕвгенийП пишет:

Вы описание этого реле читали?

Если нет, то почитайте. особенно Вам должно понравиться вот это место:

каких двигателей? почему не предназначены? для чего предназначены вообще?

если не предназначены для коммутации высоко-индуктивной нагрузки - насколько высоко? в метрах, пжлта!

*какой дыбил писал это описалово?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Я про второй датчик не зря сказал. У меня нечто подобное для сарая, так там бывает так, что вроде и владность внутри высокая, но на улице ещё выше и чего толку вентилировать. Там вентилляция нужна только если на улице меньше. чем внутри :) 

Pashtet
Offline
Зарегистрирован: 30.06.2016

ЕвгенийП  - я же и говорю, что идея классная, но сам я такой код не напишу, мне придётся упростить код до своих возможностей.

 

Pashtet
Offline
Зарегистрирован: 30.06.2016
В общем, пока всё реализую без HTU21D, т.к. их пока не знаю как подключать и не знаю как и что писать в коде.
Посмотрите пожалуйста схему и код, на сколько вероятно, что она будет работать?
 
в схеме 2 датчика: туалет + кухня.
 
 
#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, "); 
}

 

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

В строки 31-35 надо бы гистерезис добавить. А то при пограничном значении влажности она задолбает дёргать вентиллятор туда-сюда каждые две секунды.

Pashtet
Offline
Зарегистрирован: 30.06.2016

Из того, что смогу написать в голову пришло только задать паузу во время которой мы должны отойти от пограничного значения:

if(h1+10 > h2) //влажность в туалете + 10 > влажности на кухне
digitalWrite(fan, HIGH);
delay(1500000); // задержка 15 минут
} else {
digitalWrite(fan, LOW);
}

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Нет, я не про паузу, а про гистерезис.

Вот смотрите, допустим Вы включаете при влажности > 50

Нельзя писать 

if (v > 50) Vkluchit();
else Vikluchit();

потому что она когда дойдёт до 50 она же не сразу проскочит, а будет колебаться то 51, то снова 50 и так несколько раз - любой физический процесс так немного "колеблется". И вот она будет у Вас в этот момент десять раз включаться и выключться из-за каждой случайной флуктуации.

Надо 

1) посмотреть насколько процесс реально "дергается" (Попечатайте в Serial.print и понаблюдайте)
2) оставить ему зазор на "дергание".

Вот допустим, при росте она у Вас "в целом растёт", но иногда туда-сюда дергается на 2. Тогда можно написать.

if (v > 52) Vkluchit();
else if (v < 48) Vikluchit();

остался зазор в 4 единицы. Пока влажность в этом зазоре вентиллятор не изменяет своего состояния каково бы оно ни было. Этот зазор спасёт Вас от многократных ключений-выключений при пограничной влажности.

Pashtet
Offline
Зарегистрирован: 30.06.2016

Я сразу понял что Вы имеете ввиду, но не знаю как это описать.

Ведь при значении 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, "); 
}

 

[в числе и виде указания ковычек else if ((h1+10 < h2) && (h1+10 >= h2-2)) наверняка напутал]
Однако, это не решает проблему дергания - остается пограничное значение в большу сторону.
В меньшую сторону пауза в 2 единицы измерения, а в большую нет, т.е. при, скажем, 70-71% будет дергаться.
 
Кстати, пришел к выводу, что не важно какие датчики будут, самое главное, что бы разброс между ними был не большим, а там путь врут хоть на 100%. Т.е. дорогие датчики можно не заказывать.
ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ну, я же написал Вам как делать. Вот так и делайте с if и else if

А про точность - абсолютно верно. Я взял несколько самых дешёвых и просто подобрал более или менее одинаковые. Нам же важно не значение, а разница.

Ecolog
Offline
Зарегистрирован: 10.10.2018

Понимаю, что теме уже два года, но тем не менее хочу узнать получилась ли задумка с двумя датчиками и гистирезисом, есть желание повторить, нет понятия в програмировании.

Ecolog
Offline
Зарегистрирован: 10.10.2018

if (v > 52) Vkluchit();

else if (v < 48) Vikluchit();

Как сюда вписать показания двух датчиков?

Araris
Offline
Зарегистрирован: 09.11.2012

Ecolog пишет:

Как сюда вписать показания двух датчиков?

Откройте для себя http://arduino.ru/Reference/Boolean

Pashtet
Offline
Зарегистрирован: 30.06.2016

Ecolog - да не, я просто забил, оказалось, что и без вентилятора вытяжка норм тянет.

Ecolog
Offline
Зарегистрирован: 10.10.2018

Pashtet- у меня без него никак

Ecolog
Offline
Зарегистрирован: 10.10.2018
[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]

 

Ecolog
Offline
Зарегистрирован: 10.10.2018

думаю, что в строке 42 чтото не так, вент. выключается в разнице на 10 единиц, а не на пяти

Ecolog
Offline
Зарегистрирован: 10.10.2018
[code]
  if((h2 > (h1+2)) && (h2 < (h1+4))){

[/code]

Сделал такие значения, вроде стал адекватно выключать, еще потестирую.