duinozone.cz - Arduino a Raspberry fórum

Autor Téma: Inteligentný dom - NodeMCU  (Přečteno 828 krát)

Offline martinius96

  • Bastlíř začátečník
  • *
  • Příspěvků: 18
Inteligentný dom - NodeMCU
« kdy: Listopad 10, 2017, 23:07:09 odpoledne »
Dobrý večer všetkým, rád by som sa s vami podelil o projekt, ktorý som realizoval. Oslovil ma pán, ktorý chcel vyhotoviť projekt inteligentnej domácnosti na platforme NodeMCU so správou cez web. Tomu som samozrejme nemohol odolať a do projektu som sa pustil. Nakoľko sa jedná o projekt v platenej šablóne, zdrojové kódy web časti v tejto téme nebudú umiestnené.
Projekt riešil implementáciu týchto prvkov:
    Termostat s automatickým/manuálnym ovládaním z internetu
    Systém závlahy s automatickým/manuálnym ovládaním z internetu
    Ovládanie svetla cez internet + manuálne z domu vypínačom
    Ovládanie garážovej brány cez internet + manuálne z garáže tlačidlom
    Stav, či je auto v garáži
    Alarm domácnosti zapínaný z internetu
Použité moduly:
    DS18B20, teplota [/list]
      DHT12, vlhkosť[/list]
        HC-SR-04, ultrazvukový snímač prekážky[/list]
          HC-SR-501, Pir senzor pohybu[/list]
            8-kanálové relé, svetlo, brána, termostat, závlaha[/list]
            Web časť:
            Projekt web časti bolo zoznámenie sa s novou technológiou - Angular. Celá webstránka funguje na jednej PHP stránke, ktorá obsahuje množstvo javascriptu, ktorý dokáže generovať podstránky dynamicky, teda používateľ sa dynamicky premiestní na inú stránku, bez requestu na stránke, niečo v štýle Ajaxu. Tento systém spôsoboval problémy pri vykreslovaní dát AJAX-om na stránku, ktorá bola dynamický zmenená bez requestu. Na stránku som implementoval vykresľovanie real-time dát technológiou AJAX. Stránka ponúka dashboard, kde je tabuľka, kde je možné prehliadať v reálnom čase údaje o teplote, vlhkosti, stave brány, svetla, stave auta, alarmu. V prípade, že je alarm aktívny a zaznamená pohyb, na webstránke sa spustí hudobná slučka s alarm tónom. Okrem toho je možné do kódu doplniť aj odoslanie e-mailu na vybranú e-mailovú adresu, čo sa môže hodiť v prípade, že používateľ nemá práve stránku otvorenú a nachádza sa na smartfóne kdekoľvek na svete. Časť dashboardu ponúka aj výpis referenčných hodnôt, na ktoré sa systém v automatickom režime viaže. V prípade, že má používateľ nastavenú referenčnú teplotu na 21°C a má aktivovaný automatický režim, tak relé zopne termostat pri teplota 19°C a menej a kúri do dosiahnutia 22°C. Systém je modulárny a je jednoduché doprogramovať funkcionalitu iných senzorov a rozšíriť systém. V projekte som využil 2 dosky NodeMCU, nakoľko som o nich zistil nepríjemnú vec. Piny D8, D9, D10, SD3, SD2 nie je možné využiť. Hľadal som problém v napájaní, skúšal iné zdroje ale problém bol v pinoch.

            V prípade, že do dosky nahráte program, ten sa spustí a pripojíte senzory, všetko beží, ale akonáhle dosku reštartujete, tak nenabootuje. Pre systém, ktorý má byť schopný fungovať nepretržite a po výpadku elektrickej energie následne bežať sú tieto piny nepoužiteľné. Pin D4 je taktiež problémový, nakoľko je napojený na integrovanú diódu na doske. V prípade nahrávania programu tento pin ide striedavo do hodnôt LOW, HIGH... V prípade, že tam máte pripojený modul ako input, je možné, že ho to odpáli, alebo trvalo poškodí. Dosky NodeMCU vykonávajú requesty na stránku nezávislé od seba. Requesty sa vykonávajú na PHP súbory, )ktoré som umiestnil do samostatného priečinka, kde pristupujú iba NodeMCU dosky) realizujú pri zápise dát a pri update stavu, napríklad v prípade automatického režimu s kontrolou teplôt, vlhkosti real-time. Do requestu sa vloží aj nameraná hodnota a vkladá sa cez GET metódu do príslušného súboru. NodeMCU s knižnicou vie aj parsovať obsah txt súborov a vložiť ich do premennej, ktorú vieme následne porovnať. V prípade, že sa v súbore nachádza ZAP, zapne sa výstup. Hodnota v súbore sa zmení vždy pred prečítaním tohto súboru, keď NodeMCU updatuje stav, ktorý sa má nastaviť. NodeMCU doskáva odpoveď ZAP/VYP na základe porovnania hodnoty s referenčnom v Automatickom režime a v manuálnom na základe nastaveného stavu ZAP/VYP manuálne z webu.

            Mal som obavy, či to bude doska NodeMCU zvládať, skompilovaný kód zaberal cca 30% pamäte a takt procesora bol 80Mhz. Za dva týždne skúšobnej prevádzky som nezaznamenal žiaden výpadok, doska "nevytuhla". Skúšal som napájať prostredníctvom USB, kedy je možné na 5V napájanie modulov použiť priamo 5V z USB napájania, aj napájanie adaptérom, kde je možné zvoliť napätie 6-24V, napájal som na 9V a na napájanie po 5V bolo nutné využiť Vin pin, všetko fungovalo v poriadku. Jedna NodeMCU doska spravuje teplotu, termostat, vlhkosť, závlahu pir senzor. Druhá NodeMCU doska sa stará o stav auta v garáži, garážovú bránu, svetlo. Svetlo funguje na princípe schodiskového vypínača, preto je nutné použiť prerušenie na základe CHANGE na pine, na ktorom meriame, či je na žiarovke napätie. Funkciu schodiskového vypínača na strane NodeMCU robí rozpínacie relé na 8-channel relé module.

            Krízové situácie:
            V prípade, že realizujete takýto projekt je nutné premýšľať o tom, aké situácie môžu nastať. Výpadok internetu môže spôsobiť, že systém nebude vykonávať to, čo mu bolo nastavené, prakticky zotrváva v stave, v akom bol naposledy. V prípade, že internet nabehne, NodeMCU v nekonečnej slučke loop obsahuje while, ktorý pripojenie do internetu zabezpečí (získa IP adresu) inak sa kód nevykonáva ďalej.

            V prípade, že vypadne elektrina a následne sa späť nahodí, systém sa vždy najprv synchronizuje podľa internetu, vďaka čomu je možné zaručiť, že ak je nastavené uzavretie brány a je náhodou otvorená, tak sa okamžite uzavrie.

            Štandardný dopyt NodeMCU na PHP stránku GET metódou - funkcia odoslania teploty s výpisom aj na UART.
            Kód: [Vybrat]
            void send_teplota() {
              sensors.requestTemperatures();
              WiFiClientSecure client;
              if (!client.connect(host, httpsPort)) {
                return;
              }
              if (client.verify(fingerprint, host)) {
              }
              else {
              }
              String teplota = String (sensors.getTempCByIndex(0));
              String url = "/system/nodemcu/zapisteplotu.php?teplota=" + teplota;
              client.print(String("GET ") + url + " HTTP/1.1\r\n" + "Host: " + host + "\r\n" + "User-Agent: NodeMCU\r\n" + "Connection: close\r\n\r\n");
              Serial.println("Odoslane: Teplota");
              Serial.println(url);
            }

            Štandardný dopyt NodeMCU na TXT  súbor, ktorý parsuje - porovnanie s podmienkami (rozpínacie relé, stav LOW ho aktivuje)
            Kód: [Vybrat]
            void get_termostat() {
              WiFiClientSecure client;
              if (!client.connect(host, httpsPort)) {
                return;
              }
              if (client.verify(fingerprint, host)) {
              }
              else {
              }
              String url = "/mojsystem/termostat.txt";
              client.print(String("GET ") + url + " HTTP/1.1\r\n" + "Host: " + host + "\r\n" + "User-Agent: NodeMCU\r\n" + "Connection: close\r\n\r\n");

              while (client.connected()) {
                String line = client.readStringUntil('\n');
                if (line == "\r") {
                  break;
                }
              }
              String line = client.readStringUntil('\n');
              if (line == "ZAP") {
                Serial.println("Zapni termostat");
                digitalWrite(termostat, LOW);
              } else if (line == "VYP") {
                Serial.println("Vypni termostat");
                digitalWrite(termostat, HIGH);
              }
            }
            Tieto časti kódu sú základom systému, ktorý vie odosielať dáta a následne čítať textové súbory, v ktorých môže byť umiestnený text, hodnota, čísla.
            Príklad PHP súboru pre zápis teploty s ošetrením chybovej teploty spôsobenej zlým zapojením, problémovým čidlom:
            Kód: [Vybrat]
            <?php
             $teplota 
            $_GET["teplota"];
                 if(
            $teplota==|| $teplota==-127 || $teplota==85){
              echo'Neplatný údaj!';

             }else{
             
            file_put_contents('teplota.txt'$teplota);}
             
            ?>

            Vizualizácia web časti:



            Tipy: Webstránku je dobré zabezpečiť menom a heslom, v mojom prípade som využil statické zadanie mena a hesla, či viacerých priamo do PHP kódu, čo eliminuje napríklad SQL Injection útok.
            Možnosť rozšírenia do budúcnosti: Modulárny systém umožňuje pripojiť mnoho NodeMCU dosiek z celého sveta so správou cez centrálnu webstránku. Pridanie možnosti ovládania hlasom, iná šablóna v štýle Metro, mobilná aplikácia.
            V prípade, že chcete vytvoriť vlastný projekt a chcete použiť totožnú šablónu, nájdete ju na internete pod názvom ControlR. Kódy, ktoré sú tu publikované vykonávajú requesty na HTTPS stránky, takže je nutné použiť knižnicu WiFiClientSecure, kde je možné umiestniť aj fingerprint certifikátu do kódu, ktorý sa používa na stránke (SHA1, nie MD5). POZOR! Po uplynutí fingerprintu a vystavení nového certifikátu s iným fingerprintom nebude prenos na stránku úspešný. Následne je nutné zmenu fingerprintu pozmeniť aj v kóde.
            Vzorový kód s WifiSecure knižnicou a fingerprintom na Githube: https://github.com/esp8266/Arduino/blob/master/libraries/ESP8266WiFi/examples/HTTPSRequest/HTTPSRequest.ino
            Podporiť ma, nájsť zaujímavé projekty môžete aj na mojej webstránke: https://arduino.php5.sk
            Článok o inteligentnej domácnosti na mojej stránke: https://arduino.php5.sk/inteligentna-domacnost.php
            « Poslední změna: Listopad 11, 2017, 19:42:08 odpoledne od martinius96 »

            Offline seta1J

            • Bastlíř začátečník
            • *
            • Příspěvků: 9
            Re:Inteligentný dom - NodeMCU
            « Odpověď #1 kdy: Leden 10, 2018, 08:28:49 dopoledne »
            Zdraví,
            přemýšlím o podobném i když trochu jinak. Uvažuji ovládat přes SMS, manuálně a režimy poněkud jinak.
            Režimy :
            1/ jsem doma (manuální zapnutí) = teplota např.20°C, vypnout alarm
            2/ nejsem doma (manuálně,SMS) = teplota např. 15°C, zapnout alarm, zatáhnout žaluzie,...
            3/ budu doma za 2hod. (SMS) = teplota 20°C (zapnuto pouze na 2hod.), zapnout alarm
            4/ jsem doma - noc (manuálně) = teplota na 17°C, zapnout alarm (jen některá čidla)
            5/ jsem doma - den (manuálně) = teplota na 20°C, zapnout alarm (jen některá čidla)

            Úvaha : Budu mimo je zbatečné topoit na 20 ale až budu předpokládat návrat zapnu SMS režim 3. Při náhlé změně se po 2hod. přepne do režimu 2.
            Mezi 4 a 5 třeba přepnout i pulzně časově (do 4 v 21,00hod.do 5 v 5,00hod.).
            Zalévání a pod. musí fungovat stejně jestli doma jsem či ne.

            Offline martinius96

            • Bastlíř začátečník
            • *
            • Příspěvků: 18
            Re:Inteligentný dom - NodeMCU
            « Odpověď #2 kdy: Leden 10, 2018, 08:33:22 dopoledne »
            Zdravím, rád by som pomohol ale nemám s GSM modulom žiadne skúsenosti. Tie moduly nie sú až tak vyladené, často trpia zásekmi z napájania. Majú obrovskú špičku, pri pripájaní na sieť operátora majú odber 2A, Arduino má cca 60mA pri normálnom kóde, ten prúdový náraz je obrovský a je problém to ufiltrovať atď. Nemám s tým vôbec skúsenosti, neviem vám poradiť.

            Jirka

            • Host
            Re:Inteligentný dom - NodeMCU
            « Odpověď #3 kdy: Leden 10, 2018, 08:50:09 dopoledne »
            Zdravím, mám jej v provozu (zatím jen tak zkušebně) cca 1,5 celkem bez problémů. Jediná potíž co se mi jeví je někdy start. Spínal jsem s tím jen topení a pár funkcí-zkušebně pro srandu na seznámení s možnostmi.
            Jeví se mi zatím daleko spolehlivější jak David od Jablotronu.
            Co se týká odběru je fakt, že to chce tvrdý zdroj. Ale stejně by to mělo být zálohované z aku. Takže ten by špičky měl bez problémů vykrýt.

            Offline Somjitjidmaidee

            • Bastlíř začátečník
            • *
            • Příspěvků: 1
            Re:Inteligentný dom - NodeMCU
            « Odpověď #4 kdy: Červen 14, 2018, 11:45:50 dopoledne »
            Thank you for this answer.