#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Encoder.h>
// Constants for encoder
const int encoderPinA = 2;
const int encoderPinB = 3;
const int encoderButtonPin = 4;
const int buzzerPin = 13;
// OLED display configuration
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
// Encoder instance
Encoder myEnc(encoderPinA, encoderPinB);
// Variables for alarm
unsigned long alarmTime = 0;
bool alarmSet = false;
bool alarmActive = false;
int alarmMinutes = 1; // Default alarm time 1 minute
bool buttonPressed = false;
unsigned long buttonPressStartTime = 0;
const unsigned long longPressDuration = 3000; // 1 second
// Previous state for encoder
long lastEncoderPosition = -999;
unsigned long lastDebounceTime = 0;
const unsigned long debounceDelay = 50;
void setup() {
pinMode(encoderButtonPin, INPUT_PULLUP);
pinMode(buzzerPin, OUTPUT);
digitalWrite(buzzerPin, LOW);
// Initialize the OLED display
if (!display.begin(SSD1306_PAGEADDR, 0x3C)) {
Serial.println(F("SSD1306 allocation failed"));
for (;;);
}
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 10);
display.print("Set Alarm");
display.display();
}
void loop() {
// Read encoder position
long newEncoderPosition = myEnc.read() / 4; // Adjust sensitivity if necessary
if (newEncoderPosition != lastEncoderPosition) {
lastEncoderPosition = newEncoderPosition;
alarmMinutes = newEncoderPosition;
if (alarmMinutes < 1) {
alarmMinutes = 1;
myEnc.write(4); // Set to 1 minute (4 * 0.25 steps)
}
displayAlarmTime();
}
// Read encoder button state
bool buttonState = digitalRead(encoderButtonPin);
if (buttonState == LOW && !buttonPressed) {
buttonPressed = true;
buttonPressStartTime = millis();
} else if (buttonState == HIGH && buttonPressed) {
unsigned long buttonPressDuration = millis() - buttonPressStartTime;
if (buttonPressDuration >= longPressDuration) {
resetSettings();
} else {
if (!alarmSet) {
alarmSet = true;
alarmTime = millis() + alarmMinutes * 60000; // Set alarm time in future
displayAlarmTime();
} else {
alarmActive = true;
}
}
buttonPressed = false;
}
// Check if alarm time is reached
if (alarmActive && millis() >= alarmTime) {
alarmActive = false;
}
if (alarmActive) {
digitalWrite(buzzerPin, HIGH); // Turn on buzzer for alarm
unsigned long remainingTime = alarmTime - millis();
displayRemainingTime(remainingTime);
} else {
digitalWrite(buzzerPin, LOW); // Turn off buzzer if alarm is not set
}
}
void displayAlarmTime() {
display.clearDisplay();
display.setCursor(0, 0);
display.print("Set Alarm in: ");
display.print(alarmMinutes);
display.print(" min");
if (alarmSet) {
display.setCursor(0, 20);
display.print("Alarm Set");
} else {
display.setCursor(0, 20);
display.print("Alarm Not Set");
}
display.display();
}
void displayRemainingTime(unsigned long remainingTime) {
display.clearDisplay();
display.setCursor(0, 0);
display.print("Alarm in: ");
display.print(remainingTime / 60000); // Convert milliseconds to minutes
display.print(" min ");
display.print((remainingTime % 60000) / 1000); // Remaining seconds
display.print(" sec");
display.display();
}
void resetSettings() {
alarmSet = false;
alarmActive = false;
alarmTime = 0;
alarmMinutes = 1;
lastEncoderPosition = -999;
display.clearDisplay();
display.setCursor(0, 0);
display.print("Settings Reset");
display.display();
}