//Ayu Sukma Pertiwi 20220801471
//Bimo ali prakoso fakhrudin irawan 20220801238
//Jesen candra 20220801075
//Johta sansanda suntana 20220801016
//M. Rafly faturrahman 20220801080
#define BLYNK_TEMPLATE_ID "TMPL6x7uMToqb"
#define BLYNK_TEMPLATE_NAME "ESP"
#define BLYNK_AUTH_TOKEN "c7_D43EM10Oos2X7oGj1-KyvywHFr2gY"

#include <WiFi.h>
#include <PubSubClient.h>
#include <DHT.h>
#include <BlynkSimpleEsp32.h> // tambahkan library Blynk

// Header Guards
#ifndef MY_SENSOR_H
#define MY_SENSOR_H

const char* ssid = "Wokwi-GUEST";
const char* password = "";
const char* mqtt_server = "test.mosquitto.org";
const char* mqtt_topic_suhu = "ayu/suhu";
const char* mqtt_topic_kelembapan = "ayu/kelembapan";
const int port = 1883;
const int ledPin1 = 14;
const int ledPin2 = 27;
const int ledPin3 = 26;// Pin untuk LED indikator

char auth[] = BLYNK_AUTH_TOKEN; // Menggunakan token otentikasi Blynk

WiFiClient espClient;
PubSubClient client(espClient);
DHT dht(2, DHT22);

void setup_wifi();
void reconnect();
void sendSensorData();
BLYNK_WRITE(V2); // Mendeklarasikan fungsi Blynk_WRITE untuk switch

void setup() {
  Serial.begin(115200);
  pinMode(ledPin1, OUTPUT);
  pinMode(ledPin2, OUTPUT);
  pinMode(ledPin3, OUTPUT);// Mengatur pin LED sebagai output
  dht.begin();
  setup_wifi();
  client.setServer(mqtt_server, port); // Menggunakan variabel port
  
  Blynk.begin(auth, ssid, password); // Inisialisasi Blynk
}

void setup_wifi() {
  delay(10);
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);
  WiFi.mode(WIFI_STA);
  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 reconnect() {
  while (!client.connected()) {
    Serial.print("Attempting MQTT connection...");
    String clientId = "ESP32Client-";
    clientId += String(random(0xffff), HEX);
    if (client.connect(clientId.c_str())) {
      Serial.println("connected");
    } else {
      Serial.print("failed, rc=");
      Serial.print(client.state());
      Serial.println(" try again in 5 seconds");
      delay(5000);
    }
  }
}

void loop() {
  if (!client.connected()) {
    reconnect();
  }
  client.loop();
  Blynk.run(); // Menjalankan Blynk
  
  sendSensorData(); // Mengirim data sensor ke Blynk
  
  delay(5000); // delay 5 detik
}

void sendSensorData() {
  float temperature = dht.readTemperature();
  float humidity = dht.readHumidity(); // Membaca kelembapan
  
  if (!isnan(temperature) && !isnan(humidity)) {
    // Publish suhu
    String tempPayload = String(temperature);
    Serial.print("Sending temperature: ");
    Serial.println(tempPayload);
    client.publish(mqtt_topic_suhu, tempPayload.c_str());

    // Publish kelembapan
    String humPayload = String(humidity);
    Serial.print("Sending humidity: ");
    Serial.println(humPayload);
    client.publish(mqtt_topic_kelembapan, humPayload.c_str());
    
    // Mengirim data ke Blynk
    Blynk.virtualWrite(V0, temperature); // Menulis suhu ke pin V0 di aplikasi Blynk
    Blynk.virtualWrite(V1, humidity); // Menulis kelembapan ke pin V1 di aplikasi Blynk
  } else {
    Serial.println("Failed to read data from DHT sensor");
  }
}

// Fungsi untuk menangani perubahan nilai pada switch (pin virtual V2 di aplikasi Blynk)
BLYNK_WRITE(V2) {
  int switchState = param.asInt(); // Membaca status switch dari aplikasi Blynk
  if (switchState == 1) {
    digitalWrite(ledPin1, HIGH);// Menghidupkan LED ketika switch dinyalakan
  } else {
    digitalWrite(ledPin1, LOW);// Mematikan LED ketika switch dimatikan
  }
}

// Fungsi untuk menangani perubahan nilai pada switch (pin virtual V2 di aplikasi Blynk)
BLYNK_WRITE(V3) {
  int switchState = param.asInt(); // Membaca status switch dari aplikasi Blynk
  if (switchState == 1) {
    digitalWrite(ledPin2, HIGH);// Menghidupkan LED ketika switch dinyalakan
  } else {
    digitalWrite(ledPin2, LOW);// Mematikan LED ketika switch dimatikan
  }
}

// Fungsi untuk menangani perubahan nilai pada switch (pin virtual V2 di aplikasi Blynk)
BLYNK_WRITE(V4) {
  int switchState = param.asInt(); // Membaca status switch dari aplikasi Blynk
  if (switchState == 1) {
    digitalWrite(ledPin3, HIGH);// Menghidupkan LED ketika switch dinyalakan
  } else {
    digitalWrite(ledPin3, LOW);// Mematikan LED ketika switch dimatikan
  }
}


#endif // MY_SENSOR_H