// akses dan siapkan dulu broker MQTT di http://tools.emqx.io/
#include <WiFi.h> // library esp32 yg digunakan untuk terhubung ke internet
#include <MQTT.h> // library mqtt yg diinstal di library manager
const char ssid[] = "Wokwi-GUEST"; //nama wifi
const char pass[] = ""; // pasword wifi
WiFiClient net; // object ini digunakan karena library menerapkan object oriented programing
MQTTClient client; // object ini digunakan karena library menerapkan object oriented programing
#define LED1 4
#define LED2 5
unsigned long lastMillis = 0; // menyimpan data millis terakhir
int pot; // variabel pot untuk simpan data potensiometer
void connect() { //bisa ganti nama void, misal void hubungkan()
Serial.print("checking wifi..."); // memeriksa apakah sudah terhubung atau belum
while (WiFi.status() != WL_CONNECTED) {
Serial.print("."); //jika blum terhubung akan menampilkan karakter .....
delay(1000);
}
Serial.print("\nconnecting...");
while (!client.connect("test")) {// test adalah client id
Serial.print("."); //jika blum terhubung akan menampilkan karakter .....
delay(1000);
}
Serial.println("\nconnected!");//jika sudah terhubung menampilkan conected
// semua data dibelakang iot2 = topic/iot2/datadisini akan disubscribe jika pakai tanda "#"
client.subscribe("belajar/iot2/#", 1); //melakukan subscribe ke topik belajar/iot2/# (mode multiwildcard) dengan QoS 1
// client.unsubscribe("/hello"); // belum dipakai
}
void messageReceived(String &topic, String &payload) { //ini adalah fungsi untuk mengolah data yg akan disubscribe //baris ini diaktifkan untuk ESP sebagai subscriber
Serial.println("incoming: " + topic + " - " + payload);// topic adalah topic yg diambil dari data yg dikirim dan payload adalah datanya
// ditampilkan ke serial monitor
if (topic == "belajar/iot2/led1") {
digitalWrite(LED1, payload.toInt());//nilai payload berlaku untuk nilai 1 atau 0 saja
}
if (topic == "belajar/iot2/led2") {
if (payload == "1") {
digitalWrite(LED2, HIGH);
Serial.println("ON");
} else {
digitalWrite(LED2, LOW);
Serial.println("OFF");
}
}
}
void setup() {
Serial.begin(115200); // memulai komunikasi serial
WiFi.begin(ssid, pass); // untuk terhubung ke wifi
client.begin("broker.emqx.io", net); // untuk terhubung ke broker
client.onMessage(messageReceived); //baris ini diaktifkan karena subscribe
// client on message ini akan memberitahu ke ESPnya bahwa ketika ada pesan/data baru, maka akan diolah di fungsi "messageReceived"
connect();
pinMode(LED1, OUTPUT);
pinMode(LED2, OUTPUT);
pinMode(32, INPUT);
}
void loop() {
client.loop();// untuk mengeksekusi kode prgram MQTT secara terus-menerus
delay(10); // <- fixes some issues with WiFi stability
if (!client.connected()) {// untuk cek apakah perangkat terhubung ke broker atau ke wifi
connect();// memanggil fungsi void connect jika ditengah jalan koneksi terputus
}
// jika koneksi tidak terputus maka akan menjalankan program dibawah ini
// publish a message roughly every second.
if (millis() - lastMillis > 1000) {// mengeksekusi client.publish setiap 1 detik sekali
lastMillis = millis();
client.publish("belajar/iot2/akhirpekan", String(pot), true, 2);//untuk melakukan publish dengan mode retain (true) dan Qos = 2
} //baris ini diaktifkan karena melakukan publish
pot = analogRead(32);//menyimpan pembacaan data potensiometer ke variabel pot
//Serial.println(pot);
}
/* Di IOT usahakan tidak menggunakan delay dan usahakan tidak mengirim data
secara terus-menerus dengan cepat karena bandwith akan cepat habis dan
resource dari esp akan cepat habis karena akan mengolah proses yang semakin berat.
oleh karena itu setidaknya kita perlu mengirim data setiap sekian detik sekali
dalam hal ini setiap 1 detik sekali */