Здравствуйте!
Как и обещал публикую свой проект блока управления вентилятора в ванной.
Для данного устройства были использованы:
— плата Arduino Pro mini;
— зарядное устройство 5В в качестве источника питания;
— релейный модуль «5V 1-Channel Relay Module Board for Arduino PIC STM32 Optocouple For Arduino MCU»;
— фотоэлемент «LM393 light Sensor Module», для определения момента включения и выключения света.
— датчик температуры и влажности DHT11.
Компоненты выбирал из того что у меня есть в наличии. Печатную платы не делал, собирал все навесным монтажом и использовал маленькую макетную платку.
Санузел у меня совмещенный. Поэтому алгоритм работы следующий.
1. Устройство должно включать вентилятор при достижении верхнего предела влажности и выключать его, если влажность опустилась меньше нижнего порога влажности.
2. При включении света в ванной вентилятор доложен в любом случае выключатся — т.к. дома маленький ребенок и не хотелось чтобы вентилятор пугал ребенка, если нужно будет его покупать (как оказалось вентилятор не такой уж и страшный).
3. После того как свет выключился (посетитель покинул санузел) — вентилятор должен включится на заданный промежуток времени, для того чтобы освежить воздух.
Включение и выключение вентилятора происходит с помощью реле. Так же предусмотрена индикация причины включения вентилятора:
1. зеленый светодиод — человек покинул санузел.
2. красный светодиод — повышение влажности.
Схема устройства представлена на рисунке.
Всё довольно просто. Фотоэлемент LM393 light Sensor Module при включении света устанавливает у себя на выходе логическую «1». Датчик DHT11 позволяет нам отслеживать влажность в помещении.
Скетч можно загрузить тут.
Основной блок программы следующий:
void loop()
{
DHT11.acquireAndWait();
hidr = DHT11.getHumidity(); // получаем сзначение влажности
NextLight = !digitalRead(LightPin);
if (NextLight == 1)
{
vent = 0;
Lightvent = 0;
if (NextLight != PrevLight) PrevLight = NextLight; // изменение состояния освещения
}
else
{
if (PrevLight == 1)
{
time_dif = millis() — LightcurMillis;//фиксируем время работы вентилятора из-за света
if (vent == 0)
{
vent = 1;
LightcurMillis = millis();
Lightvent = 1;
//if (NextLight != PrevLight) PrevLight = NextLight;
}
else if ((millis() — LightcurMillis) > period)
{
vent = 0;//если вентилятор работает больше времени работы после выключения света — выключаем вентилятор
Lightvent = 0;
if (NextLight != PrevLight) PrevLight = NextLight;
}
}
//if (NextLight != PrevLight) PrevLight = NextLight;
if (!Lightvent && (hidr >= 40) )
{
vent = 1;//если влажность больше 40% включаем вентилятор
Hidrvent = 1;
}
else if (!Lightvent && (hidr < 37))
{
vent = 0;//если влажность меньше 37% выключаем вентилятор
Hidrvent = 0;
}
}
//фиксируем состояное выходых пинов
digitalWrite(VentPin, vent);
digitalWrite(GreenLedPin, Lightvent);
digitalWrite(RedLedPin, Hidrvent);
//некоторая отладочная информация, можно удалить
Serial.print(«\nRetrieving information from sensor: «);
Serial.print(«Read sensor: «);
//delay(100);
Serial.print(«Humidity (%): «);
Serial.println(DHT11.getHumidity(), 2);
Serial.print(«Temperature (oC): «);
Serial.println(DHT11.getCelsius(), 2);
Serial.print(«T: «);
Serial.println(vent);
Serial.print(«Lightvent: «);
Serial.println(Lightvent);
Serial.print(«Hidrvent: «);
Serial.println(Hidrvent);
Serial.print(«NextLight: «);
Serial.println(NextLight);
Serial.print(«PrevLight: «);
Serial.println(PrevLight);
Serial.print(«time_dif: «);
Serial.println(time_dif);
Serial.print(«LightcurMillis: «);
Serial.println(LightcurMillis);
Serial.print(«Millis: «);
Serial.println(millis());
delay(1000);
}
Полный скетч вы можете посмоьреть по ссылке выше.
Внешний вид устройства.
Внутренности
Тут у нас БП на 5 вольт и модуль с реле.
Тут фотоэлемент, датчик DHT11, светодиоды, Arduino Pro mini. Датчик DHT11, светодиоды и резисторы смонтированы на маленькой макетной платке. Всё закреплено клеевым пистолетом. Корпус куплен в Украине за 5 гривен. Резисторы тоже покупались в Украине. Все остальные элементы покупались на ebay у продавцов из Китая.
Устройство успешно работае у меня в санузле уже 2 месяца.
Из возможных доработок/изменений:
— т.к. устройство собрано в одном корпусе с блоком питания из зарядного устройства, которое греется, то возможна погрешность в определении влажности.
— в качестве комутирующего элемента можно использовать полевой транзистор.
Если у вас возникнут вопросы — пишите в коментариях постараюсь ответить.
Добрый день!!!
Искал устройство для управления вентилятор в ванной. Уж очень надоел своей постоянной и шумной работой. И вот наткнулся на ваше устройство, очень понравилось функционалом и простотой. Я никогда не сталкивался с ардуино, заказал все элементы, но столкнулся с проблемой. При проверке данного скетча в Arduino 1.0.5.-r.2, вылезла ошибка «idDHT11″ does not name a type
Ventilyator_v2.ino: In function ‘void setup()':
Ventilyator_v2:47: error: ‘IDDHT11LIB_VERSION’ was not declared in this scope
Ventilyator_v2.ino: In function ‘void dht11_wrapper()':
Ventilyator_v2:57: error: ‘DHT11′ was not declared in this scope
Ventilyator_v2.ino: In function ‘void loop()':
Ventilyator_v2:61: error: ‘DHT11′ was not declared in this scope
Вы скетч от сюда http://ardumini.ru/wp-content/uploads/2014/11/ventilyator_v2.zip пробуете или просто из поста скопировали?
вы похоже не установили библиотеку DHT11. Буду дома, посмотрю какая у меня библиотека стоит.
Спасибо, за ответ!!! Все времени написать не было!!! Не дожидаясь вашего ответа, почитав в инете, понял что нет нужной библиотеки, перерыв кучу библиотек нашел нужную и скетч нормально прошился.
Добрый день!!! И с праздником!!! Пытался сам разобраться да знаний не хватает!!! Собрал устройство и столкнулся со следующей проблемой.
По сигналу с фотодатчика реле щелкает. Но от датчика влажности ни светодиод ни реле не срабатывают. Мониторю, датчик работает.
Убрал отрицание в Lightvent. Светодиод стал включаться и реле щелкать от датчика влажности, но теперь не отключается.
Подскажите что может быть?
if (!Lightvent && (hidr >= 40) )
{
vent = 1;//если влажность больше 40% включаем вентилятор
Hidrvent = 1;
}
else if (!Lightvent && (hidr < 37))
{
vent = 0;//если влажность меньше 37% выключаем вентилятор
Hidrvent = 0;
В общем поковырявшись в коде, добился той работы которая мне нужна. А именно включение и отключение вентилятора от датчика влажности, не зависимо от освещения и включение и отключение вентилятора от освещенности при нормальных значениях влажности. Так как я живу на юге, то выставил оптимальные для нашего края, параметры влажности.
Уменьшил время работы вентилятора после выключения света, до 2-х минут, уж очень долго 20 минут, особенно неудобно ночью, когда все звуки, которые не замечаем, становятся громче.
Код получился следующий
#include
int idDHT11pin = 2;
int idDHT11intNumber = 0;
void dht11_wrapper();
idDHT11 DHT11(idDHT11pin,idDHT11intNumber,dht11_wrapper);
int hidr = 0;
int temp = 0;
unsigned long period = 60000*2;
unsigned long time_dif = 0;
int LightPin = 12;
int RedLedPin = 11;
int GreenLedPin = 10;
int VentPin = 7;
boolean vent = 0;
boolean Hidrvent = 0;
boolean Lightvent = 0;
boolean Light = 0;
boolean PrevLight = 0;
boolean NextLight = 0;
boolean bool1 = 0;
boolean bool2 = 0;
unsigned long curMillis = 0;
unsigned long LightcurMillis = 0;
unsigned long LightVentMillis = 0;
void setup()
{
Serial.begin(9600);
Serial.println(«idDHT11 Example program»);
Serial.print(«LIB version: «);
Serial.println(IDDHT11LIB_VERSION);
Serial.println(«—————«);
pinMode(VentPin, OUTPUT);
pinMode(RedLedPin, OUTPUT);
pinMode(GreenLedPin, OUTPUT);
pinMode(LightPin, INPUT);
}
void dht11_wrapper() {
DHT11.isrCallback();
}
void loop()
{
DHT11.acquireAndWait();
hidr = DHT11.getHumidity();
NextLight = !digitalRead(LightPin);
if (NextLight == 1)
{
vent = 0;
Lightvent = 0;
if (NextLight != PrevLight) PrevLight = NextLight;
if (hidr >= 46)
{
vent = 1;
Hidrvent = 1;
}
else if (hidr period)
{
vent = 0;
Lightvent = 0;
if (NextLight != PrevLight) PrevLight = NextLight;
}
}
}
digitalWrite(VentPin, vent);
digitalWrite(GreenLedPin, Lightvent);
digitalWrite(RedLedPin, Hidrvent);
Serial.print(«\nRetrieving information from sensor: «);
Serial.print(«Read sensor: «);
//delay(100);
Serial.print(«Humidity (%): «);
Serial.println(DHT11.getHumidity(), 2);
Serial.print(«Temperature (oC): «);
Serial.println(DHT11.getCelsius(), 2);
Serial.print(«T: «);
Serial.println(vent);
Serial.print(«Lightvent: «);
Serial.println(Lightvent);
Serial.print(«Hidrvent: «);
Serial.println(Hidrvent);
Serial.print(«NextLight: «);
Serial.println(NextLight);
Serial.print(«PrevLight: «);
Serial.println(PrevLight);
Serial.print(«time_dif: «);
Serial.println(time_dif);
Serial.print(«LightcurMillis: «);
Serial.println(LightcurMillis);
Serial.print(«Millis: «);
Serial.println(millis());
delay(1000);
}
Прошу прощение, не тот скетч скопировал
Вот тот, который в ардуинке работает:
#include
int idDHT11pin = 2;
int idDHT11intNumber = 0;
void dht11_wrapper();
idDHT11 DHT11(idDHT11pin,idDHT11intNumber,dht11_wrapper);
int hidr = 0;
int temp = 0;
unsigned long period = 60000*2;
unsigned long time_dif = 0;
int LightPin = 12;
int RedLedPin = 11;
int GreenLedPin = 10;
int VentPin = 7;
boolean vent = 0;
boolean Hidrvent = 0;
boolean Lightvent = 0;
boolean Light = 0;
boolean PrevLight = 0;
boolean NextLight = 0;
boolean bool1 = 0;
boolean bool2 = 0;
unsigned long curMillis = 0;
unsigned long LightcurMillis = 0;
unsigned long LightVentMillis = 0;
void setup()
{
Serial.begin(9600);
Serial.println(«idDHT11 Example program»);
Serial.print(«LIB version: «);
Serial.println(IDDHT11LIB_VERSION);
Serial.println(«—————«);
pinMode(VentPin, OUTPUT);
pinMode(RedLedPin, OUTPUT);
pinMode(GreenLedPin, OUTPUT);
pinMode(LightPin, INPUT);
}
void dht11_wrapper() {
DHT11.isrCallback();
}
void loop()
{
DHT11.acquireAndWait();
hidr = DHT11.getHumidity();
NextLight = !digitalRead(LightPin);
if (NextLight == 1)
{
vent = 0;
Lightvent = 0;
if (NextLight != PrevLight) PrevLight = NextLight;
if (hidr >= 46)
{
vent = 1;
Hidrvent = 1;
}
else if (hidr period)
{
vent = 0;
Lightvent = 0;
if (NextLight != PrevLight) PrevLight = NextLight;
}
}
}
digitalWrite(VentPin, vent);
digitalWrite(GreenLedPin, Lightvent);
digitalWrite(RedLedPin, Hidrvent);
Serial.print(«\nRetrieving information from sensor: «);
Serial.print(«Read sensor: «);
//delay(100);
Serial.print(«Humidity (%): «);
Serial.println(DHT11.getHumidity(), 2);
Serial.print(«Temperature (oC): «);
Serial.println(DHT11.getCelsius(), 2);
Serial.print(«T: «);
Serial.println(vent);
Serial.print(«Lightvent: «);
Serial.println(Lightvent);
Serial.print(«Hidrvent: «);
Serial.println(Hidrvent);
Serial.print(«NextLight: «);
Serial.println(NextLight);
Serial.print(«PrevLight: «);
Serial.println(PrevLight);
Serial.print(«time_dif: «);
Serial.println(time_dif);
Serial.print(«LightcurMillis: «);
Serial.println(LightcurMillis);
Serial.print(«Millis: «);
Serial.println(millis());
delay(1000);
}
Какая то ерунда, копирую одно, а после нажатия кнопки ОТПРАВИТЬ, в комментариях появляется другое
void loop()
{
DHT11.acquireAndWait();
hidr = DHT11.getHumidity();
NextLight = !digitalRead(LightPin);
if (NextLight == 1)
{
vent = 0;
Lightvent = 0;
if (NextLight != PrevLight) PrevLight = NextLight;
if (hidr >= 46)
{
vent = 1;
Hidrvent = 1;
}
else if (hidr period)
{
vent = 0;
Lightvent = 0;
if (NextLight != PrevLight) PrevLight = NextLight;
}
}
}
Вы сделали работу вентилятора от датчика влажности и датчика света независимыми друг от друга. Я же добавлял лополнительные условия чтобы, когда вентилятор сработал по влажности но включится свет — вентилятор выключился.
У вас получился немного упрощенный вариант, но при этом не менее работоспособный.
Нет не получается. какие-то значения заменяются на другое. Если интересно будет, могу на электронку, Вам скинуть.
вопрос от нуба: резисторы R1 и R2 в схеме использованы номиналом по 510 ом?
да, на 510 Ом, можно поставить резисторы с сопротивлением от 330 Ом — это токоограничивающие резисторы светодиодов.
Добрый день! Какая именно библиотека стоит и работает у вас. Перерыл уже целую кучу никак не могу найти нужную. Спасибо.
Разобрался с библиотекой, загружается нормально. Почему то работает только датчик света. Монитор порта показывает значения DHT но реле не включается при превышении значения. Где копать?
А можно ли как то заменить датчик света на простой фоторезистор и инвертировать его значения показаний в 0 и 1? Логически понимаю, что это возможно, но как на коде это показать понятия не имею, пока новичок в этой теме.
В большинстве случаев установкой датчиков движения и уровня влажности в помещении пренебрегают и ограничиваются установкой выключателя для управления вентилятором вручную.
С уважением.
Здравствуйте.Очень заинтересовала ваша схема.Как сделать чтобы При включении света в ванной вентилятор должен в любом случае включаться.Спасибо!!!
Здравствуйте.Очень заинтересовала ваша схема.Как сделать чтобы При включении света в ванной вентилятор должен в любом случае включаться.А все остальные функции оставить как есть.Спасибо!!!
Maxis and DiGi commence offering iPhone 4 with M’siaBy SHARIDAN M. ALI LEONG STRUNG YEE
В большинстве случаев установкой датчиков движения и уровня влажности в помещении пренебрегают и ограничиваются установкой выключателя для управления вентилятором вручную.
На этом можно и нужно зарабатывать деньги
Hello. And Bye.
Кто знает неплохую игруху, чтоб увлекла не на один день и не наскучить?
Предлагаем полностью рабочее ПО/We offer a ready solution for MIDAS GTS 2014 ALL MODULES (CRACK — Dongle emulator/Custom license/Patch). Полная поддержка наших решений. Тестирование перед оплатой/Full support for our solutions. Testing before payment. Контакты/Contacts: nodongle24 /@/ gmail.com (remove spaces and /)
Sentinel Pro Dongle Emulator, Biteblock3 Dongle Emulator, Guardant Code Dongle Emulator, Wi3p Dongle Emulator, buy, P-Sea Aka Unikey Dongle Emulator, Emme Inrokey Hid Dongle Emulator, Sg-Lock Dongle Emulator, download, Guardant Stealth II Dongle Emulator, Tinykey Dongle Emulator, Wi3p Dongle Emulator, Unikey Dongle Emulator, Sentinel Scribe Dongle Emulator, ROCKEY4 Plus Dongle Emulator.
Zhheherhrh eg egemtr hrggwe wes egemtrghdfbsgd rwtwrqw