/* * Taras Bilous 2023 * ver. 1.0 * This file is part of "Clock Project", a DIY project build by using Seeeduino XIAO SAMD21 * board and SSD1306 128X64 OLED Display * Visit https://tarasbilous.com/projects/electronics/clock/clock_project.html for more * information * For suggestions or questions you can freely write to my e-mail: tarasbilous90@gmail.com * */ #include #include #include #include "RTC_SAMD21.h" #include "DateTime.h" #define SCREEN_WIDTH 128 // OLED display width, in pixels #define SCREEN_HEIGHT 64 // OLED display height, in pixels // Declaration for an SSD1306 display connected to I2C (SDA, SCL pins) Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1); // Declaration for internal XIAO 32-bit Real Time Clock (RTC) RTC_SAMD21 rtc; DateTime now; int hours, minutes, seconds; const int button1 = 1; // setting button1 (select/set button) pin const int button2 = 2; // setting button2 (increase button) pin int button1State = 0; // state of button1 (0 or 1) int button2State = 0; // state of button2 (0 or 1) int clockInitState = 0; // 0 for setting hours, 1 for setting minutes, 2 clock is set (running) void setup() { clock_init(); buttons_init(); display_init(); } void loop() { buttons_controller(); display_controller(); clock_controller(); } void display_init(){ Serial.begin(9600); if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Address 0x3D for 128x64 Serial.println(F("SSD1306 allocation failed")); for(;;); } delay(2000); display.clearDisplay(); } void display_controller(){ display.clearDisplay(); display.setTextSize(4); display.setTextColor(WHITE); display.setCursor(0, 20); // setting hours if(clockInitState == 0){ display.println(digit_to_str(hours) + ": "); // displaying only hours, when hours are set // setting minutes }else if(clockInitState == 1){ display.println(" :" + digit_to_str(minutes)); // displaying only minutes, when minutes are set // clock is set (running) }else{ if(seconds % 2 == 0){ display.println(digit_to_str(hours) + ":" + digit_to_str(minutes)); }else{ display.println(digit_to_str(hours) + " " + digit_to_str(minutes)); } } display.display(); delay(100); } void buttons_init(){ pinMode(button1, INPUT); pinMode(button2, INPUT); } void clock_init(){ rtc.begin(); DateTime now = DateTime(2023, 10, 8, hours, minutes, 0); rtc.adjust(now); } void clock_controller(){ if(clockInitState == 2){ now = rtc.now(); hours = now.hour(); minutes = now.minute(); seconds = now.second(); } } void buttons_controller(){ button1State = digitalRead(button1); button2State = digitalRead(button2); if(button1State == HIGH){ clockInitState++; if(clockInitState > 1){ DateTime now = DateTime(2023, 10, 8, hours, minutes, 0); rtc.adjust(now); } if(clockInitState > 2){ clockInitState = 0; } } if(clockInitState == 0 and button2State == HIGH){ hours++; if(hours > 23){ hours = 0; } } if(clockInitState == 1 and button2State == HIGH){ minutes++; if(minutes > 59){ minutes = 0; } } } String digit_to_str(int value){ if(value < 10){ return "0" + String(value); } return String(value); }