Tartalomjegyzék:

Hőmérséklet és páratartalom az ESP32-DHT22-MQTT-MySQL-PHP használatával: 7 lépés
Hőmérséklet és páratartalom az ESP32-DHT22-MQTT-MySQL-PHP használatával: 7 lépés

Videó: Hőmérséklet és páratartalom az ESP32-DHT22-MQTT-MySQL-PHP használatával: 7 lépés

Videó: Hőmérséklet és páratartalom az ESP32-DHT22-MQTT-MySQL-PHP használatával: 7 lépés
Videó: Hőmérséklet, páratartalom adatok az üvegházból, Sonoff Zigbee bridge és hőmérő (snzb-02) 2022-04-28 2024, Július
Anonim
Hőmérséklet és páratartalom az ESP32-DHT22-MQTT-MySQL-PHP használatával
Hőmérséklet és páratartalom az ESP32-DHT22-MQTT-MySQL-PHP használatával

A barátnőm üvegházat akart, ezért csináltam neki egyet. De hő- és páratartalom -érzékelőt akartam az üvegházba. Szóval, googlettam példákat, és elkezdtem kísérletezni.

A következtetésem az volt, hogy az általam talált példák nem pontosan azok, amelyeket fel akartam építeni. Megragadtam egy csomó kis kódrészletet, és egyesítettem őket. Elég sok időbe telt, amíg befejeztem az első munkámat, mert a legtöbb példa dokumentációját túl nehéz volt megértenem, vagy feltételezték azt a részt, amit tudnom kell ?? De nem tudtam semmit (még) ☹

Ezért építem ezt az oktathatót. Egy „elejétől a végéig” bemutató, amelyet szó szerint mindenki megérthet. (Legalábbis remélem?)

Hogyan működik …

A végtermék egy ESP32-CAM, amelyhez DHT22 érzékelő van csatlakoztatva, és amely egy 18650-es akkumulátorról kap energiát. Három percenként leolvassa a hőmérsékletet és a páratartalmat, és elküldi ezt WiFi -n keresztül egy külső MQTT szervernek, majd alszik (három percre), hogy szükség szerint kevesebb akkumulátort használjon

Debian szerveren (ami szerintem málna pi is lehet) van python3, MQTT szerver, MySQL szerver és webszerver

A python3 szkript szolgáltatásként fut, és amikor MQTT üzenetet kap, számolja az előző bejegyzések számát (indexszám), és ezt eggyel növeli. Ezután leolvassa a hőmérséklet és a páratartalom értékeit az MQTT üzenetből. Ellenőrzi a hamis értékeket, és amikor az értékek helyesek, elküldi az értékeket az új indexszámmal és az aktuális dátummal és idővel együtt egy MySQL szerverre

A webszerver PHP szkripttel rendelkezik, amely kiolvassa az értékeket a MySQL szerverről, és szép grafikont készít belőle a Google Charts segítségével. (példa)

Kellékek

Az általam használt alkatrészek a következők:

  • ESP32-CAM (Az ok, amiért a kamerás verziót használtam, az az, hogy van rajta külső antennacsatlakozó. Valószínűleg más ESP32 is használható.)
  • Külső antenna
  • AM2302 DHT22 érzékelő (ez egy beépített ellenállással rendelkezik, így csak három vezetékre van szüksége)

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

  • 18650 akkumulátorpajzs v3
  • 18650 akkumulátor (NCR18650B)
  • Régi mikro USB kábel (az ESP32 csatlakoztatásához az akkumulátor burkolatához)
  • Néhány rövid áthidaló vezeték

Extra szükséges:

  • USB -TTL csatlakozó (kép)

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

  • Forrasztópáka
  • 3D nyomtató (csak házhoz szükséges)

Lépés: Töltse fel az Arduino kódot az ESP32-CAM-ba

Töltse fel az Arduino kódot az ESP32-CAM-ba
Töltse fel az Arduino kódot az ESP32-CAM-ba

Tehát kezdjük!

Ha fel szeretné tölteni az Arduino kódot az ESP32-CAM-ba, akkor az USBtoTTL csatlakozót az ESP32-hez kell csatlakoztatnia a fenti vázlatok szerint.

Az Arduino kód:

/*Csak egy kis program a hőmérséklet és páratartalom leolvasására a DHT22 érzékelőből és

adja át az MQTT -nek. B. Duijnhouwer 2020. június 8.*/#include #include #include #define wifi_ssid "*** WIFI_SSID ***" // wifi ssid #define wifi_password "*** WIFI_PASSWORD ***" // wifi jelszó #define mqtt_server "*** SERVER_NAME ***" // szerver neve vagy IP #define mqtt_user "*** MQTT_USER ***" // felhasználónév #define mqtt_password "*** MQTT_PASSWORD ***" // jelszó #define topic "üvegház /dhtreadings "#define debug_topic" üvegház /hibakeresés "// A hibakeresés témája /* definíciók a mély alváshoz* /#define uS_TO_S_FACTOR 1000000 /* Konverziós tényező mikro másodpercről másodpercre* /#define TIME_TO_SLEEP 180 /* Az ESP32 alvó állapotba kerül 5 percig (másodpercben) */ bool debug = igaz; // Naplóüzenet megjelenítése, ha igaz #define DHT22_PIN 14 dht DHT; WiFiClient espClient; PubSubClient kliens (espClient); char adatok [80]; void setup () {Serial.begin (115200); setup_wifi (); // Csatlakozás Wifi hálózati klienshez.setServer (mqtt_server, 1883); // Az MQTT kapcsolat konfigurálása, szükség esetén a port cseréje. if (! client.connected ()) {reconnect (); } // ADATOK OLVASÁSA int chk = DHT.read22 (DHT22_PIN); úszó t = DHT.hőmérséklet; úszó h = DHT.páratartalom; String dhtReadings = "{" hőmérséklet / ": \" " + String (t) +" / ", \" páratartalom / ": \" " + String (h) +" / "}"; dhtReadings.toCharArray (adatok, (dhtReadings.length () + 1)); if (hibakeresés) {Serial.print ("Temperature:"); Soros.nyomat (t); Serial.print ("| Páratartalom:"); Soros.println (h); } // Értékek közzététele az MQTT témakörökben client.publish (téma, adatok); // Olvasmányok közzététele a témában (üvegház/dhtreadings) if (debug) {Serial.println ("Az MQTT -nek küldött olvasmányok."); } esp_sleep_enable_timer_wakeup (TIME_TO_SLEEP * uS_TO_S_FACTOR); // elalvás Serial.println ("Az ESP32 beállítása minden alváshoz" + String (TIME_TO_SLEEP) + "Seconds"); Serial.println ("Most a szokásos módon alszik."); esp_deep_sleep_start (); } // Kapcsolat beállítása a wifi -hez void setup_wifi () {delay (20); Sorozat.println (); Serial.print ("Csatlakozás"); Serial.println (wifi_ssid); WiFi.begin (wifi_ssid, wifi_password); while (WiFi.status ()! = WL_CONNECTED) {delay (100); Soros.nyomtatás ("."); } Soros.println (""); Serial.println ("A WiFi rendben van"); Serial.print ("=> ESP32 új IP -címe:"); Serial.print (WiFi.localIP ()); Serial.println (""); } // Csatlakozz újra a wifi -hez, ha a kapcsolat megszakad void reonnect () {while (! Client.connected ()) {Serial.print ("Csatlakozás az MQTT brókerhez…"); if (client.connect ("ESP32Client", mqtt_user, mqtt_password)) {Serial.println ("OK"); } else {Serial.print ("[Hiba] Nincs kapcsolat:"); Serial.print (kliens.állapot ()); Serial.println ("Várjon 5 másodpercet, mielőtt újra próbálkozik."); késleltetés (5000); }}} void loop () {}

És még egyszer: ne felejtse el kicserélni a hitelesítő adatokat saját hitelesítő adataival

2. lépés: Vegye fel a kapcsolatot

Vezetékkel fel!
Vezetékkel fel!

Az áramellátáshoz egy régi USB-kábelt használtam, amelyből levágtam az USB-A csatlakozót. Az USB -kábelben négy vezeték van, csak a fekete és a piros kell.

Tehát kössön össze mindent a fenti ütemterv szerint.

3. lépés: Python3 szkript

A Python3 szkript olyan helyre megy, ahol a root felhasználó számára hozzáférhető.

A /root/scripts/glasshouse/glasshouse.py parancsot használtam ehhez a szkripthez. A python szkript tartalma:

# Python3 szkript az MQTT -hez való kapcsolódáshoz, értékek olvasásához és a MySQL -be írásához

# # B. Duijnhouwer # 2020. június 8. # # verzió: 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", "üvegház", "*** MYSQL_USERNAME ***", "*** MYSQL_PASSWORD ***") kurzor = db.cursor () broker_address = "localhost" #Broker address port = 1883 #Broker port user = "** *MQTT_USERNAME *** "#Connection username password =" *** MQTT_PASSWORD *** "#Connection password def on_connect (kliens, felhasználói adatok, zászlók, rc): #A visszahívás arra az időre, amikor az ügyfél csatlakozik a bróker nyomtatáshoz (" Connected eredménykóddal {0} ". formátum (str (rc))) # A csatlakozási kísérlet nyomtatási eredménye client.subscribe (" üvegház/dhtreadings/ # ") def on_message (kliens, felhasználói adatok, üzenet): # A visszahívás, amikor PUBLISH üzenet érkezett a szervertől. cursor.execute ("válasszon * az érzékelési adatokból") numrows = int (kurzor.rowcount) newrow = numrows + 1 most = datetime.now () formatted_date = now.strftime ('%Y-%m-%d%H:% M:%S ') hasznos terhelés = json.loads (msg.payload.decode (' utf-8 ')) print ("Új sor:"+str (newrow)) hőmérséklet = úszó (hasznos terhelés ["hőmérséklet"]) páratartalom = float (hasznos terhelés ["páratartalom"]) print ("Hőmérséklet:"+str (hőmérséklet)) print ("Páratartalom:"+str (páratartalom)) print ("DateTime:"+str (formázott_dátum)) if ((hőmérséklet > -20) és (hőmérséklet = 0) és (páratartalom <= 100)): cur = db.cursor () cur.execute ("INSERT INTO glasshouse.sensordata (idx, hőmérséklet, páratartalom, időbélyeg) VALUES ("+str (newrow)+","+str (hőmérséklet)+","+str (páratartalom)+", %s)", (formattált_dátum)) db.commit () print ("MySQL -ben kapott és importált adatok") else: print ("az adatok meghaladták a korlátokat, és NEM importálták a MySQL-be") client = mqtt. Client ("duijnhouwer-com-glasshouse-script") client.username_pw_set (felhasználó, jelszó = jelszó) client.on_connect = on_connect # Visszahívási funkció meghatározása számára sikeres csatlakozás client.on_message = on_message # Visszahívási funkció meghatározása az ügyfél fogadására. connect (broker_address, port = port) #connect to broker client.loop_forever () # Hálózati démon indítása

Ne felejtse el kicserélni a MySQL felhasználónevet és jelszót, valamint az MQTT felhasználónevet és jelszót saját hitelesítő adataira

A parancsfájlt szolgáltatásként futtathatja két fájl létrehozásával.

Az első a „/etc/init/glasshouse.conf” a következő tartalommal:

indulás futási szinten [2345]

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

A második a „/etc/systemd/system/multi-user.target.wants/glasshouse.service” a következő tartalommal:

[Mértékegység]

Leírás = Üvegházfigyelő szolgáltatás Utána = multi-user.target [Szolgáltatás] Típus = egyszerű Újraindítás = mindig RestartSec = 1 ExecStart =/usr/bin/python3 /root/scripts/glasshouse/glasshouse.py [Telepítés] WantedBy = többfelhasználó.cél

Ezt a szolgáltatást a következő paranccsal hajthatja végre:

rendszer engedélyezi az üvegházat

és indítsa el a következő használatával:

systemctl start üvegház

4. lépés: MySQL szerver

Létre kell hoznia egy új MySQL adatbázist, csak egy táblával.

A táblázat létrehozásának kódja:

TABLE "sensordata" létrehozása (`idx` int (11) DEFAULT NULL,` hőmérséklet` float DEFAULT NULL, `páratartalom` float DEFAULT NULL,` timestamp` datetime DEFAULT NULL) MOTOR = InnoDB DEFAULT CHARSET = utf8;

5. lépés: Webszerver

A webszervernek két fájlja van, az index.php és egy config.ini fájl

A config.ini fájl tartalma:

[adatbázis]

db_host = "localhost" db_name = "üvegház" db_table = "sensordata" db_user = "*** DATABASE_USER ***" db_password = "*** DATABASE_PASSWORD ***"

Ahol természetesen a *** DATABASE_USER *** és a *** DATABASE_PASSWORD *** szót saját hitelesítő adataival cseréli le.

google.charts.load ('aktuális', {'csomagok': ['corechart']}); google.charts.setOnLoadCallback (drawChart); function drawChart () {var data = google.visualization.arrayToDataTable ([// ['Időbélyeg', 'Hőmérséklet', 'Páratartalom', 'Hőindex'], ['Időbélyegző', 'Hőmérséklet', 'Páratartalom'], query ($ sql); # This while - ciklus formázza, és az összes lekért adatot ['timestamp', 'hőmérséklet', 'páratartalom'] módon helyezi el. while ($ row = $ result-> fetch_assoc ()) {$ timestamp_rest = substr ($ row ["timestamp"], 10, 6); echo "['". $ timestamp_rest. "", ". $ row [' temperature '].", ". $ row [' páratartalom ']. "],"; // echo "['". $ timestamp_rest. "", ". $ row [' hőmérséklet '].", ". $ sor [' páratartalom '].", ". $ row [' heatindex ']. "],";}?>]); // Ívelt vonal var options = {title: 'Hőmérséklet és páratartalom', curveType: 'function', legend: {position: 'bottom'}, hAxis: {slantedText: true, ferdeTextAngle: 45}}; // Ívelt diagram var chart = new google.visualization. LineChart (document.getElementById ('curve_chart')); chart.draw (adatok, opciók); } // zárójel a drawChartból //

6. lépés: 3D nyomtatott ház

A házhoz két külön házat használtam, egyet az ESP32-CAM és a DHT22 együtt, egyet pedig az 18650-es elempajzshoz.

7. lépés: A végeredmény

A Végeredmény!
A Végeredmény!
A Végeredmény!
A Végeredmény!
A Végeredmény!
A Végeredmény!
A Végeredmény!
A Végeredmény!

A végeredmény a fenti képeken is látható.

És amikor az akkumulátor lemerült, mini USB -kábellel töltheti fel.

Ajánlott: