#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);
}