#define BLYNK_TEMPLATE_ID "TMPL6QdKLSAMx"
#define BLYNK_TEMPLATE_NAME "Sera Wifi Erişim"
#define BLYNK_AUTH_TOKEN "TAqBxZ4JYajnGgYFlIPQy-2Hs3ZHdVOA"

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

// WiFi bilgileri
char ssid[] = "TP-Link_C587";
char pass[] = "94601121";

// Röle çıkış pinleri
#define RELAY_1 25
#define RELAY_2 26
#define RELAY_3 27
#define RELAY_4 14
#define RELAY_5 12
#define RELAY_6 13
#define RELAY_7 32
#define RELAY_8 33

// DHT sensör tanımları
#define DHTPIN 4          // DHT sensörünün bağlı olduğu pin (ESP32 Pin 4)
#define DHTTYPE DHT11     // Kullanılan DHT sensörü tipi (DHT11)

DHT dht(DHTPIN, DHTTYPE);

// Röleleri başlat
void initializeRelays() {
  pinMode(RELAY_1, OUTPUT);
  pinMode(RELAY_2, OUTPUT);
  pinMode(RELAY_3, OUTPUT);
  pinMode(RELAY_4, OUTPUT);
  pinMode(RELAY_5, OUTPUT);
  pinMode(RELAY_6, OUTPUT);
  pinMode(RELAY_7, OUTPUT);
  pinMode(RELAY_8, OUTPUT);

  digitalWrite(RELAY_1, HIGH);
  digitalWrite(RELAY_2, HIGH);
  digitalWrite(RELAY_3, HIGH);
  digitalWrite(RELAY_4, HIGH);
  digitalWrite(RELAY_5, HIGH);
  digitalWrite(RELAY_6, HIGH);
  digitalWrite(RELAY_7, HIGH);
  digitalWrite(RELAY_8, HIGH);
}

// WiFi ve Blynk bağlantısını başlat
void setup() {
  // Seri haberleşmeyi başlat
  Serial.begin(9600);

  // Blynk ve WiFi bağlantısını başlat
  Blynk.begin(BLYNK_AUTH_TOKEN, ssid, pass);

  // DHT sensörünü başlat
  dht.begin();

  // Röle pinlerini başlat
  initializeRelays();

  // Blynk bağlantısının sağlandığını belirten mesaj
  Serial.println("Blynk bağlantısı sağlandı.");
}

void loop() {
  // Blynk.run() her zaman çağrılmalı
  Blynk.run();
}

// V10 butonuna basıldığında veri gönder
BLYNK_WRITE(V10) {
  int value = param.asInt(); // Butonun durumunu al

  if (value == 1) { // Butona basıldığında
    // Sıcaklık ve nem verilerini al
    float h = dht.readHumidity();
    float t = dht.readTemperature();

    // DHT sensöründen veri alınamadıysa uyarı ver
    if (isnan(h) || isnan(t)) {
      Serial.println("DHT sensöründen veri okunamadı!");
      return;
    }

    // Seri port ekranına veri yazdır
    Serial.print("Nem: ");
    Serial.print(h);
    Serial.print("%  Sıcaklık: ");
    Serial.print(t);
    Serial.println("°C");

    // Blynk sanal pinlerine veri gönder
    Blynk.virtualWrite(V6, h); // Nem verisi (V6)
    Blynk.virtualWrite(V5, t); // Sıcaklık verisi (V5)
  }
}

// Röle kontrolü
BLYNK_WRITE(V0) {
  digitalWrite(RELAY_1, param.asInt() == 1 ? LOW : HIGH);
}

BLYNK_WRITE(V1) {
  digitalWrite(RELAY_2, param.asInt() == 1 ? LOW : HIGH);
}

BLYNK_WRITE(V2) {
  digitalWrite(RELAY_3, param.asInt() == 1 ? LOW : HIGH);
}

BLYNK_WRITE(V3) {
  digitalWrite(RELAY_4, param.asInt() == 1 ? LOW : HIGH);
}

BLYNK_WRITE(V4) {
  digitalWrite(RELAY_5, param.asInt() == 1 ? LOW : HIGH);
}

BLYNK_WRITE(V7) {
  digitalWrite(RELAY_6, param.asInt() == 1 ? LOW : HIGH);
}

BLYNK_WRITE(V8) {
  digitalWrite(RELAY_7, param.asInt() == 1 ? LOW : HIGH);
}

BLYNK_WRITE(V9) {
  digitalWrite(RELAY_8, param.asInt() == 1 ? LOW : HIGH);
}
