#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
#define OLED_RESET -1 // Reset pin # (or -1 if sharing Arduino reset pin)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
unsigned long countdownTime = 0; // Initial countdown time in milliseconds
unsigned long previousMillis = 0;
bool countdownActive = false;
const int buzzerPin = 9;
const int addButton5Min = 2;
const int addButton15Min = 3;
const int addButton30Min = 4;
const int startButtonPin = 5;
void setup() {
Serial.begin(9600);
pinMode(buzzerPin, OUTPUT);
pinMode(addButton5Min, INPUT_PULLUP);
pinMode(addButton15Min, INPUT_PULLUP);
pinMode(addButton30Min, INPUT_PULLUP);
pinMode(startButtonPin, INPUT_PULLUP);
// Initialize the display with the I2C addr 0x3C (for the 128x64)
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 allocation failed"));
for (;;);
}
display.display();
delay(2000); // Pause for 2 seconds
display.clearDisplay();
display.setTextSize(1); // Set text size to 1 for smaller font
display.setTextColor(SSD1306_WHITE);
}
void loop() {
if (digitalRead(addButton5Min) == LOW) {
countdownTime += 5 * 60 * 1000; // Add 5 minutes (300000 milliseconds)
delay(200); // Debounce delay
}
if (digitalRead(addButton15Min) == LOW) {
countdownTime += 15 * 60 * 1000; // Add 15 minutes (900000 milliseconds)
delay(200); // Debounce delay
}
if (digitalRead(addButton30Min) == LOW) {
countdownTime += 30 * 60 * 1000; // Add 30 minutes (1800000 milliseconds)
delay(200); // Debounce delay
}
if (digitalRead(startButtonPin) == LOW && countdownTime > 0) {
countdownActive = true;
delay(200); // Debounce delay
}
if (countdownActive) {
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= 1000) { // Update every second
previousMillis = currentMillis;
countdownTime -= 1000;
if (countdownTime <= 3 * 60 * 1000 && countdownTime > (3 * 60 * 1000 - 1000)) {
tone(buzzerPin, 1000, 200); // Beep for 200 milliseconds when 3 minutes left
}
if (countdownTime == 0) {
for (int i = 0; i < 3; i++) {
tone(buzzerPin, 1000, 1000); // Beep for 1 second
delay(1000); // Wait for 1 second
}
countdownActive = false; // Stop countdown when it reaches zero
}
}
}
// Update the display
int hours = (countdownTime / 1000) / 3600;
int minutes = ((countdownTime / 1000) % 3600) / 60;
int seconds = (countdownTime / 1000) % 60;
display.clearDisplay();
char timeString[9];
sprintf(timeString, "%02d:%02d:%02d", hours, minutes, seconds);
int16_t x1, y1;
uint16_t w, h;
display.getTextBounds(timeString, 0, 0, &x1, &y1, &w, &h);
display.setCursor((SCREEN_WIDTH - w) / 2, (SCREEN_HEIGHT - h) / 2);
display.print(timeString);
display.display();
}