Sadržaj:

Temperatura i vlažnost pomoću ESP32-DHT22-MQTT-MySQL-PHP: 7 koraka
Temperatura i vlažnost pomoću ESP32-DHT22-MQTT-MySQL-PHP: 7 koraka

Video: Temperatura i vlažnost pomoću ESP32-DHT22-MQTT-MySQL-PHP: 7 koraka

Video: Temperatura i vlažnost pomoću ESP32-DHT22-MQTT-MySQL-PHP: 7 koraka
Video: Temperature padaju i prozori u kući vam se magle? S ovih ćete nekoliko savjeta to spriječiti 2024, Srpanj
Anonim
Temperatura i vlažnost korištenjem ESP32-DHT22-MQTT-MySQL-PHP
Temperatura i vlažnost korištenjem ESP32-DHT22-MQTT-MySQL-PHP

Moja djevojka je htjela staklenik, pa sam joj to napravio. Ali htio sam senzor temperature i vlage unutar staklenika. Dakle, googlao sam primjere i počeo eksperimentirati.

Moj je zaključak bio da svi primjeri koje sam pronašao nisu baš ono što sam htio izgraditi. Uzeo sam mnogo malih dijelova koda i kombinirao ih. Trebalo mi je dosta vremena da završim svoju prvu radnu gradnju jer mi je dokumentacija većine primjera bila preteška za razumijevanje ili su pretpostavljali dio koji bih trebao znati ?? Ali nisam znao (još) ništa ☹

Zato gradim ovo uputstvo. Vodič "od početka do kraja" koji će doslovno svi razumjeti. (Bar se nadam?)

Kako radi …

Krajnji proizvod je ESP32-CAM s priključenim DHT22 senzorom koji dobiva snagu iz baterije 18650. Svake tri minute očitava temperaturu i vlagu i šalje ih putem WiFi -a na vanjski MQTT poslužitelj, a zatim ide u stanje mirovanja (tri minute) kako bi koristio što je moguće manje baterije

Na Debian poslužitelju (koji bi mogao biti i malina pi) imam python3, MQTT poslužitelj, MySQL poslužitelj i web poslužitelj

Skripta python3 radi kao usluga i kad god primi MQTT poruku, broji prethodni broj unosa (broj indeksa) i povećava je za jedan. Zatim čita vrijednosti temperature i vlažnosti iz MQTT poruke. On provjerava ima li lažnih vrijednosti i kad god su vrijednosti točne, šalje vrijednosti zajedno s novim indeksnim brojem i trenutnim datumom i vremenom na MySQL poslužitelj

Web poslužitelj ima PHP skriptu koja čita vrijednosti s MySQL poslužitelja i od nje pravi lijepi grafikon pomoću Google grafikona. (primjer)

Pribor

Dijelovi koje sam koristio su sljedeći:

  • ESP32-CAM (Razlog zašto sam koristio verziju kamere je zato što na sebi ima priključak za vanjsku antenu. Vjerojatno postoje i drugi ESP32 koji biste mogli koristiti)
  • Vanjska antena
  • AM2302 DHT22 osjetnik (Ovaj ima ugrađeni otpornik, pa su vam potrebne samo tri žice)

    https://www.amazon.de/gp/product/B07CM2VLBK/ref=p…

  • 18650 štitnik baterije v3
  • Baterija 18650 (NCR18650B)
  • Stari mikro USB kabel (za spajanje ESP32 na štitnik baterije)
  • Neke kratke kratkospojne žice

Dodatno potrebno:

  • USB na TTL konektor (slika)

    https://www.amazon.de/FT232RL-Seriell-Unterst%C3%…

  • Lemilica
  • 3D pisač (potreban samo za kućište kućišta)

Korak 1: Prenesite Arduino kod na ESP32-CAM

Prenesite Arduino kod na ESP32-CAM
Prenesite Arduino kod na ESP32-CAM

Pa počnimo!

Da biste učitali Arduino kôd na ESP32-CAM, morate spojiti USBtoTTL konektor na ESP32 pomoću gornjih shema.

Arduino kôd je:

/*Samo mali program za očitavanje temperature i vlažnosti sa senzora DHT22 i

proslijedi MQTT -u. B. Duijnhouwer, 8. lipnja 2020.*/#include #include #include #define wifi_ssid "*** WIFI_SSID ***" // wifi ssid #define wifi_password "*** WIFI_PASSWORD ***" // lozinka za WiFi #define mqtt_server "*** SERVER_NAME ***" // naziv poslužitelja ili IP #define mqtt_user "*** MQTT_USER ***" // korisničko ime #define mqtt_password "*** MQTT_PASSWORD ***" // lozinka #define topic "staklenik /dhtreadings "#define debug_topic" glasshouse /debug "// Tema za otklanjanje pogrešaka /* definicije za duboki san* /#define uS_TO_S_FACTOR 1000000 /* Faktor pretvorbe za mikro sekunde u sekunde* /#define TIME_TO_SLEEP 180 /* Vrijeme ESP32 će otići u stanje mirovanja 5 minuta (u sekundama) */ bool debug = true; // Prikaz poruke dnevnika ako je True #define DHT22_PIN 14 dht DHT; WiFiClient espClient; PubSubClient klijent (espClient); char podaci [80]; void setup () {Serial.begin (115200); setup_wifi (); // Povežite se s klijentom Wifi mreže.setServer (mqtt_server, 1883); // Konfigurirajte MQTT vezu, promijenite port ako je potrebno. if (! client.connected ()) {ponovno povezivanje (); } // PROČITAJ PODATKE int chk = DHT.read22 (DHT22_PIN); plovak t = DHT.temperatura; plovak h = DHT.vlažnost; Niz dhtReadings = "{" temperatura / ": \" " + Niz (t) +" / ", \" vlažnost / ": \" " + Niz (h) +" / "}"; dhtReadings.toCharArray (podaci, (dhtReadings.length () + 1)); if (ispravljanje pogrešaka) {Serial.print ("Temperatura:"); Serijski.tisak (t); Serial.print ("| Vlažnost:"); Serijski.println (h); } // Objavljivanje vrijednosti u MQTT temama client.publish (tema, podaci); // Objavljivanje lektire na temu (staklenik/dhtreadings) if (ispravljanje pogrešaka) {Serial.println ("Čitanja poslana MQTT -u."); } esp_sleep_enable_timer_wakeup (TIME_TO_SLEEP * uS_TO_S_FACTOR); // idite na spavanje Serial.println ("Postavljanje ESP32 u stanje mirovanja za svaki" + niz (TIME_TO_SLEEP) + "Sekunde"); Serial.println ("Odlazak na spavanje kao normalno."); esp_deep_sleep_start (); } // Postavljanje veze na wifi void setup_wifi () {delay (20); Serial.println (); Serial.print ("Povezivanje s"); Serial.println (wifi_ssid); WiFi.begin (wifi_ssid, wifi_password); while (WiFi.status ()! = WL_CONNECTED) {odgoda (100); Serial.print ("."); } Serial.println (""); Serial.println ("WiFi je u redu"); Serial.print ("=> ESP32 nova IP adresa je:"); Serial.print (WiFi.localIP ()); Serial.println (""); } // Ponovo se povežite na wifi ako se veza izgubi. Void reconnect () {while (! Client.connected ()) {Serial.print ("Povezivanje s posrednikom MQTT …"); if (client.connect ("ESP32Client", mqtt_user, mqtt_password)) {Serial.println ("U redu"); } else {Serial.print ("[Greška] Nije povezano:"); Serial.print (client.state ()); Serial.println ("Pričekajte 5 sekundi prije ponovnog pokušaja."); kašnjenje (5000); }}} void loop () {}

I opet, ne zaboravite zamijeniti vjerodajnice vlastitim vjerodajnicama

Korak 2: Povežite se

Ožičite se!
Ožičite se!

Za napajanje sam koristio stari USB kabel kojem sam odrezao USB-A konektor. U USB kabelu postoje četiri žice, trebaju nam samo crna i crvena.

Dakle, sve spojite prema gore navedenom rasporedu.

Korak 3: Python3 skripta

Skripta Python3 ide na mjesto gdje je dostupna root korisniku.

Koristio sam /root/scripts/glasshouse/glasshouse.py za ovu skriptu. Sadržaj python skripte je:

# Python3 skripta za povezivanje s MQTT -om, čitanje vrijednosti i njihovo upisivanje u MySQL

# # B. Duijnhouwer #, 8. lipnja 2020. # # verzija: 1.0 # # import paho.mqtt.client kao mqtt import json import pymysql pymysql.install_as_MySQLdb () uvoz MySQLdb iz datetime import datetime db = MySQLdb.connect ("localhost", "staklenik", "*** MYSQL_USERNAME ***", "*** MYSQL_PASSWORD ***") kurzor = db.cursor () broker_address = "localhost" #Broker adresa port = 1883 #Broker port user = "** *MQTT_USERNAME *** " #Korisničko ime lozinke za povezivanje =" *** MQTT_PASSWORD *** " #Lozinka za povezivanje def on_connect (klijent, korisnički podaci, zastavice, rc): #Povratni poziv kada se klijent poveže s brokerskim ispisom (" Povezano s kodom rezultata {0} ". format (str (rc))) # Ispis rezultata pokušaja povezivanja client.subscribe (" glasshouse/dhtreadings/ # ") def on_message (client, userdata, msg): # Povratni poziv za kada PUBLISH poruka je primljena s poslužitelja. cursor.execute ("select * from sensordata") numrows = int (cursor.rowcount) newrow = numrows + 1 now = datetime.now () formatted_date = now.strftime ('%Y-%m-%d%H:% M:%S ') korisni teret = json.loads (msg.payload.decode (' utf-8 ')) print ("Novi red:"+str (newrow)) temperatura = plutajući (korisni teret ["temperatura"]) vlažnost = float (korisni teret ["vlažnost"]) ispis ("Temperatura:"+str (temperatura)) ispis ("Vlažnost:"+str (vlažnost)) ispis ("DatumTime:"+str (formatted_date)) if ((temperatura > -20) i (temperatura = 0) i (vlažnost <= 100)): cur = db.cursor () cur.execute ("INSERT INTO glasshouse.sensordata (idx, temperatura, vlažnost, vremenska oznaka) VALUES ("+str (newrow)+","+str (temperatura)+","+str (vlažnost)+", %s)", (formatted_date)) db.commit () print ("podaci primljeni i uvezeni u MySQL") else: print ("podaci su premašili ograničenja i NISU uvezeni u MySQL") client = mqtt. Client ("duijnhouwer-com-glasshouse-script") client.username_pw_set (korisnik, lozinka = lozinka) client.on_connect = on_connect # Definirajte funkciju povratnog poziva za uspješna veza client.on_message = on_message # Definirajte funkciju povratnog poziva za primanje poruke client.connect (adresa_brokera, port = port) #povežite se s posrednikom client.loop_forever () # Pokrenite demona umrežavanja

Ne zaboravite zamijeniti korisničko ime i lozinku za MySQL te korisničko ime i lozinku za MQTT vlastitim vjerodajnicama

Skriptu možete pokrenuti kao uslugu stvaranjem dvije datoteke.

Prva je “/etc/init/glasshouse.conf” sa sljedećim sadržajem:

start na runlevel [2345]

zaustavi se na runlevel [! 2345] exec /root/scripts/glasshouse/glasshouse.py

Druga je „/etc/systemd/system/multi-user.target.wants/glasshouse.service Outlook sa sljedećim sadržajem:

[Jedinica]

Opis = Usluga nadgledanja staklenika Poslije = višekorisnički cilj [Usluga] Vrsta = jednostavno Ponovno pokretanje = uvijek RestartSec = 1 ExecStart =/usr/bin/python3 /root/scripts/glasshouse/glasshouse.py [Instaliraj] Traži se = više korisnika.cilj

Ovo pokretanje možete izvršiti kao uslugu pomoću sljedeće naredbe:

systemctl omogućiti staklenik

i pokrenite ga pomoću:

systemctl start staklenik

Korak 4: MySQL poslužitelj

Morate stvoriti novu MySQL bazu podataka sa samo jednom tablicom u njoj.

Kôd za izradu tablice je:

CREATE TABLE `sensordata` (`idx` int (11) DEFAULT NULL,` temperature` float DEFAULT NULL, float `Vlaga` float DEFAULT NULL,` timestamp` datetime DEFAULT NULL) MOTOR = InnoDB ZADNJA KARTA = utf8;

Korak 5: Web poslužitelj

Web poslužitelj ima dvije datoteke, datoteku index.php i jednu datoteku config.ini

Sadržaj datoteke config.ini je:

[baza podataka]

db_host = "localhost" db_name = "staklenik" db_table = "sensordata" db_user = "*** DATABASE_USER ***" db_password = "*** DATABASE_PASSWORD ***"

Gdje izvan kursa zamijenite *** DATABASE_USER *** i *** DATABASE_PASSWORD *** vlastitim vjerodajnicama.

google.charts.load ('current', {'packages': ['corechart']}); google.charts.setOnLoadCallback (crtanje grafikona); function drawChart () {var data = google.visualization.arrayToDataTable ([// ['Vremenska oznaka', 'Temperatura', 'Vlažnost', 'Toplinski indeks'], ['Vremenska oznaka', 'Temperatura', 'Vlažnost'], query ($ sql); # This while - petlja formatira i stavlja sve preuzete podatke na način ['timestamp', 'temperature', 'Vlažnost']. while ($ row = $ result-> fetch_assoc ()) {$ timestamp_rest = substr ($ row ["timestamp"], 10, 6); echo "['". $ timestamp_rest. "',". $ row ['temperature']. ",". $ row ['Vlažnost']. "],"; // echo "['". $ timestamp_rest. "',". $ row ['temperature']. ",". $ row ['Vlažnost']. ",". $ row ['heatindex ']. "],";}?>]); // Var curved line var options = {title: 'Temperatura i vlažnost', curveType: 'function', legend: {position: 'bottom'}, hAxis: {slantedText: true, slantedTextAngle: 45}}; // Zakrivljeni grafikon var chart = novi google.visualization. LineChart (document.getElementById ('curve_chart')); chart.draw (podaci, opcije); } // Završna zagrada iz drawChart //

Korak 6: 3D tiskano kućište

Za kućište sam koristio dva odvojena kućišta, jedno za ESP32-CAM i DHT22 zajedno i jedno za štitnik baterije 18650.

Korak 7: Konačni rezultat

Konačni rezultat!
Konačni rezultat!
Konačni rezultat!
Konačni rezultat!
Konačni rezultat!
Konačni rezultat!
Konačni rezultat!
Konačni rezultat!

Konačni rezultat također je prikazan na gornjim slikama.

A kad god je baterija prazna, možete je napuniti mini USB kabelom.

Preporučeni: