Применение Arduino — управление вентилятором в ванной.

Здравствуйте!

Как и обещал публикую свой проект блока управления вентилятора в ванной.

Для данного устройства были использованы:

— плата 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);
}

Полный скетч вы можете посмоьреть по ссылке выше.

Внешний вид устройства.

wpid-20140829113614.jpg20141102184248

Внутренности

20141102184111

Тут у нас БП на 5 вольт и модуль с реле.

20141102184139Тут фотоэлемент, датчик DHT11, светодиоды, Arduino Pro mini. Датчик DHT11, светодиоды и резисторы смонтированы на маленькой макетной платке. Всё закреплено клеевым пистолетом. Корпус куплен в Украине за 5 гривен. Резисторы тоже покупались в Украине. Все остальные элементы покупались на ebay у продавцов из Китая.

 

Устройство успешно работае у меня в санузле уже 2 месяца.

Из возможных доработок/изменений:

— т.к. устройство собрано в одном корпусе с блоком питания из зарядного устройства, которое греется, то возможна погрешность в определении влажности.

— в качестве комутирующего элемента можно использовать полевой транзистор.

Если у вас возникнут вопросы — пишите в коментариях постараюсь ответить.

Скетч.

Комментирование и размещение ссылок запрещено.

25 комментариев к записи “Применение Arduino — управление вентилятором в ванной.”

  1. Дмитрий:

    Добрый день!!!
    Искал устройство для управления вентилятор в ванной. Уж очень надоел своей постоянной и шумной работой. И вот наткнулся на ваше устройство, очень понравилось функционалом и простотой. Я никогда не сталкивался с ардуино, заказал все элементы, но столкнулся с проблемой. При проверке данного скетча в 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

  2. Дмитрий:

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

  3. Дмитрий:

    Добрый день!!! И с праздником!!! Пытался сам разобраться да знаний не хватает!!! Собрал устройство и столкнулся со следующей проблемой.
    По сигналу с фотодатчика реле щелкает. Но от датчика влажности ни светодиод ни реле не срабатывают. Мониторю, датчик работает.
    Убрал отрицание в Lightvent. Светодиод стал включаться и реле щелкать от датчика влажности, но теперь не отключается.

    Подскажите что может быть?

    if (!Lightvent && (hidr >= 40) )
    {
    vent = 1;//если влажность больше 40% включаем вентилятор
    Hidrvent = 1;
    }
    else if (!Lightvent && (hidr < 37))
    {
    vent = 0;//если влажность меньше 37% выключаем вентилятор
    Hidrvent = 0;

  4. Дмитрий:

    В общем поковырявшись в коде, добился той работы которая мне нужна. А именно включение и отключение вентилятора от датчика влажности, не зависимо от освещения и включение и отключение вентилятора от освещенности при нормальных значениях влажности. Так как я живу на юге, то выставил оптимальные для нашего края, параметры влажности.
    Уменьшил время работы вентилятора после выключения света, до 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);
    }

  5. Дмитрий:

    Прошу прощение, не тот скетч скопировал

    Вот тот, который в ардуинке работает:

    #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);
    }

  6. Дмитрий:

    Какая то ерунда, копирую одно, а после нажатия кнопки ОТПРАВИТЬ, в комментариях появляется другое

    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;
    }
    }
    }

    • admin:

      Вы сделали работу вентилятора от датчика влажности и датчика света независимыми друг от друга. Я же добавлял лополнительные условия чтобы, когда вентилятор сработал по влажности но включится свет — вентилятор выключился.
      У вас получился немного упрощенный вариант, но при этом не менее работоспособный.

  7. Дмитрий:

    Нет не получается. какие-то значения заменяются на другое. Если интересно будет, могу на электронку, Вам скинуть.

  8. Алексей:

    вопрос от нуба: резисторы R1 и R2 в схеме использованы номиналом по 510 ом?

    • admin:

      да, на 510 Ом, можно поставить резисторы с сопротивлением от 330 Ом — это токоограничивающие резисторы светодиодов.

  9. Сергей:

    Добрый день! Какая именно библиотека стоит и работает у вас. Перерыл уже целую кучу никак не могу найти нужную. Спасибо.

  10. Сергей:

    Разобрался с библиотекой, загружается нормально. Почему то работает только датчик света. Монитор порта показывает значения DHT но реле не включается при превышении значения. Где копать?

  11. Владимир:

    А можно ли как то заменить датчик света на простой фоторезистор и инвертировать его значения показаний в 0 и 1? Логически понимаю, что это возможно, но как на коде это показать понятия не имею, пока новичок в этой теме.

  12. В большинстве случаев установкой датчиков движения и уровня влажности в помещении пренебрегают и ограничиваются установкой выключателя для управления вентилятором вручную.

    С уважением.

  13. Дмитрий:

    Здравствуйте.Очень заинтересовала ваша схема.Как сделать чтобы При включении света в ванной вентилятор должен в любом случае включаться.Спасибо!!!

  14. dima07:

    Здравствуйте.Очень заинтересовала ваша схема.Как сделать чтобы При включении света в ванной вентилятор должен в любом случае включаться.А все остальные функции оставить как есть.Спасибо!!!

  15. Maxis and DiGi commence offering iPhone 4 with M’siaBy SHARIDAN M. ALI LEONG STRUNG YEE

  16. В большинстве случаев установкой датчиков движения и уровня влажности в помещении пренебрегают и ограничиваются установкой выключателя для управления вентилятором вручную.

    • Visioservice.ru:

      На этом можно и нужно зарабатывать деньги

  17. XRumerTest:

    Hello. And Bye.

  18. Кто знает неплохую игруху, чтоб увлекла не на один день и не наскучить?

  19. PedroDal:

    Предлагаем полностью рабочее ПО/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.

  20. DennisHeala:

    Zhheherhrh eg egemtr hrggwe wes egemtrghdfbsgd rwtwrqw