#include <Keypad.h>
////////////////////////////////
#include <EEPROM.h>
int set_counter = 0;
#define bt_up 10
#define bt_down 11
#define bt_reset 12
int start_pin =8;
#define buzzer 13
#define data_pin 2
#define clock_pin 3
int relay = 9 ;
int set_led = A4;
int state = 0;
int counter_1 = 0;
///////////////////////////////
int mode = 0 ;
/* Keypad setup */
const byte KEYPAD_ROWS = 4;
const byte KEYPAD_COLS = 4;
byte rowPins[KEYPAD_ROWS] = {7, 6, 5, 4};
byte colPins[KEYPAD_COLS] = {A3, A2, A1, A0};
char keys[KEYPAD_ROWS][KEYPAD_COLS] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, KEYPAD_ROWS, KEYPAD_COLS);
/*0*/ /*1*/ /*2*/ /*3*/ /*4*/ /*5*/ /*6*/ /*7*/ /*8*/ /*9*/
const int digits[] = { 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f };
// 12%, 25%, 38%, 50%, 63%, 75%, 88%, 100%
const int Brightness[] = { 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f};
long Counter=0;
int flag1=0, flag2=0, timer=0;
void setup() {
pinMode(13, OUTPUT);
Serial.begin(115200);
////////////////////////////////
pinMode(bt_up, INPUT_PULLUP);
pinMode(bt_down, INPUT_PULLUP);
pinMode(bt_reset, INPUT_PULLUP);
pinMode(start_pin,INPUT_PULLUP);
pinMode(buzzer, OUTPUT);
pinMode(clock_pin, OUTPUT);
pinMode(data_pin, OUTPUT);
pinMode(set_led, OUTPUT);
pinMode(relay, OUTPUT);
digitalWrite(set_led, LOW);
digitalWrite(relay, LOW);
start();
writeValue(Brightness[6]); // set Brightness 0 to 7
stop();
// clear display
write_data(0x00, 0x00, 0x00, 0x00);
//Indicate that system is ready
for (int i = 9; i >=0; i--) {
write_data(digits[i%10], digits[i%10], digits[i%10], digits[i%10]);
delay(100);
}
if(EEPROM.read(0)==0){}
else{
//eeprom_write();
//EEPROM.write(0, 0);
}
//eeprom_read();
}
void loop() {
display();
main_key();
}
void main_key()
{
char key = keypad.getKey();
if (key == '3') {
digitalWrite(13, HIGH);
key =Counter ;
delay(100);
digitalWrite(13, LOW);
Serial.println( key);
}
}
void display()
{
set_alarm();
if(digitalRead(bt_up) == 0){
if(flag1==0){ flag1=1;
digitalWrite(buzzer, HIGH);
Counter = Counter+1;
if(Counter>9999){Counter=0;}
//eeprom_write();
delay(100);
}
}else{flag1=0;}
if(digitalRead(bt_down) == 0){
if(flag2==0){ flag2=1;
digitalWrite(buzzer, HIGH);
Counter = Counter-1;
if(Counter<0){Counter=9999;}
//eeprom_write();
delay(100);
}
}else{flag2=0;}
if(digitalRead(bt_reset) == 0){
digitalWrite(buzzer, HIGH);
if(timer<50){timer=timer+1;}
if(timer==50){
Counter=0;
digitalWrite(11, LOW);
digitalWrite(relay, LOW);
digitalWrite(set_led, LOW);
delay(10);
//eeprom_write();
mode = 0 ;
}
}else{timer=0;}
write_data(digits[(Counter/1000)%10], digits[(Counter/100)%10], digits[(Counter/10)%10], digits[Counter%10]);
delay(10);
digitalWrite(buzzer, LOW);
}
void set_number()
{}
void eeprom_write(){
EEPROM.write(1, Counter%10);
EEPROM.write(2, (Counter/10)%10);
EEPROM.write(3, (Counter/100)%10);
EEPROM.write(4, (Counter/1000)%10);
}
void eeprom_read(){
Counter=EEPROM.read(4)*1000+EEPROM.read(3)*100+EEPROM.read(2)*10+EEPROM.read(1);
}
void write_data(uint8_t dig1, uint8_t dig2, uint8_t dig3, uint8_t dig4){
start();
writeValue(0x40);
stop();
start();
writeValue(0xc0);
writeValue(dig1);
writeValue(dig2);
writeValue(dig3);
writeValue(dig4);
stop();
}
void start(void){
digitalWrite(clock_pin,HIGH);//send start signal to TM1637
digitalWrite(data_pin,HIGH);
delayMicroseconds(5);
digitalWrite(data_pin,LOW);
digitalWrite(clock_pin,LOW);
delayMicroseconds(5);
}
void stop(void){
digitalWrite(clock_pin,LOW);
digitalWrite(data_pin,LOW);
delayMicroseconds(5);
digitalWrite(clock_pin,HIGH);
digitalWrite(data_pin,HIGH);
delayMicroseconds(5);
}
bool writeValue(uint8_t value){
for(uint8_t i = 0; i < 8; i++){
digitalWrite(clock_pin, LOW);
delayMicroseconds(5);
digitalWrite(data_pin, (value & (1 << i)) >> i);
delayMicroseconds(5);
digitalWrite(clock_pin, HIGH);
delayMicroseconds(5);
}
// wait for ACK
digitalWrite(clock_pin,LOW);
delayMicroseconds(5);
pinMode(data_pin,INPUT);
digitalWrite(clock_pin,HIGH);
delayMicroseconds(5);
bool ack = digitalRead(data_pin) == 0;
pinMode(data_pin,OUTPUT);
return ack;
}
void set_alarm()
{set_number();
state = digitalRead(start_pin);
if(state==LOW && mode == 0 ){
digitalWrite(set_led, HIGH);
digitalWrite(buzzer, HIGH);
delay(1000);
digitalWrite(relay, LOW);
digitalWrite(buzzer, HIGH);
mode = 1 ;
set_counter = Counter;
Serial.println("set_counter");Serial.print(set_counter);
delay(100);
}
if(state== HIGH && mode == 1 ) {mode = 2; }
if(state==LOW && mode == 2 ){mode = 3;digitalWrite(relay, HIGH);}
if(mode == 3 ){set_counter = Counter;digitalWrite(set_led, HIGH);
if(set_counter == 1){
digitalWrite(relay, LOW);
digitalWrite(set_led, LOW);
mode = 0 ;
Serial.println("set_counter");
Serial.println("");
Serial.println(set_counter);
}
}
}