#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include "RTClib.h"
RTC_DS1307 rtc;
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
#define SCREEN_WIDTH 128
// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
#define OLED_RESET 4 // Reset pin # (or -1 if sharing Arduino reset pin)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
//unsigned int day_ctr, hr_ctr, min_ctr, sec_ctr, ms_ctr;
int day_ctr = 0;
int hr_ctr = 0;
int min_ctr = 0;
int sec_ctr = 0;
int ms_ctr = 0;
const float pi = 3.14159267 ;
const int clock_center_x = 32;
const int clock_center_y = 32;
int o = 1;
// variables used to calculate coordinates of points on the circle
int x;
int y;
int x1;
int y1;
// variables to store previous values read off RTC module
int second = 0;
int minute;
int hour;
int RTC;
//string time="A";
int m = 0;
int h = 0;
int s = 0 ;
int j = 1;
void setup() {
Serial.begin(9600);
Serial.setTimeout(1000);
if (! rtc.begin()) {
Serial.println("Couldn't find RTC");
Serial.flush();
abort();
}
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Address 0x3D for 128x64
Serial.println(F("SSD1306 allocation failed"));
for (;;);
}
if (rtc.isrunning()) {
Serial.println("let's set the time!");
Serial.println("Set the time [hour:min;seconds]: ");
while (j != 0) {
while (Serial.available() == 0) {}
String timeStr = Serial.readString();
int seperatorIndex1 = timeStr.indexOf(":");
int seperatorIndex2 = timeStr.indexOf(";");
h = timeStr.substring(0, seperatorIndex1).toInt(); // every charactors until : from the begining
m = timeStr.substring((seperatorIndex1 + 1), seperatorIndex2).toInt();
s = timeStr.substring(seperatorIndex2 + 1).toInt();
j = 0;
}
Serial.println(h);
Serial.println(m);
Serial.println(s);
rtc.adjust(DateTime(2022, 9, 25, h, m, s));
}
// Show initial display buffer contents on the screen --
// the library initializes this with an Adafruit splash screen.
//display.display();
delay(2000); // Pause for 2 seconds
// Clear the buffer
display.clearDisplay();
draw_clock_face();
display.display();
init_timer1_ovf_interrupt();
attachInterrupt(digitalPinToInterrupt(3), stopWatch_start,RISING);
}
void draw_second(int second, int mode) {
y = (24 * cos(pi - (2 * pi) / 60 * second)) + clock_center_y;
x = (24 * sin(pi - (2 * pi) / 60 * second)) + clock_center_x;
if (mode == 1) {
display.drawCircle(x, y, 2, SSD1306_WHITE);
}
if (mode == 0) {
display.drawCircle(x, y, 2, SSD1306_BLACK);
}
}
void draw_hour(int hour, int minute, int mode) {
y = (18 * cos(pi - (2 * pi) / 12 * hour - (2 * PI) / 720 * minute)) + clock_center_y;
x = (18 * sin(pi - (2 * pi) / 12 * hour - (2 * PI) / 720 * minute)) + clock_center_x;
y1 = (18 * cos(pi - (2 * pi) / 12 * hour - (2 * PI) / 720 * minute)) + clock_center_y + 1;
x1 = (18 * sin(pi - (2 * pi) / 12 * hour - (2 * PI) / 720 * minute)) + clock_center_x + 1;
if (mode == 1) {
display.drawLine(clock_center_x, clock_center_y, x, y, SSD1306_WHITE);
display.drawLine(clock_center_x + 1, clock_center_y + 1, x1, y1, SSD1306_WHITE);
}
else {
display.drawLine(clock_center_x, clock_center_y, x, y, SSD1306_BLACK);
display.drawLine(clock_center_x + 1, clock_center_y + 1, x1, y1, SSD1306_BLACK);
}
}
void draw_minute(int minute, int mode) {
y = (24 * cos(pi - (2 * pi) / 60 * minute)) + clock_center_y;
x = (24 * sin(pi - (2 * pi) / 60 * minute)) + clock_center_x;
if (mode == 1)display.drawLine(clock_center_x, clock_center_y, x, y, SSD1306_WHITE); else display.drawLine(clock_center_x, clock_center_y, x, y, SSD1306_BLACK);
}
void draw_clock_face(void) {
// draw the center of the clock
display.drawCircle(clock_center_x, clock_center_y, 3, SSD1306_WHITE);
display.fillCircle(clock_center_x, clock_center_y, 3, SSD1306_WHITE);
// draw hour pointers around the face of a clock
for (int i = 0; i < 12; i++) {
y = (32 * cos(pi - (2 * pi) / 12 * i)) + clock_center_y;
x = (32 * sin(pi - (2 * pi) / 12 * i)) + clock_center_x;
y1 = (28 * cos(pi - (2 * pi) / 12 * i)) + clock_center_y;
x1 = (28 * sin(pi - (2 * pi) / 12 * i)) + clock_center_x;
display.drawLine(x1, y1, x, y, SSD1306_WHITE);
}
// print string "12" at the top of the face of the clock
display.drawCircle(26 * sin(pi) + clock_center_x, (26 * cos(pi)) + clock_center_y, 6, SSD1306_BLACK);
display.fillCircle(26 * sin(pi) + clock_center_x, (26 * cos(pi)) + clock_center_y, 5, SSD1306_BLACK);
display.setTextSize(1); // Normal 1:1 pixel scale
display.setTextColor(SSD1306_WHITE); // Draw white text
display.setCursor(clock_center_x - 3, 0); // Start at top-left corner
display.println(F("12"));
}
void redraw_clock_face_elements(void) {
display.drawCircle(clock_center_x, clock_center_y, 3, SSD1306_WHITE);
display.fillCircle(clock_center_x, clock_center_y, 3, SSD1306_WHITE);
display.setCursor(clock_center_x - 3, 0);
display.println(F("12"));
}
void loop() {
DateTime RTC = rtc.now();
if (RTC.second() != second) {
draw_second(second, 0);
draw_minute(minute, 0);
draw_hour(hour, minute, 0);
draw_second(RTC.second(), 1);
draw_minute(RTC.minute(), 1);
draw_hour(RTC.hour(), RTC.minute(), 1);
display.display();
antiDigiClock(second, minute, hour);
redraw_clock_face_elements();
second = RTC.second();
minute = RTC.minute();
hour = RTC.hour();
digiClock(second, minute, hour);
redraw_clock_face_elements();
display.display();
}
}
void digiClock(int second, int minute, int hour) {
int x = 72;
int y = 10;
//display.clearDisplay();
display.setTextSize(1); // Draw 2X-scale text
display.setTextColor(WHITE);
display.setCursor(x, y);
display.println(hour);
// display.display(); // Show initial text
//display.clearDisplay();
display.setTextSize(1); // Draw 2X-scale text
display.setTextColor(WHITE);
display.setCursor(x + 14, y);
display.println(":");
//display.display(); // Show initial text
//display.clearDisplay();
display.setTextSize(1); // Draw 2X-scale text
display.setTextColor(WHITE);
display.setCursor(x + 20, y);
display.println(minute);
// display.display();
//display.clearDisplay();
display.setTextSize(1); // Draw 2X-scale text
display.setTextColor(WHITE);
display.setCursor(x + 34, y);
display.println(":");
//display.display(); // Show initial text
//display.clearDisplay();
display.setTextSize(1); // Draw 2X-scale text
display.setTextColor(WHITE);
display.setCursor(x + 40, y);
display.println(second);
//display.display();
}
void antiDigiClock(int second, int minute, int hour) {
int x = 72;
int y = 10;
//display.clearDisplay();
display.setTextSize(1); // Draw 2X-scale text
display.setTextColor(BLACK);
display.setCursor(x, y);
display.println(hour);
// display.display(); // Show initial text
//display.clearDisplay();
display.setTextSize(1); // Draw 2X-scale text
display.setTextColor(BLACK);
display.setCursor(x + 14, y);
display.println(":");
//display.display(); // Show initial text
//display.clearDisplay();
display.setTextSize(1); // Draw 2X-scale text
display.setTextColor(BLACK);
display.setCursor(x + 20, y);
display.println(minute);
// display.display();
//display.clearDisplay();
display.setTextSize(1); // Draw 2X-scale text
display.setTextColor(BLACK);
display.setCursor(x + 34, y);
display.println(":");
//display.display(); // Show initial text
//display.clearDisplay();
display.setTextSize(1); // Draw 2X-scale text
display.setTextColor(BLACK);
display.setCursor(x + 40, y);
display.println(second);
//display.display();
}
void stopWatch(int second, int minute, int hour, int mode) {
int x = 8;
int y = 35;
if (mode == 0) {
//display.clearDisplay();
mode = BLACK; /// to erase previous time
display.setTextSize(2); // Draw 2X-scale text
display.setTextColor(mode);
display.setCursor(x, y);
display.println(hour);
// display.display(); // Show initial text
//display.clearDisplay();
display.setTextSize(2); // Draw 2X-scale text
display.setTextColor(mode);
display.setCursor(x + 14, y);
display.println(":");
//display.display(); // Show initial text
//display.clearDisplay();
display.setTextSize(2); // Draw 2X-scale text
display.setTextColor(mode);
display.setCursor(x + 20, y);
display.println(minute);
// display.display();
//display.clearDisplay();
display.setTextSize(2); // Draw 2X-scale text
display.setTextColor(mode);
display.setCursor(x + 34, y);
display.println(":");
//display.display(); // Show initial text
//display.clearDisplay();
display.setTextSize(2); // Draw 2X-scale text
display.setTextColor(mode);
display.setCursor(x + 40, y);
display.println(second);
//display.display();
}
if (mode == 1) {
//display.clearDisplay();
mode = WHITE; /// to display current time
display.setTextSize(2); // Draw 2X-scale text
display.setTextColor(mode);
display.setCursor(x, y);
display.println(hour);
// display.display(); // Show initial text
//display.clearDisplay();
display.setTextSize(2); // Draw 2X-scale text
display.setTextColor(mode);
display.setCursor(x + 14, y);
display.println(":");
//display.display(); // Show initial text
//display.clearDisplay();
display.setTextSize(2); // Draw 2X-scale text
display.setTextColor(mode);
display.setCursor(x + 20, y);
display.println(minute);
// display.display();
//display.clearDisplay();
display.setTextSize(2); // Draw 2X-scale text
display.setTextColor(mode);
display.setCursor(x + 34, y);
display.println(":");
//display.display(); // Show initial text
//display.clearDisplay();
display.setTextSize(2); // Draw 2X-scale text
display.setTextColor(mode);
display.setCursor(x + 40, y);
display.println(second);
//display.display();
}
}
//interrupt///////////////////////////////////////////
ISR(TIMER1_OVF_vect) {
ms_ctr = ms_ctr + 1;
if (ms_ctr == 154) // 1000ms
{
ms_ctr = 0; //reset ms counter
sec_ctr = sec_ctr + 1; //increment second counter
Serial.print(sec_ctr);
}
if (sec_ctr == 60)
{
sec_ctr = 0; //reset sec counter
min_ctr = min_ctr + 1; //increment min counter
}
//Update hour counter
if (min_ctr == 60)
{
min_ctr = 0; //reset min counter
hr_ctr = hr_ctr + 1; //increment hr counter
}
//Update day counter
if (hr_ctr == 24)
{
hr_ctr = 0; //reset hr counter
day_ctr = day_ctr + 1; //increment day counter
}
}
void init_timer1_ovf_interrupt(void) {
TCCR1B = 0x04; //divide timer1 timebase by 256, overfl. occurs every 4.1 ms
TIMSK1 = 0x01; //enable timer1 overflow interrupt
// asm("SEI"); //enable global interrupt
sei();
}
void stopWatch_start(){
Serial.print("R");
stopWatchStart();
}
void stopWatchStart(void){
rtc.adjust(DateTime(0,0, 0, 0, 0, 0));
Serial.println("yyyy");
int a=1;
while(a!=0){
Serial.println("XXXX");
}
}