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 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).
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

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.
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
/*********
: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);
}
}
}
Common Course Links
Common Course Files
Sumber daya & referensi
-
DokumentasiESP32 Tutorial 46/55 - SunFounder doc page for IoT Communication with MQTTdocs.sunfounder.com
Berkas📁
Tidak ada file tersedia.