Sisukord:

Temperatuur ja niiskus ESP32-DHT22-MQTT-MySQL-PHP abil: 7 sammu
Temperatuur ja niiskus ESP32-DHT22-MQTT-MySQL-PHP abil: 7 sammu

Video: Temperatuur ja niiskus ESP32-DHT22-MQTT-MySQL-PHP abil: 7 sammu

Video: Temperatuur ja niiskus ESP32-DHT22-MQTT-MySQL-PHP abil: 7 sammu
Video: Veose Temperatuuriandur - Temperatuur Kaubaruumis Jälgitavaks osa1 - CarCops 2024, Juuli
Anonim
Temperatuur ja niiskus ESP32-DHT22-MQTT-MySQL-PHP abil
Temperatuur ja niiskus ESP32-DHT22-MQTT-MySQL-PHP abil

Mu tüdruksõber tahtis kasvuhoonet, nii et ma tegin talle selle. Tahtsin aga kasvuhoone sisse temperatuuri- ja niiskusandurit. Niisiis, otsisin näiteid googeldades ja hakkasin katsetama.

Minu järeldus oli, et kõik näited, mis ma leidsin, ei olnud täpselt need, mida ma ehitada tahtsin. Haarasin palju väikeseid koodiosasid ja ühendasin need. Esimese tööehituse lõpetamiseks kulus mul üsna kaua aega, sest enamiku näidete dokumentatsioonist oli mulle liiga raske aru saada või nad eeldasid osa, mida ma peaksin teadma ?? Aga ma ei teadnud midagi (veel) ☹

Sellepärast koostan selle juhendi. Õpetus „algusest lõpuni”, millest sõna otseses mõttes saavad kõik aru. (Vähemalt loodan?)

Kuidas see töötab …

Lõpptoode on ESP32-CAM, mille külge on kinnitatud DHT22 andur, mis saab energiat 18650 patareist. Iga kolme minuti järel loeb see temperatuuri ja niiskust ning saadab selle WiFi kaudu välisele MQTT -serverile ja läheb seejärel magama (kolmeks minutiks), et kasutada vajadusel vähem akut

Debiani serveris (mis võib olla ka vaarika pi), on mul python3, MQTT -server, MySQL -server ja veebiserver

Skript python3 töötab teenusena ja alati, kui ta saab MQTT -teate, loendab see eelmised kirjed (indeksi number) ja suurendab seda ühe võrra. Seejärel loeb see MQTT sõnumist temperatuuri ja niiskuse väärtused. See kontrollib valeväärtusi ja kui väärtused on õiged, saadab need väärtused koos uue registrinumbri ning praeguse kuupäeva ja kellaaja MySQL -serverisse

Veebiserveril on PHP -skript, mis loeb MySQL -serveri väärtused ja teeb sellest Google Charts'i abil kena graafiku. (näide)

Tarvikud

Osad, mida kasutasin, on järgmised:

  • ESP32-CAM (Põhjus, miks ma nukkversiooni kasutasin, on see, et sellel on väline antennipistik. Tõenäoliselt on ka teisi ESP32-sid, mida võiksite kasutada)
  • Väline antenn
  • AM2302 DHT22 andur (sellel on sisseehitatud takisti, nii et vajate ainult kolme juhet)

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

  • 18650 akukilp v3
  • 18650 aku (NCR18650B)
  • Vana mikro -USB -kaabel (ESP32 ühendamiseks akukilbiga)
  • Mõned lühikesed hüppajajuhtmed

Lisa vaja:

  • USB -TTL -pistik (pilt)

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

  • Jootekolb
  • 3D -printer (vajalik ainult korpuse jaoks)

Samm: laadige Arduino kood üles ESP32-CAM-i

Laadige Arduino kood üles ESP32-CAM-i
Laadige Arduino kood üles ESP32-CAM-i

Nii et alustame!

Arduino koodi üleslaadimiseks ESP32-CAM-i peate ülaltoodud skeemide abil ühendama USBtoTTL-pistiku ESP32-ga.

Arduino kood on:

/*Vaid väike programm temperatuuri ja niiskuse lugemiseks DHT22 andurilt ja

edastage see MQTT -le. B. Duijnhouwer, juuni, 8. 2020 "*** SERVER_NAME ***" // serveri nimi või IP #define mqtt_user "*** MQTT_USER ***" // kasutajanimi #define mqtt_password "*** MQTT_PASSWORD ***" // parool #define topic "glasshouse /dhtreadings "#define debug_topic" glasshouse /debug "// Silumise teema /* deepsleepi definitsioonid* /#define uS_TO_S_FACTOR 1000000 /* Teisendustegur mikrosekunditest sekunditesse* /#define TIME_TO_SLEEP 180 /* Aeg ESP32 läheb magama 5 minutit (sekundites) */ bool debug = true; // Kuva logi teade, kui tõsi #define DHT22_PIN 14 dht DHT; WiFiClient espClient; PubSubClient klient (espClient); char andmed [80]; void setup () {Serial.begin (115200); setup_wifi (); // Ühendus Wifi võrguga client.setServer (mqtt_server, 1883); // MQTT -ühenduse seadistamine, vajadusel pordi muutmine. if (! client.connected ()) {reconnect (); } // LOE ANDMED int chk = DHT.read22 (DHT22_PIN); ujuk t = DHT.temperatuur; ujuk h = DHT.niiskus; String dhtReadings = "{" temperatuur / ": \" " + String (t) +" / ", \" niiskus / ": \" " + String (h) +" / "}"; dhtReadings.toCharArray (andmed, (dhtReadings.length () + 1)); if (silumine) {Serial.print ("Temperature:"); Jadajälg (t); Serial.print ("| Niiskus:"); Seeria.println (h); } // Väärtuste avaldamine MQTT teemades client.publish (teema, andmed); // Avalda lugemised teemal (kasvuhoone/dhtreadings) if (silumine) {Serial.println ("Näidud saadetud MQTT -le."); } esp_sleep_enable_timer_wakeup (TIME_TO_SLEEP * uS_TO_S_FACTOR); // mine magama Serial.println ("Seadista ESP32 unerežiimi igaks" + String (TIME_TO_SLEEP) + "Sekundid"); Serial.println ("Lähen magama nagu tavaliselt."); esp_deep_sleep_start (); } // Seadistusühendus wifi -ga tühine setup_wifi () {delay (20); Serial.println (); Serial.print ("Ühendamine"); Serial.println (wifi_ssid); WiFi.begin (wifi_ssid, wifi_password); while (WiFi.status ()! = WL_CONNECTED) {delay (100); Seeria.print ("."); } Serial.println (""); Serial.println ("WiFi on korras"); Serial.print ("=> ESP32 uus IP -aadress on:"); Serial.print (WiFi.localIP ()); Serial.println (""); } // Ühenda uuesti wifi -ga, kui ühendus katkeb void ühenda uuesti () {while (! Client.connected ()) {Serial.print ("Ühendamine MQTT maakleriga…"); if (client.connect ("ESP32Client", mqtt_user, mqtt_password)) {Serial.println ("OK"); } else {Serial.print ("[Viga] Pole ühendatud:"); Serial.print (client.state ()); Serial.println ("Oodake enne uuesti proovimist 5 sekundit."); viivitus (5000); }}} void loop () {}

Ja jällegi, ärge unustage volikirju oma volitustega asendada

Samm: ühendage juhtmed

Juhtmed üles!
Juhtmed üles!

Toite jaoks kasutasin vana USB-kaablit, millest katkestasin USB-A-pistiku. USB -kaablis on neli juhet, vajame ainult musta ja punast.

Niisiis, ühendage kõik vastavalt ülaltoodud ajakavale.

Samm: Python3 skript

Python3 skript läheb kohta, kus see on juurkasutajale juurdepääsetav.

Selle skripti jaoks kasutasin /root/scripts/glasshouse/glasshouse.py. Pythoni skripti sisu on järgmine:

# Python3 skript MQTT -ga ühenduse loomiseks, väärtuste lugemiseks ja MySQL -i kirjutamiseks

# # B. Duijnhouwer # Juuni, 8th 2020 # # version: 1.0 # # import paho.mqtt.client as mqtt import json import pymysql pymysql.install_as_MySQLdb () import MySQLdb from datetime import datetime db = MySQLdb.connect ("localhost", "kasvuhoone", "*** MYSQL_USERNAME ***", "*** MYSQL_PASSWORD ***") kursor = db.cursor () broker_address = "localhost" #Makleri aadressport = 1883 #Makleri pordi kasutaja = "** *MQTT_USERNAME *** "#Connection kasutajanime parool =" *** MQTT_PASSWORD *** "#ühenduse parool def on_connect (klient, kasutajaandmed, lipud, rc): #Tagasihelistamine kliendi maakleriga ühenduse loomisel print (" Ühendatud tulemikoodiga {0} ". format (str (rc))) # Ühendustesti katse printimise tulemus client.subscribe (" glasshouse/dhtreadings/ # ") def on_message (klient, kasutajaandmed, sõnum): # Tagasihelistamine, kui PUBLISH sõnum on serverist vastu võetud. cursor.execute ("vali * sensordata") numrows = int (cursor.rowcount) newrow = numrows + 1 kohe = datetime.now () formatted_date = now.strftime ('%Y-%m-%d%H:% M:%S ') kasulik koormus = json.loads (msg.payload.decode (' utf-8 ')) print ("Uus rida:"+str (newrow)) temperatuur = ujuk (kasulik koormus ["temperatuur"]) niiskus = float (kasulik koormus ["niiskus"]) print ("Temperatuur:"+str (temperatuur)) print ("Niiskus:"+str (niiskus)) print ("DateTime:"+str (vormindatud_kuupäev)) if ((temperatuur > -20) ja (temperatuur = 0) ja (niiskus <= 100)): cur = db.cursor () cur.execute ("INSERT INTO glasshouse.sensordata (idx, temperatuur, niiskus, ajatempel) VALUES ("+str (newrow)+","+str (temperatuur)+","+str (niiskus)+", %s)", (vormindatud_kuupäev)) db.commit () print ("MySQL -is saadud ja imporditud andmed") else: print ("andmed ületasid piire ja neid EI impordita MySQL-i") client = mqtt. Client ("duijnhouwer-com-glasshouse-script") client.username_pw_set (kasutaja, parool = parool) client.on_connect = on_connect # Määrake tagasihelistamisfunktsioon eest eduka ühenduse loomine client.on_message = on_message # Määrake sõnumite vastuvõtmiseks kliendile tagasihelistamise funktsioon.connect (broker_address, port = port) #connect to broker client.loop_forever () # Käivita võrguühenduse deemon

Ärge unustage asendada MySQL kasutajanimi ja parool ning MQTT kasutajanimi ja parool oma volikirjadele

Saate skripti teenusena käivitada, luues kaks faili.

Esimene neist on „/etc/init/glasshouse.conf” järgmise sisuga:

alusta tasemel [2345]

stop on runlevel [! 2345] exec /root/scripts/glasshouse/glasshouse.py

Teine on „/etc/systemd/system/multi-user.target.wants/glasshouse.service” järgmise sisuga:

[Ühik]

Kirjeldus = Glasshouse Monitoring Service Pärast = multi-user.target [Service] Tüüp = lihtne Restart = alati RestartSec = 1 ExecStart =/usr/bin/python3 /root/scripts/glasshouse/glasshouse.py [Install] WantedBy = mitme kasutajaga.siht

Saate selle käivitada teenusena, kasutades järgmist käsku:

süsteem lubab kasvuhoone

ja alustage seda kasutades:

systemctl start kasvuhoone

Samm: MySQL -server

Peate looma uue MySQL -i andmebaasi, kus on ainult üks tabel.

Tabeli loomise kood on järgmine:

LOO TABEL "sensordata" (`idx` int (11) DEFAULT NULL,` temperatuur `float DEFAULT NULL,` niiskuse` float DEFAULT NULL, `timestamp` datetime DEFAULT NULL) MOOTOR = InnoDB DEFAULT CHARSET = utf8;

Samm: veebiserver

Veebiserveril on kaks faili, fail index.php ja üks config.ini

Faili config.ini sisu on järgmine:

[andmebaas]

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

Kui mujal asendate *** DATABASE_USER *** ja *** DATABASE_PASSWORD *** oma mandaadiga.

google.charts.load ('praegune', {'paketid': ['corechart']}); google.charts.setOnLoadCallback (drawChart); function drawChart () {var data = google.visualization.arrayToDataTable ([// ['Timestamp', 'Temperature', 'Humidity', 'Heat Index'], ['Timestamp', 'Temperature', 'Niiskus'], päring ($ sql); # See samal ajal - tsükkel vormindab ja paneb kõik allalaaditud andmed ['timestamp', 'temperature', 'niiskuse'] viisil. while ($ row = $ result-> fetch_assoc ()) {$ timestamp_rest = substr ($ rida ["ajatempel"], 10, 6); kaja "['". $ timestamp_rest. "", ". $ rida [' temperatuur '].", ". $ rida [' niiskus ']. "],"; // kaja "['". $ timestamp_rest. "", ". $ rida [' temperatuur '].", ". $ rida [' niiskus '].", ". $ rida [' heatindex ']. "],";}?>])); // Kumera joone var options = {title: 'Temperatuur ja niiskus', curveType: 'function', legend: {position: 'bottom'}, hAxis: {slantedText: true, viltuneTextAngle: 45}}; // Kumera diagrammi var chart = new google.visualization. LineChart (document.getElementById ('curve_chart')); chart.draw (andmed, valikud); } // DrawChart // lõppklamber //

6. samm: 3D -trükitud korpus

Korpuse jaoks kasutasin kahte eraldi korpust, ühte ESP32-CAM ja DHT22 jaoks ja ühte 18650 aku kaitsekile jaoks.

Samm: lõpptulemus

Lõpptulemus!
Lõpptulemus!
Lõpptulemus!
Lõpptulemus!
Lõpptulemus!
Lõpptulemus!
Lõpptulemus!
Lõpptulemus!

Lõpptulemus on näha ka ülaltoodud piltidel.

Ja kui aku on tühi, saate seda laadida mini -USB -kaabli abil.

Soovitan: