#define BLYNK_TEMPLATE_ID "TMPL3msbIDVFK"
#define BLYNK_TEMPLATE_NAME "maha plant "
#define BLYNK_AUTH_TOKEN "E1zTx2hhhoLg6NQu431eoPvLiIH-YzhZ"

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

// Wi-Fi Credentials
const char* ssid = "Wokwi-GUEST";
const char* password = ""; // No password required

// Sensor and Relay Pins
#define DHTPIN 4         // DHT22 Data Pin
#define DHTTYPE DHT22    // Define DHT Type
#define SOIL1_PIN 34     // Soil Moisture 1
#define SOIL2_PIN 35     // Soil Moisture 2
#define LDR_PIN 36       // Light Sensor
#define PH_PIN 32        // pH Sensor
#define RELAY_WATER1 25  // Relay for Water Pump 1
#define RELAY_WATER2 26  // Relay for Water Pump 2
#define RELAY_LIGHT1 27   // Relay for Grow Light (Choose 27 or 14, not both)
#define RELAY_LIGHT2 14 
DHT dht(DHTPIN, DHTTYPE);

// Initialize Blynk
BlynkTimer timer;

// Function to Read Sensors and Send Data to Blynk
void sendSensorData() {
    float temperature = dht.readTemperature();
    float humidity = dht.readHumidity();
    int soil1 = analogRead(V0);
    int soil2 = analogRead(V1);
    int light = analogRead(V4);
    int pH = analogRead(V5);
    

    // Send Data to Blynk
    Blynk.virtualWrite(V2, temperature);
    Blynk.virtualWrite(V3, humidity);
    Blynk.virtualWrite(V0, soil1);
    Blynk.virtualWrite(V1, soil2);
    Blynk.virtualWrite(V4, light);
    Blynk.virtualWrite(V5, pH);

    // Automatic Watering Based on Soil Moisture
    digitalWrite(RELAY_WATER1, soil1 < 1000 ? LOW : HIGH);
    digitalWrite(RELAY_WATER2, soil2 < 1000 ? LOW : HIGH);

    // Turn ON Grow Light if Light Level is Low
    digitalWrite(RELAY_LIGHT1, light < 800 ? LOW : HIGH);
    digitalWrite(RELAY_LIGHT2, light < 800 ? LOW : HIGH);
}

void setup() {
    Serial.begin(115200);
    Blynk.begin(BLYNK_AUTH_TOKEN, ssid, password);
    dht.begin();
    
    // Set Relay Pins as Output
    pinMode(RELAY_WATER1, OUTPUT);
    pinMode(RELAY_WATER2, OUTPUT);
    pinMode(RELAY_LIGHT1, OUTPUT);
    pinMode(RELAY_LIGHT2, OUTPUT);


    // Default State: All OFF
    digitalWrite(RELAY_WATER1, HIGH);
    digitalWrite(RELAY_WATER2, HIGH);
    digitalWrite(RELAY_LIGHT1, HIGH);
    pinMode(RELAY_LIGHT2, OUTPUT);


    // Set Timer to Send Data Every 2 Seconds
    timer.setInterval(2000L, sendSensorData);
}

void loop() {
    Blynk.run();
    timer.run();
}


esp:VIN
esp:GND.2
esp:D13
esp:D12
esp:D14
esp:D27
esp:D26
esp:D25
esp:D33
esp:D32
esp:D35
esp:D34
esp:VN
esp:VP
esp:EN
esp:3V3
esp:GND.1
esp:D15
esp:D2
esp:D4
esp:RX2
esp:TX2
esp:D5
esp:D18
esp:D19
esp:D21
esp:RX0
esp:TX0
esp:D22
esp:D23
soil1:GND
soil1:SIG
soil1:VCC
soil2:GND
soil2:SIG
soil2:VCC
dht1:VCC
dht1:SDA
dht1:NC
dht1:GND
ph:GND
ph:SIG
ph:VCC
ldr1:VCC
ldr1:GND
ldr1:DO
ldr1:AO
NOCOMNCVCCGNDINLED1PWRRelay Module
relay5:VCC
relay5:GND
relay5:IN
relay5:NC
relay5:COM
relay5:NO
NOCOMNCVCCGNDINLED1PWRRelay Module
relay6:VCC
relay6:GND
relay6:IN
relay6:NC
relay6:COM
relay6:NO
NOCOMNCVCCGNDINLED1PWRRelay Module
relay7:VCC
relay7:GND
relay7:IN
relay7:NC
relay7:COM
relay7:NO
NOCOMNCVCCGNDINLED1PWRRelay Module
relay8:VCC
relay8:GND
relay8:IN
relay8:NC
relay8:COM
relay8:NO