#include <WiFi.h>
#include <ThingSpeak.h>
#include "time.h"
#define DO_PIN 35 // LDR DO output
#define LED_PIN 33 // LED pin
const char* ssid = "Wokwi-GUEST";
const char* password = "";
// ThingSpeak channel info (user provided)
unsigned long myChannelNumber = 2272204UL;
const char* myWriteAPIKey = "E8I7Z8Q88LSYNJDJ";
WiFiClient client;
// NTP server and timezone (IST)
const char* ntpServer = "pool.ntp.org";
const long gmtOffset_sec = 19800; // +5:30
const int daylightOffset_sec = 0;
// ThingSpeak upload interval (ms)
const unsigned long uploadInterval = 20000UL; // 20 seconds
unsigned long lastUpload = 0;
void setup() {
Serial.begin(115200);
pinMode(DO_PIN, INPUT);
pinMode(LED_PIN, OUTPUT);
// Connect to WiFi
WiFi.begin(ssid, password);
Serial.print("Connecting to WiFi");
while (WiFi.status() != WL_CONNECTED) {
delay(300);
Serial.print(".");
}
Serial.println();
Serial.println("WiFi connected");
// Init NTP
configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
// Init ThingSpeak
ThingSpeak.begin(client);
}
void loop() {
// Get current local time
struct tm timeinfo;
if (!getLocalTime(&timeinfo)) {
Serial.println("Failed to obtain time");
// still continue, but skip time-based checks for now
}
int hourNow = timeinfo.tm_hour; // 0-23
int minuteNow = timeinfo.tm_min;
// Read LDR digital output
int lightState = digitalRead(DO_PIN); // 0 = dark, 1 = bright
// Define night window 18:00 - 05:59
bool isNightTime = (hourNow >= 18 || hourNow < 6);
// Determine LED state based on time + LDR
int ledState = 0;
if (isNightTime && lightState == 0) {
digitalWrite(LED_PIN, HIGH);
ledState = 1;
} else {
digitalWrite(LED_PIN, LOW);
ledState = 0;
}
// Debug print
Serial.printf("Time %02d:%02d | LDR DO=%d | Night=%d | LED=%d\n",
hourNow, minuteNow, lightState, isNightTime ? 1 : 0, ledState);
// Upload to ThingSpeak at defined interval
unsigned long now = millis();
if (now - lastUpload >= uploadInterval) {
lastUpload = now;
ThingSpeak.setField(1, lightState); // field1 = LDR DO
ThingSpeak.setField(2, ledState); // field2 = LED state
ThingSpeak.setField(3, hourNow); // field3 = hour for reference
int response = ThingSpeak.writeFields(myChannelNumber, myWriteAPIKey);
if (response == 200) {
Serial.println("ThingSpeak: update successful");
} else {
Serial.printf("ThingSpeak: update failed, code=%d\n", response);
}
}
delay(500); // small delay for responsiveness
}