Taula de continguts:
- Subministraments
- Pas 1: pengeu el codi Arduino a l'ESP32-CAM
- Pas 2: connecteu-vos
- Pas 3: Script Python3
- Pas 4: servidor MySQL
- Pas 5: servidor web
- Pas 6: habitatge imprès en 3D
- Pas 7: el resultat final
Vídeo: Temperatura i humitat mitjançant ESP32-DHT22-MQTT-MySQL-PHP: 7 passos
2024 Autora: John Day | [email protected]. Última modificació: 2024-01-30 08:12
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
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
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 també es mostra a les imatges anteriors.
I sempre que la bateria estigui buida, la podeu carregar amb un cable mini USB.
Recomanat:
M5STACK Com mostrar temperatura, humitat i pressió a M5StickC ESP32 mitjançant Visuino - Fàcil de fer: 6 passos
M5STACK Com mostrar temperatura, humitat i pressió a M5StickC ESP32 mitjançant Visuino: fàcil de fer: en aquest tutorial aprendrem a programar ESP32 M5Stack StickC amb Arduino IDE i Visuino per mostrar la temperatura, humitat i pressió mitjançant el sensor ENV (DHT12, BMP280, BMM150)
Alerta de temperatura i humitat mitjançant AWS i ESP32: 11 passos
Alerta de temperatura i humitat mitjançant AWS i ESP32: en aquest tutorial, mesurarem diferents dades de temperatura i humitat mitjançant el sensor de temperatura i humitat. També aprendreu a enviar aquestes dades a AWS
Automatitzar un hivernacle amb LoRa! (Part 1) -- Sensors (temperatura, humitat, humitat del sòl): 5 passos
Automatitzar un hivernacle amb LoRa! (Part 1) || Sensors (temperatura, humitat, humitat del sòl): en aquest projecte us mostraré com he automatitzat un hivernacle. Això vol dir que us mostraré com he construït l'hivernacle i com he connectat l'electrònica de potència i automatització. També us mostraré com programar una placa Arduino que utilitzi L
ESP8266 Monitorització de temperatura Nodemcu mitjançant DHT11 en un servidor web local - Obteniu la temperatura i la humitat de l'habitació al navegador: 6 passos
ESP8266 Monitorització de temperatura Nodemcu mitjançant DHT11 en un servidor web local | Obteniu la temperatura i la humitat de l'habitació al vostre navegador: Hola nois, avui farem una humitat i un amp; sistema de control de temperatura que utilitza ESP 8266 NODEMCU & Sensor de temperatura DHT11. La temperatura i la humitat s’obtindran del sensor DHT11 & es pot veure en un navegador quina pàgina web es gestionarà
Servidor web de temperatura i humitat Esp32 mitjançant IDE de PYTHON i Zerynth: 3 passos
Servidor web de temperatura i humitat Esp32 que utilitza PYTHON & Zerynth IDE: Esp32 és un magnífic microcontrolador, és potent com un Arduino, però encara millor. Té connectivitat Wifi, cosa que us permet desenvolupar projectes IOT de manera barata i senzilla. els dispositius són frustrants, primer no és estable, Secon