#include <WiFi.h>
#include <ThingSpeak.h>
WiFiClient client;
long myChannelNumber = 2724688;
const char * myWriteAPIKey = "Y1655SIEUI2VTS1R";
char ssid[] = "Wokwi-GUEST";
char pass[] = "";
#define LDR_PIN 25
#define TRIG_PIN 15
#define ECHO_PIN 22
#define PIR_PIN 13
#define LUMINANCE_PIN 23 // Assuming you have a PWM pin for luminance control
#define RELAY1_PIN 4
#define RELAY2_PIN 5
#define RELAY3_PIN 18
#define RELAY4_PIN 19
#define LUMINANCE_CHANNEL 0 // Define a channel for PWM
void setup() {
Serial.begin(115200);
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
pinMode(PIR_PIN, INPUT);
pinMode(RELAY1_PIN, OUTPUT);
pinMode(RELAY2_PIN, OUTPUT);
pinMode(RELAY3_PIN, OUTPUT);
pinMode(RELAY4_PIN, OUTPUT);
pinMode(LUMINANCE_PIN, OUTPUT); // Pin for luminance control
digitalWrite(RELAY1_PIN, LOW);
digitalWrite(RELAY2_PIN, LOW);
digitalWrite(RELAY3_PIN, LOW);
digitalWrite(RELAY4_PIN, LOW);
// Setup PWM for luminance control
ledcSetup(LUMINANCE_CHANNEL, 5000, 8); // 5 kHz, 8-bit resolution
ledcAttachPin(LUMINANCE_PIN, LUMINANCE_CHANNEL); // Attach the pin to the channel
WiFi.begin(ssid, pass);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("Connected to WiFi");
ThingSpeak.begin(client);
}
void loop() {
float ldrValue = analogRead(LDR_PIN);
long duration, distance;
// Ultrasonic sensor
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
duration = pulseIn(ECHO_PIN, HIGH);
distance = (duration * 0.034 / 2); // Distance in cm
// PIR sensor
int pirValue = digitalRead(PIR_PIN);
// Luminance control based on distance
if (distance <= 50) {
ledcWrite(LUMINANCE_CHANNEL, 255); // Full luminance
} else if (distance <= 100) {
ledcWrite(LUMINANCE_CHANNEL, 200); // High luminance
} else if (distance <= 150) {
ledcWrite(LUMINANCE_CHANNEL, 150); // Medium luminance
} else if (distance <= 200) {
ledcWrite(LUMINANCE_CHANNEL, 100); // Low luminance
} else {
ledcWrite(LUMINANCE_CHANNEL, 0); // No luminance
}
// Relay control based on sensor values
digitalWrite(RELAY1_PIN, ldrValue < 500 ? HIGH : LOW);
digitalWrite(RELAY2_PIN, distance < 10 ? HIGH : LOW);
digitalWrite(RELAY3_PIN, pirValue == HIGH ? HIGH : LOW);
// Send data to ThingSpeak
ThingSpeak.setField(1, ldrValue);
ThingSpeak.setField(2, distance);
ThingSpeak.setField(3, pirValue);
if (ThingSpeak.writeFields(myChannelNumber, myWriteAPIKey) == 200) {
Serial.println("Data sent successfully");
} else {
Serial.println("Error sending data");
}
// Check for relay control from ThingSpeak
int relayControlValue = ThingSpeak.readField(myChannelNumber, 4); // Assuming relay control is on field 4
digitalWrite(RELAY4_PIN, relayControlValue == 1 ? HIGH : LOW);
delay(20000); // Wait 20 seconds before the next update
}