// Libraries
#include <Wire.h>
#include <RTClib.h>
#include <LiquidCrystal_I2C.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
RTC_DS1307 rtc;
LiquidCrystal_I2C lcd(0x27, 16, 2);
Adafruit_SSD1306 display = Adafruit_SSD1306(128, 64, &Wire);
// Alarmtime
int alarmHours = 0;
int alarmMinutes = 0;
bool alarmChosen = false;
char str[3]; // utilizzata per l'ora
void setup(){
// setting the pins
pinMode(2, INPUT_PULLUP);
// only needed when testing, start serial connection
Serial.begin(9600);
// starts the LCD
lcd.init();
lcd.clear();
lcd.backlight();
display.setTextColor(WHITE, BLACK);
display.setTextSize(2);
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.display();
display.clearDisplay();
// starts the RTC if it is found
if (! rtc.begin()){
lcd.print("RTC not found");
while(1);
}
// Resets RTC time when needed
if (! rtc.isrunning()){
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
// Selects the alarm time while setting up.
while (! alarmChosen) {
lcd.setCursor(0,0);
lcd.print("To Start, Please");
lcd.setCursor(0,1);
lcd.print("Select An Alarm.");
if (digitalRead(2) == LOW){
alarmChangeTime();
alarmChosen = true;
}
}
}
void loop(){
DateTime current = rtc.now();
screenDefault(current);
if (digitalRead(2) == LOW){
alarmChangeTime();
}
}
// The default setting, prints the current time and date onto the screen
void screenDefault(DateTime current) {
// Printing time onto the LCD
lcd.setCursor(0,1);
lcd.print("TIME");
lcd.print(' ');
lcd.print(current.hour());
lcd.print(':');
lcd.print(current.minute());
lcd.print(':');
lcd.print(current.second());
lcd.print(" ");
// Printing Date onto the LCD
lcd.setCursor(0,0);
lcd.print("DATE");
lcd.print(" ");
lcd.print(current.day());
lcd.print("/");
lcd.print(current.month());
lcd.print("/");
lcd.print(current.year());
lcd.print(" ");
display.setCursor(5,1);
display.print(current.day());
display.print("/");
display.print(current.month());
display.print("/");
display.print(current.year());
display.print(" ");
display.setCursor(15,30);
sprintf(str, "%02d", current.hour());
display.print(str);
display.print(':');
sprintf(str, "%02d", current.minute());
display.print(str);
display.print(':');
sprintf(str, "%02d", current.second());
display.print(str);
display.display();
}
void alarmActive() {
}
void alarmChangeTime() {
int buttonPressed = millis();
while (digitalRead(2) == LOW){}
int buttonReleased = millis();
int buttonHeld = buttonReleased - buttonPressed;
// If the button was held more than 1.5 seconds 15 minutes is subtracted from the alarm time.
// If the button was held less than 1.5 seconds 15 minutes is added the alarm time.
if (buttonHeld < 1500){
alarmMinutes += 15;
}
else{
alarmMinutes -= 15;
}
// Since the millis() command gives a 32-bit value it has to be reset every fortynine days.
// If the button were to be held while the reset happens the value of buttonHeld would be negative.
// Adjusting the minutes.
if (alarmMinutes >= 60){
alarmMinutes = 0;
alarmHours += 1;
}
if (alarmMinutes < 0){
alarmMinutes = 45;
alarmHours -= 1;
}
// Adjusting the hours.
if (alarmHours >= 24 && alarmMinutes != 0){
alarmHours = 0;
alarmMinutes = 15;
}
if (alarmHours < 0){
alarmHours = 23;
}
lcd.clear();
// Prints the current alarm time onto the screen
lcd.setCursor(0,0);
lcd.print("Alarm time:");
lcd.setCursor(0,1);
if (alarmHours == 0) {
lcd.print("00");
}
else{
lcd.print(alarmHours);
}
lcd.print(':');
if (alarmMinutes == 0){
lcd.print("00");
}
else{
lcd.print(alarmMinutes);
}
lcd.print(':');
lcd.print("00");
delay(1500);
lcd.clear();
}