#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
const int potPin = A0; // Pin analógico para el potenciómetro
const int buttonPin = 2; // Pin digital para el botón
const int outputPin = 3; // Pin digital de salida
const int resetPin = 4; // Pin digital para reiniciar el temporizador
int potValue = 0; // Variable para almacenar el valor del potenciómetro
unsigned long startTime = 0; // Variable para almacenar el tiempo de inicio
unsigned long duration = 0; // Variable para almacenar la duración del temporizador
unsigned long setTime = 0; // Variable para configurar el temporizador
bool countdownStarted = false; // Variable para verificar si se ha iniciado el conteo regresivo
bool timeConfigured = false; // Variable para verificar si se ha configurado el tiempo
void setup() {
// Inicialización de la comunicación serial y la pantalla OLED
Serial.begin(9600);
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("Error al iniciar la pantalla OLED"));
for (;;);
}
display.display();
delay(2000);
display.clearDisplay();
// Configuración de pines
pinMode(potPin, INPUT);
pinMode(buttonPin, INPUT_PULLUP);
pinMode(outputPin, OUTPUT);
pinMode(resetPin, INPUT_PULLUP); // Se establece el pin de reinicio como entrada con pull-up interno
}
void loop() {
// Si la cuenta regresiva no ha comenzado, se actualiza el valor del potenciómetro y se configura el tiempo
if (!countdownStarted) {
// Lectura del valor del potenciómetro
potValue = analogRead(potPin);
// Mapeo del valor del potenciómetro a un rango de tiempo (de 1 a 10 minutos en segundos)
setTime = map(potValue, 0, 1023, 60, 600);
// Verificar si se ha presionado el botón para iniciar el conteo regresivo
if (digitalRead(buttonPin) == LOW && !timeConfigured) {
timeConfigured = true;
startTime = millis();
}
}
// Verificar si se ha presionado el botón para reiniciar la cuenta regresiva
if (digitalRead(resetPin) == LOW) {
countdownStarted = false;
timeConfigured = false;
display.clearDisplay();
display.display();
}
// Verificar si se ha activado el Pin 4 para apagar el Pin 3
if (digitalRead(resetPin) == LOW) {
digitalWrite(outputPin, LOW); // Apagar el Pin 3
}
// Lógica para el conteo regresivo si está activado
if (countdownStarted) {
digitalWrite(outputPin, HIGH); // Activar el pin de salida
unsigned long currentTime = millis();
duration = currentTime - startTime;
if (duration >= setTime * 1000) {
countdownStarted = false;
digitalWrite(outputPin, LOW); // Desactivar el pin de salida
display.clearDisplay();
display.setTextSize(2);
display.setTextColor(SSD1306_WHITE);
display.setCursor(10, 20);
display.println("¡Tiempo!");
display.display();
delay(2000);
display.clearDisplay();
timeConfigured = false; // Permitir la reconfiguración del tiempo
} else {
unsigned long remainingTime = (setTime * 1000 - duration) / 1000;
display.clearDisplay();
display.setTextSize(2);
display.setTextColor(SSD1306_WHITE);
display.setCursor(20, 10);
display.print("Tiempo:");
display.setCursor(35, 35);
if (remainingTime < 10) {
display.print("0");
}
display.print(remainingTime / 60);
display.print(":");
if ((remainingTime % 60) < 10) {
display.print("0");
}
display.print(remainingTime % 60);
display.display();
}
} else {
// Mostrar el valor del temporizador en la pantalla OLED cuando no se esté ejecutando la cuenta regresiva
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(20, 10);
if (!timeConfigured) {
display.println("Configurar");
display.setCursor(20, 25);
display.println("Tiempo");
display.setCursor(20, 45);
display.print("Actual: ");
display.print(setTime / 60);
display.print(":");
display.print(setTime % 60 < 10 ? "0" : "");
display.println(setTime % 60);
} else {
display.println("Temporizador");
display.setCursor(20, 25);
display.println("Iniciado");
}
display.display();
}
// Verificar si se ha presionado el botón para iniciar la cuenta regresiva
if (digitalRead(buttonPin) == LOW && timeConfigured && !countdownStarted) {
countdownStarted = true;
}
}