Пребарување код

ESP32 Упатство 46/55 - Далечинско следење на температурата користејќи HiveMQ MQTT | SunFounder-овиот ESP32 комплет

ESP32 Упатство 46/55 - Далечинско следење на температурата користејќи HiveMQ MQTT | SunFounder-овиот ESP32 комплет

Во ова упатство, ќе создадеме систем за далечинско следење на температурата користејќи го ESP32 и MQTT протоколот. Овој проект ни овозможува да објавуваме податоци за температурата на MQTT брокер и да контролираме LED диода далечински преку веб интерфејс. Со притискање на копче, можеме да испратиме читања на температурата во облакот, а исто така можеме да примаме команди за вклучување или исклучување на LED диодата.

esp32-47-mqt-1

ESP32 е моќен микроконтролер кој има вградено Wi-Fi и Bluetooth, што го прави идеален за апликации на Интернет на нештата (IoT). Во оваа поставка, ќе користиме NTC термистор за мерење на температурата, копче за активирање на читањата и LED диода за означување на статусот. Податоците ќе бидат испратени до HiveMQ, популарен MQTT брокер, каде што можат да се пристапат далечински (во видеото на 00:45).

esp32-47-mqt-2

Објаснување на хардверот

За овој проект, ќе ги користиме следниве компоненти:

  • ESP32 микроконтролер: Оваа плоча служи како централна процесорска единица, управувајќи со Wi-Fi врските и MQTT комуникациите.
  • NTC термистор: Овој температурен сензор ја менува својата отпорност врз основа на температурата. Тој обезбедува аналоген сигнал што ESP32 може да го чита за да ја одреди моменталната температура.
  • LED диода: Оваа светлечка диода ќе се користи за означување на статусот врз основа на командите примени преку MQTT.
  • Копче: Ова копче ќе го активира ESP32 да ја прочита температурата и да ја објави на MQTT брокерот.

Детали од техничката документација

Производител SunFounder
Број на дел ESP32
Логички/IO напон 3.3 V
Напон на напојување 5 V (преку USB)
Излезна струја (по канал) 12 mA макс.
Насоки за PWM фреквенција До 40 kHz
Прагови на влезна логика 0.3 V (ниско), 2.4 V (високо)
Термички граници -40 до 85 °C
Пакет ESP32-WROOM-32

 

  • Осигурете се дека напонските нивоа се соодветни за да избегнете оштетување.
  • Користете pull-up отпорници за копчето за да обезбедите стабилни читања.
  • Декуплиншки кондензатори можат да помогнат во стабилизирање на напојувањето.
  • Бидете внимателни со жиците на термисторот за да избегнете неточни читања.
  • Проверете ги деталите за вашиот MQTT брокер за успешна врска.

Инструкции за поврзување

esp32-47-mqtt-wiring

За да ги поврзете компонентите, започнете со поврзување на NTC термисторот. Поврзете еден пин од термисторот на 3.3 V напојувањето на ESP32. Другиот пин се поврзува на пин 36 на ESP32, и исто така треба да се поврзе со отпорник од 10 kΩ, кој потоа се поврзува на земја. Ова создава делител на напон што му овозможува на ESP32 да ја чита отпорноста на термисторот.

Следно, поврзете ја LED диодата. Подолгиот пин (анода) на LED диодата се поврзува на пин 4 на ESP32 преку отпорник од 220 Ω, додека пократкиот пин (катода) се поврзува на земја. За копчето, поврзете една страна на 3.3 V и другата страна на пин 14 на ESP32. Дополнително, поврзете отпорник од 10 kΩ од пинот на копчето до земја за да обезбедите стабилна LOW состојба кога копчето не е притиснато.

Инсталирање на потребната библиотека

Библиотеката PubSubClient се користи овде, можете да ја инсталирате од Управувачот со библиотеки.

esp32-47-mqtt-library

Примери на код и објаснување

Во поставката, ја иницијализираме сериската комуникација, ја поставуваме Wi-Fi врската и го конфигурираме MQTT серверот. Еве дел од кодот за поставка:

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

Овој дел од кодот ја воспоставува врската со Wi-Fi мрежата и го поставува MQTT серверот. Режимите на пиновите за копчето и LED диодата исто така се конфигурирани овде.

Функцијата loop постојано ја проверува состојбата на копчето и објавува податоци за температурата кога е притиснато. Еве фокусиран извадок од 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);
    }
  }
}

Во оваа loop, проверуваме дали ESP32 е поврзан со MQTT брокерот. Ако копчето е притиснато, ја чита температурата од термисторот и ја објавува на темата "SF/TEMP" секои 5 секунди.

Демонстрација / Што да очекувате

Когато проектот е поставен и работи, притискањето на копчето ќе ја објави моменталната температура на MQTT брокерот. Можете да ги следите овие податоци од било кој MQTT клиент. Дополнително, можете да испраќате пораки за контрола на LED-светилката; испраќањето „on“ ќе ја запали, додека „off“ ќе ја изгаси. Внимавајте на очекуваното однесување во видеото на 15:30, каде што читањата на температурата се прикажани по секое притискање на копчето.

Временски ознаки на видеото

  • 00:00 Почеток
  • 2:05 Вовед во проектот
  • 7:06 Бесплатна HiveMQ услуга
  • 7:56 Објаснување на жиците
  • 11:11 Објаснување на Arduino кодот
  • 18:46 Избор на ESP32 плочка и COM порта во Arduino IDE
  • 20:30 Демонстрација на HiveMQ Free брокер

Слики

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
Јазик: 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);
    }
  }
}

Ресурси и референци

Датотеки📁

Нема достапни датотеки.