#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
#define OLED_ADDR 0x3C // I2C address for the SSD1306 display
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_ADDR);
const int redLED = 2;
const int yellowLED = 3;
const int greenLED = 4;
void setup() {
Serial.begin(9600);
if(!display.begin(SSD1306_SWITCHCAPVCC, OLED_ADDR)) {
Serial.println(F("SSD1306 allocation failed"));
for(;;);
}
pinMode(redLED, OUTPUT);
pinMode(yellowLED, OUTPUT);
pinMode(greenLED, OUTPUT);
}
void loop() {
controlTrafficLights(); // Control traffic lights
displayText(); // Display text on OLED based on the traffic light state
}
void controlTrafficLights() {
digitalWrite(redLED, HIGH);
delay(5000);
digitalWrite(yellowLED, HIGH);
delay(2000);
digitalWrite(redLED, LOW);
digitalWrite(yellowLED, LOW);
digitalWrite(greenLED, HIGH);
delay(5000);
digitalWrite(greenLED, LOW);
digitalWrite(yellowLED, HIGH);
delay(2000);
digitalWrite(yellowLED, LOW);
}
void displayText() {
int state = millis() / 2000 % 3; // Change text every 2 seconds
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
switch (state) {
case 0:
display.println("STOP");
break;
case 1:
display.println("SLOW DOWN");
break;
case 2:
display.println("GO");
break;
default:
display.println("ERROR");
break;
}
display.display();
}