#include <Wire.h>
#include "SSD1306Wire.h"
#include "images.h"
#include "Aclonica_Regular_24.h" //el tipo de letra
#include "DSEG7.h" //otro tipo de letra
#define SCREEN_ADDRESS 0x3C
#define OLED_SDA_PIN 21
#define OLED_SCL_PIN 22
#define BUZZER_PIN 13
#define RELAY_PIN 26
SSD1306Wire display(SCREEN_ADDRESS, OLED_SDA_PIN, OLED_SCL_PIN);
int frec = 1000, resolucion = 8;
int countdownStart = 9; // segundos
unsigned long previousMillis = 0;
float timeLeft = countdownStart;
void setup() {
Serial.begin(115200);
pinMode(RELAY_PIN, OUTPUT);
digitalWrite(RELAY_PIN, LOW);
display.init();
display.flipScreenVertically();
//display.setFont(DSEG7_Classic_Mini_Regular_27);
display.setFont(Aclonica_Regular_24);
display.setTextAlignment(TEXT_ALIGN_CENTER_BOTH);
display.drawCircle(64, 32, 22);
display.drawCircle(64, 32, 25);
display.drawString(62, 32, String(timeLeft, 0));
display.display();
ledcAttach(BUZZER_PIN, frec, resolucion);
//ledcSetup(0, 1000, 8); // Ya no existe, es lo que escribre ChatGPT
//ledcAttachPin(BUZZER_PIN,, 0); // ya no exsite, es lo que escribre ChatGPT
ledcWriteTone(BUZZER_PIN, 500); //pin, frecuencia
delay(150);
ledcWrite(BUZZER_PIN, 0);
}
void loop() {
unsigned long currentMillis = millis();
if (timeLeft >= 2.0) { //aquí voy de segundo en segundo
if (currentMillis - previousMillis >= 1000) // Cada segundo
{
previousMillis = currentMillis;
timeLeft -= 1.0;
display.clear();
display.drawCircle(64, 32, 22);
display.drawCircle(64, 32, 25);
display.drawString(62, 32, String(timeLeft, 0));
display.display();
ledcWriteTone(BUZZER_PIN, 500); //pitido
delay(150);
ledcWrite(BUZZER_PIN, 0);
}
}
else if (timeLeft > 0.0 ) { // Décimas de segundo
if (currentMillis - previousMillis >= 100) {
previousMillis = currentMillis;
timeLeft -= 0.1;
if (timeLeft < 0) // si ha lelgado al final que active relé
{
digitalWrite(RELAY_PIN, HIGH); // activa relé
display.clear();
display.setFont(Aclonica_Regular_24);
display.drawString(64, 32, "BOOM"); //muestra mensaje "BOOM"
display.display();
delay(500); //espera antes de mostrar el dibujo
display.clear(); // clear display
display.drawXbm(34, 0, explosion_width, explosion_height, bitmap_explosion2); //muestra dibujo
display.display();
while (true); // detener el programa
}
else //último segundo que muestre décimas
{
ledcWriteTone(BUZZER_PIN, 400); //pitido
delay(50);
ledcWrite(BUZZER_PIN, 0);
display.clear();
display.drawString(64, 32, String(timeLeft, 1));
display.display();
}
}
}
}