#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);
const int buttonOptionPin = 2;
const int buttonConfirmPin = 3;
const int buzzerPin = 5;
int currentMenu = 0;
int selectedValue = 1;
int TIEMPO_ACTIVO = 1;
int TIEMPO_DESCANSO = 1;
int CANTIDAD_INTERVALOS = 1;
void setup() {
pinMode(buttonOptionPin, INPUT_PULLUP);
pinMode(buttonConfirmPin, INPUT_PULLUP);
pinMode(buzzerPin, OUTPUT);
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.display();
delay(1000);
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.println("INTERVAL TIMER");
display.println("by FRAN RUIZ");
display.display();
delay(1000);
}
void loop() {
switch (currentMenu) {
case 0:
showMenu("INTERVALOS", CANTIDAD_INTERVALOS);
break;
case 1:
showMenu("ACTIVO", TIEMPO_ACTIVO);
break;
case 2:
showMenu("DESCANSO", TIEMPO_DESCANSO);
break;
case 3:
showMenu("EMPEZAR", 0); // No value to display
break;
}
if (currentMenu < 3) {
if (digitalRead(buttonOptionPin) == LOW) {
delay(200);
currentMenu = (currentMenu + 1) % 4;
}
} else {
// Si estamos en la opción "EMPEZAR", permitir regresar al primer menú
if (digitalRead(buttonOptionPin) == LOW) {
delay(200);
currentMenu = 0;
}
}
if (digitalRead(buttonConfirmPin) == LOW) {
delay(200);
if (currentMenu < 3) {
selectedValue = (selectedValue % 10) + 1;
switch (currentMenu) {
case 0:
CANTIDAD_INTERVALOS = selectedValue;
break;
case 1:
TIEMPO_ACTIVO = selectedValue;
break;
case 2:
TIEMPO_DESCANSO = selectedValue;
break;
}
} else {
startIntervals();
}
}
}
void showMenu(String menuName, int value) {
display.clearDisplay();
display.setTextSize(2);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.println(menuName);
if (value != 0) {
display.print("");
display.println(value);
}
display.display();
}
void startIntervals() {
for (int i = 0; i < CANTIDAD_INTERVALOS; i++) {
for (int j = TIEMPO_ACTIVO; j > 0; j--) {
showTimer(j, "ACTIVO");
delay(1000);
}
sound(buzzerPin, 1000, 100);
delay(500);
sound(buzzerPin, 1000, 100);
delay(500);
sound(buzzerPin, 1000, 100);
delay(500);
for (int j = TIEMPO_DESCANSO; j > 0; j--) {
showTimer(j, "DESCANSO");
delay(1000);
}
sound(buzzerPin, 1500, 100);
delay(500);
sound(buzzerPin, 1500, 100);
delay(500);
sound(buzzerPin, 1500, 100);
delay(500);
}
sound(buzzerPin, 3000, 1000);
}
void sound(int pin, int frequency, int duration) {
tone(pin, frequency, duration);
delay(duration);
noTone(pin);
}
void showTimer(int seconds, String phase) {
display.clearDisplay();
display.setTextSize(2);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.println(phase);
display.print(" ");
display.println(seconds);
display.display();
}