// 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 */