#include <TimerOne.h>
#include <ezButton.h> //anti rebote
#include <TM1637TinyDisplay.h>
#include <ArduinoTrace.h>
#include <EasyBuzzer.h>
unsigned char hour = 7;
unsigned char minute = 9;
unsigned char Update;
unsigned char halfsecond = 0;
unsigned char second;
unsigned char alarmHour = 7;
unsigned char alarmMinute = 10;
#define CLK 2
#define DIO 3
#define ON 1
#define OFF 0
// Instantiate TM1637TinyDisplay Class
TM1637TinyDisplay display(CLK, DIO);
ezButton timeSetBtn(5); // create ezButton object that attach to pin 5;
ezButton hourBtn(6);
ezButton minuteBtn(7);
ezButton alarmSetBtn(8);
void setup()
{
Serial.begin(115200);
timeSetBtn.setDebounceTime(50); // set debounce time to 50 milliseconds
hourBtn.setDebounceTime(50);
minuteBtn.setDebounceTime(50);
alarmSetBtn.setDebounceTime(50);
pinMode(5, INPUT_PULLUP);
pinMode(6, INPUT_PULLUP);
pinMode(7, INPUT_PULLUP);
pinMode(8, INPUT_PULLUP);
display.begin();
Timer1.initialize(500000);//timing for 500ms
Timer1.attachInterrupt(TimingISR);//declare the interrupt serve routine:TimingISR
}
unsigned long pm1;
void loop()
{
timeSetBtn.loop();
hourBtn.loop();
minuteBtn.loop();
alarmSetBtn.loop();
incrementHour();
incrementMinute();
clockTicking();
setAlarm();
checkAlarm();
/*
if(hourBtn.getState()==LOW){
Serial.println("Botoncito horas");
}
if(minuteBtn.getState()==LOW){
Serial.println("Botoncito minutos");
}
*/
Serial.print(hour);
Serial.print(":");
Serial.print(minute);
Serial.print(":");
Serial.println(second);
delay(10);
}
void incrementHour()
{
enum {s0,s1,s2,s3};
static int state=s0;
if (alarmSetBtn.getState()==HIGH)
{
switch(state)
{
case s0:
if(timeSetBtn.getState()==LOW) //si esta oprimido paso a s1
{
state=s1;
}
break;
case s1:
if(hourBtn.getState()==LOW && timeSetBtn.getState()==LOW)//ambos oprimidos
{
hour++;
pm1=millis();
state=s2;
}
else
{
state=s0;
}
break;
case s2:
if(hourBtn.getState()==LOW && timeSetBtn.getState()==LOW)
{
if((millis()-pm1)>800)
{
pm1=millis();
state=s3;
}
}
else
{
state=s0;
}
break;
case s3:
if(hourBtn.getState()==LOW && timeSetBtn.getState()==LOW)
{
if((millis()-pm1)>250 && hour<24)//comenzamos a increentar
{
pm1=millis();
hour++;
if (hour >= 24){
hour = 0;
}
}
long int hora =hour*100;
display.showNumber(hora+minute);
}
else
{
state=s0;
}
break;
}
}
}
void incrementMinute()
{
enum {s0,s1,s2,s3};
static int state=s0;
if (alarmSetBtn.getState()==HIGH)
{
switch(state)
{
case s0:
if(timeSetBtn.getState()==LOW) //si esta oprimido paso a s1
{
state=s1;
}
break;
case s1:
if(minuteBtn.getState()==LOW && timeSetBtn.getState()==LOW)//ambos oprimidos
{
minute++;
pm1=millis();
state=s2;
}
else
{
state=s0;
}
break;
case s2:
if(minuteBtn.getState()==LOW && timeSetBtn.getState()==LOW)
{
if((millis()-pm1)>800)
{
pm1=millis();
state=s3;
}
}
else
{
state=s0;
}
break;
case s3:
if(minuteBtn.getState()==LOW && timeSetBtn.getState()==LOW)
{
if((millis()-pm1)>250 && minute<60)//comenzamos a increentar
{
pm1=millis();
minute++;
if (minute >= 60){
hour++;
if (hour >=24){
hour = 0;
}
minute = 0;
}
}
display.showNumber((hour*100)+minute);
}
else
{
state=s0;
}
break;
}
}
}
void clockTicking()
{
if(timeSetBtn.getState()==HIGH && alarmSetBtn.getState()==HIGH)
{
if(Update == ON)
{
display.showNumber((hour*100)+minute);
Update = OFF;
}
}
}
void TimingISR()
{
if(timeSetBtn.getState()==HIGH && alarmSetBtn.getState()==HIGH)
{
halfsecond ++;
Update = ON;
if(halfsecond == 2){
second ++;
if(second == 60)
{
minute ++;
if(minute == 60)
{
hour ++;
if(hour == 24)hour = 0;
minute = 0;
}
second = 0;
}
halfsecond = 0;
}
}
}
void setAlarm()
{
enum {s0,s1,s2,s3,s4,s5};
static int state=s0;
Serial.print("Alarm: ");
Serial.println((alarmHour*100)+alarmMinute);
switch(state)
{
case s0:
if(alarmSetBtn.getState()==LOW) //si esta oprimido paso a s1
{
state=s1;
}
break;
case s1:
if(hourBtn.getState()==LOW && alarmSetBtn.getState()==LOW)
{
alarmHour++;
pm1=millis();
state=s2;
}
else if (minuteBtn.getState()==LOW && alarmSetBtn.getState()==LOW)
{
alarmMinute++;
pm1=millis();
state=s4;
}
else
{
state=s0;
delay(1000);
}
break;
case s2:
if(hourBtn.getState()==LOW && alarmSetBtn.getState()==LOW)
{
if((millis()-pm1)>800)
{
pm1=millis();
state=s3;
}
}
else
{
state=s0;
delay(1000);
}
break;
case s3:
if(hourBtn.getState()==LOW && alarmSetBtn.getState()==LOW)
{
if((millis()-pm1)>250 && alarmHour<24)//comenzamos a increentar
{
pm1=millis();
alarmHour++;
if (alarmHour >= 24){
alarmHour = 0;
}
}
display.showNumber((alarmHour*100)+alarmMinute);
}
else
{
state=s0;
delay(1000);
}
break;
case s4:
if(minuteBtn.getState()==LOW && alarmSetBtn.getState()==LOW)
{
if((millis()-pm1)>800)
{
pm1=millis();
state=s5;
}
}
else
{
state=s0;
delay(1000);
}
break;
case s5:
if(minuteBtn.getState()==LOW && alarmSetBtn.getState()==LOW)
{
if((millis()-pm1)>250 && alarmMinute<60)//comenzamos a increentar
{
pm1=millis();
alarmMinute++;
if (alarmMinute >= 60){
alarmHour++;
if (alarmHour >=24){
alarmHour = 0;
}
alarmMinute = 0;
}
}
display.showNumber((alarmHour*100)+alarmMinute);
}
else
{
state=s0;
delay(1000);
}
break;
}
}
void checkAlarm() {
if (hour == alarmHour && minute == alarmMinute) {
EasyBuzzer.setPin(9);
EasyBuzzer.singleBeep(2000,5000);
}
else{
EasyBuzzer.stopBeep();
}
}