Cari Kode

Tutorial ESP32 46/55 - Pemantauan Suhu Jarak Jauh menggunakan HiveMQ MQTT | Kit ESP32 SunFounder

Tutorial ESP32 46/55 - Pemantauan Suhu Jarak Jauh menggunakan HiveMQ MQTT | Kit ESP32 SunFounder

Dalam tutorial ini, kita akan membuat sistem pemantauan suhu jarak jauh menggunakan ESP32 dan protokol MQTT. Proyek ini memungkinkan kita untuk memublikasikan data suhu ke broker MQTT dan mengontrol LED dari jarak jauh menggunakan antarmuka web. Dengan menekan tombol, kita dapat mengirim pembacaan suhu ke cloud, dan kita juga dapat menerima perintah untuk menyalakan atau mematikan LED.

esp32-47-mqt-1

ESP32 adalah mikrokontroler yang kuat dengan Wi-Fi dan Bluetooth bawaan, menjadikannya ideal untuk aplikasi Internet of Things (IoT). Dalam pengaturan ini, kita akan menggunakan termistor NTC untuk mengukur suhu, tombol tekan untuk memicu pembacaan, dan LED untuk menunjukkan status. Data akan dikirim ke HiveMQ, broker MQTT yang populer, di mana data dapat diakses dari jarak jauh (dalam video pada 00:45).

esp32-47-mqt-2

Penjelasan Perangkat Keras

Untuk proyek ini, kita akan menggunakan komponen berikut:

  • Mikrokontroler ESP32: Papan ini berfungsi sebagai unit pemrosesan pusat, menangani koneksi Wi-Fi dan komunikasi MQTT.
  • Termistor NTC: Sensor suhu ini mengubah resistansinya berdasarkan suhu. Sensor ini memberikan sinyal analog yang dapat dibaca oleh ESP32 untuk menentukan suhu saat ini.
  • LED: Dioda pemancar cahaya ini akan digunakan untuk menunjukkan status berdasarkan perintah yang diterima melalui MQTT.
  • Tombol Tekan: Tombol ini akan memicu ESP32 untuk membaca suhu dan memublikasikannya ke broker MQTT.

Detail Datasheet

Produsen SunFounder
Nomor bagian ESP32
Tegangan logika/IO 3,3 V
Tegangan suplai 5 V (melalui USB)
Arus keluaran (per saluran) Maks 12 mA
Panduan frekuensi PWM Hingga 40 kHz
Ambang logika masukan 0,3 V (rendah), 2,4 V (tinggi)
Batas termal -40 hingga 85 °C
Kemasan ESP32-WROOM-32

 

  • Pastikan tingkat tegangan yang tepat untuk menghindari kerusakan.
  • Gunakan resistor pull-up untuk tombol tekan agar pembacaan stabil.
  • Kapasitor decoupling dapat membantu menstabilkan catu daya.
  • Berhati-hatilah dengan kabel termistor untuk menghindari pembacaan yang salah.
  • Verifikasi detail broker MQTT Anda untuk koneksi yang berhasil.

Instruksi Pengkabelan

esp32-47-mqtt-wiring

Untuk menghubungkan komponen, mulailah dengan menghubungkan termistor NTC. Hubungkan satu pin termistor ke suplai 3,3 V pada ESP32. Pin lainnya terhubung ke pin 36 pada ESP32, dan juga harus terhubung ke resistor 10 kΩ, yang kemudian terhubung ke ground. Ini menciptakan pembagi tegangan yang memungkinkan ESP32 membaca resistansi termistor.

Selanjutnya, hubungkan LED. Pin yang lebih panjang (anoda) dari LED terhubung ke pin 4 pada ESP32 melalui resistor 220 Ω, sedangkan pin yang lebih pendek (katoda) terhubung ke ground. Untuk tombol tekan, hubungkan satu sisi ke 3,3 V dan sisi lainnya ke pin 14 pada ESP32. Selain itu, hubungkan resistor 10 kΩ dari pin tombol ke ground untuk memastikan status LOW yang stabil saat tombol tidak ditekan.

Instal Pustaka yang Diperlukan

Pustaka PubSubClient digunakan di sini, Anda dapat menginstalnya dari Library Manager.

esp32-47-mqtt-library

Contoh Kode & Penjelasan

Dalam pengaturan, kita menginisialisasi komunikasi serial, mengatur koneksi Wi-Fi, dan mengonfigurasi server MQTT. Berikut adalah cuplikan kode pengaturan:

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

Bagian kode ini membuat koneksi ke jaringan Wi-Fi dan mengatur server MQTT. Mode pin untuk tombol dan LED juga dikonfigurasi di sini.

Fungsi loop terus memeriksa status tombol dan memublikasikan data suhu saat ditekan. Berikut adalah kutipan fokus dari 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);
    }
  }
}

Dalam loop ini, kita memeriksa apakah ESP32 terhubung ke broker MQTT. Jika tombol ditekan, ia membaca suhu dari termistor dan memublikasikannya ke topik "SF/TEMP" setiap 5 detik.

Demonstrasi / Apa yang Diharapkan

Ketika proyek telah disiapkan dan berjalan, menekan tombol akan memublikasikan suhu saat ini ke broker MQTT. Anda dapat memantau data ini dari klien MQTT mana pun. Selain itu, Anda dapat mengirim pesan untuk mengontrol LED; mengirim "on" akan menyalakannya, sedangkan "off" akan mematikannya. Perhatikan perilaku yang diharapkan dalam video pada menit 15:30, di mana pembacaan suhu ditampilkan setelah setiap penekanan tombol.

Stempel Waktu Video

  • 00:00 Mulai
  • 2:05 Pengenalan proyek
  • 7:06 Layanan HiveMQ gratis
  • 7:56 Penjelasan pengkabelan
  • 11:11 Penjelasan kode Arduino
  • 18:46 Memilih papan ESP32 dan port COM di Arduino IDE
  • 20:30 Demonstrasi broker gratis HiveMQ

Gambar

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

Sumber daya & referensi

Berkas📁

Tidak ada file tersedia.