#define BLYNK_TEMPLATE_ID "TMPL69jxmXJjI"
#define BLYNK_TEMPLATE_NAME "WİFİ"
#define BLYNK_AUTH_TOKEN "aBw6ojUINbfjd-Velm5zziUhbD406Lvu"

/* Yorum satırlarını devre dışı bırakmak için bu satırı kaldırabilirsiniz */
#define BLYNK_PRINT Serial

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

// Wi-Fi giriş bilgileri
char ssid[] = "WiFi_SSID";       // WiFi ağ adı
char pass[] = "WiFi_Password";   // WiFi şifresi

// Röle çıkış pinleri
#define RELAY_1 25
#define RELAY_2 26
#define RELAY_3 27
#define RELAY_4 14

// DHT Sensör bağlantısı
#define DHTPIN 4        // DHT sensörü veri pini (GPIO 4)
#define DHTTYPE DHT11   // Kullanılan DHT modeli: DHT11 (DHT22 ise bunu değiştirin)

// DHT sensörünü başlat
DHT dht(DHTPIN, DHTTYPE);
BlynkTimer timer;

void sendSensorData()
{
  float humidity = dht.readHumidity();         // Nem değerini oku
  float temperature = dht.readTemperature();  // Sıcaklık değerini oku

  // Okuma başarısız olursa hata mesajı gönder
  if (isnan(humidity) || isnan(temperature)) {
    Serial.println("DHT sensöründen veri alınamadı!");
    return;
  }

  // Blynk uygulamasına sıcaklık ve nem değerlerini gönder
  Blynk.virtualWrite(V5, temperature); // Sıcaklık verisi V5 pinine gönderiliyor
  Blynk.virtualWrite(V6, humidity);   // Nem verisi V6 pinine gönderiliyor

  Serial.print("Sıcaklık: ");
  Serial.print(temperature);
  Serial.print("°C  Nem: ");
  Serial.print(humidity);
  Serial.println("%");
}

void setup()
{
  // Seri haberleşmeyi başlat
  Serial.begin(9600);

  // Blynk'e bağlan
  Blynk.begin(BLYNK_AUTH_TOKEN, ssid, pass);

  // Röle pinlerini çıkış olarak ayarla
  pinMode(RELAY_1, OUTPUT);
  pinMode(RELAY_2, OUTPUT);
  pinMode(RELAY_3, OUTPUT);
  pinMode(RELAY_4, OUTPUT);

  // Röleleri başlangıçta kapalı (HIGH) duruma getir
  digitalWrite(RELAY_1, HIGH);
  digitalWrite(RELAY_2, HIGH);
  digitalWrite(RELAY_3, HIGH);
  digitalWrite(RELAY_4, HIGH);

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

  // Her 2 saniyede bir sıcaklık ve nem verilerini gönder
  timer.setInterval(2000L, sendSensorData);

  Serial.println("Sistem başlatıldı. Tüm röleler kapalı.");
}

void loop()
{
  Blynk.run();    // Blynk bağlantısını çalıştır
  timer.run();    // Zamanlayıcıyı çalıştır
}

// Röle kontrolü için Blynk sanal pinlerini ayarla
BLYNK_WRITE(V0)
{
  int value = param.asInt();
  digitalWrite(RELAY_1, value == 1 ? LOW : HIGH); // Röle 1 kontrolü
}

BLYNK_WRITE(V1)
{
  int value = param.asInt();
  digitalWrite(RELAY_2, value == 1 ? LOW : HIGH); // Röle 2 kontrolü
}

BLYNK_WRITE(V2)
{
  int value = param.asInt();
  digitalWrite(RELAY_3, value == 1 ? LOW : HIGH); // Röle 3 kontrolü
}

BLYNK_WRITE(V3)
{
  int value = param.asInt();
  digitalWrite(RELAY_4, value == 1 ? LOW : HIGH); // Röle 4 kontrolü
}
