#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
Adafruit_SSD1306 oled(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
// Definición de Pines (Tal como lo hablamos)
const int TRIG = 13;
const int ECHO = 14;
const int BUZZER = 12;
const int LED_FRENO = 15;
const int PIN_R = 18;
const int PIN_G = 19;
const int PIN_B = 5;
void setup() {
pinMode(TRIG, OUTPUT);
pinMode(ECHO, INPUT);
pinMode(BUZZER, OUTPUT);
pinMode(LED_FRENO, OUTPUT);
pinMode(PIN_R, OUTPUT);
pinMode(PIN_G, OUTPUT);
pinMode(PIN_B, OUTPUT);
if(!oled.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
for(;;);
}
// --- EJERCICIO 1: SALUDO INICIAL ---
oled.clearDisplay();
oled.setTextColor(WHITE);
oled.setTextSize(2);
oled.setCursor(40, 10);
oled.print("Hola");
oled.setCursor(40, 35);
oled.print("Joel");
oled.display();
delay(3000); // Se queda 3 segundos como pediste
}
// Función auxiliar para controlar el color del RGB
void colorRGB(int r, int g, int b) {
digitalWrite(PIN_R, r);
digitalWrite(PIN_G, g);
digitalWrite(PIN_B, b);
}
void loop() {
// Medición de distancia
digitalWrite(TRIG, LOW);
delayMicroseconds(2);
digitalWrite(TRIG, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG, LOW);
long tiempo = pulseIn(ECHO, HIGH);
int dist = tiempo / 58;
oled.clearDisplay();
digitalWrite(LED_FRENO, LOW); // Apagado por defecto
String notaNom = "---";
String frenoMsg = "OFF";
// --- LÓGICA DE RANGOS SEGÚN CONDICIONES ---
// 1. Zona Segura (150cm a 400cm)
if (dist > 150 && dist <= 400) {
colorRGB(0, 1, 0); // VERDE
noTone(BUZZER);
notaNom = "SILENCIO";
}
// 2. Advertencia (80cm a 150cm) - DO Intermitente
else if (dist > 80 && dist <= 150) {
colorRGB(1, 1, 0); // AMARILLO (R+G)
notaNom = "DO (262Hz)";
tone(BUZZER, 262, 100);
delay(300);
}
// 3. Precaución (35cm a 80cm) - RE Intermitente
else if (dist > 35 && dist <= 80) {
colorRGB(1, 0, 0); // ROJO
notaNom = "RE (294Hz)";
tone(BUZZER, 294, 100);
delay(150);
colorRGB(0, 0, 0); // Efecto parpadeo
delay(100);
}
// 4. Peligro (15cm a 35cm) - MI Pitido CORRIDO
else if (dist > 15 && dist <= 35) {
colorRGB(1, 0, 0); // ROJO FIJO
notaNom = "MI (330Hz)";
tone(BUZZER, 330); // Sin tiempo definido = sonido seguido
}
// 5. Freno de Emergencia (0cm a 15cm) - STOP Pitido CORRIDO + LED Pin 15
else if (dist >= 0 && dist <= 15) {
colorRGB(1, 0, 0);
digitalWrite(LED_FRENO, HIGH); // Activa freno físico
frenoMsg = "ON";
notaNom = "STOP! (500Hz)";
tone(BUZZER, 500);
}
// --- MOSTRAR DATOS EN OLED ---
oled.setTextSize(1);
oled.setCursor(0, 0);
oled.print("Distancia: "); oled.print(dist); oled.print(" cm");
oled.setCursor(0, 15);
oled.print("Nota: "); oled.print(notaNom);
oled.drawLine(0, 35, 128, 35, WHITE); // Línea divisoria
oled.setTextSize(2);
oled.setCursor(0, 45);
oled.print("FRENO: "); oled.print(frenoMsg);
oled.display();
}