#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <RTClib.h>
#include <time.h>
#include <EEPROM.h>
#include <math.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
#define SERIAL_OPTION 0
const int button1Pin = 2;
const int button2Pin = 50;
const int button3Pin = 40;
const int buzzerPin = 3;
int aHour;
int aMinute;
int aSecond;
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
RTC_DS1307 RTC;
const int HOUR_EEPROM_ADDRESS = 0;
const int MINUTE_EEPROM_ADDRESS = 0;
const int SECOND_EEPROM_ADDRESS = 0;
bool digitalMode = true;
bool twedigMode = false;
bool alarmMode = false;
int buttonState = HIGH;
int twebutState = HIGH;
int lastButtonState = HIGH;
void setup() {
Serial.begin(9600);
Wire.begin();
analogReference(EXTERNAL);
pinMode(button1Pin, INPUT_PULLUP);
pinMode(button2Pin, INPUT_PULLUP);
pinMode(button3Pin, INPUT_PULLUP);
pinMode(buzzerPin, OUTPUT);
Serial.println("Digital Timer and Alarm Clock");
RTC.begin();
if (! RTC.isrunning()) {
Serial.println("RTC is NOT running!");
RTC.adjust(DateTime(__DATE__, __TIME__));
}
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3D)) {
Serial.println("SSD1306 allocation failed.");
Serial.flush();
while (1) delay(10);
}
display.display();
delay(700);
display.clearDisplay();
delay(700);
}
void loop() {
//RTC.adjust(DateTime(2023,04,22,12,36,30));
buttonState = digitalRead(button1Pin);
if (lastButtonState && twebutState != buttonState) {
if (buttonState == LOW) {
digitalMode = true;
twedigMode = false;
}
}
lastButtonState = twebutState = buttonState;
buttonState = digitalRead(button3Pin);
if (lastButtonState && buttonState != twebutState) {
if (buttonState == LOW) {
twedigMode = true;
digitalMode = false;
}
}
lastButtonState = twebutState = buttonState;
twebutState = digitalRead(button2Pin);
if (twebutState && buttonState != lastButtonState) {
if (twebutState == LOW) {
alarmMode = true;
twedigMode = false;
}
}
lastButtonState = twebutState = buttonState;
if (digitalMode) {
digital();}
if (twedigMode) {
twedig();
} else if (alarmMode) {
alarm();
}
}
void digital() {
DateTime now = RTC.now();
if (SERIAL_OPTION) {
Serial.print(now.year()); Serial.print("/");
Serial.print(now.month()); Serial.print("/");
Serial.print(now.day()); Serial.print(" ");
Serial.print(now.hour()); Serial.print(":");
Serial.print(now.minute()); Serial.print(":");
Serial.print(now.second()); Serial.print("\n");
}
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0,5);
display.println("Date:");
display.setCursor(0,15);
display.print(now.year()); display.print("/"); display.print(now.month()); display.print("/"); display.print(now.day());
display.setCursor(0,25);
display.println("Time:");
display.setCursor(0,35);
display.print(now.hour()); display.print(":"); display.print(now.minute()); display.print(":"); display.print(now.second());
display.display();
display.clearDisplay();
delay(1000);
}
void twedig() {
DateTime now = RTC.now();
if (SERIAL_OPTION) {
Serial.print(now.year()); Serial.print("/");
Serial.print(now.month()); Serial.print("/");
Serial.print(now.day()); Serial.print(" ");
Serial.print(now.hour()); Serial.print(":");
Serial.print(now.minute()); Serial.print(":");
Serial.print(now.second()); Serial.print("\n");
}
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0,15);
display.println("12 Hour Time:");
display.setCursor(0,25);
display.print(now.hour()-12); display.print(":"); display.print(now.minute()); display.print(":"); display.print(now.second());
display.display();
display.clearDisplay();
delay(1000);
}
void writeString(int address, String data) {
for (int i = 0; i < data.length(); i++) {
EEPROM.write(address + i, data[i]);
}
EEPROM.write(address + data.length(), '\0');
}
void readString(char* buffer, int length) {
int i = 0;
while (i < length - 1) {
char c = Serial.read();
if (c == '\n' || c == '\r') {
break;
}
buffer[i++] = c;
Serial.write(c);
}
buffer[i] = '\0';
}
void alarm() {
DateTime now = RTC.now();
String alarmHour, alarmMinute, alarmSecond;
display.setTextColor(WHITE);
display.setTextSize(1);
Serial.println("Set Hour:");
display.clearDisplay();
display.setCursor(0, 20);
display.println("Set Hour:");
display.display();
while (!Serial.available()) {}
alarmHour = Serial.readString();
Serial.println("Set Minute:");
display.clearDisplay();
display.setCursor(0, 20);
display.println("Set Minute:");
display.display();
while (!Serial.available()) {}
alarmMinute = Serial.readString();
Serial.println("Set Second:");
display.clearDisplay();
display.setCursor(0, 20);
display.println("Set Second:");
display.display();
while (!Serial.available()) {}
alarmSecond = Serial.readString();
writeString(HOUR_EEPROM_ADDRESS, alarmHour);
writeString(MINUTE_EEPROM_ADDRESS, alarmMinute);
writeString(SECOND_EEPROM_ADDRESS, alarmSecond);
// Display name and ID on OLED
display.clearDisplay();
display.setCursor(0, 20);
display.println("Time Set:");
display.setCursor(60, 20);
display.println(alarmHour);
display.setCursor(70, 20);
display.println(":");
display.setCursor(80, 20);
display.println(alarmMinute);
display.setCursor(90, 20);
display.println(":");
display.setCursor(100, 20);
display.println(alarmSecond);
display.display();
delay(10000);
}