#include <PubSubClient.h>
#include <WiFi.h>
#define NUM_JALUR 4
int redPins[NUM_JALUR] = {13, 27, 33, 19};
int yellowPins[NUM_JALUR] = {12, 26, 32, 18};
int greenPins[NUM_JALUR] = {14, 25, 23, 5};
enum LampuStatus {
LAMPU_HIJAU,
LAMPU_KUNING,
LAMPU_MERAH
};
WiFiClient espClient;
PubSubClient client(espClient);
const char *ssid = "www.jasatukanglistrik.com";
const char *password = "suksesterus";
const char *mqttServer = "3ef7e525f8474fde88d328280a4bfd6f.s2.eu.hivemq.cloud";
const int mqttPort = 8883;
const char *mqttUsername = "ipulcatur";
const char *mqttPassword = "Ipulcatur37";
const char *mqttTopic = "delay";
int currentDelay = 5000; // Default delay
void setTrafficLight(int activeLane, LampuStatus status) {
for (int i = 0; i < NUM_JALUR; i++) {
if (i == activeLane) {
digitalWrite(redPins[i], (status == LAMPU_HIJAU) ? LOW : HIGH);
digitalWrite(yellowPins[i], (status == LAMPU_KUNING) ? HIGH : LOW);
digitalWrite(greenPins[i], (status == LAMPU_MERAH) ? LOW : HIGH);
} else {
digitalWrite(redPins[i], HIGH);
digitalWrite(yellowPins[i], LOW);
digitalWrite(greenPins[i], LOW); // Jalur non-aktif - Lampu merah
}
}
}
void callback(char *topic, byte *payload, unsigned int length) {
String message;
for (int i = 0; i < length; i++) {
message += (char)payload[i];
}
int newDelay = message.toInt();
if (newDelay > 0) {
currentDelay = newDelay;
}
}
void reconnect() {
while (!client.connected()) {
Serial.println("Attempting MQTT connection...");
if (client.connect("ESP32Client", mqttUsername, mqttPassword)) {
Serial.println("Connected to MQTT broker");
client.subscribe(mqttTopic);
} else {
Serial.print("Failed, rc=");
Serial.print(client.state());
Serial.println(" Retrying in 2 seconds...");
delay(2000);
}
}
}
void setup() {
Serial.begin(115200);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connecting to WiFi...");
}
Serial.println("Connected to WiFi");
client.setServer(mqttServer, mqttPort);
client.setCallback(callback);
for (int i = 0; i < NUM_JALUR; i++) {
pinMode(redPins[i], OUTPUT);
pinMode(yellowPins[i], OUTPUT);
pinMode(greenPins[i], OUTPUT);
}
}
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
setTrafficLight(0, LAMPU_KUNING); // Jalur 1 - Kuning, Jalur 2-4 - Merah
delay(2000); // Tunggu 2 detik
setTrafficLight(0, LAMPU_HIJAU); // Jalur 1 - Hijau, Jalur 2-4 - Merah
delay(currentDelay); // Tunggu sesuai settingan
setTrafficLight(0, LAMPU_KUNING); // Jalur 1 - Kuning, Jalur 2-4 - Merah
delay(2000); // Tunggu 2 detik
setTrafficLight(1, LAMPU_KUNING); // Jalur 2 - Kuning, Jalur 1,3,4 - Merah
delay(2000); // Tunggu 2 detik
setTrafficLight(1, LAMPU_HIJAU); // Jalur 2 - Hijau, Jalur 1,3,4 - Merah
delay(currentDelay); // Tunggu sesuai settingan
setTrafficLight(1, LAMPU_KUNING); // Jalur 2 - Kuning, Jalur 1,3,4 - Merah
delay(2000); // Tunggu 2 detik
setTrafficLight(2, LAMPU_KUNING); // Jalur 3 - Kuning, Jalur 1,2,4 - Merah
delay(2000); // Tunggu 2 detik
setTrafficLight(2, LAMPU_HIJAU); // Jalur 3 - Hijau, Jalur 1,2,4 - Merah
delay(currentDelay); // Tunggu sesuai settingan
setTrafficLight(2, LAMPU_KUNING); // Jalur 3 - Kuning, Jalur 1,2,4 - Merah
delay(2000); // Tunggu 2 detik
setTrafficLight(3, LAMPU_KUNING); // Jalur 4 - Kuning, Jalur 1,2,3 - Merah
delay(2000); // Tunggu 2 detik
setTrafficLight(3, LAMPU_HIJAU); // Jalur 4 - Hijau, Jalur 1,2,3 - Merah
delay(currentDelay); // Tunggu sesuai settingan
setTrafficLight(3, LAMPU_KUNING); // Jalur 4 - Kuning, Jalur 1,2,3 - Merah
delay(2000); // Tunggu 2 detik
}