Sisällysluettelo:

Lämpötila ja kosteus käyttämällä ESP32-DHT22-MQTT-MySQL-PHP: 7 vaihetta
Lämpötila ja kosteus käyttämällä ESP32-DHT22-MQTT-MySQL-PHP: 7 vaihetta

Video: Lämpötila ja kosteus käyttämällä ESP32-DHT22-MQTT-MySQL-PHP: 7 vaihetta

Video: Lämpötila ja kosteus käyttämällä ESP32-DHT22-MQTT-MySQL-PHP: 7 vaihetta
Video: Vaisalan kosteus-, lämpötila-ja CO2-mittalaitteet ilmanvaihdon sovelluksiin 2024, Heinäkuu
Anonim
Lämpötila ja kosteus ESP32-DHT22-MQTT-MySQL-PHP: n avulla
Lämpötila ja kosteus ESP32-DHT22-MQTT-MySQL-PHP: n avulla

Tyttöystäväni halusi kasvihuoneen, joten tein hänelle sellaisen. Halusin kuitenkin lämpötila- ja kosteusanturin kasvihuoneeseen. Joten googletin esimerkkejä ja aloin kokeilla.

Johtopäätökseni oli, että kaikki löytämäni esimerkit eivät olleet juuri sitä, mitä halusin rakentaa. Nappasin paljon pieniä koodin osia ja yhdistin ne. Minulla kesti kauan, ennen kuin sain ensimmäisen työrakenteen valmiiksi, koska useimpien esimerkkien dokumentaatio oli liian vaikea ymmärtää tai ne oletivat osan, jonka minun pitäisi tietää ?? Mutta en tiennyt mitään (vielä) ☹

Siksi rakennan tämän opettavaisen. "Alusta loppuun" -opetusohjelma, jonka kirjaimellisesti kaikki ymmärtävät. (Ainakin toivon?)

Kuinka se toimii …

Lopputuote on ESP32-CAM, johon on kiinnitetty DHT22-anturi, joka saa virransa 18650-paristosta. Kolmen minuutin välein se lukee lämpötilan ja kosteuden ja lähettää sen WiFi -yhteyden kautta ulkoiselle MQTT -palvelimelle ja siirtyy sitten nukkumaan (kolmeksi minuutiksi) käyttämään vähemmän akkua tarpeen mukaan

Debian -palvelimella (joka voisi olla myös vadelma pi) minulla on python3, MQTT -palvelin, MySQL -palvelin ja verkkopalvelin

Python3 -komentosarja suoritetaan palveluna, ja aina kun se vastaanottaa MQTT -sanoman, se laskee edelliset merkinnät (hakemistonumeron) ja lisää tätä yhdellä. Sitten se lukee lämpötilan ja kosteuden arvot MQTT -sanomasta. Se tarkistaa vääriä arvoja ja aina, kun arvot ovat oikein, lähettää arvot yhdessä uuden hakemistonumeron ja nykyisen päivämäärän ja kellonajan MySQL -palvelimelle

Verkkopalvelimessa on PHP -skripti, joka lukee arvot MySQL -palvelimelta ja tekee siitä hyvän kaavion Google Chartsin avulla. (esimerkki)

Tarvikkeet

Käyttämäni osat ovat seuraavat:

  • ESP32-CAM (Syy, miksi käytin nokkaversiota, on se, että siinä on ulkoinen antenniliitin. On luultavasti myös muita ESP32-laitteita, joita voit käyttää)
  • Ulkoinen antenni
  • AM2302 DHT22 -anturi (tässä on sisäänrakennettu vastus, joten tarvitset vain kolme johtoa)

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

  • 18650 akun suojus v3
  • 18650 -akku (NCR18650B)
  • Vanha mikro -USB -kaapeli (ESP32: n liittämiseen akkukoteloon)
  • Jotkut lyhyet hyppyjohdot

Tarvitaan ylimääräistä:

  • USB - TTL -liitin (kuva)

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

  • Juotin
  • 3D -tulostin (tarvitaan vain koteloon)

Vaihe 1: Lataa Arduino-koodi ESP32-CAM-laitteeseen

Lataa Arduino-koodi ESP32-CAM-laitteeseen
Lataa Arduino-koodi ESP32-CAM-laitteeseen

Aloitetaan siis!

Jos haluat ladata Arduino-koodin ESP32-CAM-laitteeseen, sinun on liitettävä USBtoTTL-liitin ESP32-laitteeseen yllä olevien kaavioiden avulla.

Arduino -koodi on:

/*Vain pieni ohjelma lämpötilan ja kosteuden lukemiseen DHT22 -anturista ja

välitä se MQTT: lle. B. Duijnhouwer Kesäkuu, 8. 2020 "*** SERVER_NAME ***" // palvelimen nimi tai IP #define mqtt_user "*** MQTT_USER ***" // käyttäjänimi #define mqtt_password "*** MQTT_PASSWORD ***" // salasana #define topic "kasvihuone /dhtreadings "#define debug_topic" glasshouse /debug "// Debugging -aihe /* syvän unen määritelmät* /#define uS_TO_S_FACTOR 1000000 /* Muunnoskerroin mikrosekunneista sekunteihin* /#define TIME_TO_SLEEP 180 /* Aika ESP32 menee nukkumaan 5 minuutin ajan (sekunneissa) */ bool debug = true; // Näytä lokiviesti, jos tosi #define DHT22_PIN 14 dht DHT; WiFiClient espClient; PubSubClient -asiakas (espClient); char -tiedot [80]; void setup () {Serial.begin (115200); setup_wifi (); // Yhdistä Wifi -verkkoon client.setServer (mqtt_server, 1883); // Määritä MQTT -yhteys, vaihda porttia tarvittaessa. if (! client.connected ()) {reconnect (); } // LUE TIEDOT int chk = DHT.read22 (DHT22_PIN); kelluva t = DHT.lämpötila; kelluva h = DHT.kosteus; Merkkijono dhtReadings = "{" lämpötila / ": \" " + Jono (t) +" / ", \" kosteus / ": \" " + Jono (h) +" / "}"; dhtReadings.toCharArray (data, (dhtReadings.length () + 1)); if (debug) {Serial.print ("Lämpötila:"); Sarjanjälki (t); Serial.print ("| Kosteus:"); Sarja.println (h); } // Julkaise arvot MQTT -aiheisiin client.publish (aihe, data); // Julkaise lukemia aiheesta (kasvihuone/dhtreadings) if (debug) {Serial.println ("Lukemat lähetetty MQTT: lle."); } esp_sleep_enable_timer_wakeup (TIME_TO_SLEEP * uS_TO_S_FACTOR); // mene nukkumaan Serial.println ("Aseta ESP32 nukkumaan jokaiselle" + merkkijono (TIME_TO_SLEEP) + "Sekunnit"); Serial.println ("Menee nukkumaan normaalisti nyt."); esp_deep_sleep_start (); } // Asennusyhteys wifi: hen void setup_wifi () {delay (20); Sarja.println (); Serial.print ("Yhdistäminen"); Sarja.println (wifi_ssid); WiFi.begin (wifi_ssid, wifi_password); while (WiFi.status ()! = WL_CONNECTED) {delay (100); Serial.print ("."); } Sarja.println (""); Serial.println ("WiFi on OK"); Serial.print ("=> ESP32 uusi IP -osoite on:"); Sarjajälki (WiFi.localIP ()); Serial.println (""); } // Muodosta yhteys wifi -verkkoon uudelleen, jos yhteys katoaa. Void connect () {while (! Client.connected ()) {Serial.print ("Yhdistetään MQTT -välittäjään…"); if (client.connect ("ESP32Client", mqtt_user, mqtt_password)) {Serial.println ("OK"); } else {Serial.print ("[Virhe] Ei yhdistetty:"); Serial.print (client.state ()); Serial.println ("Odota 5 sekuntia ennen kuin yrität uudelleen."); viive (5000); }}} void loop () {}

Ja jälleen, älä unohda korvata kirjautumistiedot omilla tunnuksillasi

Vaihe 2: Johdotus

Johdottaa!
Johdottaa!

Virtaksi käytin vanhaa USB-kaapelia, josta katkaisin USB-A-liittimen. USB -kaapelissa on neljä johtoa, tarvitsemme vain mustan ja punaisen.

Liitä siis kaikki yllä olevan aikataulun mukaisesti.

Vaihe 3: Python3 -skripti

Python3 -skripti menee paikkaan, jossa se on pääkäyttäjän käytettävissä.

Käytin tätä komentosarjaa /root/scripts/glasshouse/glasshouse.py. Python -komentosarjan sisältö on:

# Python3 -komentosarja MQTT: hen yhdistämistä varten, lukemalla arvot ja kirjoittamalla ne MySQL: ään

# # B. Duijnhouwer # Kesäkuu, 8th 2020 # # version: 1.0 # # import paho.mqtt.client as mqtt import json import pymysql pymysql.install_as_MySQLdb () tuo MySQLdb datetime import datetime db = MySQLdb.connect ("localhost", "kasvihuone", "*** MYSQL_USERNAME ***", "*** MYSQL_PASSWORD ***") kohdistin = db.cursor () broker_address = "localhost" #Broker address port = 1883 #Broker port user = "** *MQTT_USERNAME *** "#Connection username password =" *** MQTT_PASSWORD *** " #Yhteyssalasana def on_connect (asiakas, käyttäjätiedot, liput, rc): #Takaisinsoitto, kun asiakas muodostaa yhteyden välittäjään print (" Connected tuloskoodilla {0} ". format (str (rc))) # Yhteystiedon tulostustulos client.subscribe (" glasshouse/dhtreadings/ # ") def on_message (client, userdata, msg): # Takaisinsoitto, kun JULKAISU -viesti vastaanotetaan palvelimelta. cursor.execute ("valitse * sensordatasta") numrows = int (cursor.rowcount) newrow = numrows + 1 nyt = datetime.now () formatted_date = now.strftime ('%Y-%m-%d%H:% M:%S ') hyötykuorma = json.loads (msg.payload.decode (' utf-8 ')) print ("Uusi rivi:"+str (newrow)) lämpötila = kelluva (hyötykuorma ["lämpötila"]) kosteus = float (hyötykuorma ["kosteus"]) print ("Lämpötila:"+str (lämpötila)) print ("Kosteus:"+str (kosteus)) print ("DateTime:"+str (formatted_date)) if ((lämpötila > -20) ja (lämpötila = 0) ja (kosteus <= 100)): cur = db.cursor () cur.execute ("INSERT INTO glasshouse.sensordata (idx, lämpötila, kosteus, aikaleima) ARVOT ("+str (newrow)+","+str (lämpötila)+","+str (kosteus)+", %s)", (formatted_date)) db.commit () print ("MySQL: ssä vastaanotetut ja tuodut tiedot") else: print ("data ylitti rajat ja sitä EI tuoda MySQL: ään") client = mqtt. Client ("duijnhouwer-com-glasshouse-script") client.username_pw_set (käyttäjä, salasana = salasana) client.on_connect = on_connect # Määritä takaisinsoittotoiminto varten onnistunut yhteys client.on_message = on_message # Määritä soittotoiminto viestin vastaanottamista varten client.connect (broker_address, port = port) #connect to broker client.loop_forever () # Käynnistä verkostoitumisdemoni

Muista korvata MySQL -käyttäjätunnus ja -salasana sekä MQTT -käyttäjätunnus ja -salasana omiin tunnistetietoihisi

Voit saada komentosarjan toimimaan palveluna luomalla kaksi tiedostoa.

Ensimmäinen on "/etc/init/glasshouse.conf", jonka sisältö on seuraava:

aloita ajotasolla [2345]

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

Toinen on /etc/systemd/system/multi-user.target.wants/glasshouse.service”, jonka sisältö on seuraava:

[Yksikkö]

Kuvaus = Glasshouse Monitoring Service After = multi-user.target [Service] Tyyppi = yksinkertainen Restart = aina RestartSec = 1 ExecStart =/usr/bin/python3 /root/scripts/glasshouse/glasshouse.py [Asenna] WantedBy = usean käyttäjän.kohde

Voit suorittaa tämän suorituksen palveluna käyttämällä seuraavaa komentoa:

järjestelmä ottaa käyttöön kasvihuoneen

ja aloita se käyttämällä:

systemctl start kasvihuone

Vaihe 4: MySQL -palvelin

Sinun on luotava uusi MySQL -tietokanta, jossa on vain yksi taulukko.

Taulukon luomisen koodi on:

LUO TAULUKKO `sensordata` ("idx" int (11) DEFAULT NULL, "lämpötila" float DEFAULT NULL, "kosteus" float DEFAULT NULL, "timestamp" päivämäärä DEFAULT NULL) MOOTTORI = InnoDB DEFAULT CHARSET = utf8;

Vaihe 5: Verkkopalvelin

Verkkopalvelimessa on kaksi tiedostoa, index.php -tiedosto ja yksi config.ini -tiedosto

Config.ini -tiedoston sisältö on:

[tietokanta]

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

Jos vaihdat *** DATABASE_USER *** ja *** DATABASE_PASSWORD *** omilla tunnuksillasi.

google.charts.load ('nykyinen', {'paketit': ['corechart']}); google.charts.setOnLoadCallback (drawChart); function drawChart () {var data = google.visualization.arrayToDataTable ([// ['Aikaleima', 'Lämpötila', 'Kosteus', 'Lämpöindeksi'], ['Aikaleima', 'Lämpötila', 'Kosteus'], query ($ sql); # This while - silmukka muotoilee ja laittaa kaikki haetut tiedot ['aikaleima', 'lämpötila', 'kosteus'] tavalla. while ($ row = $ result-> fetch_assoc ()) {$ timestamp_rest = substr ($ rivi ["aikaleima"], 10, 6); echo "['". $ timestamp_rest. "", ". $ rivi [' lämpötila '].", ". $ rivi [' kosteus ']. "],"; // kaiku "['". $ timestamp_rest. "", ". $ rivi [' lämpötila '].", ". $ rivi [' kosteus '].", ". $ rivi [' lämpöindeksi ']. "],";}?>]); // Kaarevat viivat var options = {title: 'Lämpötila ja kosteus', curveType: 'function', selite: {position: 'bottom'}, hAxis: {slantedText: true, slntedTextAngle: 45}}; // Kaareva kaavio var chart = new google.visualization. LineChart (document.getElementById ('curve_chart')); chart.draw (tiedot, vaihtoehdot); } // endChert from drawChart //

Vaihe 6: 3D -tulostettu kotelo

Kotelossa käytin kahta erillistä koteloa, yksi ESP32-CAM: lle ja DHT22: lle yhdessä ja toinen 18650-paristokotelolle.

Vaihe 7: Lopputulos

Lopullinen tulos!
Lopullinen tulos!
Lopullinen tulos!
Lopullinen tulos!
Lopullinen tulos!
Lopullinen tulos!
Lopullinen tulos!
Lopullinen tulos!

Lopputulos näkyy myös yllä olevissa kuvissa.

Ja aina kun akku on tyhjä, voit ladata sen mini -USB -kaapelilla.

Suositeltava: