#include <DHT.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <ESP32Servo.h>
#include <WiFi.h>

#define DHTPIN 2         // Digital pin connected to the DHT sensor
#define DHTTYPE DHT22    // DHT sensor type
#define LCD_COLUMNS 16   // Number of columns on the LCD
#define LCD_ROWS 2       // Number of rows on the LCD
#define SERVO_PIN 9      // Digital pin connected to the servo

// ThingSpeak parameters
const char *ssid = "YourWiFiSSID";
const char *password = "YourWiFiPassword";
const char *thingSpeakApiKey = "YourThingSpeakAPIKey";
const char *thingSpeakHost = "api.thingspeak.com";
const char *thingSpeakField1 = "field1";
const char *thingSpeakField2 = "field2";

DHT dht(DHTPIN, DHTTYPE);
LiquidCrystal_I2C lcd(0x27, LCD_COLUMNS, LCD_ROWS);
ESP32Servo servo;

void setup() {
  Serial.begin(9600);
  dht.begin();
  lcd.begin(LCD_COLUMNS, LCD_ROWS); // Provide arguments for columns and rows
  lcd.backlight();
  servo.attach(SERVO_PIN);

  // Connect to WiFi
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.println("Connecting to WiFi...");
  }
  Serial.println("Connected to WiFi");
}

void loop() {
  // Read temperature and humidity
  float temperature = dht.readTemperature();
  float humidity = dht.readHumidity();

  // Print readings to Serial Monitor
  Serial.print("Temperature: ");
  Serial.print(temperature);
  Serial.print(" °C, Humidity: ");
  Serial.print(humidity);
  Serial.println("%");

  // Upload data to ThingSpeak
  uploadToThingSpeak(temperature, humidity);

  // Check if conditions are met for servo activation
  if (temperature >= 35 && humidity >= 85) {
    // Activate servo
    servo.write(180);
    delay(500);
    servo.write(0);
    delay(500);
  }

  // Display readings on LCD
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Temp: ");
  lcd.print(temperature);
  lcd.print(" C");
  lcd.setCursor(0, 1);
  lcd.print("Humidity: ");
  lcd.print(humidity);
  lcd.print("%");

  delay(5000); // Delay between readings
}

void uploadToThingSpeak(float temperature, float humidity) {
  // Create a TCP/IP client
  WiFiClient client;
  if (!client.connect(thingSpeakHost, 80)) {
    Serial.println("Failed to connect to ThingSpeak");
    return;
  }

  // Create a HTTP request string
  String data = String("GET /update?api_key=") + thingSpeakApiKey;
  data += "&" + String(thingSpeakField1) + "=" + String(temperature);
  data += "&" + String(thingSpeakField2) + "=" + String(humidity);
  data += " HTTP/1.1\r\nHost: " + String(thingSpeakHost) + "\r\nConnection: close\r\n\r\n";

  // Send the HTTP request
  client.print(data);

  // Wait for response
  delay(1000);

  // Read response from ThingSpeak (optional)
  while (client.available()) {
    String line = client.readStringUntil('\r');
    Serial.print(line);
  }

  // Disconnect from ThingSpeak
  client.stop();
}
$abcdeabcde151015202530fghijfghij