#include <Wire.h>
#include <TM1637Display.h>
#define CLK 17
#define DIO 16
#define SW_HOUR 14 // Set HOURS button
#define SW_MIN 15 // Set MINUTES button
TM1637Display display(CLK, DIO);
#define DS3231_I2C_ADDRESS 0x68
bool rep = false;
void setup(){
pinMode(SW_HOUR, INPUT_PULLUP);
pinMode(SW_MIN, INPUT_PULLUP);
Wire.begin();
display.setBrightness(2);
}
void loop(){
displayTime(); // display the real-time clock data
if (read_button(SW_HOUR) > 0) {
byte second, minute, hour;
readDS3231time(&second, &minute, &hour);
if (hour == 23)
hour = 0;
else
hour++;
setDS3231time(0, minute, hour);
displayTime();
delay(10);
}
if (read_button(SW_MIN) > 0) {
byte second, minute, hour;
readDS3231time(&second, &minute, &hour);
if (minute == 59)
minute = 0;
else
minute++;
setDS3231time(0, minute, hour);
displayTime();
delay(10);
}
if (rep) {
if (digitalRead(SW_HOUR) && digitalRead(SW_MIN))
rep = false;
}
}
void displayTime(){
byte second, minute, hour;
// retrieve data from DS3231
readDS3231time(&second, &minute, &hour);
int time = (hour * 100) + minute;
display.showNumberDecEx(time, 0b11100000, true);
//delay(1000);
//display.showNumberDec(time, true);
}
byte decToBcd(byte val){
return( (val/10*16) + (val%10) );
}
byte bcdToDec(byte val){
return( (val/16*10) + (val%16) );
}
void setDS3231time(byte second, byte minute, byte hour){
// sets time and date data to DS3231
Wire.beginTransmission(DS3231_I2C_ADDRESS);
Wire.write(0); // set next input to start at the seconds register
Wire.write(decToBcd(second)); // set seconds
Wire.write(decToBcd(minute)); // set minutes
Wire.write(decToBcd(hour)); // set hours
Wire.endTransmission();
}
void readDS3231time(byte *second, byte *minute, byte *hour){
Wire.beginTransmission(DS3231_I2C_ADDRESS);
Wire.write(0); // set DS3231 register pointer to 00h
Wire.endTransmission();
Wire.requestFrom(DS3231_I2C_ADDRESS, 7);
// request seven bytes of data from DS3231 starting from register 00h
*second = bcdToDec(Wire.read() & 0x7f);
*minute = bcdToDec(Wire.read());
*hour = bcdToDec(Wire.read() & 0x3f);
}
int read_button (uint8_t pin_wbutton) { // push button state, return: 0(very fast), 1(fast), 2(slow)
uint32_t vr_start = 0;
uint32_t vr_button = 0;
uint8_t wposition = 0;
uint16_t wzab;
if (rep)
wzab = 200;
else
wzab = 1000;
vr_start = millis();
while (digitalRead(pin_wbutton) == LOW) {
vr_button = millis() - vr_start;
if (vr_button > wzab) {
rep = true;
break;
}
}
if (vr_button < 30) // 'nothing' for debounce
wposition = 0;
else if (vr_button > 100) // slow push button
wposition = 2;
else wposition = 1; // fast push button
return wposition;
}