#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
// GPIO pin assignments
#define INCREASE_BUTTON 17
#define DECREASE_BUTTON 16
#define START_STOP_BUTTON 15
#define BUZZER_PIN 4
// OLED dimensions
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
// Timer variables
int sessionMinutes = 0; // Total session duration in minutes
int studyMinutes = 0; // Study time in minutes
bool timerRunning = false; // Timer state: running or stopped
unsigned long startTime; // Timer start time (in milliseconds)
unsigned long elapsedTime; // Elapsed time since start
void setup() {
// Initialize Serial Monitor
Serial.begin(115200);
// Initialize buttons
pinMode(INCREASE_BUTTON, INPUT_PULLDOWN);
pinMode(DECREASE_BUTTON, INPUT_PULLDOWN);
pinMode(START_STOP_BUTTON, INPUT_PULLDOWN);
// Initialize buzzer
pinMode(BUZZER_PIN, OUTPUT);
// Initialize OLED display
if (!display.begin(0x3C, -1)) {
Serial.println("OLED initialization failed!");
while (true);
}
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.println("Welcome!");
display.display();
delay(2000); // Show welcome message for 2 seconds
// Initial display update
updateDisplay();
}
void loop() {
// Check Increase Button
if (digitalRead(INCREASE_BUTTON) == HIGH) {
sessionMinutes += 5; // Increment session time by 5 minutes
updateDisplay();
delay(200); // Debounce delay
}
// Check Decrease Button
if (digitalRead(DECREASE_BUTTON) == HIGH) {
if (sessionMinutes > 0) sessionMinutes -= 5; // Decrement session time
updateDisplay();
delay(200); // Debounce delay
}
// Check Start/Stop Button
if (digitalRead(START_STOP_BUTTON) == HIGH) {
timerRunning = !timerRunning; // Toggle the timer state
playBuzzer(timerRunning); // Play buzzer sound
startTime = millis(); // Record start time
updateDisplay();
delay(500); // Debounce delay
}
// Timer logic
if (timerRunning) {
elapsedTime = millis() - startTime;
int elapsedMinutes = elapsedTime / 60000; // Convert ms to minutes
if (elapsedMinutes >= sessionMinutes) {
// Timer completed
timerRunning = false;
playBuzzer(false); // End buzzer
sessionMinutes = 0; // Reset session time
updateDisplay();
}
}
}
void updateDisplay() {
display.clearDisplay();
display.setTextSize(1);
display.setCursor(0, 0);
// Display timer settings
display.println("Timer Settings:");
display.setCursor(0, 15);
display.print("Session: ");
display.print(sessionMinutes);
display.println(" mins");
display.setCursor(0, 30);
display.print("Study: ");
display.print(studyMinutes);
display.println(" mins");
// Display timer state
if (timerRunning) {
display.setCursor(0, 45);
display.println("Timer: RUNNING");
} else {
display.setCursor(0, 45);
display.println("Timer: STOPPED");
}
display.display();
}
void playBuzzer(bool start) {
if (start) {
digitalWrite(BUZZER_PIN, HIGH);
delay(200);
digitalWrite(BUZZER_PIN, LOW);
} else {
for (int i = 0; i < 3; i++) {
digitalWrite(BUZZER_PIN, HIGH);
delay(200);
digitalWrite(BUZZER_PIN, LOW);
delay(200);
}
}
}
Loading
ssd1306
ssd1306