Search Code

Návod pre ESP32 46/55 – Diaľkové monitorovanie teploty pomocou HiveMQ MQTT | Súprava ESP32 od SunFounder

Návod pre ESP32 46/55 – Diaľkové monitorovanie teploty pomocou HiveMQ MQTT | Súprava ESP32 od SunFounder

V tomto návode si vytvoríme systém diaľkového monitorovania teploty pomocou ESP32 a protokolu MQTT. Tento projekt nám umožňuje publikovať údaje o teplote do MQTT brokera a ovládať LED diódu na diaľku pomocou webového rozhrania. Stlačením tlačidla môžeme odoslať namerané teploty do cloudu a tiež môžeme prijímať príkazy na zapnutie alebo vypnutie LED diódy.

esp32-47-mqt-1

ESP32 je výkonný mikrokontrolér so zabudovaným Wi-Fi a Bluetooth, vďaka čomu je ideálny pre aplikácie internetu vecí (IoT). V tomto zapojení použijeme NTC termistor na meranie teploty, tlačidlo na spustenie meraní a LED diódu na indikáciu stavu. Údaje budú odosielané do HiveMQ, populárneho MQTT brokera, kde k nim možno pristupovať na diaľku (vo videu o 00:45).

esp32-47-mqt-2

Vysvetlenie hardvéru

Pre tento projekt použijeme nasledujúce komponenty:

  • Mikrokontrolér ESP32: Táto doska slúži ako centrálna procesorová jednotka, ktorá spravuje Wi-Fi pripojenie a MQTT komunikáciu.
  • NTC termistor: Tento teplotný senzor mení svoj odpor v závislosti od teploty. Poskytuje analógový signál, ktorý ESP32 dokáže prečítať na určenie aktuálnej teploty.
  • LED dióda: Táto svetelná dióda sa použije na indikáciu stavu na základe príkazov prijatých cez MQTT.
  • Tlačidlo: Toto tlačidlo spustí ESP32, aby prečítal teplotu a publikoval ju do MQTT brokera.

Podrobnosti z datasheetu

Výrobca SunFounder
Označenie dielu ESP32
Logické/IO napätie 3,3 V
Napájacie napätie 5 V (cez USB)
Výstupný prúd (na kanál) max. 12 mA
Odporúčaná PWM frekvencia až 40 kHz
Prahové hodnoty vstupnej logiky 0,3 V (nízka), 2,4 V (vysoká)
Tepelné limity -40 až 85 °C
Puzdro ESP32-WROOM-32

 

  • Zabezpečte správne úrovne napätia, aby nedošlo k poškodeniu.
  • Použite pull-up rezistory pre tlačidlo, aby boli namerané hodnoty stabilné.
  • Oddeľovacie kondenzátory môžu pomôcť stabilizovať napájanie.
  • Buďte opatrní pri zapojení termistora, aby ste predišli nesprávnym meraniam.
  • Overte si údaje o vašom MQTT brokeri pre úspešné pripojenie.

Pokyny na zapojenie

esp32-47-mqtt-wiring

Pri zapájaní komponentov začnite pripojením NTC termistora. Pripojte jeden vývod termistora na 3,3 V napájanie na ESP32. Druhý vývod pripojte na pin 36 na ESP32 a tiež ho pripojte k 10 kΩ rezistoru, ktorý je následne pripojený na zem. Tým sa vytvorí napäťový delič, ktorý umožní ESP32 prečítať odpor termistora.

Ďalej pripojte LED diódu. Dlhší vývod (anóda) LED diódy pripojte na pin 4 na ESP32 cez 220 Ω rezistor, zatiaľ čo kratší vývod (katóda) pripojte na zem. Pre tlačidlo pripojte jednu stranu na 3,3 V a druhú stranu na pin 14 na ESP32. Okrem toho pripojte 10 kΩ rezistor z pinu tlačidla na zem, aby ste zabezpečili stabilný stav LOW, keď tlačidlo nie je stlačené.

Inštalácia požadovanej knižnice

Používa sa tu knižnica PubSubClient, ktorú môžete nainštalovať zo Správcu knižníc.

esp32-47-mqtt-library

Príklady kódu a vysvetlenie

V nastavení inicializujeme sériovú komunikáciu, nastavíme Wi-Fi pripojenie a nakonfigurujeme MQTT server. Tu je ukážka nastavovacieho kódu:

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

Táto časť kódu vytvorí pripojenie k Wi-Fi sieti a nastaví MQTT server. Tu sú tiež nakonfigurované režimy pinov pre tlačidlo a LED diódu.

Funkcia loop nepretržite kontroluje stav tlačidla a po stlačení publikuje údaje o teplote. Tu je zameraný výňatok zo slučky:

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

V tejto slučke kontrolujeme, či je ESP32 pripojený k MQTT brokerovi. Ak je tlačidlo stlačené, prečíta teplotu z termistora a publikuje ju do témy "SF/TEMP" každých 5 sekúnd.

Demonštrácia / Čo očakávať

Keď je projekt nastavený a spustený, stlačenie tlačidla publikuje aktuálnu teplotu do MQTT brokera. Tieto údaje môžete sledovať z ľubovoľného MQTT klienta. Okrem toho môžete posielať správy na ovládanie LED; odoslanie „on" ju rozsvieti, zatiaľ čo „off" ju vypne. Sledujte očakávané správanie vo videu v čase 15:30, kde sú zobrazené hodnoty teploty po každom stlačení tlačidla.

Časové značky videa

  • 00:00 Začiatok
  • 2:05 Úvod do projektu
  • 7:06 Bezplatná služba HiveMQ
  • 7:56 Vysvetlenie zapojenia
  • 11:11 Vysvetlenie kódu Arduino
  • 18:46 Výber dosky ESP32 a COM portu v Arduino IDE
  • 20:30 Ukážka HiveMQ Free brokera

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

Resources & references

Files📁

No files available.