#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
Adafruit_SSD1306 oled(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
const int relePin = 12;
const int pinGreen = 25;
const int pinYellow = 26;
const int pinRed = 27;
const int potPin = 34;
int indice = 0;
bool ativarLed = false;
bool releLigado = false;
unsigned long tempoAnterior = 0;
void setup() {
pinMode(pinRed, OUTPUT);
pinMode(pinYellow, OUTPUT);
pinMode(pinGreen, OUTPUT);
pinMode(relePin, OUTPUT);
digitalWrite(pinGreen, HIGH);
if (!oled.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 allocation failed"));
while (true);
}
oled.clearDisplay();
}
void loop() {
int potRead = analogRead(potPin);
int velocidadeLed = map(potRead, 0, 4095, 500, 50);
modoCascata(velocidadeLed);
if(velocidadeLed > 100){estadoRele(0); texto("SEGURO", "");}
else {estadoRele(1); texto("PERIGO!", "Manter distancia!");}
delay(50);
}
void modoCascata(int velocidade){
int leds[] = {pinGreen, pinYellow, pinRed};
if(millis() - tempoAnterior >= velocidade){
digitalWrite(leds[indice], LOW);
tempoAnterior = millis();
indice++;
if(indice >= 3){
indice = 0;
}
digitalWrite(leds[indice], HIGH);
}
}
void estadoRele(bool rele){
digitalWrite(relePin, rele);
}
void texto(const char* perigo, const char* risco){
oled.clearDisplay();
oled.setTextSize(1);
oled.setTextColor(WHITE);
oled.setCursor(0, 20);
oled.print(perigo);
oled.setCursor(0, 28);
oled.print(risco);
oled.display();
}