#include <WiFi.h>
#include "ThingSpeak.h" // always include thingspeak header file after other header files and custom macros
#include <DHT.h>  
#include <ESP32Servo.h>

#define WIFI_SSID "Wokwi-GUEST"		// replace MySSID with your WiFi network name
#define WIFI_PASSWORD ""	// replace MyPassword with your WiFi password

#define SECRET_CH_ID 2345721			// replace 0000000 with your channel number
#define SECRET_WRITE_APIKEY "1T6RAWURR0KJRX5M"   // replace XYZ with your channel write API Key

#define MQ2_A 35 // define MQ2 analog pin
#define BUT 25
#define buz 33
DHT dht(26, DHT22);
const int servoPin = 14;
float temperature ;
float  humidity;
WiFiClient  client;
Servo servo;

unsigned long myChannelNumber = SECRET_CH_ID;
const char * myWriteAPIKey = SECRET_WRITE_APIKEY;

int A_value;
unsigned long dataMillis = 0;
int k, m;
void setup() {
  Serial.begin(115200);  //Initialize serial
  servo.attach(servoPin, 500, 2400);
  pinMode(MQ2_A, INPUT);
  pinMode(BUT, INPUT_PULLUP);

  pinMode(buz, OUTPUT);
  digitalWrite(buz, LOW);

  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
  Serial.print("Connecting to Wi-Fi");
  while (WiFi.status() != WL_CONNECTED)
  {
      Serial.print(".");
      delay(300);
  }
  Serial.println();
  Serial.print("Connected with IP: ");
  Serial.println(WiFi.localIP());
  Serial.println();

  ThingSpeak.begin(client);  // Initialize ThingSpeak
}

void loop() {

  A_value = analogRead(MQ2_A);
  k = analogRead(MQ2_A);

  temperature  = dht.readTemperature();
  humidity     = dht.readHumidity();

  ThingSpeak.setField(1, temperature);
  ThingSpeak.setField(2, humidity);

  if (millis() - dataMillis > 20000)
  {
    int x = ThingSpeak.writeFields(myChannelNumber, myWriteAPIKey);
    if(x == 200){
      Serial.println("Channel update successful.");
    }
    else {
      Serial.println("Problem updating channel. HTTP error code " + String(x));
    }  
  }

  int value = digitalRead((BUT));
  if(temperature<60){
    digitalWrite(buz, LOW);
    servo.write(90);
    delay(200);
  }else{
    digitalWrite(buz, HIGH);
    servo.write(180);
    delay(200);
  }
}