Innholdsfortegnelse:

Temperatur og fuktighet ved bruk av ESP32-DHT22-MQTT-MySQL-PHP: 7 trinn
Temperatur og fuktighet ved bruk av ESP32-DHT22-MQTT-MySQL-PHP: 7 trinn

Video: Temperatur og fuktighet ved bruk av ESP32-DHT22-MQTT-MySQL-PHP: 7 trinn

Video: Temperatur og fuktighet ved bruk av ESP32-DHT22-MQTT-MySQL-PHP: 7 trinn
Video: Hvor god er egentlig en avfukter? Hvor mye fuktighet fjerner en avfukter? 2024, Juli
Anonim
Temperatur og fuktighet ved bruk av ESP32-DHT22-MQTT-MySQL-PHP
Temperatur og fuktighet ved bruk av ESP32-DHT22-MQTT-MySQL-PHP

Kjæresten min ville ha et drivhus, så jeg lagde et til henne. Men jeg ville ha en temperatur- og fuktighetssensor inne i drivhuset. Så jeg googlet etter eksempler og begynte å eksperimentere.

Min konklusjon var at alle eksemplene jeg fant ikke akkurat var det jeg ønsket å bygge. Jeg tok mange små deler av koden og kombinerte dem. Det tok en god stund å fullføre min første arbeidsbygning fordi dokumentasjonen til de fleste eksemplene var for vanskelig for meg å forstå, eller de antok en del som jeg burde vite ?? Men jeg visste ingenting (ennå) ☹

Derfor bygger jeg dette instruerbart. En opplæring fra begynnelsen til slutten for bokstavelig talt alle å forstå. (Håper jeg i hvert fall?)

Hvordan det fungerer …

Sluttproduktet er en ESP32-CAM med en DHT22-sensor festet til den som får strøm fra et 18650-batteri. Hvert tredje minutt leser den temperatur og fuktighet og sender dette over WiFi til en ekstern MQTT -server og går deretter i dvale (i tre minutter) for å bruke så lite batteri som nødvendig

På en Debian -server, (som også kan være en bringebær pi antar jeg) har jeg python3, en MQTT -server, en MySQL -server og en webserver

Python3 -skriptet kjøres som en tjeneste, og når det mottar en MQTT -melding, teller det forrige antall oppføringer (indeksnummer) og øker dette med en. Deretter leser den verdiene av temperaturen og fuktigheten fra MQTT -meldingen. Den ser etter falske verdier, og når verdiene er riktige, sender den verdiene sammen med det nye indeksnummeret og gjeldende dato og klokkeslett til en MySQL -server

Nettserveren har et PHP -skript som leser verdiene fra MySQL -serveren og lager en fin graf fra den ved hjelp av Google Charts. (eksempel)

Rekvisita

Delene jeg brukte er følgende:

  • ESP32-CAM (Grunnen til at jeg brukte kamversjonen er fordi den har en ekstern antennekontakt på den. Det er sannsynligvis også andre ESP32-er du kan bruke)
  • Ekstern antenne
  • AM2302 DHT22 sensor (Denne har en innebygd motstand, så du trenger bare tre ledninger)

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

  • 18650 batteriskjold v3
  • 18650 batteri (NCR18650B)
  • Gammel mikro -USB -kabel (for tilkobling av ESP32 til batteriskjoldet)
  • Noen korte hoppetråder

Ekstra nødvendig:

  • USB til TTL -kontakt (bilde)

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

  • Loddejern
  • 3D -skriver (bare nødvendig for etui)

Trinn 1: Last opp Arduino-koden til ESP32-CAM

Last opp Arduino-koden til ESP32-CAM
Last opp Arduino-koden til ESP32-CAM

Så la oss begynne!

For å laste opp Arduino-koden til ESP32-CAM må du koble USBtoTTL-kontakten til ESP32 ved hjelp av skjemaene ovenfor.

Arduino -koden er:

/*Bare et lite program for å lese temperatur og fuktighet fra en DHT22 -sensor og

gi den videre til MQTT. B. Duijnhouwer 8. juni 2020*/#include #include #include #define wifi_ssid "*** WIFI_SSID ***" // wifi ssid #define wifi_password "*** WIFI_PASSWORD ***" // wifi passord #definer mqtt_server "*** SERVER_NAME ***" // servernavn eller IP #define mqtt_user "*** MQTT_USER ***" // brukernavn #define mqtt_password "*** MQTT_PASSWORD ***" // passord #define topic "glasshouse /dhtreadings "#define debug_topic" glasshouse /debug "// Emne for feilsøking /* definisjoner for deepsleep* /#define uS_TO_S_FACTOR 1000000 /* Konverteringsfaktor i mikrosekunder til sekunder* /#define TIME_TO_SLEEP 180 /* Time ESP32 vil gå i dvale i 5 minutter (i sekunder) */ bool debug = true; // Vis loggmelding hvis True #define DHT22_PIN 14 dht DHT; WiFiClient espClient; PubSubClient -klient (espClient); røyedata [80]; ugyldig oppsett () {Serial.begin (115200); setup_wifi (); // Koble til Wifi -nettverksklient.setServer (mqtt_server, 1883); // Konfigurer MQTT -tilkobling, bytt port om nødvendig. if (! client.connected ()) {reconnect (); } // LES DATA int chk = DHT.read22 (DHT22_PIN); flyte t = DHT.temperatur; flyte h = DHT. fuktighet; String dhtReadings = "{" temperatur / ": \" " + streng (t) +" / ", \" fuktighet / ": \" " + streng (h) +" / "}"; dhtReadings.toCharArray (data, (dhtReadings.length () + 1)); if (feilsøk) {Serial.print ("Temperatur:"); Serial.print (t); Serial.print ("| Fuktighet:"); Serial.println (h); } // Publiser verdier til MQTT -emner client.publish (emne, data); // Publiser avlesninger om emne (glasshouse/dhtreadings) if (debug) {Serial.println ("Readings sent to MQTT."); } esp_sleep_enable_timer_wakeup (TIME_TO_SLEEP * uS_TO_S_FACTOR); // gå i dvale Serial.println ("Sett opp ESP32 for å sove for hver" + streng (TIME_TO_SLEEP) + "sekunder"); Serial.println ("Sover som normalt nå."); esp_deep_sleep_start (); } // Oppsettstilkobling til wifi void setup_wifi () {forsinkelse (20); Serial.println (); Serial.print ("Koble til"); Serial.println (wifi_ssid); WiFi.begin (wifi_ssid, wifi_password); mens (WiFi.status ()! = WL_CONNECTED) {forsinkelse (100); Serial.print ("."); } Serial.println (""); Serial.println ("WiFi er OK"); Serial.print ("=> ESP32 ny IP -adresse er:"); Serial.print (WiFi.localIP ()); Serial.println (""); } // Koble til Wi -Fi igjen hvis tilkoblingen er tapt ugyldig tilkobling () {mens (! Client.connected ()) {Serial.print ("Kobler til MQTT -megler …"); if (client.connect ("ESP32Client", mqtt_user, mqtt_password)) {Serial.println ("OK"); } annet {Serial.print ("[Feil] Ikke tilkoblet:"); Serial.print (client.state ()); Serial.println ("Vent 5 sekunder før du prøver igjen."); forsinkelse (5000); }}} void loop () {}

Og igjen, ikke glem å erstatte legitimasjonen med din egen legitimasjon

Trinn 2: Wire Up

Koble opp!
Koble opp!

For strømmen brukte jeg en gammel USB-kabel som jeg kuttet av USB-A-kontakten. Det er fire ledninger i USB -kabelen, vi trenger bare de svarte og de røde.

Så, koble alt i henhold til timeplanen ovenfor.

Trinn 3: Python3 Script

Python3 -skriptet går til et sted hvor det er tilgjengelig for rotbrukeren.

Jeg brukte /root/scripts/glasshouse/glasshouse.py for dette skriptet. Innholdet i python -skriptet er:

# Python3 -skript for å koble til MQTT, lese verdier og skrive dem inn i MySQL

# # B. Duijnhouwer # 8. juni 2020 # # versjon: 1.0 # # import paho.mqtt.client som mqtt import json import pymysql pymysql.install_as_MySQLdb () import MySQLdb fra datetime import datetime db = MySQLdb.connect ("localhost", "glasshus", "*** MYSQL_USERNAME ***", "*** MYSQL_PASSWORD ***") cursor = db.cursor () broker_address = "localhost" #Broker address port = 1883 #Broker port user = "** *MQTT_USERNAME *** "#Connection brukernavn passord =" *** MQTT_PASSWORD *** " #Connection password def on_connect (klient, brukerdata, flagg, rc): #Tilbakeringing for når klienten kobler seg til meglerutskriften (" Connected med resultatkode {0} ". format (str (rc))) # Utskriftsresultat av tilkoblingsforsøk client.subscribe (" glasshouse/dhtreadings/ # ") def on_message (client, userdata, msg): # Tilbakeringing for når en PUBLISH melding mottas fra serveren. cursor.execute ("velg * fra sensordata") numrows = int (cursor.rowcount) newrow = numrows + 1 nå = datetime.now () formatted_date = now.strftime ('%Y-%m-%d%H:% M:%S ') nyttelast = json.loads (msg.payload.decode (' utf-8 ')) print ("Ny rad:"+str (newrow)) temperatur = float (nyttelast ["temperatur"]) fuktighet = float (nyttelast ["fuktighet"]) print ("Temperatur:"+str (temperatur)) print ("Fuktighet:"+str (fuktighet)) print ("Dato:"+str (format_date)) if ((temperatur > -20) og (temperatur = 0) og (fuktighet <= 100)): cur = db.markør () cur.execute ("INSERT INTO glasshouse.sensordata (idx, temperatur, fuktighet, tidsstempel) VERDIER ("+str (newrow)+","+str (temperatur)+","+str (fuktighet)+", %s)", (format_date)) db.commit () print ("data mottatt og importert i MySQL") annet: print ("data overskred grenser og er IKKE importert i MySQL") client = mqtt. Client ("duijnhouwer-com-glasshouse-script") client.username_pw_set (bruker, passord = passord) client.on_connect = on_connect # Definer tilbakeringingsfunksjon til vellykket tilkobling client.on_message = on_message # Definer tilbakeringingsfunksjon for mottak av melding client.connect (broker_address, port = port) #connect to broker client.loop_forever () # Start networking daemon

Ikke glem å bytte ut MySQL brukernavn og passord og MQTT brukernavn og passord til dine egne legitimasjoner

Du kan få skriptet til å kjøre som en tjeneste ved å opprette to filer.

Den første er “/etc/init/glasshouse.conf” med følgende innhold:

start på runlevel [2345]

stopp på runlevel [! 2345] exec /root/scripts/glasshouse/glasshouse.py

Den andre er “/etc/systemd/system/multi-user.target.wants/glasshouse.service”med følgende innhold:

[Enhet]

Beskrivelse = Glasshouse Monitoring Service After = multi-user.target [Service] Type = simple Restart = always RestartSec = 1 ExecStart =/usr/bin/python3 /root/scripts/glasshouse/glasshouse.py [Install] WantedBy = multi-user.mål

Du kan få dette til å kjøre som en tjeneste ved å bruke følgende kommando:

systemctl muliggjør drivhus

og start den med:

systemctl start drivhus

Trinn 4: MySQL Server

Du må opprette en ny MySQL -database med bare en tabell i den.

Koden for å lage tabellen er:

LAG TABELL `sensordata` (`idx` int (11) DEFAULT NULL,` temperatur` float DEFAULT NULL, `fuktighet` float DEFAULT NULL,` tidsstempel` datetime DEFAULT NULL) MOTOR = InnoDB DEFAULT CHARSET = utf8;

Trinn 5: Webserver

Nettserveren har to filer, filen index.php og en config.ini -fil

Innholdet i filen config.ini er:

[database]

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

Der du selvfølgelig erstatter *** DATABASE_USER *** og *** DATABASE_PASSWORD *** med din egen legitimasjon.

google.charts.load ('current', {'packages': ['corechart']}); google.charts.setOnLoadCallback (drawChart); function drawChart () {var data = google.visualization.arrayToDataTable ([// ['Tidsstempel', 'Temperatur', 'Fuktighet', 'Varmeindeks'], ['Tidsstempel', 'Temperatur', 'Fuktighet'], spørring ($ sql); # This while - loop formaterer og setter alle de hentede dataene på ['tidsstempel', 'temperatur', 'fuktighet'] måte. while ($ row = $ result-> fetch_assoc ()) {$ timestamp_rest = substr ($ rad ["tidsstempel"], 10, 6); ekko "['". $ timestamp_rest. "',". $ rad ['temperatur']. ",". $ rad ['fuktighet']. "],"; // echo "['". $ timestamp_rest. "',". $ rad ['temperatur']. ",". $ rad ['fuktighet']. ",". $ rad ['heatindex ']. "],";}?>]); // Curved line var options = {title: 'Temperatur og fuktighet', curveType: 'function', legend: {position: 'bottom'}, hAxis: {slantedText: true, slantedTextAngle: 45}}; // Curved chart var chart = new google.visualization. LineChart (document.getElementById ('curve_chart')); chart.draw (data, alternativer); } // Sluttbrakett fra drawChart //

Trinn 6: 3D -trykt hus

Til huset brukte jeg to separate hus, ett for ESP32-CAM og DHT22 sammen og ett for 18650 batteriskjold.

Trinn 7: Det endelige resultatet

Det endelige resultatet!
Det endelige resultatet!
Det endelige resultatet!
Det endelige resultatet!
Det endelige resultatet!
Det endelige resultatet!
Det endelige resultatet!
Det endelige resultatet!

Det endelige resultatet er også vist på bildene ovenfor.

Og når batteriet er tomt, kan du lade det med en mini -USB -kabel.

Anbefalt: