#include <WiFi.h>
#include <PubSubClient.h>
#include <Ultrasonic.h>
const int TRIG_PIN = 15;
const int ECHO_PIN = 2;
const int RED_PIN = 21;
const int YELLOW_PIN = 19;
const int GREEN_PIN = 18;
const int BUZZER_PIN = 13;
const char* ssid = "Wokwi-GUEST";
const char* password = "";
const char* mqtt_server = "test.mosquitto.org";
const char* traffic_light_topic = "/traffic_light";
WiFiClient espClient;
PubSubClient client(espClient);
Ultrasonic ultrasonic(TRIG_PIN, ECHO_PIN);
enum DistanceRange { NONE, CLOSE, MEDIUM, FAR };
DistanceRange lastRange = NONE;
void setup_wifi() {
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(200);
}
}
void callback(char* topic, byte* payload, unsigned int length) {}
void reconnect() {
while (!client.connected()) {
String clientId = "ESP8266Client" + String(random(0xffff), HEX);
if (client.connect(clientId.c_str())) {
client.publish(traffic_light_topic, "Connected");
client.subscribe(traffic_light_topic);
} else {
delay(5000);
}
}
}
void setup() {
Serial.begin(115200);
setup_wifi();
client.setServer(mqtt_server, 1883);
client.setCallback(callback);
pinMode(RED_PIN, OUTPUT);
pinMode(YELLOW_PIN, OUTPUT);
pinMode(GREEN_PIN, OUTPUT);
pinMode(BUZZER_PIN, OUTPUT);
}
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
long distance = ultrasonic.distanceRead();
DistanceRange currentRange;
if (distance < 150) {
currentRange = CLOSE;
digitalWrite(RED_PIN, HIGH);
digitalWrite(YELLOW_PIN, LOW);
digitalWrite(GREEN_PIN, LOW);
} else if (distance < 250) {
currentRange = MEDIUM;
digitalWrite(RED_PIN, LOW);
digitalWrite(YELLOW_PIN, HIGH);
digitalWrite(GREEN_PIN, LOW);
} else {
currentRange = FAR;
digitalWrite(RED_PIN, LOW);
digitalWrite(YELLOW_PIN, LOW);
digitalWrite(GREEN_PIN, HIGH);
}
if (currentRange != lastRange) {
lastRange = currentRange;
if (currentRange == CLOSE) {
tone(BUZZER_PIN, 1000); // Play tone at 1000 Hz
delay(1000);
noTone(BUZZER_PIN);
} else if (currentRange == MEDIUM) {
tone(BUZZER_PIN, 500); // Play tone at 500 Hz
delay(1000);
noTone(BUZZER_PIN);
}
else{
tone(BUZZER_PIN, 500); // Play tone at 500 Hz
delay(1000);
noTone(BUZZER_PIN);}
}
String distanceStr = String(distance);
client.publish(traffic_light_topic, distanceStr.c_str());
}