Контроль влажности и температуры в погребе, подвале.

Тема в разделе "Глядите, что я сделал", создана пользователем ИгорьК, 28 сен 2016.

Метки:
  1. ИгорьК

    ИгорьК Гуру

    UPD 06.10.2020. Устройство уже год как переделано на ESP32.
    Основная элементая база не изменилась, кроме дисплей теперь i2c.
    Связка датчиков hih5030 + DS2438 показывает себя великолепно, а hih5030 так и работают с момента создания проекта.

    Устройство теперь работает по wifi (тем самым стало проще) - замена ASUSa на Keenetic сотворила чудеса и в погребе(!!!!!!) появилась сеть, тем более - в гараже.

    ------------------------------------------------------------------------------------------------
    Начнем... Начнем с красного колечка, которое напечатаем на 3D принтере:
    0001.jpg
    Колечко наденем на вентилятор.
    0002.jpg

    Вентилятор вставим в 110 мм трубу от канализации:
    0003.jpg

    Трубу вставим в вытяжную трубу в погребе.
    0004.jpg

    Возьмем (условно) герметичный корпус для электросчетчиков. Затолкаем всякую рухлядь.

    0005.jpg

    И получим такую отвратительную картину:

    0006.jpg

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

    0008.jpg

    Отправим в погреб, пока положим на полку.

    0010.jpg

    И соединим с вентилятором.
    0011.jpg

    Уфффффффф...
    А погреб то высох!
     
    Последнее редактирование: 6 окт 2020
    klmn, Нигрол, lepidot и 3 другим нравится это.
  2. ИгорьК

    ИгорьК Гуру

    Источником опыта и вдохновения послужил этот проект на сайте Arduino.ru.
    Из него беззастенчиво уворована формула расчета абсолютной влажности по относительной и температуре.
    Код (Javascript):
    function CalcAbsH(t, h) { // t - Температура, h - Относительная влажность %
        var tmp;
        var absHumid;
        tmp = Math.pow(2.718281828,(17.67*t)/(t+243.5));
        absHumid = (6.112*tmp*h*2.1674)/(273.15+t);
        console.log('Abs Humidity is ', absHumid.toFixed(2), "g/m3");
        return absHumid; // Это граммы воды в дном кубометре воздуха.
    }
    В свою очередь, товарищ Peter Mander из этого блога https://carnotcycle.wordpress.com/2012/08/04/how-to-convert-relative-humidity-to-absolute-humidity/ помог нам всем своей замечательной работой.

    В остальном... сделал многое по-другому.

    Проект, кроме основной цели - осушения (и подогрева зимой), сосредотачивает усилия на
    Формально, отличия, в первую очередь, в компонентной базе. И дело не в Iskra JS, а в датчиках и отражении/передаче информации.
    • Датчики DHT - табу. Здесь DS18b20 и HIH-5030.
    • nRF24L01+ - табу. Здесь HC-12.
    • Красивый дисплей - а зачем он нужен? Здесь - народный 16х2.
    Не занимайся я темой OpenHab - тоже, наверно, стал бы приспосабливать что-то яркое как задница попугая. Но, уверен, мельком взглянуть на сосотяние дел, отраженных на двустрочном дисплее, вполне достаточно. Не живем же мы в этом погребе.
    Да и вообще, не будем перфекционистами. Проект прост и ненавязчив, а жизнь так коротка...
    Вот как все устроено (проект можно сделать на многих из этих плат, исключая ESP-8266):
    cellar7.jpg
     
    Последнее редактирование: 6 окт 2020
    IvanUA, Нигрол, lepidot и 3 другим нравится это.
  3. ИгорьК

    ИгорьК Гуру

    И код. Здесь выкинуто все что касается HC-12. О передаче данных в другой теме. Полностью возможности устройства раскрыты здесь.
    Код ниже работает просто термостатом, но с расчетом абсолютной влажности в погребе и на улице.
    Вентилятор включается, когда абсолютная влажность внутри выше на 0.5 г/м3 чем на улице, причем, температура на улице должна быть ниже чем в погребе.
    Выключается вентилятор, когда (или):
    • температура в погребе опускается ниже установленной;
    • температура на улице выше чем в погребе;
    • абсолютная влажость на улице меньше чем в погребе на 0.2 г/м3.
    Для подвалов, где не хранятся продукты, можно установить несколько другие требования. То есть его можно сушить без оглядки на верхний предел температуры: необльшое исправление коде.
    Код (Javascript):

    // Loaded 25/08/2016
    var cl = console.log; // For my pleasure
    // LCD
    var lcd = require("HD44780").connect(B0,C2,C9,C8,C7,C6);


    /********************* Global Var init ****************************/
    var pinOW    = A3;    // DS18B20 pin
    var pinHumIn = A4;    // Humidity In pin
    var pinHumOt = A5;    // Humidity Out pin
    var pinFan   = P2;    // Fan pin

    var makeDes  = 10;    // Delay in seconds to check sensors and make decision to switch fan.
                        // not less 5 seconds because of hih-5030 have at least 5 second to get data

    var lagOn = 0.5;        // g/m3, Histeresis between humidityes to on fan
    var lagOff = 0.1;        // g/m3, Histeresis between humidityes to off fan

    var minInTemp = 1;    // Minimun inner temperature at cellar
    var maxOutTemp = 12; // Maximum Out temperature when fan cwitched ON

    var param = {
        unt : "cel",    // Units name (for HC-12 only)
        mod : "ON",        // Mode: ON, OFF (for HC-12 only)
        fan : "OFF",    // Is Works Now?
        faF : "OFF",    // Fan is forced: ON, OFF  (for HC-12 only)
        tg :  4,        // Target temperature at cellar
        tIn : 16.4,        // Temperature at Cellar, for start
        hIn : 95.3,        // Humidity at Cellar, for start
        tOt : 10.8,        // Outside Temperature, for start
        hOt : 20.4        // Outside Humidity, for start
    };

    //------------------------ Print LCD ----------------------------

    function printLCD(aIn, aOut, inf) {
        if(inf) {
            lcd.clear();
            lcd.clear();
            lcd.setCursor(0,0);
            lcd.print("   Cellar 2016");
            lcd.setCursor(0,1);
            lcd.print("    Jiaffe!");
        }
        else {
            lcd.clear();
            lcd.setCursor(0,0);  // Print t and h at cellar
            lcd.print(param.tIn.toFixed(1)+"/"+param.hIn.toFixed(0)+"="+aIn.toFixed(0));
            lcd.setCursor(13,0);
            lcd.print("F:");
            if (param.fan === "ON"){
                lcd.print("\u00D9");
                x = true; // Start muliplication at pos 0,15
            }
            else {
                x = false;
                lcd.print("\u008D"); // Print key at pos 0,15
            }
            lcd.setCursor(13,1);
            lcd.print("M:");
            if (param.mod === "ON"){
                lcd.print("\u0094"); // Print v at pos 1,15
            }
            else {
                lcd.print("\u008D"); // Print key at pos 1,15
            }
            lcd.setCursor(0,1); // Print outside t and h
            lcd.print(param.tOt.toFixed(1)+"/"+param.hOt.toFixed(0)+"="+aOut.toFixed(0));
        }
    }


    //----------------------------------------------------------------------------
    // This is the simple muliplication fo show working fan at LCD position 0,15
    var x = false;
    var pr = ['+', '/','X', '+','\\','X'];
    var nw = 0;

    var c = setInterval(function(){
      if(x) {
        lcd.setCursor(15,0);
        lcd.print(pr[nw]);
        nw++;
        if(nw === 6) nw = 0;
      }
    }, 150);
    //-----------------------------------------------------------------------------

    //------------------------  DS18B20 Init ---------------------------

    var ow = new OneWire(pinOW);
    var sensor1 = require("DS18B20").connect(ow, 0);
    var sensor2 = require("DS18B20").connect(ow, 1);


    //----------------------------  GetSensors ---------------------------
    function GetSensors(callback) {
        var tInn = 85;
        var tOut = 85;
        cl("GetSensors");

        // Calculate true humidity from raw and temperature
        var GetHue = function (pin, temp) {
            // Accordiong HIH-5030 datasheet:
            var RH =  (analogRead(pin) - 0.1515)/ 0.00636;
            var TrueRH = (RH)/(1.0546 - 0.00216 * temp);
            console.log("Hum is " + TrueRH.toFixed(1)+" %");
            return parseFloat(TrueRH.toFixed(1));
        };
        // callback liked calculating temperatures and humidities
        sensor1.getTemp(function (tInn) {
            console.log("Temp is "+tInn.toFixed(1)+" C");
            param.tIn = parseFloat(tInn.toFixed(1));
            var gin = GetHue;
            param.hIn = gin(pinHumIn, tInn);

            sensor2.getTemp(function (tOut) {
                console.log("Temp is "+tOut.toFixed(1)+" C");
                param.tOt =  parseFloat(tOut.toFixed(1));
                var gOt = GetHue;
                param.hOt = gOt(pinHumOt, tOut);

                if (callback) {
                    callback();
                }
            });
        });
        return;
    }


    /************************ Calculate ABS Humi ***************************/

    // This function was stolen from http://arduino.ru/forum/proekty/kontrol-vlazhnosti-podvala-arduino-pro-mini
    function CalcAbsH(t, h) { // t - temperature celsius, h - humidity %
        var tmp;
        var absHumid;
        tmp = Math.pow(2.718281828,(17.67*t)/(t+243.5));
        absHumid = (6.112*tmp*h*2.1674)/(273.15+t);
        console.log('Abs Humidity is ', absHumid.toFixed(2), "g/m3");
        return absHumid;
    }

    /************************  Just Switch The Fan  ************************/
    function SwitchFan(sw) { // Switchs  fan and write data to param
        digitalWrite(pinFan, sw);
        if(sw) {param.fan = "ON";}
        else {param.fan = "OFF";}
    }

    /************************ Is It Time To Fan  ***************************/
    // Desiding about switching fan
    function IsFan(){
        var aHumIn  = CalcAbsH(param.tIn, param.hIn);
        var aHumOut = CalcAbsH(param.tOt, param.hOt);
        var delta = aHumIn - aHumOut;  // delta between absolute humidities
        cl("Delta = ", delta.toFixed(1));

        // You have make a choice for your cellar:
        // absolutly switch OFF fan when...
        // ... cooling at cellar is not importat:
        //if(((param.tIn < minInTemp) || (param.tOt > maxOutTemp)) && (param.fan === "ON")){

        // ... you would like contane the temperature between min and max
        if(((param.tIn < minInTemp) || (param.tOt >param.tIn)) && (param.fan === "ON")){
            SwitchFan(0);
            param.mod = "ON";
        }
        else if (param.mod == "ON") {
            if ((param.tIn >  param.tg) && (param.tIn > param.tOt)) {
                if ((delta > lagOn) && (param.fan === "OFF")) {
                    SwitchFan(1);
                }
                if  ((delta < lagOff) && (param.fan === "ON")) {
                    SwitchFan(0);
                }
            }
        }
        printLCD(aHumIn, aHumOut);
    }

    E.on('init', function() {
        setTimeout(function () {
            printLCD(1,1,true);
            GetSensors();
        }, 3000);

      var ddd = setInterval(function() {
        GetSensors(IsFan);
      }, makeDes*1000);
    });

    Мы видим:
    cellar3.jpg

    Опция. С использованием модуля передачи HC-12, во взаимодействии с этим устройством, появляется возможность дистанционно видеть информацию с датчиков, а также устанавливать принудительное включение и выключение устройства, передавать ему целевую температуру (правда, не знаю зачем это нужно), а выгдядит это так:
    77352.jpg

    Что касается HIH-5030:
    hih.jpg

    При влажности от 90 до 100%, а такая в погребе бывает часто, датчик улетает за 100%, и показания могут доходить до 108%. Сначала расстраивался, а потом (как положено, кто же документацию читает пока не упрется) все стало ясно. То есть при влажности более 90% датчик может болтаться в пределах 14 процентов.

    Он и болтается, но на работоспособности устройства это не сказывается никак :) :
    hih2.jpg

    cellar7.jpg
     
    Последнее редактирование: 10 окт 2016
    NikitOS, KKND, sys и ещё 1-му нравится это.
  4. Flyfisherman

    Flyfisherman Нерд

    Я в некотором смысле в теме новмичек, интересуюсь что не так с
    Можно не расписывать а ответить ссылками на сооответствующие темы
     
  5. Tomasina

    Tomasina Сушитель лампочек Модератор

    DHT11 врет безбожно с самого начала, DHT22 чуть точнее, но быстро деградирует и через пару месяцев вроде и работает (показания выдает), но показания не соответствуют реальности.
    Они пригодны только в обучающих целях, но не для постоянного применения.
     
  6. ostrov

    ostrov Гуру

    Не многовато Искры для такой задачки? Какая нибудь Атмега8 в минимальной обвязке не справилась бы? По сути термостат же, только вместо температуры влажность.

    Кстати, самый кошерный способ вычислять влажность - по двум градусникам, один сухой, другой мокрый.
     
  7. ИгорьК

    ИгорьК Гуру

    Они просто разлагают народ. Я бы их запретил на законодательном уровне. А то запрещают всякую ерунду, а то что надо запрещать - нет.
    Вот мои исследования: http://forum.amperka.ru/threads/dht-11-22.7298/
     
    Последнее редактирование: 28 сен 2016
  8. Flyfisherman

    Flyfisherman Нерд

    Про датчики все понял:) спасибо а главное что все это своевременно.
    Хочу поинтересоваться а какие датчики не деградируют и стабильно работают?
    Ну или какие датчики предпочитает сообщество?
     
  9. ИгорьК

    ИгорьК Гуру

    ... я ожидал этот вопрос :)
    Посмотрите на последнее фото внимательно. Если предположить, что вентиляция - часть погреба, не кажется ли Вам цена Искры и остальных запчастей - смешной?
    Искра очень хороша и "железно" и возможностями. Кроме термостата там идет передача данных с вычислением crc8 и работой с json, все это "стреляет" в 433 мгц и принимает кое-что обратно, опять же проверив crc8 на предмет правильности команды:
    Код (Javascript):
    var param = {
        unt : "cel",       // Name of unit
        mod : "ON",    // Mode: ON, OFF
        fan : "OFF",     // Fan now
        faF : "OFF",      // Fan is forced switched
        tg : 4,             // Target temperature at cellar
        tIn : 16.4,        // Temperature at Cellar
        hIn : 95.3,        // Humidity at Cellar
        tOt : 10.8,        // Outside Temperature
        hOt : 20.4        // Outside Humidity
    };
     
    И я могу это сделать на 328, на восьмой - вряд ли. Но разве я не могу побаловать себя вкусным JS после строительства погреба? :)

    Кстати, вентилятор, думаю, надо будет поменять на более серьезный. Вряд ли этот зиму переживет.
    Но даже он отлично высушил погреб после строительства.
     
    Последнее редактирование: 28 сен 2016
    sys нравится это.
  10. ИгорьК

    ИгорьК Гуру

    Здесь hih-5030 и ds18b20.

    А сообщество с остервенением доказывает, что DHT-11 - это круто. Но Вы почитайте ссылку на проект-первоисточник. Там тоже кое-что на тему DHT есть.
     
    Последнее редактирование: 28 сен 2016
  11. Protos911

    Protos911 Нерд

    Вау, а я всё мастырился, как прикрутить МЭЛТ MT-16S2H :)
     
  12. ИгорьК

    ИгорьК Гуру

    А что там проблемного?
     
  13. Protos911

    Protos911 Нерд

    Проблема в том что на сайте http://wiki.amperka.ru/js:start амперки не слова про дисплейные библиотеки под JS! :mad:
    Есть только на Адруино http://wiki.amperka.ru/Схемы-подключения:подключение-текстового-экрана, а там из полезного только схема подключения и про гемор с кириллицей:D
    Млин , ну как так можно..дисплеи - это самое вкусное... всё по той-же логике, что я и написал
    Как-будто им не нужно, что-бы кто-то что-то купил у них ...:(
     
    Последнее редактирование: 8 янв 2017
  14. ИгорьК

    ИгорьК Гуру

  15. mcureenab

    mcureenab Гуру

    Подключил МЭЛТовский экран без проблем. Даже не помню как. Стандартная библиотека LCD и все дела. С питанием от USB была проблема. Видно 5 вольт по пути терялись. От батарейки нормально работало.
     
  16. Protos911

    Protos911 Нерд

    Теперь я тоже знаю про "Стандартная библиотека LCD и все дела", "Ну, кое-что можно найти еще здесь: http://www.espruino.com/Modules" ;)
    Но для новичка это должно быть на сайте Амперки.РУ в вики и на странице индикатора!

    всё разобрался и с этим,..
    У вас на схеме ноги дисплея перепутаны... должно быть так:
    "var lcd = require("HD44780").connect(B0,C2,C6,C7,C8,C9))":)
     
    Последнее редактирование: 9 янв 2017
  17. чемто подобным скоро тоже займусь (((((
     
  18. ИгорьК

    ИгорьК Гуру

    Загрузить модуль HD44780 и создать ссылку на него в переменной lcd. Загрузка начинается функцией connect с передачей ей необходимых ног.
     
  19. ИгорьК

    ИгорьК Гуру

    А что так грустно. У Вас то опыта достаточно для этого.
     
  20. Protos911

    Protos911 Нерд

    А что у вас с ногами на МЭЛТе?
    Ваш скетч на дисплей мусор гонит;)