#include #include #include #include #define SCREEN_WIDTH 128 #define SCREEN_HEIGHT 64 Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1); SoftwareSerial miSerial(0, 6); const int BTN = 2; int ultimoEstadoBtn = -1; int ultimaDistanciaSubida = -1; bool modoAlertaActivo = false; void setup() { miSerial.begin(9600); pinMode(BTN, INPUT_PULLUP); if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) for(;;); Wire.setClock(400000); display.clearDisplay(); display.display(); } void loop() { // --- 1. PRIORIDAD TOTAL AL BOTÓN (Detección de flanco) --- int estadoActualBtn = digitalRead(BTN); if (estadoActualBtn != ultimoEstadoBtn) { if (estadoActualBtn == LOW) miSerial.write('F'); // Presionado -> Apagar else miSerial.write('N'); // Soltado -> Encender ultimoEstadoBtn = estadoActualBtn; } // --- 2. PANTALLA (Solo si no estamos ocupados enviando datos del botón) --- if (miSerial.available() > 0) { int distLeida = miSerial.read(); if (distLeida < 15 && distLeida > 0) { if (abs(distLeida - ultimaDistanciaSubida) >= 2 || !modoAlertaActivo) { display.clearDisplay(); display.setTextSize(2); display.setTextColor(SSD1306_WHITE); display.setCursor(20, 10); display.print("ALERTA!"); display.setCursor(20, 40); display.print(distLeida); display.print(" cm"); display.display(); ultimaDistanciaSubida = distLeida; modoAlertaActivo = true; } } else if (modoAlertaActivo) { display.clearDisplay(); display.display(); modoAlertaActivo = false; ultimaDistanciaSubida = -1; } } }