Taula de continguts:

Temperatura i humitat mitjançant ESP32-DHT22-MQTT-MySQL-PHP: 7 passos
Temperatura i humitat mitjançant ESP32-DHT22-MQTT-MySQL-PHP: 7 passos

Vídeo: Temperatura i humitat mitjançant ESP32-DHT22-MQTT-MySQL-PHP: 7 passos

Vídeo: Temperatura i humitat mitjançant ESP32-DHT22-MQTT-MySQL-PHP: 7 passos
Vídeo: ИНКУБАТОР, как ПОНИЖАТЬ или ПОВЫШАТЬ ВЛАЖНОСТЬ. 2024, De novembre
Anonim
Temperatura i humitat mitjançant ESP32-DHT22-MQTT-MySQL-PHP
Temperatura i humitat mitjançant ESP32-DHT22-MQTT-MySQL-PHP

La meva xicota volia un hivernacle, així que li vaig fer un. Però volia un sensor de temperatura i humitat a l’interior de l’hivernacle. Per tant, vaig buscar exemples a Google i vaig començar a experimentar.

La meva conclusió va ser que tots els exemples que vaig trobar no eren exactament el que volia construir. Vaig agafar moltes petites parts de codi i les vaig combinar. Vaig trigar bastant temps a acabar la meva primera versió de treball perquè la documentació de la majoria d’exemples era massa difícil d’entendre o suposava una part que hauria de saber ?? Però no sabia res (encara) ☹

Per això construeixo aquest instructiu. Un tutorial "de principi a fi" perquè tothom entengui literalment. (Almenys espero?)

Com funciona …

El producte final és un ESP32-CAM amb un sensor DHT22 connectat al mateix, que obté energia mitjançant una bateria 18650. Cada tres minuts llegeix la temperatura i la humitat i l’envia per WiFi a un servidor MQTT extern i després es posa a dormir (durant tres minuts) per utilitzar la bateria que necessiti

En un servidor Debian, (que també podria ser un raspberry pi, suposo) tinc python3, un servidor MQTT, un servidor MySQL i un servidor web

L'escriptura python3 s'executa com a servei i, sempre que rep un missatge MQTT, compta el nombre d'entrades anterior (número d'índex) i l'incrementa en un. A continuació, llegeix els valors de la temperatura i la humitat del missatge MQTT. Comprova si hi ha valors falsos i, sempre que els valors són correctes, envia els valors juntament amb el nou número d’índex i la data i hora actuals a un servidor MySQL

El servidor web té un script PHP que llegeix els valors del servidor MySQL i en fa un bon gràfic mitjançant Google Charts. (exemple)

Subministraments

Les parts que he fet servir són les següents:

  • ESP32-CAM (El motiu pel qual he utilitzat la versió de càmera és perquè té un connector d'antena extern. Probablement també hi ha altres ESP32 que podríeu utilitzar)
  • Antena externa
  • Sensor DH222 AM2302 (aquest té una resistència integrada, de manera que només necessiteu tres cables)

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

  • 18650 blindatge de la bateria v3
  • Bateria 18650 (NCR18650B)
  • Antic cable micro USB (per connectar l'ESP32 al blindatge de la bateria)
  • Alguns cables de pont curt

Necessaris extra:

  • Connector USB a TTL (imatge)

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

  • Soldador
  • Impressora 3D (només necessària per a la carcassa)

Pas 1: pengeu el codi Arduino a l'ESP32-CAM

Pengeu el codi Arduino a l’ESP32-CAM
Pengeu el codi Arduino a l’ESP32-CAM

Comencem, doncs, Per carregar el codi Arduino a l'ESP32-CAM, heu de connectar el connector USBtoTTL a l'ESP32 mitjançant els esquemes anteriors.

El codi Arduino és:

/ * Només un petit programa per llegir la temperatura i la humitat des d’un sensor DHT22 i

passar-lo a MQTT. B. Duijnhouwer, 8 de juny de 2020 * / #include #include #include #define wifi_ssid "*** WIFI_SSID ***" // wifi ssid #define wifi_password "*** WIFI_PASSWORD ***" // password wifi #define mqtt_server "*** SERVER_NAME ***" // nom del servidor o IP # definir mqtt_user "*** MQTT_USER ***" // nom d'usuari # definir mqtt_password "*** MQTT_PASSWORD ***" // contrasenya # definir tema "hivernacle / dhtreadings "#define debug_topic" glasshouse / debug "// Tema per a la depuració / * definicions per a deepsleep * / #define uS_TO_S_FACTOR 1000000 / * Factor de conversió de micro segons a segons * / #define TIME_TO_SLEEP 180 / * El temps ESP32 es posarà a dormir durant 5 minuts (en segons) * / bool debug = true; // Mostra el missatge de registre si és cert #define DHT22_PIN 14 dht DHT; WiFiClient espClient; Client PubSubClient (espClient); dades de caràcters [80]; configuració nul·la () {Serial.begin (115200); setup_wifi (); // Connecteu-vos a la xarxa Wifi client.setServer (mqtt_server, 1883); // Configureu la connexió MQTT, canvieu de port si cal. if (! client.connected ()) {reconnect (); } // LLEGIR DADES int chk = DHT.read22 (DHT22_PIN); flotador t = temperatura DHT; flotador h = DHT.humitat; String dhtReadings = "{" temperatura / ": \" "+ Cadena (t) +" / ", \" humitat / ": \" "+ Cadena (h) +" / "}"; dhtReadings.toCharArray (dades, (dhtReadings.length () + 1)); if (depurar) {Serial.print ("Temperatura:"); Serial.print (t); Serial.print ("| Humitat:"); Serial.println (h); } // Publicar valors a temes MQTT client.publish (tema, dades); // Publicar lectures sobre el tema (hivernacle / dhtreadings) si (depurar) {Serial.println ("Lectures enviades a MQTT."); } esp_sleep_enable_timer_wakeup (TIME_TO_SLEEP * uS_TO_S_FACTOR); // anar a dormir Serial.println ("Configureu ESP32 per dormir per a cada" + cadena (TIME_TO_SLEEP) + "segons"); Serial.println ("Anar a dormir amb normalitat ara"); esp_deep_sleep_start (); } // Configura la connexió a wifi void setup_wifi () {delay (20); Serial.println (); Serial.print ("Connexió a"); Serial.println (wifi_ssid); WiFi.begin (wifi_ssid, wifi_password); while (WiFi.status ()! = WL_CONNECTED) {delay (100); Serial.print ("."); } Serial.println (""); Serial.println ("WiFi està bé"); Serial.print ("=> La nova adreça IP ESP32 és:"); Serial.print (WiFi.localIP ()); Serial.println (""); } // Torneu a connectar a wifi si es perd la connexió void reconnectar () {while (! Client.connected ()) {Serial.print ("Connexió al corredor MQTT …"); if (client.connect ("ESP32Client", mqtt_user, mqtt_password)) {Serial.println ("OK"); } else {Serial.print ("[Error] no connectat:"); Serial.print (client.state ()); Serial.println ("Espereu 5 segons abans de tornar-ho a provar"); retard (5000); }}} void loop () {}

I, de nou, no oblideu substituir les credencials per les vostres pròpies

Pas 2: connecteu-vos

Wire Up!
Wire Up!

Per alimentar-lo, he utilitzat un antic cable USB del qual he tallat el connector USB-A. Al cable USB hi ha quatre cables, només necessitem el negre i el vermell.

Per tant, connecteu-ho tot segons la programació anterior.

Pas 3: Script Python3

L’escriptura Python3 es dirigeix a un lloc on és accessible per a l’usuari root.

He utilitzat /root/scripts/glasshouse/glasshouse.py per a aquest script. El contingut del script python és:

Script # Python3 per connectar-se a MQTT, llegir valors i escriure'ls a MySQL

# # B. Duijnhouwer # 8 de juny de 2020 # # versió: 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", "hivernacle", "*** MYSQL_USERNAME ***", "*** MYSQL_PASSWORD ***") cursor = db.cursor () broker_address = "localhost" #Broker address port = 1883 #Broker port user = "** * MQTT_USERNAME *** "#Connection username password =" *** MQTT_PASSWORD *** "#Connection password def on_connect (client, dades d'usuari, indicadors, rc): # La devolució de trucada per a quan el client es connecta al corredor d'impressió (" Connectat amb el codi de resultat {0} ". format (str (rc))) # Imprimeix el resultat de l'intent de connexió client.subscribe (" glasshouse / dhtreadings / # ") def on_message (client, userdata, msg): # La devolució de trucada quan El servidor rep el missatge PUBLICAR. cursor.execute ("select * from sensordata") numrows = int (cursor.rowcount) newrow = numrows + 1 now = datetime.now () formatted_date = now.strftime ('% Y-% m-% d% H:% M:% S ') càrrega útil = json.loads (msg.payload.decode (' utf-8 ')) print ("Nova fila:" + str (nova fila)) temperatura = flotació (càrrega útil ["temperatura"]) humitat = float (càrrega útil ["humitat"]) imprimir ("Temperatura:" + str (temperatura)) imprimir ("Humitat:" + str (humitat)) imprimir ("DataTime:" + str (data_format)) si ((temperatura > -20) i (temperatura = 0) i (humitat <= 100)): cur = db.cursor () cur.execute ("INSERT INTO glasshouse.sensordata (idx, temperature, humity, timestamp) VALORS (" + str (nova fila) + "," + str (temperatura) + "," + str (humitat) + ",% s)", (data_format)) db.commit () print ("dades rebudes i importades a MySQL") més: print ("les dades han superat els límits i NO s'importen a MySQL") client = mqtt. Client ("duijnhouwer-com-glasshouse-script") client.username_pw_set (usuari, contrasenya = contrasenya) client.on_connect = on_connect # Define callback function per connexió reeixida client.on_message = on_message # Defineix la funció de devolució de trucada per a la recepció d'un missatge client.connect (broker_address, port = port) #connect to broker client.loop_forever () # Inicia el dimoni de xarxa

No oblideu substituir el nom d’usuari i la contrasenya de MySQL i el nom d’usuari i la contrasenya MQTT per les vostres pròpies credencials

Podeu fer que l'script s'executi com a servei creant dos fitxers.

El primer és "/etc/init/glasshouse.conf" amb el contingut següent:

comença al nivell d'execució [2345]

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

El segon és “/etc/systemd/system/multi-user.target.wants/glasshouse.service› amb el contingut següent:

[Unitat]

Descripció = Servei de control de l’hivernacle After = multi-user.target [Servei] Tipus = simple Reiniciar = sempre RestartSec = 1 ExecStart = / usr / bin / python3 /root/scripts/glasshouse/glasshouse.py [Instal·lar] WantedBy = multi-usuari.objectiu

Podeu executar-lo com a servei mitjançant l'ordre següent:

systemctl habilitar l'hivernacle

i comenceu amb:

systemctl inici hivernacle

Pas 4: servidor MySQL

Heu de crear una nova base de dades MySQL amb només una taula.

El codi per crear la taula és:

CREA TAULA `sensordata` ("idx" int (11) DEFAULT NULL, flotador de "temperatura" DEFAULT NULL, flotador de "humitat" DEFAULT NULL, "timestamp` datetime DEFAULT NULL) MOTOR = InnoDB DEFAULT CHARSET = utf8;

Pas 5: servidor web

El servidor web té dos fitxers, el fitxer index.php i un fitxer config.ini

El contingut del fitxer config.ini és:

[base de dades]

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

En cas que substituïu *** DATABASE_USER *** i *** DATABASE_PASSWORD *** per les vostres pròpies credencials.

google.charts.load ('actual', {'packages': ['corechart']}); google.charts.setOnLoadCallback (drawChart); function drawChart () {var data = google.visualization.arrayToDataTable ([// ['Marca de temps', 'Temperatura', 'Humitat', 'Índex de calor'], ['Marca de temps', 'Temperatura', 'Humitat'], consulta ($ sql); # This while - loop formats i posa totes les dades recuperades a la manera ['timestamp', 'temperature', 'humity']. while ($ row = $ result-> fetch_assoc ()) {$ timestamp_rest = substr ($ fila ["timestamp"], 10, 6); eco "['". $ timestamp_rest. "',". $ fila ['temperatura']. ",". $ fila ['humitat']. "],"; // eco "['". $ timestamp_rest. "',". $ fila ['temperatura']. ",". $ fila ['humitat']. ",". $ fila ['heatindex ']. "],";}?>]); // Opcions var de línia corba = {title: 'Temperatura i humitat', curveType: 'function', llegenda: {position: 'bottom'}, hAxis: {slantedText: true, slantedTextAngle: 45}}; // gràfic corbat var chart = new google.visualization. LineChart (document.getElementById ('curve_chart')); chart.draw (dades, opcions); } // Final de claudàtor de drawChart //

Pas 6: habitatge imprès en 3D

Per a la carcassa, he utilitzat dues carcasses separades, una per a l’ESP32-CAM i DHT22 juntes i una per al blindatge de la bateria 18650.

Pas 7: el resultat final

El resultat final!
El resultat final!
El resultat final!
El resultat final!
El resultat final!
El resultat final!
El resultat final!
El resultat final!

El resultat final també es mostra a les imatges anteriors.

I sempre que la bateria estigui buida, la podeu carregar amb un cable mini USB.

Recomanat: