/* Ahmed Arduino Clock Instructable Step 5 - RTC Uses Adafruit 7-segment display and libraries: https://learn.adafruit.com/adafruit-led-backpack/0-dot-56-seven-segment-backpack And DS1307 Real Time Clock breakout board kit and libraries: https://learn.adafruit.com/ds1307-real-time-clock-breakout-board-kit MakersBox.blogspot.com 648.ken@gmail.com */ #include "Wire.h" #include "RTClib.h" #include "Adafruit_LEDBackpack.h" #include "Adafruit_GFX.h" Adafruit_7segment matrix = Adafruit_7segment(); // Get upload date time DateTime uploadDateTime = DateTime(__DATE__, __TIME__); // time variables long lastMillis; int hours = uploadDateTime.hour(); int minutes = uploadDateTime.minute(); int seconds = uploadDateTime.second(); // set alarm here or it gets +1 minute in setup int alarm_hour = 0; int alarm_minute = 0; boolean alarming = false; boolean alarmSet = true; int buzzerPin = 8; // Tactile button input int buttonPin = A0; // Start the Real Time Clock RTC_DS1307 rtc = RTC_DS1307(); void setup() { Serial.begin(9600); // Open channel to serial console Serial.println("Arduino Clock Step 5 - RTC module"); matrix.begin(0x70); // Start display matrix.setBrightness(1); // set the alarm one minute in the future if(!alarm_hour){ // not set above alarm_hour = hours; alarm_minute = minutes + 1; } Serial.print("Alarm set "); Serial.print(alarm_hour); Serial.print(":"); Serial.println(alarm_minute); // input button setup pinMode(buttonPin, INPUT); digitalWrite(buttonPin, HIGH); // engage internal pullup // start and set clock if not already running rtc.begin(); bool setClockTime = !rtc.isrunning(); Serial.print("rtc.isrunning() ="); Serial.println(!setClockTime); if (setClockTime) { rtc.adjust(DateTime(uploadDateTime)); } // initalize time variables DateTime time = rtc.now(); hours = time.hour(); minutes = time.minute(); seconds = time.second(); lastMillis = millis(); } void loop() { // Check RTC at top of hour and reset variables if (minutes == 0 && seconds == 0){ DateTime time = rtc.now(); hours = time.hour(); minutes = time.minute(); seconds = time.second(); } // Check button. If pushed reset alarm. boolean buttonState = digitalRead(buttonPin); if(buttonState == LOW){ alarmSet = false; } long curMillis = millis(); // get current counter in milliseconds if (curMillis > (lastMillis + 1000)){ // If one second has passed: lastMillis = lastMillis + 1000; seconds = seconds + 1; // increment seconds if (seconds > 59){ seconds = 0; minutes = minutes + 1; // increment minutes if (minutes > 59){ minutes = 0; hours = hours + 1; // increment hours if (hours > 23){ hours = 0; } } } // Display time on serial console if (hours < 10){ Serial.print(" "); // pad hours } Serial.print(hours); Serial.print(":"); if (minutes < 10){ Serial.print("0"); // pad minutes} } Serial.print(minutes); Serial.print(":"); if (seconds < 10){ Serial.print("0"); // pad seconds } Serial.println(seconds); // Break time into individual digits for display int h1 = hours / 10; int h2 = hours - h1 * 10; int m1 = minutes / 10; int m2 = minutes - m1 * 10; int s1 = seconds / 10; int s2 = seconds - s1 * 10; // Send data to display if (h1){ matrix.writeDigitNum(0, h1, false); } else{ matrix.writeDigitRaw(0, 0); // blank instead of zero } matrix.writeDigitNum(1, h2, false); matrix.drawColon(seconds % 2); // on if second is odd matrix.writeDigitNum(3, m1, false); matrix.writeDigitNum(4, m2, false); matrix.writeDisplay(); // check for alarm if ((hours == alarm_hour) && (minutes == alarm_minute)){ alarming = true;} else{ alarming = false; alarmSet = true; // reset alarm } if (alarming && alarmSet){ Serial.print("Alarm! "); if (seconds % 2){ tone(buzzerPin, 880); } else{ noTone(buzzerPin); } } else{ noTone(buzzerPin); } } }