Përmbajtje:

Temperatura dhe lagështia duke përdorur ESP32-DHT22-MQTT-MySQL-PHP: 7 hapa
Temperatura dhe lagështia duke përdorur ESP32-DHT22-MQTT-MySQL-PHP: 7 hapa

Video: Temperatura dhe lagështia duke përdorur ESP32-DHT22-MQTT-MySQL-PHP: 7 hapa

Video: Temperatura dhe lagështia duke përdorur ESP32-DHT22-MQTT-MySQL-PHP: 7 hapa
Video: “Medikamentet te fëmijët duhet të fillojnë në temperaturën 38.3 gradë” 2024, Nëntor
Anonim
Temperatura dhe lagështia duke përdorur ESP32-DHT22-MQTT-MySQL-PHP
Temperatura dhe lagështia duke përdorur ESP32-DHT22-MQTT-MySQL-PHP

E dashura ime donte një serë, kështu që unë e bëra atë. Por unë doja një sensor të temperaturës dhe lagështisë brenda serrës. Kështu, unë kërkova në Google për shembuj dhe fillova të eksperimentoja.

Përfundimi im ishte se të gjithë shembujt që gjeta nuk ishin pikërisht ato që doja të ndërtoja. Kam kapur shumë pjesë të vogla të kodit dhe i kam kombinuar ato. M'u desh shumë kohë për të përfunduar ndërtimin tim të parë të punës sepse dokumentacioni i shumicës së shembujve ishte shumë i vështirë për mua për të kuptuar ose ata supozuan një pjesë që duhet ta dija ?? Por nuk dija asgjë (akoma)

Kjo është arsyeja pse unë e ndërtoj këtë të udhëzueshme. Një tutorial "nga fillimi deri në fund" për të kuptuar fjalë për fjalë të gjithë. (Të paktën shpresoj?)

Si punon …

Produkti përfundimtar është një ESP32-CAM me një sensor DHT22 të bashkangjitur në të, i cili merr fuqinë nga një bateri 18650. Çdo tre minuta lexon temperaturën dhe lagështinë dhe e dërgon këtë përmes WiFi në një server të jashtëm MQTT dhe pastaj shkon në gjumë (për tre minuta) për të përdorur sa më pak bateri sipas nevojës

Në një server Debian, (i cili gjithashtu mund të jetë një mjedër pi) unë kam python3, një server MQTT, një server MySQL dhe një server në internet

Skripti python3 funksionon si një shërbim dhe sa herë që merr një mesazh MQTT, ai numëron numrin e mëparshëm të shënimeve (numri i indeksit) dhe e rrit këtë me një. Pastaj lexon vlerat e temperaturës dhe lagështisë nga mesazhi MQTT. Kontrollon vlerat e rreme dhe sa herë që vlerat janë të sakta, i dërgon vlerat së bashku me numrin e ri të indeksit dhe datën dhe kohën aktuale në një server MySQL

Serveri i uebit ka një skript PHP i cili lexon vlerat nga serveri MySQL dhe bën një grafik të bukur prej tij duke përdorur Google Charts. (shembull)

Furnizimet

Pjesët që kam përdorur janë këto:

  • ESP32-CAM (Arsyeja pse kam përdorur versionin e kamerës është sepse ka një lidhës të jashtëm të antenës në të. Ndoshta ka edhe ESP32 të tjerë që mund të përdorni)
  • Antenë e jashtme
  • Sensori AM2302 DHT22 (ky ka një rezistencë të integruar, kështu që ju duhen vetëm tre tela)

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

  • Mburoja e baterisë 18650 v3
  • Bateri 18650 (NCR18650B)
  • Kabllo e vjetër mikro USB (për lidhjen e ESP32 me mburojën e baterisë)
  • Disa tela të shkurtër kërcyes

E nevojshme shtesë:

  • Lidhës USB në TTL (foto)

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

  • Makine per ngjitjen e metalit
  • Printer 3D (i nevojshëm vetëm për kutinë e strehimit)

Hapi 1: Ngarko kodin Arduino në ESP32-CAM

Ngarko kodin Arduino në ESP32-CAM
Ngarko kodin Arduino në ESP32-CAM

Pra, le të fillojmë!

Për të ngarkuar kodin Arduino në ESP32-CAM, duhet të lidhni lidhësin USBtoTTL me ESP32 duke përdorur skemat e mësipërme.

Kodi Arduino është:

/*Vetëm një program i vogël për të lexuar temperaturën dhe lagështinë nga një sensor DHT22 dhe

kalojeni atë në MQTT. B. Duijnhouwer Qershor, 8th 2020*/#include #include #include #define wifi_ssid "*** WIFI_SSID ***" // wifi ssid #define wifi_password "*** WIFI_PASSWORD ***" // wifi password #define mqtt_server "*** SERVER_NAME ***" // emri i serverit ose IP #define mqtt_user "*** MQTT_USER ***" // emri i përdoruesit #define mqtt_password "*** MQTT_PASSWORD ***" // fjalëkalimi #përcakto temën "glasshouse /dhtreadings "#define debug_topic" glasshouse /debug "// Tema për korrigjimin e gabimeve /* përkufizimet për gjumë të thellë* /#përcakto uS_TO_S_FACTOR 1000000 /* Faktori i shndërrimit për mikro sekonda në sekonda* /#define TIME_TO_SLEEP 180 /* Koha ESP32 do të shkojë në gjumë për 5 minuta (në sekonda) */ bool debug = true; // Shfaq mesazhin e regjistrit nëse True #define DHT22_PIN 14 dht DHT; WiFiClient espClient; Klienti PubSubClient (espClient); të dhëna char [80]; void setup () {Serial.begin (115200); setup_wifi (); // Lidhu me klientin e rrjetit Wifi.setServer (mqtt_server, 1883); // Konfiguro lidhjen MQTT, ndrysho portën nëse është e nevojshme. nëse (! client.connected ()) {rilidheni (); } // LEXO T DHNAT int chk = DHT.read22 (DHT22_PIN); noton t = DHT.temperatura; noton h = DHT. lagështia; String dhtReadings = "{" temperatura / ": \" " + Vargu (t) +" / ", \" lagështia / ": \" " + Vargu (h) +" / "}"; dhtReadings.toCharArray (të dhëna, (dhtReadings.length () + 1)); if (debug) {Serial.print ("Temperatura:"); Serial.print (t); Serial.print ("| Lagështia:"); Serial.println (h); } // Publikoni vlerat në temat MQTT client.publish (tema, të dhëna); // Publikoni lexime mbi temën (glasshouse/dhtreadings) nëse (debug) {Serial.println ("Leximet i dërgohen MQTT."); } esp_sleep_enable_timer_wakeup (TIME_TO_SLEEP * uS_TO_S_FACTOR); // shko për të fjetur Serial.println ("Konfiguro ESP32 për të fjetur për çdo" + String (TIME_TO_SLEEP) + "Seconds"); Serial.println ("Të flesh si zakonisht tani."); esp_deep_sleep_start (); } // Konfiguro lidhjen me wifi void setup_wifi () {vonesë (20); Serial.println (); Serial.print ("Lidhu me"); Serial.println (wifi_ssid); WiFi.filloj (wifi_ssid, wifi_password); ndërsa (WiFi.status ()! = WL_CONNECTED) {vonesë (100); Serial.print ("."); } Serial.println (""); Serial.println ("WiFi është në rregull"); Serial.print ("=> ESP32 adresa e re IP është:"); Serial.print (WiFi.localIP ()); Serial.println (""); } // Rilidheni me wifi nëse lidhja humbet rilidheni të pavlefshme () {ndërsa (! Client.connected ()) {Serial.print ("Po lidhet me ndërmjetësin MQTT …"); if (client.connect ("ESP32Client", mqtt_user, mqtt_password)) {Serial.println ("OK"); } else {Serial.print ("[Gabim] Nuk është lidhur:"); Serial.print (client.state ()); Serial.println ("Prisni 5 sekonda para se të provoni përsëri."); vonesa (5000); }}} lak void () {}

Dhe përsëri, mos harroni të zëvendësoni letrat kredenciale me kredencialet tuaja

Hapi 2: Lidhuni

Wire Up!
Wire Up!

Për energjinë, kam përdorur një kabllo të vjetër USB, nga e cila kam ndërprerë lidhësin USB-A. Ka katër tela në kabllon USB, na duhen vetëm ato të zeza dhe të kuqe.

Pra, lidhni gjithçka sipas orarit të mësipërm.

Hapi 3: Shkrimi Python3

Skripti Python3 shkon në një vend ku është i arritshëm për përdoruesit rrënjë.

Kam përdorur /root/scripts/glasshouse/glasshouse.py për këtë skenar. Përmbajtja e shkrimit python është:

Skenari # Python3 për t'u lidhur me MQTT, lexoni vlerat dhe shkruani ato në MySQL

# # B. Duijnhouwer # qershor, 8th 2020 # # version: 1.0 # # import paho.mqtt.client si mqtt import json import pymysql pymysql.install_as_MySQLdb () import MySQLdb nga dataetime import dataetime db = MySQLdb.connect (" "glasshouse", "*** MYSQL_USERNAME ***", "*** MYSQL_PASSWORD ***") kursori = db.cursor () broker_address = "localhost" #Porta e adresës së ndërmjetësit = 1883 #Përdoruesi i portit të ndërmjetësit = "** *MQTT_USERNAME *** " #Fjalëkalimi i emrit të përdoruesit =" *** MQTT_PASSWORD *** " #Fjalëkalimi i lidhjes def_connect (klienti, të dhënat e përdoruesit, flamujt, rc): #Kthimi i telefonatës për kur klienti lidhet me printimin e ndërmjetësit (" Lidhur me kodin e rezultatit {0} ". format (str (rc))) # Printo rezultatin e përpjekjes së lidhjes klient. abonohu (" glasshouse/dhtreadings/ # ") def on_message (client, userdata, msg): # Kthimi i telefonatës për kur një Mesazhi PUBLISHT merret nga serveri. cursor.execute ("zgjidhni * nga sensordata") numrows = int (cursor.rowcount) newrow = numrows + 1 now = datetime.now () formatatted_date = now.strftime ('%Y-%m-%d%H:% M:%S ') payload = json.loads (msg.payload.decode (' utf-8 ')) print ("Rresht i ri:"+str (newrow)) temperature = float (payload ["temperature"]) lagështia = float (ngarkesa ["lagështia"]) print ("Temperatura:"+str (temperatura)) print ("Lagështia:"+str (lagështia)) print ("DataTime:"+str (data_at formatuar)) nëse ((temperatura > -20) dhe (temperatura = 0) dhe (lagështia <= 100)): cur = db.cursor () cur.execute ("INSERT INTO glassshouse.sensordata (idx, temperatura, lagështia, vula kohore) VLERAT ("+str (newrow)+","+str (temperatura)+","+str (lagështia)+", %s)", (data_ e formatuar)) db.commit () print ("të dhënat e marra dhe të importuara në MySQL") tjetër: print ("të dhënat tejkaluan kufijtë dhe NUK importohen në MySQL") klient = mqtt. Client ("duijnhouwer-com-glasshouse-script") client.username_pw_set (përdorues, fjalëkalim = fjalëkalim) klient.on_connect = on_connect # Përcakto funksionin e thirrjes për klient i suksesshëm i lidhjes.on_message = on_message # Përcaktoni funksionin e kthimit të thirrjes për marrjen e një klienti mesazhi.lidhu (adresa e ndërmjetësit, porti = porti) #lidhu me klientin e ndërmjetësit. loop_forever () # Fillo rrjetin daemon

Mos harroni të zëvendësoni emrin e përdoruesit dhe fjalëkalimin MySQL dhe emrin e përdoruesit dhe fjalëkalimin MQTT me kredencialet tuaja

Mund ta bëni skriptin të funksionojë si shërbim duke krijuar dy skedarë.

E para është "/etc/init/glasshouse.conf" me përmbajtjen e mëposhtme:

fillo në nivelin e parë [2345]

ndalo në nivelin e parë [! 2345] exec /root/scripts/glasshouse/glasshouse.py

E dyta është “/etc/systemd/system/multi-user.target.wants/glasshouse.service” me përmbajtjen e mëposhtme:

[Njësia]

Përshkrimi = Shërbimi i Monitorimit të Glasshouse Pas = multi-user.target [Shërbimi] Lloji = i thjeshtë Restart = gjithmonë RestartSec = 1 ExecStart =/usr/bin/python3 /root/scripts/glasshouse/glasshouse.py [Install] WantedBy = multi-user. synim

Ju mund ta bëni këtë si një shërbim duke përdorur komandën e mëposhtme:

systemctl aktivizoni serën

dhe fillojeni duke përdorur:

systemctl start glassshouse

Hapi 4: MySQL Server

Ju duhet të krijoni një bazë të dhënash të re MySQL me vetëm një tabelë në të.

Kodi për krijimin e tabelës është:

KRIJO TABEL `sensordata` (`idx` int (11) NULL DEFAULT,` temperatura` noton DEFAULT NULL, `lagështia` noton DEFAULT NULL,` timeestamp` dataetime DEFAULT NULL) ENGINE = InnoDB DEFAULT CHARSET = utf8;

Hapi 5: Serveri i uebit

Serveri i uebit ka dy skedarë, skedarin index.php dhe një skedar config.ini

Përmbajtja e skedarit config.ini është:

[baza e të dhënave]

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

Aty ku zëvendësoni *** DATABASE_USER *** dhe *** DATABASE_PASSWORD *** me kredencialet tuaja.

google.charts.load ('aktuale', {'paketa': ['corechart']}); google.charts.setOnLoadCallback (drawChart); funksion drawChart () {var data = google.visualization.arrayToDataTable ([// ['Temestamp', 'Temperature', 'Humidity', 'Heat Index'], ['Timestamp', 'Temperature', 'Humidity'], query ($ sql); # This while - formoni lakun dhe vendosni të gjitha të dhënat e marra në mënyrën ['timestamp', 'temperature', 'lagështia']. ndërsa ($ row = $ result-> fetch_assoc ()) {$ timestamp_rest = substr ($ row ["timestamp"], 10, 6); jehonë "['". $ timestamp_rest. "',". $ row ['temperature']. ",". $ row ['lagështia']. "],"; // echo "['". $ timestamp_rest. "',". $ row ['temperature']. ",". $ row ['lagështia']. ",". $ row ['heatindex ']. "],";}?>]); // Linja e lakuar var opsionet = {titulli: 'Temperatura dhe lagështia', curveType: 'funksioni', legjenda: {pozicioni: 'poshtë'}, hAxis: {slantedText: true, slantedTextAngle: 45}}; // Grafiku i lakuar var grafiku = new google.visualization. LineChart (document.getElementById ('curve_chart')); chart.draw (të dhëna, opsione); } // Kllapa përfundimtare nga drawChart //

Hapi 6: Strehimi i Shtypur 3D

Për strehimin, kam përdorur dy strehë të veçantë, një për ESP32-CAM dhe DHT22 së bashku dhe një për mburojën e baterisë 18650.

Hapi 7: Rezultati Final

Rezultati Final!
Rezultati Final!
Rezultati Final!
Rezultati Final!
Rezultati Final!
Rezultati Final!
Rezultati Final!
Rezultati Final!

Rezultati përfundimtar tregohet gjithashtu në fotot e mësipërme.

Dhe sa herë që bateria është bosh, mund ta ngarkoni me një mini kabllo USB.

Recommended: