Indholdsfortegnelse:

Temperatur og fugtighed ved hjælp af ESP32-DHT22-MQTT-MySQL-PHP: 7 trin
Temperatur og fugtighed ved hjælp af ESP32-DHT22-MQTT-MySQL-PHP: 7 trin

Video: Temperatur og fugtighed ved hjælp af ESP32-DHT22-MQTT-MySQL-PHP: 7 trin

Video: Temperatur og fugtighed ved hjælp af ESP32-DHT22-MQTT-MySQL-PHP: 7 trin
Video: Xiaomi Mi Temperatur og Luftfugtighed Sensor med Display 2024, Juli
Anonim
Temperatur og fugtighed ved hjælp af ESP32-DHT22-MQTT-MySQL-PHP
Temperatur og fugtighed ved hjælp af ESP32-DHT22-MQTT-MySQL-PHP

Min kæreste ville have et drivhus, så jeg lavede hende et. Men jeg ville have en temperatur- og fugtighedsføler inde i drivhuset. Så jeg googlede efter eksempler og begyndte at eksperimentere.

Min konklusion var, at alle de eksempler, jeg fandt, ikke ligefrem var det, jeg ville bygge. Jeg tog en masse små dele af koden og kombinerede dem. Det tog mig et stykke tid at afslutte min første arbejdsopbygning, fordi dokumentationen for de fleste eksempler var for vanskelig til at forstå mig, eller de antog en del, som jeg burde vide ?? Men jeg vidste intet (endnu) ☹

Derfor bygger jeg dette instruerbart. En "begyndelse-til slutningen" -vejledning til bogstaveligt talt alle at forstå. (Håber jeg i hvert fald?)

Hvordan det virker …

Slutproduktet er en ESP32-CAM med en DHT22-sensor knyttet til den, som får strøm fra et 18650 batteri. Hvert tredje minut læser den temperatur og luftfugtighed og sender dette via WiFi til en ekstern MQTT -server og går derefter i dvale (i tre minutter) for at bruge så mindre batteri som nødvendigt

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

Python3 -scriptet kører som en tjeneste, og når det modtager en MQTT -meddelelse, tæller det det tidligere antal poster (indeksnummer) og øger dette med en. Derefter læser den værdierne for temperaturen og fugtigheden fra MQTT -meddelelsen. Den kontrollerer for falske værdier, og når værdierne er korrekte, sender den værdierne sammen med det nye indeksnummer og den aktuelle dato og klokkeslæt til en MySQL -server

Webserveren har et PHP -script, der læser værdierne fra MySQL -serveren og laver en flot graf fra den ved hjælp af Google Charts. (eksempel)

Forbrugsvarer

De dele jeg brugte er følgende:

  • ESP32-CAM (Grunden til at jeg brugte cam-versionen er fordi den har et eksternt antennestik på. Der er sandsynligvis også andre ESP32’er du kan bruge)
  • Ekstern antenne
  • AM2302 DHT22 sensor (Denne har en indbygget modstand, så du behøver kun tre ledninger)

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

  • 18650 batteriskærm v3
  • 18650 batteri (NCR18650B)
  • Gammelt mikro -USB -kabel (til tilslutning af ESP32 til batteriskærmen)
  • Nogle korte springtråde

Ekstra behov:

  • USB til TTL -stik (billede)

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

  • Loddekolbe
  • 3D -printer (kun nødvendig til huskasse)

Trin 1: Upload Arduino-koden til ESP32-CAM

Upload Arduino-koden til ESP32-CAM
Upload Arduino-koden til ESP32-CAM

Så lad os begynde!

For at uploade Arduino-koden til ESP32-CAM skal du tilslutte USBtoTTL-stikket til ESP32 ved hjælp af skemaerne ovenfor.

Arduino -koden er:

/*Bare et lille program til at aflæse temperatur og fugtighed fra en DHT22 sensor og

videregive det til MQTT. B. Duijnhouwer juni, 8th 2020*/#include #include #include #define wifi_ssid "*** WIFI_SSID ***" // wifi ssid #define wifi_password "*** WIFI_PASSWORD ***" // wifi password #define mqtt_server "*** SERVER_NAME ***" // servernavn eller IP #define mqtt_user "*** MQTT_USER ***" // brugernavn #define mqtt_password "*** MQTT_PASSWORD ***" // password #define topic "glasshouse /dhtreadings "#define debug_topic" glasshouse /debug "// Emne til fejlfinding /* definitioner for deepsleep* /#define uS_TO_S_FACTOR 1000000 /* Omregningsfaktor i mikrosekunder til sekunder* /#define TIME_TO_SLEEP 180 /* Time ESP32 går i dvale i 5 minutter (i sekunder) */ bool debug = true; // Vis logbesked, hvis True #define DHT22_PIN 14 dht DHT; WiFiClient espClient; PubSubClient -klient (espClient); kuldata [80]; ugyldig opsætning () {Serial.begin (115200); setup_wifi (); // Opret forbindelse til Wifi -netværksklient.setServer (mqtt_server, 1883); // Konfigurer MQTT -forbindelse, skift port, hvis det er nødvendigt. hvis (! client.connected ()) {genforbind (); } // LÆS DATA int chk = DHT.read22 (DHT22_PIN); flyde t = DHT.temperatur; flyde h = DHT. fugtighed; String dhtReadings = "{" temperatur / ": \" " + streng (t) +" / ", \" fugtighed / ": \" " + streng (h) +" / "}"; dhtReadings.toCharArray (data, (dhtReadings.length () + 1)); if (debug) {Serial.print ("Temperatur:"); Serial.print (t); Serial.print ("| Fugtighed:"); Serial.println (h); } // Udgiv værdier til MQTT -emner client.publish (emne, data); // Udgiv aflæsninger om emne (drivhus/dhtreadings) if (debug) {Serial.println ("Læsning sendt til MQTT."); } esp_sleep_enable_timer_wakeup (TIME_TO_SLEEP * uS_TO_S_FACTOR); // gå i dvale Serial.println ("Indstil ESP32 til at sove for hver" + streng (TIME_TO_SLEEP) + "sekunder"); Serial.println ("Sover som normalt nu."); esp_deep_sleep_start (); } // Opsætning af forbindelse til wifi void setup_wifi () {forsinkelse (20); Serial.println (); Serial.print ("Opretter forbindelse til"); Serial.println (wifi_ssid); WiFi.begyndt (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 (""); } // Tilslut igen til wifi, hvis forbindelsen går tabt, ugyldig genforbindelse () {mens (! Client.connected ()) {Serial.print ("Opretter forbindelse til MQTT -mægler …"); hvis (client.connect ("ESP32Client", mqtt_user, mqtt_password)) {Serial.println ("OK"); } ellers {Serial.print ("[Fejl] Ikke tilsluttet:"); Serial.print (client.state ()); Serial.println ("Vent 5 sekunder, før du prøver igen."); forsinkelse (5000); }}} void loop () {}

Og igen, glem ikke at udskifte legitimationsoplysningerne med dine egne legitimationsoplysninger

Trin 2: Tråd op

Tråd op!
Tråd op!

Til strømmen brugte jeg et gammelt USB-kabel, hvoraf jeg afbrød USB-A-stikket. Der er fire ledninger i USB -kablet, vi har kun brug for de sorte og de røde.

Så tilslut alt i henhold til skemaet ovenfor.

Trin 3: Python3 Script

Python3 -scriptet går ind på et sted, hvor det er tilgængeligt for rodbrugeren.

Jeg brugte /root/scripts/glasshouse/glasshouse.py til dette script. Indholdet af python -scriptet er:

# Python3 -script for at oprette forbindelse til MQTT, læse værdier og skrive dem i MySQL

# # B. Duijnhouwer # juni, 8. 2020 # # version: 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", "glashus", "*** MYSQL_USERNAME ***", "*** MYSQL_PASSWORD ***") cursor = db.cursor () broker_address = "localhost" #Broker address port = 1883 #Broker port user = "** *MQTT_USERNAME *** "#Connection brugernavn password =" *** MQTT_PASSWORD *** " #Connection password def on_connect (klient, brugerdata, flag, rc): #Tilbagekald til når klienten opretter forbindelse til mæglerudskrivningen (" Tilsluttet med resultatkode {0} ". format (str (rc))) # Udskriv resultat af forbindelsesforsøg client.subscribe (" glasshouse/dhtreadings/ # ") def on_message (client, userdata, msg): # Tilbagekald til når en PUBLISH -besked modtages fra serveren. cursor.execute ("vælg * fra sensordata") numrows = int (cursor.rowcount) newrow = numrows + 1 nu = datetime.now () formatted_date = now.strftime ('%Y-%m-%d%H:% M:%S ') nyttelast = json.loads (msg.payload.decode (' utf-8 ')) print ("Ny række:"+str (ny)) temperatur = float (nyttelast ["temperatur"]) fugtighed = float (nyttelast ["fugtighed"]) print ("Temperatur:"+str (temperatur)) print ("Fugtighed:"+str (fugtighed)) print ("DateTime:"+str (format_date)) if ((temperatur > -20) og (temperatur = 0) og (fugtighed <= 100)): cur = db.cursor () cur.execute ("INSERT INTO glasshouse.sensordata (idx, temperatur, luftfugtighed, tidsstempel) VÆRDIER ("+str (newrow)+","+str (temperatur)+","+str (fugtighed)+", %s)", (formateret_dato)) db.commit () print ("data modtaget og importeret i MySQL") andet: print ("data overskred grænser og er IKKE importeret i MySQL") client = mqtt. Client ("duijnhouwer-com-glasshouse-script") client.username_pw_set (bruger, password = password) client.on_connect = on_connect # Definer tilbagekaldsfunktion til succesfuld forbindelse client.on_message = on_message # Definer tilbagekaldsfunktion til modtagelse af en meddelelse client.connect (broker_address, port = port) #connect to broker client.loop_forever () # Start networking daemon

Glem ikke at udskifte MySQL brugernavn og adgangskode og MQTT brugernavn og adgangskode til dine egne legitimationsoplysninger

Du kan få scriptet til at køre som en tjeneste ved at oprette to filer.

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

start på runlevel [2345]

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

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

[Enhed]

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 at køre som en service ved hjælp af følgende kommando:

systemctl muliggøre drivhus

og start det med:

systemctl start drivhus

Trin 4: MySQL -server

Du skal oprette en ny MySQL -database med kun en tabel i den.

Koden til oprettelse af tabellen er:

Opret tabel `sensordata` (`idx` int (11) DEFAULT NULL,` temperatur` float DEFAULT NULL, `luftfugtighed` float DEFAULT NULL,` tidsstempel` datetime DEFAULT NULL) MOTOR = InnoDB DEFAULT CHARSET = utf8;

Trin 5: Webserver

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

Indholdet af filen config.ini er:

[database]

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

Hvor du selvfølgelig erstatter *** DATABASE_USER *** og *** DATABASE_PASSWORD *** med dine egne legitimationsoplysninger.

google.charts.load ('nuværende', {'pakker': ['corechart']}); google.charts.setOnLoadCallback (drawChart); funktion drawChart () {var data = google.visualization.arrayToDataTable ([// ['Tidsstempel', 'Temperatur', 'Fugtighed', 'Varmeindeks'], ['Tidsstempel', 'Temperatur', 'Fugtighed'], forespørgsel ($ sql); # This while - loop formaterer og sætter alle de hentede data på ['tidsstempel', 'temperatur', 'fugtighed'] måde. while ($ row = $ result-> fetch_assoc ()) {$ timestamp_rest = substr ($ række ["tidsstempel"], 10, 6); ekko "['". $ tidsstempel_rest. "',". $ række ['temperatur']. ",". $ række ['fugtighed']. "],"; // ekko "['". $ timestamp_rest. "',". $ row ['temperatur']. ",". $ row ['luftfugtighed']. ",". $ row ['heatindex ']. "],";}?>]); // Buet linje var options = {title: 'Temperatur og luftfugtighed', 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, optioner); } // Slutbeslag fra drawChart //

Trin 6: 3D -trykt hus

Til huset brugte jeg to separate huse, et til ESP32-CAM og DHT22 sammen og et til 18650 batteriskærm.

Trin 7: Det endelige resultat

Det endelige resultat!
Det endelige resultat!
Det endelige resultat!
Det endelige resultat!
Det endelige resultat!
Det endelige resultat!
Det endelige resultat!
Det endelige resultat!

Det endelige resultat er også vist på billederne ovenfor.

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

Anbefalede: