Tutoriel ESP32 46/55 - Surveillance de température à distance utilisant HiveMQ MQTT | Kit ESP32 de SunFounder
Dans ce tutoriel, nous allons créer un système de surveillance de la température à distance en utilisant l'ESP32 et le protocole MQTT. Ce projet nous permet de publier des données de température sur un broker MQTT et de contrôler une LED à distance à l'aide d'une interface web. En appuyant sur un bouton, nous pouvons envoyer des relevés de température vers le cloud, et nous pouvons également recevoir des commandes pour allumer ou éteindre la LED.
L'ESP32 est un microcontrôleur puissant qui dispose de Wi-Fi et Bluetooth intégrés, ce qui le rend idéal pour les applications Internet des Objets (IoT). Dans cette configuration, nous utiliserons un thermistor NTC pour mesurer la température, un bouton poussoir pour déclencher les lectures, et une LED pour indiquer l'état. Les données seront envoyées à HiveMQ, un courtier MQTT populaire, où elles pourront être accessibles à distance (dans la vidéo à 00:45).
Matériel expliqué
Pour ce projet, nous utiliserons les composants suivants :
- Microcontrôleur ESP32 :Cette carte sert d'unité centrale de traitement, gérant les connexions Wi-Fi et les communications MQTT.
- Thermistor NTC :Ce capteur de température modifie sa résistance en fonction de la température. Il fournit un signal analogique que l'ESP32 peut lire pour déterminer la température actuelle.
- LED :Cette diode électroluminescente sera utilisée pour indiquer le statut en fonction des commandes reçues via MQTT.
- Bouton poussoir :Ce bouton déclenchera l'ESP32 pour lire la température et la publier sur le courtier MQTT.
Détails de la fiche technique
| Fabricant | SunFounder |
|---|---|
| Numéro de pièce | ESP32 |
| Tension logique/IO | 3,3 V |
| Tension d'alimentation | 5 V (via USB) |
| Courant de sortie (par canal) | 12 mA max |
| Guide de fréquence PWM | Jusqu'à 40 kHz |
| Seuils logiques d'entrée | 0,3 V (bas), 2,4 V (élevé) |
| Limites thermiques | -40 à 85 °C |
| Paquet | ESP32-WROOM-32 |
- Assurez-vous de niveaux de tension appropriés pour éviter les dommages.
- Utilisez des résistances de tirage pour le bouton-poussoir afin d'assurer des lectures stables.
- Les condensateurs de découplage peuvent aider à stabiliser l'alimentation électrique.
- Soyez prudent avec le câblage du thermistor pour éviter des lectures incorrectes.
- Vérifiez les détails de votre courtier MQTT pour une connexion réussie.
Instructions de câblage

Pour câbler les composants, commencez par connecter le thermistor NTC. Connectez une broche du thermistor à l'alimentation de 3,3 V de l'ESP32. L'autre broche se connecte à la broche 36 de l'ESP32, et elle doit également se connecter à une résistance de 10 kΩ, qui est ensuite reliée à la terre. Cela crée un diviseur de tension qui permet à l'ESP32 de lire la résistance du thermistor.
Ensuite, connectez la LED. La broche la plus longue (anode) de la LED se connecte à la broche 4 de l'ESP32 à travers une résistance de 220 Ω, tandis que la broche la plus courte (cathode) se connecte à la masse. Pour le bouton-poussoir, connectez un côté à 3,3 V et l'autre côté à la broche 14 de l'ESP32. De plus, connectez une résistance de 10 kΩ entre la broche du bouton et la masse pour garantir un état bas stable lorsque le bouton n'est pas enfoncé.
Installer la bibliothèque requise
LePubSubClientla bibliothèque est utilisée ici, vous pouvez l'installer depuis leGestionnaire de bibliothèque.
Exemples de code et guide étape par étape
Dans la configuration, nous initialisons la communication série, établissons la connexion Wi-Fi et configurons le serveur MQTT. Voici un extrait du code de configuration :
void setup() {
Serial.begin(115200);
setup_wifi();
client.setServer(mqtt_server, 1883);
client.setCallback(callback);
pinMode(buttonPin, INPUT);
pinMode(ledPin, OUTPUT);
}Cette partie du code établit la connexion au réseau Wi-Fi et configure le serveur MQTT. Les modes de broche pour le bouton et la LED sont également configurés ici.
La fonction boucle vérifie en continu l'état du bouton et publie les données de température lorsqu'il est pressé. Voici un extrait ciblé de la boucle :
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
if (digitalRead(buttonPin)) {
long now = millis();
if (now - lastMsg > 5000) {
lastMsg = now;
char tempString[8];
dtostrf(thermistor(), 1, 2, tempString);
client.publish("SF/TEMP", tempString);
}
}
}Dans cette boucle, nous vérifions si l'ESP32 est connecté au broker MQTT. Si le bouton est enfoncé, il lit la température du thermistor et la publie sur le sujet "SF/TEMP" toutes les 5 secondes.
Démonstration / À quoi s'attendre
Lorsque le projet est configuré et en cours d'exécution, appuyer sur le bouton publiera la température actuelle sur le courtier MQTT. Vous pouvez surveiller ces données depuis n'importe quel client MQTT. De plus, vous pouvez envoyer des messages pour contrôler la LED ; envoyer "on" l'allumera, tandis que "off" l'éteindra. Regardez le comportement attendu dans la vidéo à 15:30, où les relevés de température sont montrés après chaque pression sur le bouton.
Horodatages vidéo
- 00:00 Début
- 2:05 Introduction au projet
- 7:06 Service HiveMQ gratuit
- 7:56 Explication du câblage
- 11:11 Code Arduino expliqué
- 18:46 Sélection de la carte ESP32 et du port COM dans l'IDE Arduino
- 20:30 Démonstration du courtier HiveMQ Free
/*
* :ref: https://randomnerdtutorials.com/esp32-mqtt-publish-subscribe-arduino-ide/
* https://docs.sunfounder.com/projects/kepler-kit/en/latest/iotproject/5.mqtt_pub.html
*/
#include <WiFi.h>
#include <PubSubClient.h>
// #include <Wire.h>
// Remplacez les variables suivantes par votre combinaison SSID/Mot de passe.
const char* ssid = "SSID";
const char* password = "PASSWORD";
// Ajoutez l'adresse de votre courtier MQTT, exemple :
const char* mqtt_server = "broker.hivemq.com";
const char* unique_identifier = "sunfounder-client-sdgvsda";
WiFiClient espClient;
PubSubClient client(espClient);
long lastMsg = 0;
int value = 0;
// Broche LED
const int ledPin = 4;
const int buttonPin = 14;
// Lorsque vous vous connectez au WIFI, seuls les broches 36 39 34 35 32 33 peuvent être utilisées pour la lecture analogique.
// Définir des constantes
const int thermistorPin = 36; // Broche connectée au thermistor
const float referenceVoltage = 3.3;
const float referenceResistor = 10000; // Valeur de résistance (10k)
const float beta = 3950; // Valeur bêta (Valeur typique)
const float nominalTemperature = 25; // Température nominale pour le calcul du coefficient de température
const float nominalResistance = 10000; // Valeur de résistance à la température nominale
void setup() {
Serial.begin(115200);
// paramètres par défaut
setup_wifi();
client.setServer(mqtt_server, 1883);
client.setCallback(callback);
pinMode(buttonPin, INPUT);
pinMode(ledPin, OUTPUT);
}
void setup_wifi() {
delay(10);
// Nous commençons par nous connecter à un réseau WiFi.
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}
void callback(char* topic, byte* message, unsigned int length) {
Serial.print("Message arrived on topic: ");
Serial.print(topic);
Serial.print(". Message: ");
String messageTemp;
for (int i = 0; i < length; i++) {
Serial.print((char)message[i]);
messageTemp += (char)message[i];
}
Serial.println();
// Si un message est reçu sur le sujet "SF/LED", vous vérifiez si le message est soit "on", soit "off".
// Change l'état de sortie en fonction du message.
if (String(topic) == "SF/LED") {
Serial.print("Changing state to ");
if (messageTemp == "on") {
Serial.println("on");
digitalWrite(ledPin, HIGH);
} else if (messageTemp == "off") {
Serial.println("off");
digitalWrite(ledPin, LOW);
}
}
}
void reconnect() {
// Boucle jusqu'à ce que nous soyons reconnectés.
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
// Tentative de connexion
if (client.connect(unique_identifier)) {
Serial.println("connected");
// S'abonner
client.subscribe("SF/LED");
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
// Attendez 5 secondes avant de réessayer.
delay(5000);
}
}
}
float thermistor() {
int adcValue = analogRead(thermistorPin); // Lire la valeur ADC
float voltage = (adcValue * referenceVoltage) / 4095.0; // Calculer la tension
float resistance = (voltage * referenceResistor) / (referenceVoltage - voltage); // Calculez la résistance du thermistor avec la configuration mise à jour.
// Calculez la température en utilisant l'équation du paramètre Beta.
float tempK = 1 / (((log(resistance / nominalResistance)) / beta) + (1 / (nominalTemperature + 273.15)));
float tempC = tempK - 273.15; // Obtenez la température en Celsius
float tempF = 1.8 * tempC + 32.0; // Obtenez la température en Fahrenheit
// Imprimer la température
Serial.print("Temp: ");
Serial.println(tempC);
delay(200); // attendre 200 millisecondes
return tempC;
}
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
// si le bouton est pressé, publiez la température sur le sujet "SF/TEMP"
if (digitalRead(buttonPin)) {
long now = millis();
if (now - lastMsg > 5000) {
lastMsg = now;
char tempString[8];
dtostrf(thermistor(), 1, 2, tempString);
client.publish("SF/TEMP", tempString);
}
}
}
Common Course Links
Common Course Files
Ressources et références
-
Documentation
Fichiers📁
Aucun fichier disponible.