#include <EEPROM.h>
#include <TM1637Display.h>
#define RELAY A5
#define SW_START A4
#define SW_SEC A2
#define SW_MIN A1
//Module connection pins (Digital Pins)
#define CLK A3
#define DIO 3
TM1637Display seg7display(CLK, DIO);
//--------------------------------------
uint8_t setMin = 0, setSec = 0;
uint16_t totalSeconds = 0, timeInt;
bool startFlag = 0;
#define SET_TIME_INT ((setMin*100)+setSec)
//--------------------------------------
void calculateTotalSeconds(void){
totalSeconds = (setMin*60)+setSec;
}
void secondsToTimeInt(void){
uint8_t min_loc = 0, sec_loc = 0;
min_loc = (int)totalSeconds/60;
sec_loc = (int)totalSeconds%60;
timeInt = ((min_loc*100)+sec_loc);
seg7display.showNumberDecEx(timeInt, 0x40, true, 4, 0);
}
//--------------------------------------
ISR(TIMER1_COMPA_vect){
if(startFlag > 0){
if(totalSeconds > 0) totalSeconds --;
else{startFlag = 0; digitalWrite (RELAY, HIGH);}
}
}
//--------------------------------------
void setup(){
/*setMin = EEPROM.read(2);
setSec = EEPROM.read(3);
if(setMin > 59 || setMin <0){
setMin = 0; setSec = 0;{
else if(setSec > 59 || setSec <0){
setSec = 0; setMin = 0;
}
}
}*/
pinMode(RELAY, OUTPUT);
pinMode(SW_START, INPUT);
pinMode(SW_SEC, INPUT);
pinMode(SW_MIN, INPUT);
delay(400);
digitalWrite(RELAY, HIGH);
seg7display.setBrightness(0x0f);
seg7display.showNumberDecEx(SET_TIME_INT, 0X40, true, 4, 0);
//--------------------------------------
// Setup Timer Interrupt for 1 Second
//--------------------------------------
cli(); //turn off all interrupts
TCCR1A = 0;
TCCR1B = 0;
OCR1A = 0xF424;
TCCR1B = (1<<WGM12) | (1<<CS12);
TIMSK1 = (1<<OCIE1A);
sei(); //enable global interrupt
//--------------------------------------
}
void loop(){
if(startFlag > 0){
secondsToTimeInt();
}
//--------------------------------------
if(digitalRead(SW_START) == LOW){
startFlag = 1;
calculateTotalSeconds();
//Turn On Relay
digitalWrite(RELAY, LOW);
}
//--------------------------------------
if(digitalRead(SW_MIN) == LOW){
startFlag = 0; totalSeconds = 0;
digitalWrite(RELAY, HIGH);
//Turn Off Relay
setMin++;
if(setMin > 59) setMin = 0;
seg7display.showNumberDecEx(SET_TIME_INT, 0X40, true, 4, 0);
do{delay(100);} while(digitalRead(SW_MIN)== LOW);
//EEPROM.write(2, setMin);
}
//--------------------------------------
if(digitalRead(SW_SEC) == LOW){
startFlag = 0; totalSeconds = 0;
digitalWrite(RELAY, HIGH);
//Turn Off Relay
setSec++;
if(setSec > 59) setSec = 0;{
seg7display.showNumberDecEx(SET_TIME_INT, 0X40, true, 4, 0);
do{delay(100);} while(digitalRead(SW_SEC)== LOW);
//EEPROM.write(3, setSec);
}
}
}