Table des matières:

Température et humidité avec ESP32-DHT22-MQTT-MySQL-PHP : 7 étapes
Température et humidité avec ESP32-DHT22-MQTT-MySQL-PHP : 7 étapes

Vidéo: Température et humidité avec ESP32-DHT22-MQTT-MySQL-PHP : 7 étapes

Vidéo: Température et humidité avec ESP32-DHT22-MQTT-MySQL-PHP : 7 étapes
Vidéo: ESP32 DHT Web Server Project 2024, Juillet
Anonim
Température et humidité avec ESP32-DHT22-MQTT-MySQL-PHP
Température et humidité avec ESP32-DHT22-MQTT-MySQL-PHP

Ma copine voulait une serre, alors je lui en ai fait une. Mais je voulais un capteur de température et d'humidité à l'intérieur de la serre. Alors, j'ai cherché des exemples sur Google et j'ai commencé à expérimenter.

Ma conclusion était que tous les exemples que j'ai trouvés n'étaient pas exactement ce que je voulais construire. J'ai récupéré beaucoup de petites parties de code et je les ai combinées. Il m'a fallu un certain temps pour terminer ma première version de travail parce que la documentation de la plupart des exemples était trop difficile à comprendre pour moi ou qu'ils supposaient une partie que je devais connaître ?? Mais je ne savais rien (encore) ☹

C'est pourquoi je construis cette instructable. Un didacticiel « du début à la fin » pour que tout le monde comprenne littéralement. (du moins j'espère ?)

Comment ça fonctionne …

Le produit final est un ESP32-CAM avec un capteur DHT22 attaché qui l'alimente à partir d'une batterie 18650. Toutes les trois minutes, il lit la température et l'humidité et l'envoie via WiFi à un serveur MQTT externe, puis se met en veille (pendant trois minutes) pour utiliser autant de batterie que nécessaire

Sur un serveur Debian (qui pourrait aussi être un raspberry pi je suppose) j'ai python3, un serveur MQTT, un serveur MySQL et un serveur web

Le script python3 s'exécute en tant que service et chaque fois qu'il reçoit un message MQTT, il compte le nombre d'entrées précédent (numéro d'index) et l'incrémente de un. Ensuite, il lit les valeurs de température et d'humidité du message MQTT. Il vérifie les fausses valeurs et chaque fois que les valeurs sont correctes, il envoie les valeurs avec le nouveau numéro d'index et la date et l'heure actuelles à un serveur MySQL

Le serveur Web a un script PHP qui lit les valeurs du serveur MySQL et en fait un joli graphique à l'aide de Google Charts. (Exemple)

Fournitures

Les pièces que j'ai utilisées sont les suivantes:

  • ESP32-CAM (La raison pour laquelle j'ai utilisé la version cam est qu'elle a un connecteur d'antenne externe. Il y a probablement aussi d'autres ESP32 que vous pourriez utiliser)
  • Antenne externe
  • Capteur AM2302 DHT22 (Celui-ci a une résistance intégrée, vous n'avez donc besoin que de trois fils)

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

  • Bouclier de batterie 18650 v3
  • Batterie 18650 (NCR18650B)
  • Ancien câble micro USB (pour connecter l'ESP32 au blindage de la batterie)
  • Quelques fils de liaison courts

Supplément nécessaire:

  • Connecteur USB vers TTL (photo)

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

  • Fer à souder
  • Imprimante 3D (uniquement nécessaire pour le boîtier)

Étape 1: Téléchargez le code Arduino sur l'ESP32-CAM

Téléchargez le code Arduino sur l'ESP32-CAM
Téléchargez le code Arduino sur l'ESP32-CAM

Alors commençons !

Pour télécharger le code Arduino sur l'ESP32-CAM, vous devez connecter le connecteur USBtoTTL à l'ESP32 en utilisant les schémas ci-dessus.

Le code Arduino est:

/*Juste un petit programme pour lire la température et l'humidité d'un capteur DHT22 et

transmettez-le à MQTT. B. Duijnhouwer 8 juin 2020 */ #include #include #include #define wifi_ssid "***WIFI_SSID***" //wifi ssid #define wifi_password "***WIFI_PASSWORD***" //mot de passe wifi #define mqtt_server "***SERVER_NAME***" // nom du serveur ou IP #define mqtt_user "***MQTT_USER***" // nom d'utilisateur #define mqtt_password "***MQTT_PASSWORD***" // mot de passe #define topic "glasshouse /dhtreadings" #define debug_topic "glasshouse/debug" //Thème de débogage /* définitions pour deepsleep */ #define uS_TO_S_FACTOR 1000000 /* Facteur de conversion pour les microsecondes en secondes */ #define TIME_TO_SLEEP 180 /* Heure de mise en veille de l'ESP32 pendant 5 minutes (en secondes) */ bool debug = true; //Afficher le message du journal si vrai #define DHT22_PIN 14 dht DHT; WiFiClient espClient; Client PubSubClient (espClient); données char[80]; void setup() { Serial.begin(115200); setup_wifi(); //Connectez-vous au réseau Wifi client.setServer(mqtt_server, 1883); // Configurez la connexion MQTT, changez de port si nécessaire. if (!client.connected()) { reconnecter(); } // LIRE LES DONNÉES int chk = DHT.read22(DHT22_PIN); float t = DHT.température; float h = DHT.humidité; String dhtReadings = "{"temperature\":\"" + String(t) + "\", \"humidité\":\"" + String(h) + "\"}"; dhtReadings.toCharArray(data, (dhtReadings.length() + 1)); if (debug) { Serial.print("Temperature: "); Serial.print(t); Serial.print(" | Humidité: "); Serial.println(h); } // Publier les valeurs dans les rubriques MQTT client.publish(topic, data); // Publier les lectures sur le sujet (glasshouse/dhtreadings) if (debug) { Serial.println("Lectures envoyées à MQTT."); } esp_sleep_enable_timer_wakeup(TIME_TO_SLEEP * uS_TO_S_FACTOR); //aller dormir Serial.println("Configurer ESP32 pour dormir pour chaque " + String(TIME_TO_SLEEP) + " Secondes"); Serial.println("Je vais dormir normalement maintenant."); esp_deep_sleep_start(); } //Configurer la connexion au wifi void setup_wifi() { delay(20); Serial.println(); Serial.print("Connexion à "); Serial.println(wifi_ssid); WiFi.begin(wifi_ssid, wifi_password); while (WiFi.status() != WL_CONNECTED) { delay(100); Serial.print("."); } Serial.println(""); Serial.println("Le WiFi est OK "); Serial.print("=> La nouvelle adresse IP ESP32 est: "); Serial.print(WiFi.localIP()); Serial.println(""); } // Se reconnecter au wifi si la connexion est perdue void reconnect() { while (!client.connected()) { Serial.print("Connexion au courtier MQTT …"); if (client.connect ("ESP32Client", mqtt_user, mqtt_password)) { Serial.println ("OK"); } else { Serial.print("[Erreur] Non connecté: "); Serial.print(client.state()); Serial.println("Attendez 5 secondes avant de réessayer."); retard (5000); } } } boucle vide() { }

Et encore une fois, n'oubliez pas de remplacer les informations d'identification par vos propres informations d'identification

Étape 2: Connectez-vous

Câbler!
Câbler!

Pour l'alimentation, j'ai utilisé un vieux câble USB dont j'ai coupé le connecteur USB-A. Il y a quatre fils dans le câble USB, nous n'avons besoin que du noir et du rouge.

Alors, connectez le tout selon le calendrier ci-dessus.

Étape 3: Script Python3

Le script Python3 va dans un endroit où il est accessible à l'utilisateur root.

J'ai utilisé /root/scripts/glasshouse/glasshouse.py pour ce script. Le contenu du script python est:

# Script Python3 pour se connecter à MQTT, lire les valeurs et les écrire dans MySQL

# # B. Duijnhouwer # 8 juin 2020 # # version: 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", "glasshouse", "***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, userdata, flags, rc): # Le rappel lorsque le client se connecte au courtier print("Connected avec le code de résultat {0}".format(str(rc))) # Affiche le résultat de la tentative de connexion client.subscribe("glasshouse/dhtreadings/#") def on_message(client, userdata, msg): # Le rappel pour quand un Le message PUBLIER est reçu du serveur. curseur.execute ("select * from sensordata") numrows = int (cursor.rowcount) newrow = numrows + 1 now = datetime.now() formatted_date = now.strftime('%Y-%m-%d %H:% M:%S') payload = json.loads(msg.payload.decode('utf-8')) print("Nouvelle ligne: "+str(newrow)) temperature = float(payload["temperature"]) humidité = float(payload["humidité"]) print("Temperature: "+str(temperature)) print("Humidity: "+str(humidity)) print("DateTime: "+str(formatted_date)) if ((temperature > -20) et (température = 0) et (humidité <= 100)): cur = db.cursor() cur.execute("INSERT INTO glasshouse.sensordata (idx, temperature, humidity, timestamp) VALUES ("+str (newrow)+", "+str(temperature)+", "+str(humidité)+", %s)", (formatted_date)) db.commit() print("données reçues et importées dans MySQL") else: print("les données ont dépassé les limites et ne sont PAS importées dans MySQL") client = mqtt. Client("duijnhouwer-com-glasshouse-script") client.username_pw_set(user, password=password) client.on_connect = on_connect # Définir la fonction de rappel pour connexion réussie client.on_message = on_message # Définir la fonction de rappel pour la réception d'un message client.connect(broker_address, port=port) #connecter au courtier client.loop_forever() # Démarrer le démon de mise en réseau

N'oubliez pas de remplacer le nom d'utilisateur et le mot de passe MySQL et le nom d'utilisateur et le mot de passe MQTT par vos propres identifiants

Vous pouvez exécuter le script en tant que service en créant deux fichiers.

Le premier est "/etc/init/glasshouse.conf" avec le contenu suivant:

démarrer au niveau d'exécution [2345]

arrêt au niveau d'exécution [!2345] exec /root/scripts/glasshouse/glasshouse.py

Le second est "/etc/systemd/system/multi-user.target.wants/glasshouse.service" avec le contenu suivant:

[Unité]

Description=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.cible

Vous pouvez exécuter cela en tant que service à l'aide de la commande suivante:

systemctl activer la serre

et lancez-le en utilisant:

systemctl start serre

Étape 4: Serveur MySQL

Vous devez créer une nouvelle base de données MySQL avec une seule table.

Le code pour créer la table est:

CREATE TABLE `sensordata` (`idx` int(11) DEFAULT NULL, `temperature` float DEFAULT NULL, `humidité` float DEFAULT NULL, `timestamp` datetime DEFAULT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Étape 5: Serveur Web

Le serveur Web a deux fichiers, le fichier index.php et un fichier config.ini

Le contenu du fichier config.ini est:

[base de données]

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

Où bien sûr, vous remplacez ***DATABASE_USER*** et ***DATABASE_PASSWORD*** par vos propres informations d'identification.

google.charts.load('current', {'packages':['corechart']}); google.charts.setOnLoadCallback(drawChart); function drawChart() { var data = google.visualization.arrayToDataTable([// ['Timestamp', 'Temperature', 'Humidity', 'Heat Index'], ['Timestamp', 'Temperature', 'Humidity'], query($sql); # Cette boucle while formate et met toutes les données récupérées dans ['timestamp', 'temperature', 'humidity']. while ($row = $result->fetch_assoc()) { $timestamp_rest = substr($row["timestamp"], 10, 6); echo "['".$timestamp_rest."', ".$row['temperature'].", ".$row['humidité']. "], "; // echo "['".$timestamp_rest."', ".$row['temperature'].", ".$row['humidité'].", ".$row['heatindex ']."], "; } ?>]); // Options de var de ligne courbe = { titre: 'Température et humidité', curveType: 'fonction', légende: { position: 'bottom' }, hAxis: { slantedText:true, slantedTextAngle:45 } }; // Graphique courbe var chart = new google.visualization. LineChart(document.getElementById('curve_chart')); chart.draw(données, options); } // Fin du crochet de drawChart //

Étape 6: boîtier imprimé en 3D

Pour le boîtier, j'ai utilisé deux boîtiers séparés, un pour l'ESP32-CAM et le DHT22 ensemble et un pour le bouclier de batterie 18650.

Étape 7: le résultat final

Le résultat final !
Le résultat final !
Le résultat final !
Le résultat final !
Le résultat final !
Le résultat final !
Le résultat final !
Le résultat final !

Le résultat final est également montré dans les images ci-dessus.

Et chaque fois que la batterie est vide, vous pouvez la recharger avec un câble mini USB.

Conseillé: