#include <WiFi.h>
#include <MQTT.h>
#include "DHT.h"

const char ssid[] = "Wokwi-GUEST";
const char pass[] = "";

WiFiClient net;
MQTTClient client;

#define DHT22Pin 5

#define ledRed 27
#define ledBlue 26

DHT dht(DHT22Pin, DHT22);

unsigned long lastMillis = 0;

void connect(){
  // Menghubungkan ke WiFi
  Serial.print("Cek WiFi");
  while(WiFi.status() != WL_CONNECTED){
    Serial.print(".");
    delay(1000);
  }
  Serial.println("");
  Serial.println("Sukses Terhubung ke WiFi");

  // Menghubungkan ke Broker
  Serial.print("Cek Broker");
  while(!client.connect("")){ // Client ID boleh dikosongkan
    Serial.print(".");
    delay(1000);
  }
  Serial.println("");
  Serial.println("Sukses Terhubung ke Server");
  
  client.subscribe("labskite/iot/#", 1); // subcribe dengan QoS 1
}

void reconnect() {
  Serial.print("Menghubungkan ke Broker");
  while(!client.connect("")){ // Client ID tidak boleh sama
    Serial.print(".");
    delay(1000);
  }
  Serial.println("");
  Serial.println("Berhasil Terhubung ke Server");
  
  client.subscribe("labskite/iot/#", 1); // subcribe dengan QoS 1
}

void subscribeData(String &topic, String &data){
  Serial.print("Topic: ");
  Serial.println(topic);
  Serial.print("Data: ");
  Serial.println(data);

  if(topic == "labskite/iot/led1"){  
    digitalWrite(ledRed, data.toInt());   //control led 1
    client.publish("labskite/iot/led1/status", data, true, 1);
  }

  if(topic == "labskite/iot/led2"){
    digitalWrite(ledBlue, data.toInt());   //control led 2
    client.publish("labskite/iot/led2/status", data, true, 1);   
  }

  if(topic == "labskite/iot/onsemua"){  
    digitalWrite(ledRed, HIGH);
    digitalWrite(ledBlue, HIGH);
  }

  if(topic == "labskite/iot/offsemua"){
    digitalWrite(ledRed, LOW);
    digitalWrite(ledBlue, LOW);
  }

}

void publish(){
  float hum = dht.readHumidity();
  float temp = dht.readTemperature();
  Serial.print("Temperature : ");
  Serial.print(temp);
  Serial.print(" C ");

  Serial.print("Humidity : ");
  Serial.print(hum);
  Serial.println(" % ");

  client.publish("labskite/iot/dht/temp", String(temp), true, 1); // publish variabel temperatue ke topic labskite/iot/dht/temp dengan QoS 1
  client.publish("labskite/iot/dht/humi", String(hum), true, 1); // publish variabel humidity ke topic labskite/iot/dht/humi dengan QoS 1
}

void setup() {
  Serial.begin(115200);
  pinMode(ledRed,OUTPUT); 
  pinMode(ledBlue,OUTPUT);
  dht.begin();

  Serial.begin(9600);
  WiFi.begin(ssid, pass);
  client.begin("broker.emqx.io", net);
  client.onMessage(subscribeData); 
  connect();
}

void loop() {
   if (!client.connected()) { // If client is not connected
    reconnect(); // Try to reconnect
  }
   client.loop();
   
// publish a message roughly every second.
 if (millis() - lastMillis > 1000) {
    lastMillis = millis();
    publish();
  }
  delay(10);
}
esp:0
esp:2
esp:4
esp:5
esp:12
esp:13
esp:14
esp:15
esp:16
esp:17
esp:18
esp:19
esp:21
esp:22
esp:23
esp:25
esp:26
esp:27
esp:32
esp:33
esp:34
esp:35
esp:3V3
esp:EN
esp:VP
esp:VN
esp:GND.1
esp:D2
esp:D3
esp:CMD
esp:5V
esp:GND.2
esp:TX
esp:RX
esp:GND.3
esp:D1
esp:D0
esp:CLK
led1:A
led1:C
r1:1
r1:2
led2:A
led2:C
r2:1
r2:2
dht1:VCC
dht1:SDA
dht1:NC
dht1:GND