#include <WiFi.h>
#include <HTTPClient.h>
#include <DHTesp.h>
// WiFi Credentials
const char* ssid = "Wokwi-GUEST";
const char* pass = "";
// ThingSpeak API Key and Channel
const char* apiKey = "N7MEBOTUEC7RKM7W"; // Ganti dengan API Key ThingSpeak Anda
const char* server = "http://api.thingspeak.com/update";
// Pin Definitions
const int DHT_PIN = 15; // Pin untuk sensor DHT22
const int PIR1_PIN = 17; // Pin untuk PIR1
const int PIR2_PIN = 16; // Pin untuk PIR2
const int RELAY_PIN = 26; // Pin untuk relay lampu
const int LED_PIN = 33; // LED indikator
const int TRIG_PIN = 5; // Pin trig untuk ultrasonik
const int ECHO_PIN = 4; // Pin echo untuk ultrasonik
const int BUTTON_PIN = 14; // Pin untuk tombol push button
// DHT Sensor
DHTesp dhtSensor;
float suhu, kelembaban;
// Variables
bool lampStatus = false; // Status lampu
bool buttonPressed = false; // Status tombol
int peopleCount = 0; // Jumlah orang di ruangan
// Variabel tambahan untuk timer
unsigned long lastMovementTime = 0; // Waktu terakhir ada gerakan
const unsigned long noMovementDelay = 10000; // Waktu tunda (10 detik)
// Ultrasonic Function
float getDistance() {
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
int duration = pulseIn(ECHO_PIN, HIGH);
return duration * 0.034 / 2;
}
// Kirim Data ke ThingSpeak
void sendDataToThingSpeak() {
if (WiFi.status() == WL_CONNECTED) {
HTTPClient http;
String url = String(server) + "?api_key=" + apiKey +
"&field1=" + String(suhu) +
"&field2=" + String(kelembaban) +
"&field3=" + String(getDistance()) +
"&field4=" + String(lampStatus) +
"&field5=" + String(peopleCount);
http.begin(url);
int httpResponseCode = http.GET();
if (httpResponseCode > 0) {
Serial.println("Data sent to ThingSpeak. Response code: " + String(httpResponseCode));
} else {
Serial.println("Error sending data to ThingSpeak. Response code: " + String(httpResponseCode));
}
http.end();
} else {
Serial.println("WiFi not connected. Data not sent to ThingSpeak.");
}
}
// Tampilkan Data pada Serial Monitor
void printDataToSerial() {
Serial.println("===== SENSOR DATA =====");
Serial.println("Suhu: " + String(suhu, 1) + " °C");
Serial.println("Kelembaban: " + String(kelembaban, 1) + " %");
Serial.println("Tinggi Air: " + String(getDistance(), 1) + " cm");
Serial.println("Lampu: " + String(lampStatus ? "ON" : "OFF"));
Serial.println("Jumlah Orang: " + String(peopleCount));
Serial.println("========================");
}
// Setup
void setup() {
Serial.begin(115200);
// Initialize WiFi
WiFi.begin(ssid, pass);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nWiFi connected.");
// Initialize Sensor and Pins
dhtSensor.setup(DHT_PIN, DHTesp::DHT22);
pinMode(PIR1_PIN, INPUT);
pinMode(PIR2_PIN, INPUT);
pinMode(RELAY_PIN, OUTPUT);
pinMode(LED_PIN, OUTPUT);
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
pinMode(BUTTON_PIN, INPUT_PULLUP); // Tombol dengan pull-up
}
// Loop
void loop() {
// DHT22 Data
TempAndHumidity data = dhtSensor.getTempAndHumidity();
suhu = data.temperature;
kelembaban = data.humidity;
// PIR Detection
int pir1State = digitalRead(PIR1_PIN);
int pir2State = digitalRead(PIR2_PIN);
if (pir1State == HIGH || pir2State == HIGH) {
peopleCount = 2; // Jika kedua PIR mendeteksi gerakan
lastMovementTime = millis(); // Reset timer ketika ada gerakan
} else {
peopleCount = 0; // Tidak ada gerakan
}
// Matikan lampu jika tidak ada gerakan selama lebih dari 10 detik
if (peopleCount == 0 && (millis() - lastMovementTime > noMovementDelay)) {
lampStatus = false;
digitalWrite(RELAY_PIN, LOW);
digitalWrite(LED_PIN, LOW);
Serial.println("Lampu otomatis dimatikan karena tidak ada orang di ruangan!");
delay(5000);
}
// Handle Push Button
int buttonState = digitalRead(BUTTON_PIN);
if (buttonState == LOW && !buttonPressed) {
buttonPressed = true; // Tandai tombol ditekan
lampStatus = !lampStatus; // Toggle lampu
digitalWrite(RELAY_PIN, lampStatus);
digitalWrite(LED_PIN, lampStatus);
Serial.println("Lampu dikontrol melalui tombol!");
delay(300); // Debouncing
}
if (buttonState == HIGH) {
buttonPressed = false; // Reset tombol
}
// Kirim Data ke ThingSpeak setiap 15 detik
static unsigned long lastSendTime = 0;
if (millis() - lastSendTime >= 5000) { // 5 detik
printDataToSerial(); // Tampilkan data di Serial Monitor
sendDataToThingSpeak(); // Kirim data ke ThingSpeak
lastSendTime = millis();
}
}