Kedves Blogolvasók!
A nyári szünet úgymond véget ért. Lassan jönnek a hosszú őszi napok, amikor már nem lehet annyit a szabadban tölteni, ezért újra tudok a tesztek írására is időt fordítani. Az első ilyen példa legyen az, hogy miként lehet megvalósítani az előző cikkben szereplő feladatot az Arduino IDE-vel.
Röviden az előző cikk összefoglalása, ha valaki nem olvasná el. Ott két dobozt készítettem, az egyikben egy DHT22 van, ami a külső hőmérséklet és páratartalom adatokat méri (akksiról). A másikban pedig egy DS18B20 hőmérő szenzor és egy SR-HC501 mozgásérzékelő van. Ezek az eszközök Wifin keresztül $_GET-elik be mért adatokat egy BananaPi-n futó apache2-nek.
A harmadik Node, amit az Arduino IDE-n keresztül programoztam fel egy DHT11-et tartalmaz és egy SR-HC501-es mozgásérzékelőt, ami hasonlatosan $_GET-eli be a mért szenzoradatokat.
Kapcsolási rajzot nem mellékelek, mert aki valami ilyesminek a készítésére adja a fejét, annak kapcsolási rajz úgy sem kell. Plusz végigolvassa az előző cikkeimet, ami telis-tele van jobbnál jobb bekötési vázlatokkal.
Nos akkor kezdjük is azzal, hogy miként néz ki a már kibővített rendszer.
Itt látható, hogy lett egy plusz ikon az előző cikkben látott állapothoz képest. Ez az ikon vezet a DHT11 mért adataihoz. Ami így néz ki:
Ez a grafikon semmiben sem tér el az előző két eszköz grafikonjától. Max a mérési intervallumokban. Ami még változott az az, hogy kibővült plusz egy szektorral a mozgásérzékelő látásköre.
Nah de ezekből ennyi legyen is elég, lássuk a kódot:
// DHT 11 definiálás #include "DHT.h" #define DHTTYPE DHT11 // DHT 11 #define DHTPIN 2 DHT dht(DHTPIN, DHTTYPE, 15); #include <ESP8266WiFi.h> const char* ssid = "Aloha"; const char* password = "deepdish"; const char* host = "192.168.0.115"; #define sensor 14 int pirState = LOW; // Mozgásérzékelő állapot státusza int val = 0; // Mozgásértékelő beolvasása ebbe a változóba int counter = 0; #include "Timer.h" Timer t; void setup() { t.every(10 * 60 * 1000, dhtwrite); Serial.begin(115200); delay(100); pinMode(sensor, INPUT_PULLUP); dht.begin(); // Connect to WiFi network Serial.println(); Serial.println(); Serial.print("Connecting to "); Serial.println(ssid); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.println("WiFi connected"); Serial.print(WiFi.localIP()); Serial.println("/"); } void loop() { t.update(); val = digitalRead(sensor); // A mozgásérzékelő beolvasása if (val == HIGH) // Ha val HIGH akkor van mozgás { connection(); delay(1000); if (pirState == LOW) { counter=counter+1; pirState = HIGH; //pirstate állapot megváltoztatása Serial.print("Motion Started ");//Írás serial monitorra Serial.println(counter); } } else { if (pirState == HIGH) { counter=counter+1; Serial.print("Motion Ended ");//Írás serial monitorra Serial.println(counter); pirState = LOW; // pirstate alaphelyzetbe állítása } } } void connection() { // Use WiFiClient class to create TCP connections WiFiClient client; const int httpPort = 80; if (!client.connect(host, httpPort)) { Serial.println("connection failed"); return; } // URL összeállítása String url = "/motion.php?SID=2"; Serial.print("Requesting URL: "); Serial.println(url); // Kérés küldése a szervernek client.print(String("GET ") + url + " HTTP/1.1\r\n" + "Host: " + host + "\r\n" + "Connection: close\r\n\r\n"); delay(500); // Reply to serial while(client.available()) { String line = client.readStringUntil('\r'); Serial.print(line); } Serial.println(); Serial.println("closing connection"); } void dhtwrite() { // Várakozás a szenzorra, hogy észhez térjen delay(2000); float h = dht.readHumidity(); float t = dht.readTemperature(); // Csekk DHT if (isnan(h) || isnan(t)) { Serial.println("Failed to read from DHT sensor!"); return; } Serial.print("Humidity: "); Serial.print(h); Serial.println(""); Serial.print("Temperature: "); Serial.print(t); Serial.print(" *C "); // DHT WEB-re WiFiClient client; const int httpPort = 80; if (!client.connect(host, httpPort)) { Serial.println("connection failed"); return; } String temp; String humi; temp = String(t); humi = String(h); // URL készítése String url = "/insidedht.php?temp="+temp+"&humi="+humi; Serial.print("Requesting URL: "); Serial.println(url); // Kérés küldése a szervernek client.print(String("GET ") + url + " HTTP/1.1\r\n" + "Host: " + host + "\r\n" + "Connection: close\r\n\r\n"); delay(500); // Reply to Serial while(client.available()) { String line = client.readStringUntil('\r'); Serial.print(line); delay(2000); } Serial.println(); Serial.println("closing connection"); }
Az Arduino IDE-t ahhoz, hogy NodeMcu-t tudjunk programozni csak egy bővítménnyel kell felokosítani. Ehhez a lépéshez itt van egy instructable.com-os leírás: -ITT-
Ezen felül még két könyvtárat is telepíteni kell a kódhoz.
– A DHT könyvtárat ami letölthető: -INNEN-
– A Timer könyvtárat ami letölthető: -INNEN-
Tulajdonképpen az Arduino könyvtárak 90%-át lehet alkalmazni a NodeMcu-nál is, ez nagy segítség és talán könnyedség is a LUA-hoz a képest. Akinek lenne valamilyen kérdése vagy kérése a projekttel kapcsolatban, az nyugodtan írjon e-mailt: