Arduino контролирует в подвале температуру, влажность и затопление и выдает данные на веб-страницу

    Всем привет.

    Хочу поделиться опытом создания системы контроля и предупреждения.

    На одном из строительных объектов делали строение с бассейном, сауной, тренажёрным залом и комнатой отдыха. Все это было в приличных размерах как для одного хозяина. Чисто технически понадобилось 2 подвала: 1-й для обслуживания насосов бассейна — маленький, 2-й для обслуживания систем обогрева и накопления тепла

    Закуплены были 2 напольных евро-люка разных размеров для двух подвалов. Люки зарывались 4-мя винтами и имели очень плотные резиновые уплотнения. Чтобы открыть подвал, необходимо было 4 человека (и немного здоровья). При работе всей техники в подвале поднималась температура и влажность, при этом контролировать что там происходит практически неудобно.

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

    За основу взял Arduino Pro Mini плюс Ethernet ENC28J60. Для замера влажности и температуры датчик DHT11 и FC-28 (датчик влажности почвы – в роли датчика затопления).

    image

    Тех задание:

    1) Управление и информирование через Web интерфейс;
    2) Включение и отключение вентиляции по заданному уровню влажности;
    3) Включение и отключение клапана водопровода (возможно, ревун, откачивающий насос) при затоплении.

    В выборе Arduino Pro Mini тоже надо подумать, так как существуют разные исполнения:

    image

    Лучше брать ту, в которой стабилизатор по мощнее, так как та, что по слабее, при активных реле и сетевом контроллера закипит стабилизатор, что приводит к зависанию системы (я упустил этот нюанс и получил зависания, но приобрел более ценное – опыт).
    Сетевые контроллеры также надо выбирать внимательно, так как есть те которые от 5В (стабилизатор на обратной стороне модуля) и на 3,3В. Нужен будет дополнительный стабилизатор на 3,3В.

    Блок питания взял от обычного свитча (или роутера) TP-Link 9В 500мА (примерно), они часто встречаются за копейки от паленых свитчей или роутеров.

    Принцип работы простой: есть 2 датчика, которые сливают информацию на контроллер. В зависимости от ситуации контроллер включает и выключает реле (клапана водопровода, возможно ревун, откачивающий насос, вентилятор). Управление и мониторинг через WEB интерфейс который реализован программой на базе модуля ENC28J60.

    image

    image

    1) Сработка датчика затопления = включение реле (клапана водопровода(ревун, откачивающий насос ); + информирование на web странице крупным шрифтом;
    2) Повышение влажности выше установленного уровня = включение реле вентилятора;
    3) Вся информация о температуре влажности и затоплению выводится на web страницу;
    4) При понижении температуры ниже 5 градусов оповещение на web сайте о угрозе.

    Наглядно можно увидеть на видео:



    На практике все очень удобно. Всегда можно посмотреть с Телевизора (Smart), телефона или планшета — что творится в закрытых помещениях, не открывая их.

    image
    image
    image

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

    Надеюсь, эта статья кому-то поможет, а кого то вдохновит на создание своего проекта.

    Программа для Arduino
    #include "etherShield.h"
    #include "ETHER_28J60.h"
    #include <EEPROM.h>
    #include "DHT.h"
    #define DHTPIN 2     // к какому пину будет подключен вывод Data
    
    //выбор используемого датчика
    #define DHTTYPE DHT11   // DHT 11 
    //#define DHTTYPE DHT22   // DHT 22  (AM2302)
    //#define DHTTYPE DHT21   // DHT 21 (AM2301)
    
    // Connect pin 1 (on the left) of the sensor to +5V
    // Connect pin 2 of the sensor to whatever your DHTPIN is
    // Connect pin 4 (on the right) of the sensor to GROUND
    // Connect a 10K resistor from pin 2 (data) to pin 1 (power) of the sensor
    
    //инициализация датчика
    DHT dht(DHTPIN, DHTTYPE);
    int VlagInPin = 3;
    int RelPin = 4;
    int PotPin = 5;
    byte vlaga = 75;
    int temp = 55;
    int vent =85;
    int pot; // переменная датчика затопления
    byte vf; // переменная для значения влаги во флеше
    
    static uint8_t mac[6] = {0x54,0x55,0x58,0x10,0x00,0x24}; 
    static uint8_t ip[4] = {192,168,88,24};
    static uint16_t port = 80; 
    
    ETHER_28J60 ethernet;
    
    void setup()
    { 
      dht.begin();  //
      pinMode(VlagInPin, INPUT);
      pinMode(RelPin, OUTPUT);
      digitalWrite(RelPin, HIGH);
      pinMode(PotPin, OUTPUT);
      digitalWrite(PotPin, HIGH);
      
      
      vf = EEPROM.read(0); //чтение из флеш значение влаги для сработки вентилятора
      if ( vf > 110)
                    {
                    EEPROM.write(0, 110);     // Запись нового значения в Флеш
                     }
      ethernet.setup(mac, ip, port);
      
    }
    
    void loop()
    {
      // чтение температуры и влажности займет примерно 250 миллисекунд
      //float h = dht.readHumidity();
      //float t = dht.readTemperature();
      vlaga = dht.readHumidity();
      temp = dht.readTemperature();
      
      pot = digitalRead(VlagInPin);
      
      if (pot == LOW) {                               // Условие включения и отключения затопления
                       digitalWrite(PotPin, LOW);
                       }                    
      if (pot == HIGH) {                                // Условие включения и отключения затопления
                       digitalWrite(PotPin, HIGH);     
                       }                 
      
      
      
      if (vlaga >= vf) {                               // Условие включения и отключения вентиляции
                       digitalWrite(RelPin, LOW);
                       }                    
      if (vlaga < vf-1) {                                // Условие включения и отключения вентиляции
                       digitalWrite(RelPin, HIGH);     
                       }                 
      
      String param;
     
      if (param = ethernet.serviceRequest())
      {
        ethernet.print("<H1>БОЛЬШОЙ ПОДВАЛ</H1>");
        ethernet.print("<a href=\"/\">ОБНОВИТЬ СОСТОЯНИЕ</a><br>"); 
        
        
         if (pot == LOW) {                               // Условие включения и отключения затопления
                          ethernet.print("<H1>Внимание Затопление!!!</H1>");
                          }
          
         if (temp <= 3) {                               // Условие вывода сообщения Угроза разморозки системы
                          ethernet.print("<H1>Угроза разморозки системы</H1>");
                          }
         
        
        if (param == "plus")
                             {
                             vf++;                    // Увеличить значение переменной влаги
                             if ( vf > 110)
                                           {
                                            vf=110;
                                            }
                             EEPROM.write(0, vf);     // Запись нового значения в Флеш
                             
                             }
        if (param == "minus")
                             {
                             vf--;                    // Уменьшить значение переменной влаги
                             if ( vf < 5)
                                           {
                                            vf=5;
                                            }
                             EEPROM.write(0, vf);     // Запись нового значения в Флеш
                             }
        
        ethernet.print("<H1>Температура</H1>");
        ethernet.print("<H2>");
        ethernet.print(temp);
        ethernet.print("</H2>");
         ethernet.print("<H1>Влага</H1>");
        ethernet.print("<H2>");
        ethernet.print(vlaga);
        ethernet.print("</H2>");
        ethernet.print("<H1>Сработка Вентиляции</H1>");
        ethernet.print("<H2>");
        ethernet.print(vf);
        ethernet.print("</H2>");
       
        ethernet.print("<a href=\"/minus\">Уменьшить</a>  <a href=\"/plus\">Увеличить</a><br>");
        ethernet.respond();
      }
      
     }
    
    


    image
    И вот архив программы с библиотеками:
    www.facebook.com/download/766447720118309/potop.IDE%201.5.2.rar
    Share post

    Comments 32

      +2
      Схему бы подключения выложили и страничку)) А то проект из разряда works good on video =)
        –1
        Как бы в проге есть описание пинов… но могу и нарисовать
          +1
          было бы не дурно :)
            0
            Добавил схему в конце статьи.
        +2
        но DHT11 же тупой до неприличия. У меня он стоял дома пару недель, показывал что температура у меня не меняет вообще никогда, только когда кодицонер включал, а на деле температура менялась на +-3 градуса в течении дня.
          0
          Возможно у Вас питание не стабильное было… я неделю тестил в мастерской… он показывал четко те температуры которые показывали другие + обычный ртутный термометр, не может же Китай массово продавать нерабочие датчики… их бы просто перестали покупать…
          Приборы работают стабильно уже 2,5 месяца…
            0
            С питанием все в порядке, с самим датчиком проблемы. Как было сказано, он тупой до неприличия.
            www.micropik.com/PDF/dht11.pdf
            Погрешность +-2С, повторяемость +-1C. Он же не меряет температуру, он ее угадывает.

            У самого был опыт использования. Можно наблюдать полный спектр вариантов его работы: от «он показывает все время разную температуру в стабильной среде» до «температура среды по субъективным ощущениям меняется от прохладно до жарко, а он показывает одно и то же». Пришлось поменять на DHT22.
              0
              Он работает, питание стабильно. Просто он не замечал изменения которые у меня были. Заменил на DHT22 и какой-то bosch для давления. Собирая статистику со всех трех я понял, что DHT11 тупо не замечает короткие изменения.
                0
                Как будто о разных датчиках говорим :). А как долго пользовались им… может он бракованный или засорён?
                У меня есть DHT11 21 22 и 22(уличный в корпусе), все одинаково(+-1), возможно погрешность… влагу +-4%…
                Может мне повезло с датчиками?
                В принципе даже если он начнет врать(теоретически на пару градусов), то температура в подвале носит информативный характер и не влияет на управления устройствами, а вот влажность это лишняя работа вентилятора. Надеюсь датчик проработает долго, если будут наблюдаться такие грешки то поменяю на 21 или 22.
                Спасибо за Отзывы!!! Они важны не только для меня а и для тех кто будет повторять и творить подобное…
              0
              Поддерживаю! В своем зимовнике для кактусов я после написания статьи перешел сначала на DHT11, выдававшим температуру с ужасной точностью, а потом безболезненно заменил его на DHT22. При этом у меня два потока показаний температуры — от LM35 и DHT22. Могу сказать, что показания DHT22 отличаются от LM35 максимум на 1/4 градуса, что говорит о приемлимой точности DHT22.
              0
              Медь на почвенном датчике не сгниёт так? Не проще ли было взять пару гвоздей из нержавейки вместо него?
                0
                Возможно сгниёт… если будет влага или агрессия, учитывая что подвал сухой и теплый, то боятся не стоит… да к тому же как минимум ежегодные ревизии смогут определить, а сам датчик не такой уже и дорогой 1$ это копейки для такого объекта.
                  0
                  Можно взять графитовые стержни.
                    +3
                    и регулировать влажность и подогрев поднятием стержней из рабочей зоны реактора? )
                0
                Оказывается, не один я распределительный короб с Arduino и реле использую ;-)
                  0
                  Оказывается ;-)
                  0
                  А добавьте, пожалуйста, архив со скетчем и библиотеками для ENC, которые вы использовали!
                    +1
                    ок сегодня добавлю…
                      +1
                      Добавил схему + скетч с библиотеками
                        0
                        спасибо!
                      0
                      Расскажите, пожалуйста, в каком режиме работает насос при замыкании реле. Что будет если воды нет, но реле замкнулось (только на датчик затопления попала вода, а пол сухой)? Сработает ли защита от «сухого хода»? Как дальше поведет себя система? Не зациклится ли?
                        +1
                        насос стоит дорогой и автоматический… он сам определяет наличие воды и по уровню… в сантиметрах, включается откачка. Вы тогда спросите зачем тогда нужен датчик?.. А датчик выключает электро клапан(подача воды), и звуковую индикацию — типа «есть проблема». Допустим если не будет этого девайса… прорвало воду… насос себе откачивает в канализацию кубометры воды… и канализация полная и счетчик воды мотает… и хозяин неделю не заходи в помещение, да же если зайдет то вряд-ли из-за толстой бетонной плотной евро-люка, что-то услышит. Насосом можно было бы управлять если у Вас был бы приямок в полу и он точно был бы с водой когда уровень дойдет до датчика… тогда не страшно и включать.
                        На счет зациклится то возможно да, но тут уже сирена должна обратить на себя внимание и хозяин как минимум на ТВ посмотрит что действительно затопление… и примет меры…
                        0
                        Вот если бы, он еще вовне данные передавал… ато мало ли, что с самим девайсом может случиться, а так хотя б данные будут удаленно доступны. Да и время жизни личных сайтов, которые как правило живут недолго (пока есть на них личное время их владельца).
                          0
                          Управление по внутренней сетке, предполагается после установки проекта Сауна, можно будет выводить информацию на экран сауны, типа «Алярм», ну а сама сауна будет иметь возможность управление из-вне. Ну а сервер статистики конечно нужен был бы, я думаю это должен быть отдельный девайс, который бы хранил инфу о всех устройствах в реал времени, например на SD карту и имел Web интерфейс.
                            0
                            присоединяйтесь, сервер статистики с доступом через API вам обеспечим.
                              0
                              а видел… интересно… даже думал сделать…
                                0
                                Учитывая уже проделанную вами работу, полагаю это не так сложно.
                                  0
                                  Обязательно попробую… ;-)
                          0
                          Спасибо за статью, надо посмотреть на моих ардуинках, которые лежат в шкафу, какие стабилизаторы стоят…
                            +1
                            В выборе Arduino Pro Mini тоже надо подумать, так как существуют разные исполнения:


                            Не вводите людей в заблуждение. Существует только один вариант Arduino Pro Mini, как он выглядит всегда можно посмотреть на arduino.cc. Всё остальное — это Arduino-совместимые платы («копии» разной степени похожести на оригинал).

                            Лучше брать ту, в которой стабилизатор по мощнее, так как та, что по слабее, при активных реле и сетевом контроллера закипит стабилизатор, что приводит к зависанию системы


                            Лучше использовать закон ома. Ток, потребляемый реле — около 80 мА. У вас два реле. Цифровые пины у Arduino при старте переводятся в INPUT_PULLUP. Ваши реле скорее всего включаются через полевики, поэтому даже INPUT_PULLUP работает как команда «включить реле». Вот у вас уже 160 мА, а Arduino Pro Mini имеет максимальный ток, снимаемый с VCC 150 мА. Заранее можно было сказать, что плата будет сбрасываться, а стабилизатор — греться.
                              +1
                              в экстазе написания программы я закон ома упустил :)))
                                0
                                Я правильно вас понимаю — выхода два? либо не использовать запитку реле от VCC ардуины либо использовать отдельный источник питания для реле?

                              Only users with full accounts can post comments. Log in, please.