#include <WiFi.h>
#include <HTTPClient.h>
// WiFi
const char* ssid = "Wokwi-GUEST";
const char* password = "";
// ThingSpeak
const char* server = "http://api.thingspeak.com/update";
const char* apiKey = "43TZ4FCFN71ABKCN";
#define PIR_PIN 14
#define LDR_PIN 34
#define LED_PIN 26
#define RELAY_PIN 27
#define SERVO_PIN 25
#define SERVO_FREQ 50
#define SERVO_RES 16
#define SERVO_MIN_US 500
#define SERVO_MAX_US 2500
int lightThreshold = 2000;
static uint32_t usToDuty(uint32_t us) {
const uint32_t periodUs = 1000000UL / SERVO_FREQ;
const uint32_t maxDuty = (1UL << SERVO_RES) - 1;
return (uint32_t)((uint64_t)us * maxDuty / periodUs);
}
void setup() {
pinMode(PIR_PIN, INPUT);
pinMode(LED_PIN, OUTPUT);
pinMode(RELAY_PIN, OUTPUT);
ledcAttach(SERVO_PIN, SERVO_FREQ, SERVO_RES);
ledcWrite(SERVO_PIN, usToDuty(SERVO_MIN_US));
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
}
}
void loop() {
int motion = digitalRead(PIR_PIN);
int light = analogRead(LDR_PIN);
if (motion) {
digitalWrite(RELAY_PIN, HIGH);
ledcWrite(SERVO_PIN, usToDuty((SERVO_MIN_US + SERVO_MAX_US) / 2));
digitalWrite(LED_PIN, light < lightThreshold);
} else {
digitalWrite(RELAY_PIN, LOW);
digitalWrite(LED_PIN, LOW);
ledcWrite(SERVO_PIN, usToDuty(SERVO_MIN_US));
}
if (WiFi.status() == WL_CONNECTED) {
HTTPClient http;
String url = String(server) +
"?api_key=" + apiKey +
"&field1=" + String(motion) +
"&field2=" + String(light);
http.begin(url);
http.GET();
http.end();
}
delay(15000);
}