Caută cod

Tutorial ESP32 46/55 - Monitorizarea temperaturii de la distanță folosind HiveMQ MQTT | Kitul ESP32 de la SunFounder

Tutorial ESP32 46/55 - Monitorizarea temperaturii de la distanță folosind HiveMQ MQTT | Kitul ESP32 de la SunFounder

În acest tutorial, vom crea un sistem de monitorizare a temperaturii de la distanță folosind ESP32 și protocolul MQTT. Acest proiect ne permite să publicăm date de temperatură către un broker MQTT și să controlăm un LED de la distanță printr-o interfață web. Prin apăsarea unui buton, putem trimite citirile de temperatură în cloud și putem primi, de asemenea, comenzi pentru a aprinde sau stinge LED-ul.

esp32-47-mqt-1

ESP32 este un microcontroler puternic care include Wi-Fi și Bluetooth integrate, fiind ideal pentru aplicații de Internet of Things (IoT). În această configurație, vom folosi un termistor NTC pentru a măsura temperatura, un buton pentru a declanșa citirile și un LED pentru a indica starea. Datele vor fi trimise către HiveMQ, un broker MQTT popular, unde pot fi accesate de la distanță (în video la 00:45).

esp32-47-mqt-2

Hardware Explicat

Pentru acest proiect, vom folosi următoarele componente:

  • Microcontroler ESP32: Această placă servește ca unitate centrală de procesare, gestionând conexiunile Wi-Fi și comunicațiile MQTT.
  • Termistor NTC: Acest senzor de temperatură își schimbă rezistența în funcție de temperatură. Oferă un semnal analogic pe care ESP32 îl poate citi pentru a determina temperatura curentă.
  • LED: Acest diodă emițătoare de lumină va fi folosită pentru a indica starea pe baza comenzilor primite prin MQTT.
  • Buton: Acest buton va declanșa ESP32 să citească temperatura și să o publice către brokerul MQTT.

Detalii din Fișa Tehnică

Producător SunFounder
Număr de piesă ESP32
Tensiune logică/IO 3,3 V
Tensiune de alimentare 5 V (prin USB)
Curent de ieșire (pe canal) 12 mA max
Ghid frecvență PWM Până la 40 kHz
Praguri logice de intrare 0,3 V (jos), 2,4 V (sus)
Limite termice -40 până la 85 °C
Pachet ESP32-WROOM-32

 

  • Asigurați niveluri de tensiune adecvate pentru a evita deteriorarea.
  • Folosiți rezistențe de pull-up pentru buton pentru a asigura citiri stabile.
  • Condensatoarele de decuplare pot ajuta la stabilizarea sursei de alimentare.
  • Fiți atenți la cablarea termistorului pentru a evita citiri incorecte.
  • Verificați detaliile brokerului MQTT pentru o conexiune reușită.

Instrucțiuni de Cablare

esp32-47-mqtt-wiring

Pentru a cabla componentele, începeți prin conectarea termistorului NTC. Conectați un pin al termistorului la sursa de 3,3 V de pe ESP32. Celălalt pin se conectează la pinul 36 de pe ESP32 și ar trebui să se conecteze și la o rezistență de 10 kΩ, care este apoi conectată la masă. Aceasta creează un divizor de tensiune care permite ESP32 să citească rezistența termistorului.

Apoi, conectați LED-ul. Pinul mai lung (anodul) al LED-ului se conectează la pinul 4 de pe ESP32 printr-o rezistență de 220 Ω, în timp ce pinul mai scurt (catodul) se conectează la masă. Pentru buton, conectați o parte la 3,3 V și cealaltă parte la pinul 14 de pe ESP32. În plus, conectați o rezistență de 10 kΩ de la pinul butonului la masă pentru a asigura o stare LOW stabilă când butonul nu este apăsat.

Instalarea Bibliotecii Necesare

Biblioteca PubSubClient este folosită aici, o puteți instala din Library Manager.

esp32-47-mqtt-library

Exemple de Cod și Explicații

În configurare, inițializăm comunicarea serială, setăm conexiunea Wi-Fi și configurăm serverul MQTT. Iată un fragment din codul de configurare:

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

Această parte a codului stabilește conexiunea la rețeaua Wi-Fi și configurează serverul MQTT. Modurile pinilor pentru buton și LED sunt, de asemenea, configurate aici.

Funcția loop verifică continuu starea butonului și publică datele de temperatură când este apăsat. Iată un extras focusat din 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);
    }
  }
}

În acest loop, verificăm dacă ESP32 este conectat la brokerul MQTT. Dacă butonul este apăsat, citește temperatura de la termistor și o publică pe topicul "SF/TEMP" la fiecare 5 secunde.

Demonstrație / Ce să Așteptați

Când proiectul este configurat și rulează, apăsarea butonului va publica temperatura curentă către broker-ul MQTT. Puteți monitoriza aceste date de la orice client MQTT. În plus, puteți trimite mesaje pentru a controla LED-ul; trimiterea comenzii "on" îl va aprinde, iar "off" îl va stinge. Urmăriți comportamentul așteptat în videoclipul la minutul 15:30, unde citirile de temperatură sunt afișate după fiecare apăsare a butonului.

Marcaje temporale video

  • 00:00 Început
  • 2:05 Introducere în proiect
  • 7:06 Serviciul gratuit HiveMQ
  • 7:56 Explicația cablajului
  • 11:11 Explicația codului Arduino
  • 18:46 Selectarea plăcii ESP32 și a portului COM în Arduino IDE
  • 20:30 Demonstrația broker-ului gratuit HiveMQ

Imagini

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

Resurse și referințe

Fișiere📁

Nu sunt disponibile fișiere.