#include <WiFi.h>
//#include "DHTesp.h"
#include <DHT.h>
#include "ThingSpeak.h"

// Define DHT sensor type and pins
#define DHTPIN1 32
#define DHTPIN2 33
#define DHTPIN3 26
#define DHTPIN4 25
DHT dht1(DHTPIN1, DHT22);
DHT dht2(DHTPIN2, DHT22);
DHT dht3(DHTPIN3, DHT22);
DHT dht4(DHTPIN4, DHT22);

// Define relay pins for humidity control
#define RELAY_EXHAUST_FAN_PIN 23
#define RELAY_HUMIDIFIER_PIN 23 

// Define relay pins for temperature control
#define RELAY_LIGHT_BULB_HEATER_PIN 2
#define RELAY_AIR_CON_PIN 15

// Wifi Credentials
const char* WIFI_NAME = "Wokwi-GUEST";
const char* WIFI_PASSWORD = "";
const int myChannelNumber = 2573552;
const char* myApiKey = "3ZLV3D6J0ELOILQ3";
const char* server = "api.thingspeak.com";

WiFiClient client;

void setup() {
  Serial.begin(115200);

  pinMode(DHTPIN1, INPUT);
  pinMode(DHTPIN2, INPUT);
  pinMode(DHTPIN3, INPUT);
  pinMode(DHTPIN4, INPUT);

  // Initialization of Wifi
  WiFi.begin(WIFI_NAME, WIFI_PASSWORD);
  while (WiFi.status() != WL_CONNECTED){
    delay(1000);
    Serial.println("Wifi not connected");
  }
  Serial.println("Wifi connected !");
  Serial.println("Local IP: " + String(WiFi.localIP()));
  WiFi.mode(WIFI_STA);


  ThingSpeak.begin(client);
}

void loop() {
  // Reading temperature and humidity from all sensors
  float humidity1 = dht1.readHumidity();
  float temperature1 = dht1.readTemperature();
  float humidity2 = dht2.readHumidity();
  float temperature2 = dht2.readTemperature();
  float humidity3 = dht3.readHumidity();
  float temperature3 = dht3.readTemperature();
  float humidity4 = dht4.readHumidity();
  float temperature4 = dht4.readTemperature();

  // Calculate average humidity and temperature
  float avgHumidity = (humidity1 + humidity2 + humidity3 + humidity4) / 4.0;
  float avgTemperature = (temperature1 + temperature2 + temperature3 + temperature4) / 4.0;

  // Print data to Serial Monitor
  Serial.print("T1: ");
  Serial.print(temperature1);
  Serial.print("C H1: ");
  Serial.print(humidity1);
  Serial.print("%\t");

  Serial.print(" | T2: ");
  Serial.print(temperature2);
  Serial.print("C H2: ");
  Serial.print(humidity2);
  Serial.println("%\t");

  Serial.print("T3: ");
  Serial.print(temperature3);
  Serial.print("C H3: ");
  Serial.print(humidity3);
  Serial.print("%\t");

  Serial.print(" | T4: ");
  Serial.print(temperature4);
  Serial.print("C H4: ");
  Serial.print(humidity4);
  Serial.println("%");

  Serial.print("AVE_T: ");
  Serial.print(avgTemperature);
  Serial.print("C AVE_H: ");
  Serial.print(avgHumidity);
  Serial.println("%");

  // Control relays based on average humidity
  if (avgHumidity > 70) { // If humidity is high, turn on exhaust fan
    digitalWrite(RELAY_EXHAUST_FAN_PIN, HIGH);
    digitalWrite(RELAY_HUMIDIFIER_PIN, LOW);
    Serial.println("Warning: High humidity detected. Exhaust fan is ON.");
  } else if (avgHumidity < 50) { // If humidity is low, turn on humidifier
    digitalWrite(RELAY_HUMIDIFIER_PIN, HIGH);
    digitalWrite(RELAY_EXHAUST_FAN_PIN, LOW);
    Serial.println("Warning: Low humidity detected. Humidifier is ON.");
  } else { // Maintain current state
    digitalWrite(RELAY_EXHAUST_FAN_PIN, LOW);
    digitalWrite(RELAY_HUMIDIFIER_PIN, LOW);
    Serial.println("Info: Humidity is within the normal range. All humidity control systems are OFF.");
  }

  // Control relays based on average temperature
  if (avgTemperature > 32) { // If temperature is high, turn on air conditioner
    digitalWrite(RELAY_AIR_CON_PIN, HIGH);
    digitalWrite(RELAY_LIGHT_BULB_HEATER_PIN, LOW);
    Serial.println("Warning: High temperature detected. Air conditioner is ON.");
  } else if (avgTemperature < 18) { // If temperature is low, turn on light bulb heater
    digitalWrite(RELAY_LIGHT_BULB_HEATER_PIN, HIGH);
    digitalWrite(RELAY_AIR_CON_PIN, LOW);
    Serial.println("Warning: Low temperature detected. Light bulb heater is ON.");
  } else { // Maintain current state
    digitalWrite(RELAY_LIGHT_BULB_HEATER_PIN, LOW);
    digitalWrite(RELAY_AIR_CON_PIN, LOW);
    Serial.println("Info: Temperature is within the normal range. All temperature control systems are OFF.");
  }

  // Pushing Data to ThingSpeak
  int x = ThingSpeak.writeFields(myChannelNumber, myApiKey);
  uploadToThingSpeak(x, avgHumidity, avgTemperature);

  delay(15000);
}

void uploadToThingSpeak(int x, float humidity, float temperature){
  ThingSpeak.setField(1, temperature);
  ThingSpeak.setField(2, humidity);
  if(x == 200){
    Serial.println("Data pushed successfull");
  }else{
    Serial.println("Push error" + String(x));
  }
  Serial.println("---");
}
$abcdeabcde151015202530fghijfghij
NOCOMNCVCCGNDINLED1PWRRelay Module
NOCOMNCVCCGNDINLED1PWRRelay Module
NOCOMNCVCCGNDINLED1PWRRelay Module
NOCOMNCVCCGNDINLED1PWRRelay Module