Search Code

Hướng dẫn ESP32 46/55 - Giám sát nhiệt độ từ xa bằng HiveMQ MQTT | Bộ kit ESP32 của SunFounder

Hướng dẫn ESP32 46/55 - Giám sát nhiệt độ từ xa bằng HiveMQ MQTT | Bộ kit ESP32 của SunFounder

Trong hướng dẫn này, chúng ta sẽ tạo một hệ thống giám sát nhiệt độ từ xa sử dụng ESP32 và giao thức MQTT. Dự án này cho phép chúng ta xuất bản dữ liệu nhiệt độ lên một broker MQTT và điều khiển đèn LED từ xa bằng giao diện web. Bằng cách nhấn một nút, chúng ta có thể gửi số đo nhiệt độ lên đám mây, và chúng ta cũng có thể nhận lệnh để bật hoặc tắt đèn LED.

esp32-47-mqt-1

ESP32 là một vi điều khiển mạnh mẽ có tích hợp Wi-Fi và Bluetooth, khiến nó trở nên lý tưởng cho các ứng dụng Internet vạn vật (IoT). Trong thiết lập này, chúng ta sẽ sử dụng một nhiệt điện trở NTC để đo nhiệt độ, một nút nhấn để kích hoạt các phép đo, và một đèn LED để chỉ báo trạng thái. Dữ liệu sẽ được gửi đến HiveMQ, một broker MQTT phổ biến, nơi nó có thể được truy cập từ xa (trong video ở phút 00:45).

esp32-47-mqt-2

Giải thích về Phần cứng

Đối với dự án này, chúng ta sẽ sử dụng các thành phần sau:

  • Vi điều khiển ESP32: Bo mạch này đóng vai trò là bộ xử lý trung tâm, xử lý các kết nối Wi-Fi và truyền thông MQTT.
  • Nhiệt điện trở NTC: Cảm biến nhiệt độ này thay đổi điện trở của nó dựa trên nhiệt độ. Nó cung cấp một tín hiệu analog mà ESP32 có thể đọc để xác định nhiệt độ hiện tại.
  • Đèn LED: Điốt phát quang này sẽ được sử dụng để chỉ báo trạng thái dựa trên các lệnh nhận được qua MQTT.
  • Nút nhấn: Nút này sẽ kích hoạt ESP32 để đọc nhiệt độ và xuất bản nó lên broker MQTT.

Chi tiết Bảng dữ liệu

Nhà sản xuất SunFounder
Số bộ phận ESP32
Điện áp Logic/IO 3,3 V
Điện áp cung cấp 5 V (qua USB)
Dòng điện đầu ra (mỗi kênh) Tối đa 12 mA
Hướng dẫn tần số PWM Lên đến 40 kHz
Ngưỡng logic đầu vào 0,3 V (thấp), 2,4 V (cao)
Giới hạn nhiệt độ -40 đến 85 °C
Đóng gói ESP32-WROOM-32

 

  • Đảm bảo mức điện áp phù hợp để tránh hư hỏng.
  • Sử dụng điện trở kéo lên cho nút nhấn để đảm bảo các phép đo ổn định.
  • Tụ điện tách rời có thể giúp ổn định nguồn điện.
  • Hãy cẩn thận với hệ thống dây của nhiệt điện trở để tránh các phép đo không chính xác.
  • Xác minh chi tiết broker MQTT của bạn để kết nối thành công.

Hướng dẫn Đấu dây

esp32-47-mqtt-wiring

Để đấu dây các thành phần, hãy bắt đầu bằng cách kết nối nhiệt điện trở NTC. Kết nối một chân của nhiệt điện trở với nguồn 3,3 V trên ESP32. Chân còn lại kết nối với chân 36 trên ESP32, và nó cũng nên kết nối với một điện trở 10 kΩ, sau đó được nối với đất. Điều này tạo ra một bộ chia điện áp cho phép ESP32 đọc điện trở của nhiệt điện trở.

Tiếp theo, kết nối đèn LED. Chân dài hơn (cực dương) của đèn LED kết nối với chân 4 trên ESP32 qua một điện trở 220 Ω, trong khi chân ngắn hơn (cực âm) kết nối với đất. Đối với nút nhấn, kết nối một bên với 3,3 V và bên còn lại với chân 14 trên ESP32. Ngoài ra, kết nối một điện trở 10 kΩ từ chân nút xuống đất để đảm bảo trạng thái LOW ổn định khi nút không được nhấn.

Cài đặt thư viện cần thiết

Thư viện PubSubClient được sử dụng ở đây, bạn có thể cài đặt nó từ Trình quản lý Thư viện.

esp32-47-mqtt-library

Ví dụ Mã & Hướng dẫn Chi tiết

Trong phần thiết lập, chúng ta khởi tạo truyền thông nối tiếp, thiết lập kết nối Wi-Fi và cấu hình máy chủ MQTT. Đây là một đoạn mã thiết lập:

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

Phần mã này thiết lập kết nối đến mạng Wi-Fi và cấu hình máy chủ MQTT. Các chế độ chân cho nút nhấn và đèn LED cũng được cấu hình ở đây.

Hàm vòng lặp liên tục kiểm tra trạng thái nút và xuất bản dữ liệu nhiệt độ khi được nhấn. Đây là một đoạn trích tập trung từ vòng lặp:

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

Trong vòng lặp này, chúng ta kiểm tra xem ESP32 có được kết nối với broker MQTT hay không. Nếu nút được nhấn, nó đọc nhiệt độ từ nhiệt điện trở và xuất bản nó lên chủ đề "SF/TEMP" mỗi 5 giây.

Trình diễn / Điều gì sẽ xảy ra

Khi dự án được thiết lập và chạy, nhấn nút sẽ xuất bản nhiệt độ hiện tại lên MQTT broker. Bạn có thể theo dõi dữ liệu này từ bất kỳ MQTT client nào. Ngoài ra, bạn có thể gửi tin nhắn để điều khiển đèn LED; gửi "on" sẽ bật đèn, còn "off" sẽ tắt đèn. Hãy xem hành vi mong đợi trong video tại 15:30, nơi các chỉ số nhiệt độ được hiển thị sau mỗi lần nhấn nút.

Mốc thời gian trong video

  • 00:00 Bắt đầu
  • 2:05 Giới thiệu về dự án
  • 7:06 Dịch vụ HiveMQ miễn phí
  • 7:56 Giải thích về cách đấu dây
  • 11:11 Giải thích mã Arduino
  • 18:46 Chọn bo mạch ESP32 và cổng COM trong Arduino IDE
  • 20:30 Trình diễn HiveMQ Free broker

Hình ảnh

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
Ngôn ngữ: 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);
    }
  }
}

Tài nguyên & tài liệu tham khảo

Tập tin📁

Không có tệp nào khả dụng.