#include <WiFi.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include "DHTesp.h"
#include <Servo.h>
#include <WiFi.h>  
#include "ThingSpeak.h"

#define LIGHT_SENSOR_PIN 34
const int DHT_PIN     = 15;
#define SERVO_PIN 26

Servo servoMotor;
DHTesp    dhtSensor;
LiquidCrystal_I2C lcd = LiquidCrystal_I2C(0x27, 20, 4);

#define NTP_SERVER     "pool.ntp.org"
#define UTC_OFFSET     0
#define UTC_OFFSET_DST 0

const char* apiKey   = "G0P2KTS8UZYS5ECR";
const char* resource = "/update?api_key=";
const char* server   = "api.thingspeak.com";


int ledPin    = 23  ;     
int kipas     = 19  ;
int heater    = 18  ;     
int inputPin  = 2   ;            
int pirState  = LOW ;            
int val       = 0   ;   

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

  lcd.init();
  lcd.backlight();
  lcd.setCursor(0, 0);
  pinMode (ledPin, OUTPUT);
  pinMode (kipas, OUTPUT);
  pinMode (heater, OUTPUT);
  pinMode (inputPin, INPUT);
  dhtSensor.setup(DHT_PIN, DHTesp::DHT22);
  servoMotor.attach(SERVO_PIN);

  lcd.print("Connecting to ");
  lcd.setCursor(0, 1);
  lcd.print("WiFi ");

  WiFi.begin("Wokwi-GUEST", "", 6);
  while (WiFi.status() != WL_CONNECTED) {
    delay(250);
    spinner();
  }

  Serial.println("");
  Serial.println("WiFi connected");
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());

  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.println("Online");
  lcd.setCursor(0, 1);
  lcd.println("Updating time...");

  configTime(UTC_OFFSET, UTC_OFFSET_DST, NTP_SERVER);
  printLocalTime();
  delay(250);
}

void loop() 
{
 lcd.clear ();

 printLocalTime();
 suhu ();
 cahaya ();
 sensorpir (); 
}
void suhu ()
{
  TempAndHumidity  data = dhtSensor.getTempAndHumidity();
  Serial.println("Temp: " + String(data.temperature, 2) + "°C");
  Serial.println("Humidity: " + String(data.humidity, 1) + "%");
  Serial.println("---");
  delay(1000);

  Serial.print("Connecting to "); 
  Serial.print(server);
  WiFiClient client;   
  while(!!!client.connect(server, 80)) 
  {
    Serial.print(".");
  }
  Serial.println();
  if(!!!client.connected()) 
  {
    Serial.println("gagal terkoneksi, ke mode sleep");
  }
  Serial.print("Permintaan sumber: "); 
  Serial.println(resource);
  client.print(String("GET ")+resource+apiKey+"&field1="+data.temperature
  +"&field1="+data.humidity
  +"HTTP/1.1\r\n"+"Host: "+server+"\r\n" +"Connection: close\r\n\r\n"); 
  while(!!!client.available())
  {                  
    delay(100);
  }
  if(!!!client.available()) 
  {
    Serial.println("Tidak ada response, going back to sleep");
  }
  while(client.available())
  {
    Serial.write(client.read());
  }
  Serial.println("\nclosing connection");
  client.stop();

  if (data.temperature < 15)
  {
    digitalWrite (heater, HIGH);
    digitalWrite (kipas , LOW);
    lcd.clear ();
    lcd.setCursor (0,2);
    lcd.print("Suhu :");
    lcd.println(data.temperature);
    lcd.setCursor (0,3);
    lcd.print("Suhu Dingin"); 
    delay (1000);    
  }
  else if (data.temperature > 15 && data.temperature <=20)
  {
    digitalWrite (heater, LOW);
    digitalWrite (kipas , LOW);
    lcd.clear ();
    lcd.setCursor (0,2);
    lcd.print("Suhu :");
    lcd.println(data.temperature);
    lcd.setCursor (0,3);
    lcd.print("Suhu Normal");  
    delay (1000);   
  }
  else if (data.temperature > 20)
  {
    digitalWrite (heater, LOW);
    digitalWrite (kipas , HIGH);
    lcd.clear ();
    lcd.setCursor (0,2);
    lcd.print("Suhu :");
    lcd.println(data.temperature);
    lcd.setCursor (0,3);
    lcd.print("Ruangan Panas");
    delay (1000);
  }
}
void cahaya ()
{
  int analogValue = analogRead(LIGHT_SENSOR_PIN);
  Serial.print("Analog Value = ");
  Serial.print(analogValue);  
  
  Serial.print("Connecting to "); 
  Serial.print(server);
  WiFiClient client;   
  while(!!!client.connect(server, 80)) 
  {
    Serial.print(".");
  }
  Serial.println();
  if(!!!client.connected()) 
  {
    Serial.println("gagal terkoneksi, ke mode sleep");
  }
  Serial.print("Permintaan sumber: "); 
  Serial.println(resource);
  client.print(String("GET ")+resource+apiKey+"&field3="+analogValue
  +"HTTP/1.1\r\n"+"Host: "+server+"\r\n" +"Connection: close\r\n\r\n"); 
  while(!!!client.available())
  {                  
    delay(100);
  }
  if(!!!client.available()) 
  {
    Serial.println("Tidak ada response, going back to sleep");
  }
  while(client.available())
  {
    Serial.write(client.read());
  }
  Serial.println("\nclosing connection");
  client.stop();

  if (analogValue < 800) 
  {
    Serial.println(" => Dark");
    tutupjendela ();

    lcd.clear ();
    lcd.setCursor (0,2);
    lcd.print("Cahaya :");
    lcd.println(analogValue);
    lcd.setCursor (0,3);
    lcd.print("Ruangan Gelap");
    delay (1000);
  }  
  else if (analogValue > 1500) 
  {
    Serial.println(" => Light");
    bukajendela ();

    lcd.clear ();
    lcd.setCursor (0,2);
    lcd.print("Cahaya :");
    lcd.println(analogValue);
    lcd.setCursor (0,3);
    lcd.print("Ruangan Terang");
    delay (1000);
  }
}
void sensorpir ()
{
val = digitalRead(inputPin);  
  if (val == HIGH) 
  {
    digitalWrite(ledPin, HIGH);
    if (pirState == LOW) 
    {
      Serial.println("Motion detected!");
      pirState = HIGH;
      lcd.clear ();
      lcd.setCursor (0,0);
      lcd.print     ("Gerakan Terdeteksi");
      lcd.setCursor (0,1);
      lcd.print     ("Lampu Aktif");
      delay (1000);
    }
  } 
  else 
  {
    digitalWrite(ledPin, LOW);
    if (pirState == HIGH) 
    {
      Serial.println("Motion ended!");
      pirState = LOW;
      lcd.clear ();
      lcd.setCursor (0,0);
      lcd.print     ("Tidak Ada Gerakan");
      lcd.setCursor (0,1);
      lcd.print     ("Lampu Mati");
      delay (1000);
    }
  }
}
void bukajendela ()
{
  for (int pos = 0; pos <= 180; pos += 1) 
  {
    servoMotor.write(pos);
    delay(15); 
  }
}
void tutupjendela ()
{
  for (int pos = 180; pos >= 0; pos -= 1) 
  {
    servoMotor.write(pos);
    delay(15); 
  }
}
void spinner() 
{
  static int8_t counter = 0;
  const char* glyphs = "\xa1\xa5\xdb";
  lcd.setCursor(15, 1);
  lcd.print(glyphs[counter++]);
  if (counter == strlen(glyphs)) {
    counter = 0;
  }
}
void printLocalTime() {
  struct tm timeinfo;
  if (!getLocalTime(&timeinfo)) {
    lcd.setCursor(0, 1);
    lcd.println("Connection Err");
    return;
  }
  lcd.setCursor(0, 0);
  lcd.println(&timeinfo, "%H:%M:%S");
  lcd.setCursor(0, 1);
  lcd.println(&timeinfo, "%d/%m/%Y   %Z");
  delay (1000);
}

$abcdeabcde151015202530fghijfghij