#include #include #include #include #include #define SCREEN_WIDTH 128 #define SCREEN_HEIGHT 64 Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1); // Pines #define ONE_WIRE_BUS D0 #define BUTTON_PIN D7 #define LED_PIN D6 OneWire oneWire(ONE_WIRE_BUS); DallasTemperature sensors(&oneWire); float temperature = 0; bool ledEncendido = false; bool parpadeando = false; bool esperandoNuevaPulsacion = false; unsigned long tiempoInicioParpadeo = 0; unsigned long ultimoParpadeo = 0; unsigned long ultimoFrame = 0; unsigned long ultimaMuestra = 0; const float TEMP_LIMITE = 30.0; // Animación int frame = 0; // Gráfica #define GRAPH_WIDTH 80 #define GRAPH_HEIGHT 30 #define GRAPH_X 0 #define GRAPH_Y 30 float tempHistory[GRAPH_WIDTH]; void setup() { Serial.begin(115200); pinMode(LED_PIN, OUTPUT); pinMode(BUTTON_PIN, INPUT); digitalWrite(LED_PIN, LOW); sensors.begin(); if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { while (true); } display.setTextSize(1); display.setTextColor(SSD1306_WHITE); for (int i = 0; i < GRAPH_WIDTH; i++) tempHistory[i] = 0; } void loop() { leerTemperatura(); gestionarBoton(); gestionarLED(); actualizarGrafica(); mostrarPantalla(); } void leerTemperatura() { sensors.requestTemperatures(); temperature = sensors.getTempCByIndex(0); } void gestionarBoton() { if (esperandoNuevaPulsacion) return; if (temperature >= TEMP_LIMITE) return; if (digitalRead(BUTTON_PIN) == HIGH) { ledEncendido = true; digitalWrite(LED_PIN, HIGH); delay(300); } } void gestionarLED() { if (ledEncendido && temperature >= TEMP_LIMITE && !parpadeando) { parpadeando = true; tiempoInicioParpadeo = millis(); } if (parpadeando) { if (millis() - ultimoParpadeo >= 500) { ultimoParpadeo = millis(); digitalWrite(LED_PIN, !digitalRead(LED_PIN)); } if (millis() - tiempoInicioParpadeo >= 5000) { digitalWrite(LED_PIN, LOW); parpadeando = false; ledEncendido = false; esperandoNuevaPulsacion = true; } } if (temperature < TEMP_LIMITE) { esperandoNuevaPulsacion = false; } } void actualizarGrafica() { if (millis() - ultimaMuestra > 1000) { ultimaMuestra = millis(); for (int i = 0; i < GRAPH_WIDTH - 1; i++) tempHistory[i] = tempHistory[i + 1]; tempHistory[GRAPH_WIDTH - 1] = temperature; } } void dibujarGrafica() { display.drawRect( GRAPH_X, GRAPH_Y, GRAPH_WIDTH, GRAPH_HEIGHT, SSD1306_WHITE); for (int i = 0; i < GRAPH_WIDTH - 1; i++) { int y1 = map( tempHistory[i], 0, 50, GRAPH_Y + GRAPH_HEIGHT, GRAPH_Y); int y2 = map( tempHistory[i + 1], 0, 50, GRAPH_Y + GRAPH_HEIGHT, GRAPH_Y); display.drawLine( GRAPH_X + i, y1, GRAPH_X + i + 1, y2, SSD1306_WHITE); } } void dibujarBomba(int x, int y) { display.drawCircle(x, y, 12, SSD1306_WHITE); int size = 8; switch (frame) { case 0: display.fillTriangle(x, y - size, x - size, y + size, x + size, y + size, SSD1306_WHITE); break; case 1: display.fillTriangle(x + size, y, x - size, y - size, x - size, y + size, SSD1306_WHITE); break; case 2: display.fillTriangle(x, y + size, x - size, y - size, x + size, y - size, SSD1306_WHITE); break; case 3: display.fillTriangle(x - size, y, x + size, y - size, x + size, y + size, SSD1306_WHITE); break; } } void mostrarPantalla() { display.clearDisplay(); display.setCursor(0, 0); display.print("Temp: "); display.print(temperature); display.print(" C"); display.setCursor(0, 10); if (parpadeando) display.print("GO STADBY"); else if (ledEncendido) display.print("PUMP ON"); else if (temperature >= TEMP_LIMITE) display.print("READY"); else display.print("WAITING"); dibujarGrafica(); int velocidad = 0; if (ledEncendido) velocidad = 100; if (parpadeando) velocidad = 400; if (velocidad > 0) { if (millis() - ultimoFrame > velocidad) { frame++; if (frame > 3) frame = 0; ultimoFrame = millis(); } } else { frame = 0; } dibujarBomba(105, 45); display.display(); }