#include <WiFi.h>
#include "ThingSpeak.h"
#define LED_BUILTIN 2
#define ECHO_PIN 18
#define TRIG_PIN 19
const int irPin = 5; // IR sensor input
const int redLed = 4; // Red LED output
const char* ssid = "Wokwi-GUEST";
const char* password = "";
WiFiClient client;
// ThingSpeak Settings
unsigned long channelID = 3016367;
const char* writeAPIKey = "3TJCHJTDN4X80XIL";
// Violation handling
unsigned long lastViolationTime = 0;
const unsigned long cooldownPeriod = 1000; // 1 second
void setup() {
Serial.begin(115200);
pinMode(irPin, INPUT);
pinMode(redLed, OUTPUT);
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
pinMode(LED_BUILTIN, OUTPUT); // Make sure it's defined
// WiFi Connection
WiFi.begin(ssid, password);
Serial.print("Connecting to WiFi");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nConnected to WiFi!");
ThingSpeak.begin(client);
}
float readDistanceCM() {
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
int duration = pulseIn(ECHO_PIN, HIGH, 30000); // 30ms timeout
return duration * 0.034 / 2;
}
void loop() {
// Reconnect WiFi if disconnected
if (WiFi.status() != WL_CONNECTED) {
Serial.println("WiFi disconnected. Reconnecting...");
WiFi.begin(ssid, password);
delay(1000);
return;
}
int sensorValue = digitalRead(irPin);
unsigned long currentTime = millis();
digitalWrite(redLed, LOW); // Default OFF
float distance = readDistanceCM();
bool isNearby = distance < 100;
digitalWrite(LED_BUILTIN, isNearby ? HIGH : LOW);
Serial.print("Measured distance: ");
Serial.print(distance);
Serial.println(" cm");
// If IR detects and object is nearby and cooldown passed
if (sensorValue == LOW && isNearby && (currentTime - lastViolationTime >= cooldownPeriod)) {
Serial.println("Violation Detected!");
digitalWrite(redLed, HIGH);
delay(1000);
digitalWrite(redLed, LOW);
// Send data to ThingSpeak
ThingSpeak.setField(1, "Violation");
ThingSpeak.setField(2, String(currentTime)); // Send timestamp (ms since boot)
int status = ThingSpeak.writeFields(channelID, writeAPIKey);
if (status == 200) {
Serial.println("Data sent to ThingSpeak!");
} else {
Serial.print("Error sending to ThingSpeak: ");
Serial.println(status);
}
lastViolationTime = currentTime;
}
delay(100); // Small delay to avoid CPU overuse
}