#include <WiFi.h> // Memasukkan library WiFi untuk mengaktifkan konektivitas WiFi pada ESP32.
#include "PubSubClient.h" // Memasukkan library PubSubClient untuk komunikasi MQTT.
// Pengaturan Awal MQTT
char *mqttServer = "broker.emqx.io"; // Mendefinisikan alamat server broker MQTT.
int mqttPort = 1883; // Mendefinisikan port broker MQTT (1883 adalah port standar MQTT tanpa enkripsi).
String myClientID = "001"; // Mendefinisikan ID klien yang unik untuk klien MQTT ini.
String Topic_1 = "blksby/data/tegangan"; // Mendefinisikan topik MQTT untuk memublikasikan data tegangan.
String Topic_2 = "blksby/data/arus"; // Mendefinisikan topik MQTT untuk memublikasikan data arus.
// Membuat Objek MQTT Client dan Jenis Koneksi
WiFiClient wifi; // Membuat objek WiFiClient untuk menangani koneksi WiFi.
PubSubClient mqttClient(wifi); // Membuat objek PubSubClient, menghubungkannya dengan WiFiClient untuk komunikasi jaringan.
const int vr = 220; // Mendefinisikan variabel integer konstan 'vr' (referensi tegangan) dengan nilai 220.
const float ir = 0.78; // Mendefinisikan variabel float konstan 'ir' (referensi arus) dengan nilai 0.78.
char* ssid = "Wokwi-GUEST"; // Mendefinisikan SSID (nama jaringan) WiFi yang akan dihubungkan.
char* pass = ""; // Mendefinisikan kata sandi WiFi (kosong untuk Wokwi-GUEST).
void setup() {
// Letakkan kode setup Anda di sini, untuk dijalankan sekali:
Serial.begin(115200); // Menginisialisasi komunikasi serial pada baud rate 115200 untuk debugging.
Serial.println("Hello, ESP32!"); // Mencetak pesan sapaan ke monitor serial.
WiFi.mode(WIFI_STA); // Mengatur ESP32 untuk beroperasi dalam mode Station (mode klien) untuk terhubung ke jaringan WiFi yang sudah ada.
WiFi.begin(ssid,pass); // Memulai koneksi WiFi menggunakan SSID dan kata sandi yang telah ditentukan.
while(WiFi.status() != WL_CONNECTED){ // Mengulang sampai ESP32 berhasil terhubung ke jaringan WiFi.
delay(100); // Menunggu 100 milidetik sebelum memeriksa status koneksi lagi.
Serial.println("*"); // Mencetak tanda bintang ke monitor serial untuk menunjukkan bahwa sedang mencoba terhubung.
}
Serial.println(" ESP 32 telah berhasil Connect"); // Mencetak pesan sukses setelah terhubung ke WiFi.
// Memerintahkan ESP untuk tahu alamat broker
init_to_broker(mqttServer, mqttPort); // Memanggil fungsi untuk mengatur detail broker MQTT.
// Memerintahkan untuk Connect ke Broker
connect_to_broker(myClientID); // Memanggil fungsi untuk terhubung ke broker MQTT menggunakan ID klien yang telah ditentukan.
}
void loop() {
// Letakkan kode utama Anda di sini, untuk dijalankan berulang kali:
Serial.print("Nilai Tegangan : "); // Mencetak label untuk tegangan ke monitor serial.
Serial.print(vr); // Mencetak nilai tegangan ke monitor serial.
Serial.print(" Nilai Arus : "); // Mencetak label untuk arus ke monitor serial, dengan beberapa spasi.
Serial.println(ir); // Mencetak nilai arus ke monitor serial, diikuti dengan baris baru.
mqtt_publish(Topic_1, vr); // Memublikasikan nilai tegangan ke Topic_1.
mqtt_publish(Topic_2, ir); // Memublikasikan nilai arus ke Topic_2.
delay(1000); // Menunggu 1000 milidetik (1 detik) sebelum iterasi loop berikutnya. Ini juga mempercepat simulasi di lingkungan seperti Wokwi.
}
// Fungsi untuk menginisialisasi pengaturan broker MQTT.
void init_to_broker(char* myMqttServer, int myMqttPort) {
mqttClient.setServer(myMqttServer, myMqttPort); // Mengatur alamat IP/nama host dan port broker MQTT untuk klien MQTT.
// jika kita ingin menerima pesan untuk langganan yang dibuat oleh klien sebagai subscriber
// mqttClient.setCallback(callback); // (Dikomentari) Baris ini akan digunakan untuk mengatur fungsi callback jika klien juga perlu berlangganan topik dan menerima pesan.
}
// Fungsi untuk terhubung ke broker MQTT.
void connect_to_broker(String clientName) {
Serial.println("Connecting to MQTT Broker..."); // Mencetak pesan yang menunjukkan upaya koneksi.
String clientId = "ESP32Client-" + clientName; // Membuat ID klien unik dengan menggabungkan awalan dengan nama klien yang diberikan.
mqttClient.connect(clientId.c_str()); // Mencoba terhubung ke broker MQTT menggunakan ID klien yang dibuat. .c_str() mengubah String menjadi array char.
while (!mqttClient.connected()) { // Mengulang sampai klien MQTT berhasil terhubung ke broker.
Serial.print("failed, rc="); // Mencetak "failed, rc=" jika koneksi gagal.
Serial.println(mqttClient.state()); // Mencetak kode status koneksi MQTT (alasan kegagalan).
Serial.println("Reconnecting to MQTT Broker.."); // Mencetak pesan yang menunjukkan upaya penyambungan kembali.
delay(1000); // Menunggu 1000 milidetik sebelum mencoba menyambung kembali.
}
Serial.print(clientId); // Mencetak ID klien yang berhasil terhubung.
Serial.println(" Device to Broker Connected."); // Mencetak pesan sukses setelah perangkat terhubung ke broker.
}
// Fungsi untuk memublikasikan data ke topik MQTT.
void mqtt_publish(String yourTopic, float yourPayload){
char yourPayloadString[8]; // Mendeklarasikan array karakter untuk menampung payload sebagai string. Ukuran 8 dipilih untuk mengakomodasi konversi float ke string (misalnya, "0.78\0").
dtostrf(yourPayload, 1, 2, yourPayloadString); // Mengubah float 'yourPayload' menjadi string dan menyimpannya di 'yourPayloadString'.
// 1: lebar minimum keluaran (termasuk titik desimal dan tanda).
// 2: jumlah digit setelah titik desimal.
// yourPayloadString: array karakter untuk menyimpan hasilnya.
mqttClient.publish(yourTopic.c_str(), yourPayloadString); // Memublikasikan string payload ke topik MQTT yang ditentukan.
// .c_str() mengubah topik String menjadi array char.
Serial.print(yourTopic); // Mencetak topik tempat data dipublikasikan.
Serial.print(" ==> "); // Mencetak pemisah panah.
Serial.println(yourPayload); // Mencetak nilai numerik dari payload yang dipublikasikan.
}