Добрый день. Хочу сделать вытяжку в ванной, из железок - DHT11, Arduino UNO, Твердотельное реле(в своё время его заказывал, т.е. оно есть, хочется применить его, что б не валялось). По идее(я полный нуб в электронике, а ардуино один раз включал), схема будет такой: Программа будет такой: Код (C++): #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 "); } Самое главное - как подключить твердотельное реле вместо обычного(на схеме справа)? Заранее огромное спасибо.
Значит правильно с самого начала раскрасил. Можно немного потупить? Т.е. на цифровом выходе мы получим 5в для замыкания реле? И годится ли код? Заранее огромное спасибо!
Неплохо бы параллельно твердотелке резистор 10 кОм подключить (притянуть вход к GND, чтобы гарантировать отсутствие случайных самопроизвольных включений от помех). Ну и порядка 200 Ом между зеленым проводом твердотелки и 4 пином ардуины (ограничить ток на пине ардуины). Только смотрите внимательно - в зависимости от потребляемой нагрузкой мощности может понадобится радиатор для твердотелки. Вполне достаточно.
DHT11 сразу выкинуть и поставить хотя бы DHT 22 (кстати в коде именно DHT 22 написано). Еще нет гистерезиса, поэтому на пограничных значениях реле может начать дребезжать. Добавь небольшую дельту между порогами включения и выключения: Код (C++): if(h > maxHum || t > maxTemp) digitalWrite(fan, HIGH); else if(h < maxHum -10 || t < maxTemp -3) digitalWrite(fan, LOW);
Скажите, а на сколько точные DHT11/22? Может есть какие аналоги по вменяемой цене? Типа: HTU21D temperature & humidity sensor breakout board module или AM2320
С датчиком может быть засада, возможно придётся покупать часы реального времени (что бы задать сезонность зима-лето). За 6 лет наблюдений за домашней метеостанцией средняя влажность зимой, при включенных батареях, около 20-27%, летом ~65%. Т.е. при купании в ванной зимой 65% практически не будет превышаться, в то время как летом там всегда будет >65%. Вопрос - а что ставить в качестве "большая влажность, нужно включить вентилятор"? Можно ли в коде указать, что независимо от влажности вентилятор нужно включать раз в 15 минут на 2 минуты?
Это реализуемо, но может есть смысл отслеживать текущую влажность за сутки и усредненное значение использовать как опорное (с некоторым допуском) на следующие сутки? Таким образом получим адаптивный датчик...
Да, классная идея. Ещё можно так: Показания снимаются раз в минуту. Если 3 показания на 5% > чем среднее значение за последние 100 замеров, то включается вытяжка, которая должна за 20 минут должна достигнуть того среднего значения с сотни замеров. Если значение за 20 минут работы вентилятора не достигнуто, то следующее включение будет через, допустим, 60 минут на 5 минут. Если через 3 часа значение так и не было достигнуто, то значения обнуляются и рассчитываются заново (если естественная влажность начала увеличиваться, то вентилятор может достигнуть той влажности(полученной со ста замеров) только через пару месяцев) [потупить on] а разве в арудино есть память, в которую можно записать значения? [/потупить on]
Есть ещё вариант - считать через 2 датчика влажности, один в ванной, второй на кухне. Если значение первого датчика(туалет) отличается более чем на 10%(можно меньше, но наверняка у двух рядом лежащих датчиков будет разница в измерениях из-за погрешности изготовления датчика) от значения второго датчика, то включается вентилятор, который за, допустим, 20 минут должен достигнуть одинакового значения(с учётом 10% разницы), если нет, то пауза в 30 минут, затем очередное включение вентилятора. А можно реализовать по другому. На потолке венной светодиодные светильники работающие от 12 вольт. Можно ли эти 12 вольт как-то подвести к ардуине, что бы она их "видела"? Включаем свет в ванной на период < 7 минут, после выключения света вентилятор включается на 5 минут. Включаем свет в ванной на период >7 минут(купаемся), после выключения света включаем вентилятор в ванной на 1 час. Будет тупо и цинично, но основная задача будет выполнена, этого времени будет вполне достаточно, что бы убрать избыточную влажность(ну я просто не напишу сам код для двух датчиков влажности, а этот можно попробовать сделать). Через датчик света не сделаю(было бы проще всего) - у меня окно в ванной.
alp69 - Вы шутите! (даже без знака вопроса), там это, код для тех, кто 18+ В общем, пока всё реализую без HTU21D, т.к. их пока не знаю как подключать и не знаю как и что писать в коде. Посмотрите пожалуйста схему и код, на сколько вероятно, что она будет работать? Код (C++): #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, "); }