Search Code

ESP32 Tutorial 46/55 - Remote Temperature Monitoring using HiveMQ MQTT | SunFounder's ESP32 kit

ESP32 Tutorial 46/55 - Remote Temperature Monitoring using HiveMQ MQTT | SunFounder's ESP32 kit

In deze tutorial maken we een extern temperatuurbewakingssysteem met behulp van de ESP32 en het MQTT-protocol. Dit project stelt ons in staat om temperatuurgegevens te publiceren naar een MQTT-broker en een LED op afstand te bedienen via een webinterface. Door op een knop te drukken, kunnen we temperatuurmetingen naar de cloud sturen, en we kunnen ook opdrachten ontvangen om de LED aan of uit te zetten.

esp32-47-mqt-1

De ESP32 is een krachtige microcontroller met ingebouwde Wi-Fi en Bluetooth, waardoor deze ideaal is voor Internet of Things (IoT)-toepassingen. In deze opstelling gebruiken we een NTC-thermistor om temperatuur te meten, een drukknop om de metingen te activeren, en een LED om de status aan te geven. De gegevens worden verzonden naar HiveMQ, een populaire MQTT-broker, waar ze op afstand kunnen worden benaderd (in video op 00:45).

esp32-47-mqt-2

Hardware Uitgelegd

Voor dit project gebruiken we de volgende componenten:

  • ESP32 Microcontroller: Dit bord fungeert als de centrale verwerkingseenheid en verzorgt Wi-Fi-verbindingen en MQTT-communicatie.
  • NTC-thermistor: Deze temperatuursensor verandert zijn weerstand op basis van temperatuur. Het levert een analoog signaal dat de ESP32 kan lezen om de huidige temperatuur te bepalen.
  • LED: Deze lichtgevende diode wordt gebruikt om de status aan te geven op basis van opdrachten die via MQTT worden ontvangen.
  • Drukknop: Deze knop activeert de ESP32 om de temperatuur te lezen en deze naar de MQTT-broker te publiceren.

Datasheet Details

Fabrikant SunFounder
Onderdeelnummer ESP32
Logica/IO-spanning 3,3 V
Voedingsspanning 5 V (via USB)
Uitgangsstroom (per kanaal) 12 mA max
PWM-frequentierichtlijn Tot 40 kHz
Ingangslogische drempels 0,3 V (laag), 2,4 V (hoog)
Thermische limieten -40 tot 85 °C
Verpakking ESP32-WROOM-32

 

  • Zorg voor correcte spanningsniveaus om schade te voorkomen.
  • Gebruik pull-up-weerstanden voor de drukknop om stabiele metingen te garanderen.
  • Ontkoppelcondensatoren kunnen helpen de voeding te stabiliseren.
  • Wees voorzichtig met de bedrading van de thermistor om onjuiste metingen te voorkomen.
  • Controleer uw MQTT-brokergegevens voor een succesvolle verbinding.

Bedradingsinstructies

esp32-47-mqtt-wiring

Om de componenten te bedraden, begin met het aansluiten van de NTC-thermistor. Verbind een pin van de thermistor met de 3,3 V-voeding op de ESP32. De andere pin verbindt met pin 36 op de ESP32, en deze moet ook worden verbonden met een 10 kΩ-weerstand, die vervolgens met de grond wordt verbonden. Dit creëert een spanningsdeler die de ESP32 in staat stelt de weerstand van de thermistor te lezen.

Verbind vervolgens de LED. De langere pin (anode) van de LED verbindt met pin 4 op de ESP32 via een 220 Ω-weerstand, terwijl de kortere pin (kathode) met de grond wordt verbonden. Voor de drukknop verbind je een zijde met 3,3 V en de andere zijde met pin 14 op de ESP32. Verbind daarnaast een 10 kΩ-weerstand van de knop-pin naar de grond om een stabiele LAGE toestand te garanderen wanneer de knop niet wordt ingedrukt.

Vereiste bibliotheek installeren

De PubSubClient-bibliotheek wordt hier gebruikt; je kunt deze installeren vanuit de Bibliotheekbeheerder.

esp32-47-mqtt-library

Codevoorbeelden & Uitleg

In de setup initialiseren we de seriële communicatie, stellen we de Wi-Fi-verbinding in en configureren we de MQTT-server. Hier is een fragment van de setup-code:

void setup() {
  Serial.begin(115200);
  setup_wifi();
  client.setServer(mqtt_server, 1883);
  client.setCallback(callback);
  pinMode(buttonPin, INPUT);
  pinMode(ledPin, OUTPUT);
}

Dit deel van de code brengt de verbinding met het Wi-Fi-netwerk tot stand en stelt de MQTT-server in. De pinmodi voor de knop en LED worden hier ook geconfigureerd.

De loop-functie controleert continu de knopstatus en publiceert temperatuurgegevens wanneer deze wordt ingedrukt. Hier is een gericht fragment uit de loop:

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);
    }
  }
}

In deze loop controleren we of de ESP32 is verbonden met de MQTT-broker. Als de knop wordt ingedrukt, leest het de temperatuur van de thermistor en publiceert deze naar het onderwerp "SF/TEMP" elke 5 seconden.

Demonstratie / Wat te Verwachten

Wanneer het project is opgezet en draait, zal het indrukken van de knop de huidige temperatuur publiceren naar de MQTT-broker. U kunt deze gegevens volgen vanuit elke MQTT-client. Daarnaast kunt u berichten sturen om de LED te bedienen; het sturen van "aan" laat deze oplichten, terwijl "uit" deze uitschakelt. Let op het verwachte gedrag in de video op 15:30, waar de temperatuurmetingen worden getoond na elke knopdruk.

Videotijdstippen

  • 00:00 Start
  • 2:05 Introductie tot het project
  • 7:06 Gratis HiveMQ-service
  • 7:56 Bedrading uitgelegd
  • 11:11 Arduino-code uitgelegd
  • 18:46 ESP32-board en COM-poort selecteren in Arduino IDE
  • 20:30 Demonstratie van HiveMQ Free broker

Afbeeldingen

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
Taal: 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>

// Replace the next variables with your SSID/Password combination
const char* ssid = "SSID";
const char* password = "PASSWORD";

// Add your MQTT Broker address, example:
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;


// LED Pin
const int ledPin = 4;
const int buttonPin = 14;

// When you connect to WIFI, only 36 39 34 35 32 33 pins can be used for analog reading.
// Define constants
const int thermistorPin = 36; // Pin connected to the thermistor
const float referenceVoltage = 3.3;
const float referenceResistor = 10000; // Resistance value (10k)
const float beta = 3950; // Beta value (Typical Value)
const float nominalTemperature = 25; // Nominal temperature for calculating the temperature coefficient
const float nominalResistance = 10000; // Resistance value at nominal temperature



void setup() {
  Serial.begin(115200);

  // default settings
  setup_wifi();
  client.setServer(mqtt_server, 1883);
  client.setCallback(callback);

  pinMode(buttonPin, INPUT);
  pinMode(ledPin, OUTPUT);
}

void setup_wifi() {
  delay(10);
  // We start by connecting to a WiFi network
  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();

  // If a message is received on the topic "SF/LED", you check if the message is either "on" or "off".
  // Changes the output state according to the 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() {
  // Loop until we're reconnected
  while (!client.connected()) {
    Serial.print("Attempting MQTT connection...");
    // Attempt to connect
    if (client.connect(unique_identifier)) {
      Serial.println("connected");
      // Subscribe
      client.subscribe("SF/LED");
    } else {
      Serial.print("failed, rc=");
      Serial.print(client.state());
      Serial.println(" try again in 5 seconds");
      // Wait 5 seconds before retrying
      delay(5000);
    }
  }
}

float thermistor() {
  int adcValue = analogRead(thermistorPin); // Read ADC value
  float voltage = (adcValue * referenceVoltage) / 4095.0; // Calculate voltage
  float resistance = (voltage * referenceResistor) / (referenceVoltage - voltage); // Calculate thermistor resistance with updated configuration

  // Calculate temperature using the Beta parameter equation
  float tempK = 1 / (((log(resistance / nominalResistance)) / beta) + (1 / (nominalTemperature + 273.15)));
  
  float tempC = tempK - 273.15; // Get temperature in Celsius
  float tempF = 1.8 * tempC + 32.0; // Get temperature in Fahrenheit

  //Print temperature
  Serial.print("Temp: ");
  Serial.println(tempC);
  delay(200); //wait for 200 milliseconds
  return tempC;
}

void loop() {
  if (!client.connected()) {
    reconnect();
  }
  client.loop();

  // if the button pressed, publish the temperature to topic "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);
    }
  }
}

Hulpmiddelen en referenties

Bestanden📁

Geen bestanden beschikbaar.