Inteligentný dom - NodeMCU
- November 11 2017
- ESP32, ESP8266, NodeMCU , Wemos, RTLDuino...
- 3703x Přečteno
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
- Stav, či je auto v garáži
- Alarm domácnosti zapínaný z internetu
Použité moduly:
DS18B20, teplota
DHT12, vlhkosť
HC-SR-04, ultrazvukový snímač prekážky
HC-SR-501, Pir senzor pohybu
8-kanálové relé, svetlo, brána, termostat, závlaha
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.
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)
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:
$teplota = $_GET["teplota"];
if($teplota==0 || $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. Využitie bistabilného relé, alebo relé, ktoré sa napája iba pri zmene stavu.
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