Code de recherche

Tutoriel ESP32 46/55 - Surveillance de température à distance utilisant HiveMQ MQTT | Kit ESP32 de SunFounder

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.

esp32-47-mqt-1

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).

esp32-47-mqt-2

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

esp32-47-mqtt-wiring

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.

esp32-47-bibliothèque-mqtt

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

Images

esp32-47-mqt-1
esp32-47-mqt-1
esp32-47-mqt-2
esp32-47-mqt-2
esp32-47-mqtt-library
esp32-47-mqtt-library
esp32-47-mqtt-wiring
esp32-47-mqtt-wiring
847-ESP32 Tutorial 46/55- Arduino code for IoT Communication with MQTT
Langue: C++
/*
 * :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);
    }
  }
}

Fichiers📁

Aucun fichier disponible.