#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>
#include "DHT.h"

#define BLYNK_TEMPLATE_ID "TMPL6wXfsJTDi"
#define BLYNK_TEMPLATE_NAME "DHT ESP 32"
#define BLYNK_AUTH_TOKEN "TbmdGpKhTXPlQAtTD86ptD2DQj7lO7_f"  //Paste your credentials here
#define ledM 23
#define ledH 23
#define ledB 23
#define ledU 23
#define ledK 23
#define ledO 23



 

// You should get Auth Token in the Blynk App.
// Go to the Project Settings (nut icon).
char auth[] = "TbmdGpKhTXPlQAtTD86ptD2DQj7lO7_f";//Paste auth token you copied

// Your WiFi credentials.
// Set password to "" for open networks.
char ssid[] = "Wokwi-GUEST";///Enter your wifi name
char pass[] = "";// Enter wifi password

#define DHTPIN 33         // What digital pin we're connected to select yours accordingly

// Uncomment whatever type you're using!
#define DHTTYPE DHT22     // DHT 11
//#define DHTTYPE DHT22   // DHT 22, AM2302, AM2321
//#define DHTTYPE DHT21   // DHT 21, AM2301

DHT dht(DHTPIN, DHTTYPE);
BlynkTimer timer;

// This function sends Arduino's up time every second to Virtual Pin (5).
// In the app, Widget's reading frequency should be set to PUSH. This means
// that you define how often to send data to Blynk App.
void sendSensor()
{
  float h = dht.readHumidity();
  float t = dht.readTemperature(); // or dht.readTemperature(true) for Fahrenheit

  if (isnan(h) || isnan(t)) {
    Serial.println("Failed to read from DHT sensor!");
    return;
  }
  // You can send any value at any time.
  // Please don't send more that 10 values per second.
  Blynk.virtualWrite(V5, h); // select your virtual pins accordingly
  Blynk.virtualWrite(V6, t); // select your virtual pins accordingly
}

void setup()
{
  // Debug console
  Serial.begin(115200);
delay(1000);
  Blynk.begin(auth, ssid, pass);
  // You can also specify server:
  //Blynk.begin(auth, ssid, pass, "blynk-cloud.com", 80);
  //Blynk.begin(auth, ssid, pass, IPAddress(192,168,1,100), 8080);

  dht.begin();

  pinMode(ledM, OUTPUT);
  pinMode(ledH, OUTPUT);
  pinMode(ledB, OUTPUT);
  pinMode(ledU, OUTPUT);
  pinMode(ledK, OUTPUT);
  pinMode(ledO, OUTPUT);

  // Setup a function to be called every second
  timer.setInterval(1000L, sendSensor);
}

void loop()
{
  Blynk.run();
  timer.run();
float temperature = dht.readTemperature();
  float humidity = dht.readHumidity();

  
  if (isnan(temperature) || isnan(humidity)) {
    Serial.println(F("Failed to read from DHT sensor!"));
    return;
  }


  if (temperature < 15 || humidity < 10){
    digitalWrite(ledH, HIGH);
    digitalWrite(ledK, LOW);
    digitalWrite(ledM LOW);
    Serial.println(F("Suhu: Dingin || Temp: "));
    Serial.print(temperature);
    Serial.println(F("°C "));
    Serial.println(F("Kelembapan: Kering || Humi: "));
    Serial.print(humidity);
    Serial.println(F("% "));
    Serial.println(F("---"));
  }
  else if (temperature > 15 && temperature < 27 || humidity > 10 && humidity < 40){
    digitalWrite(ledK, HIGH);
    digitalWrite(ledM, LOW);
    digitalWrite(ledH, LOW);
    Serial.println(F("Suhu: Normal || Temp: "));
    Serial.print(temperature);
    Serial.println(F("°C "));
    Serial.println(F("Kelembapan: Normal || Humi: "));
    Serial.print(humidity);
    Serial.println(F("% "));
    Serial.println(F("---"));
  }
  else if (temperature > 27 || humidity > 40){
    digitalWrite(ledM, HIGH);
    digitalWrite(ledK, LOW);
    digitalWrite(ledH, LOW);
    Serial.println(F("Suhu: Panas || Temp: "));
    Serial.print(temperature);
    Serial.println(F("°C "));
    Serial.println(F("Kelembapan: Banjir datang || Humi: "));
    Serial.print(humidity);
    Serial.println(F("% "));
    Serial.println(F("---"));
  }


  
  delay(2000);

}