/**
Arduino Digital Alarm Clock
Copyright (C) 2020, Uri Shaked.
Released under the MIT License.
*/
/*
#include <SevSeg.h>
#include "Button.h"
#include "AlarmTone.h"
#include "Clock.h"
#include "config.h"
const int COLON_PIN = 13;
const int SPEAKER_PIN = A3;
Button hourButton(A0);
Button minuteButton(A1);
Button alarmButton(A2);
AlarmTone alarmTone;
Clock clock;
SevSeg sevseg;
enum DisplayState {
DisplayClock,
DisplayAlarmStatus,
DisplayAlarmTime,
DisplayAlarmActive,
DisplaySnooze,
};
DisplayState displayState = DisplayClock;
long lastStateChange = 0;
void changeDisplayState(DisplayState newValue) {
displayState = newValue;
lastStateChange = millis();
}
long millisSinceStateChange() {
return millis() - lastStateChange;
}
void setColon(bool value) {
digitalWrite(COLON_PIN, value ? LOW : HIGH);
}
void displayTime() {
DateTime now = clock.now();
bool blinkState = now.second() % 2 == 0;
sevseg.setNumber(now.hour() * 100 + now.minute());
setColon(blinkState);
}
void clockState() {
displayTime();
if (alarmButton.read() == Button::RELEASED && clock.alarmActive()) {
// Read alarmButton has_changed() to clear its state
alarmButton.has_changed();
changeDisplayState(DisplayAlarmActive);
return;
}
if (hourButton.pressed()) {
clock.incrementHour();
}
if (minuteButton.pressed()) {
clock.incrementMinute();
}
if (alarmButton.pressed()) {
clock.toggleAlarm();
changeDisplayState(DisplayAlarmStatus);
}
}
void alarmStatusState() {
setColon(false);
sevseg.setChars(clock.alarmEnabled() ? " on" : " off");
if (millisSinceStateChange() > ALARM_STATUS_DISPLAY_TIME) {
changeDisplayState(clock.alarmEnabled() ? DisplayAlarmTime : DisplayClock);
return;
}
}
void alarmTimeState() {
DateTime alarm = clock.alarmTime();
sevseg.setNumber(alarm.hour() * 100 + alarm.minute(), -1);
if (millisSinceStateChange() > ALARM_HOUR_DISPLAY_TIME || alarmButton.pressed()) {
changeDisplayState(DisplayClock);
return;
}
if (hourButton.pressed()) {
clock.incrementAlarmHour();
lastStateChange = millis();
}
if (minuteButton.pressed()) {
clock.incrementAlarmMinute();
lastStateChange = millis();
}
if (alarmButton.pressed()) {
changeDisplayState(DisplayClock);
}
}
void alarmState() {
displayTime();
if (alarmButton.read() == Button::RELEASED) {
alarmTone.play();
}
if (alarmButton.pressed()) {
alarmTone.stop();
}
if (alarmButton.released()) {
alarmTone.stop();
bool longPress = alarmButton.repeat_count() > 0;
if (longPress) {
clock.stopAlarm();
changeDisplayState(DisplayClock);
} else {
clock.snooze();
changeDisplayState(DisplaySnooze);
}
}
}
void snoozeState() {
sevseg.setChars("****");
if (millisSinceStateChange() > SNOOZE_DISPLAY_TIME) {
changeDisplayState(DisplayClock);
return;
}
}
void setup() {
Serial.begin(115200);
clock.begin();
hourButton.begin();
hourButton.set_repeat(500, 200);
minuteButton.begin();
minuteButton.set_repeat(500, 200);
alarmButton.begin();
alarmButton.set_repeat(1000, -1);
alarmTone.begin(SPEAKER_PIN);
pinMode(COLON_PIN, OUTPUT);
byte digits = 4;
byte digitPins[] = {2, 3, 4, 5};
byte segmentPins[] = {6, 7, 8, 9, 10, 11, 12};
bool resistorsOnSegments = false;
bool updateWithDelays = false;
bool leadingZeros = true;
bool disableDecPoint = true;
sevseg.begin(DISPLAY_TYPE, digits, digitPins, segmentPins, resistorsOnSegments,
updateWithDelays, leadingZeros, disableDecPoint);
sevseg.setBrightness(90);
}
void loop() {
sevseg.refreshDisplay();
switch (displayState) {
case DisplayClock:
clockState();
break;
case DisplayAlarmStatus:
alarmStatusState();
break;
case DisplayAlarmTime:
alarmTimeState();
break;
case DisplayAlarmActive:
alarmState();
break;
case DisplaySnooze:
snoozeState();
break;
}
}
*/
#include <Wire.h>
#include "RTClib.h"
#include <TM1637Display.h>
RTC_DS3231 rtc;
#define CLK 8
#define DIO 9
TM1637Display display(CLK, DIO);
const uint8_t blank[] = {0x00, 0x00, 0x00,0x00};
int setButton = 2; // pushbutton for setting alarm
int hourButton = 3; // pushbutton for hour
int minButton = 4; // pushbutton for minutes
int exitButton = 5; // pushbutton for exit of set alarm
int buzzer = 13;
int t, a, Hour, Min, h, m;
int set_time, alarm_time, auto_alarmStop, set_alarm_min, set_alarm_hour;
int setButtonState = 0; // pushbutton state for setting alarm
int hourButtonState = 0; // pushbutton state for hour
int minButtonState = 0;// pushbutton state for minutes
int exitButtonState = 0; // pushbutton state for exit of set alarm
int activate;
uint8_t dots;
void setup() {
Serial.begin(9600); // Begin serial communication at a baud rate of 9600:
delay(3000); // Wait for console opening:
if (! rtc.begin()) { // Check if RTC is connected correctly:
Serial.println("Couldn't find RTC");
while (1);
}
if (rtc.lostPower()) { // Check if the RTC lost power and if so, set the time:
Serial.println("RTC lost power, lets set the time!");
// The following line sets the RTC to the date & time this sketch was compiled:
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
// This line sets the RTC with an explicit date & time, for example to set
// July 02, 2020 at 3:47am you would call:
//rtc.adjust(DateTime(2020, 7, 02, 03, 47, 0));
}
Wire.begin();
display.setBrightness(0xA);
pinMode(setButton,
INPUT_PULLUP);
pinMode(hourButton, INPUT_PULLUP);
pinMode(minButton, INPUT_PULLUP);
pinMode(exitButton, INPUT_PULLUP);
pinMode(buzzer, OUTPUT);
activate = 0;
}
void loop() {
DateTime now = rtc.now();
Hour = now.hour();
Min = now.minute();
t =(now.hour()* 100 )+ now.minute();
a=now.second()%2;
// if(a==0){display.setColon(false);}
// else{display.setColon(true);}
if(a==0){dots=0b00000000;}
else{dots=0b01000000;}
switch(activate){
case 0:
display.showNumberDecEx(t, dots ,true);
setButtonState = digitalRead(setButton);
if(setButtonState == LOW){ delay(50); activate = 1;}
if(t == alarm_time &&
now.second()==0){activate = 2;}
break;
case 1:
display.setSegments(blank);//clear display
display.showNumberDecEx(0, 0b01000000 ,true);
// display.setColon(true);
while(activate == 1){
hourButtonState = digitalRead(hourButton);
if(hourButtonState == LOW){
h++;
edit();
set_alarm_hour = h;
delay(200);
}
minButtonState = digitalRead(minButton);
if(minButtonState == LOW){
m++;
edit();
set_alarm_min = m;
delay(200);
}
exitButtonState = digitalRead(exitButton);
if(exitButtonState == LOW){delay(50); activate = 0;}
}
alarm_time = (set_alarm_hour*100)+set_alarm_min;
break;
case 2:
alarm();
display.showNumberDec(t, true);
auto_alarmStop = alarm_time+1;
exitButtonState = digitalRead(exitButton);
if(exitButtonState == LOW){delay(50); activate = 0;}
if(t == auto_alarmStop){activate = 0;}
display.showNumberDecEx(t,0b01000000 ,true);
break;
}
delay(5);
}
void edit(){
if(m==60){m=0; h++;}
if(m<0){m=59; h--;}
if(h==24){h=0;}
if(h<0){h=23; m=59;}
set_time = (h*100)+ m;
display.showNumberDecEx(set_time, 0b01000000 , true);
// display.setColon(true);
}
void alarm(){
tone(13, 500, 200);
delay(100);
tone(13, 1000, 200);
delay(100);
tone(13, 2000, 200);
delay(100);
tone(13, 3000, 200);
delay(100);
tone(13, 4000, 200);
delay(100);
tone(13, 3000, 200);
delay(100);
tone(13, 2000, 200);
delay(100);
tone(13, 1000, 200);
delay(100);
}