#include "RTClib.h"
#include "SevSeg.h"
RTC_DS1307 rtc;
char daysOfTheWeek[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
const int buttonPin = 9;
int buttonState = 0;
SevSeg sevseg; //Instantiate a seven segment controller object
enum MachineState {
STATE_WAITING_FOR_BUTTON,
STATE_H1_ON,
STATE_H1_OFF,
STATE_H0_ON,
STATE_H0_OFF,
STATE_M1_ON,
STATE_M1_OFF,
STATE_M0_ON,
STATE_M0_OFF,
};
int state = STATE_WAITING_FOR_BUTTON;
void setup () {
Serial.begin(115200);
if (! rtc.begin()) {2;
Serial.println("Couldn't find RTC");
Serial.flush();
abort();
}
byte numDigits = 1;
byte digitPins[] = {10};
byte segmentPins[] = {6, 7, 8, 2, 3, 5, 4,};
bool resistorsOnSegments = true; // 'false' means resistors are on digit pins
byte hardwareConfig = COMMON_CATHODE; // See README.md for options
bool updateWithDelays = false; // Default 'false' is Recommended
bool leadingZeros = false; // Use 'true' if you'd like to keep the leading zeros
bool disableDecPoint = true; // Use 'true' if your decimal point doesn't exist or isn't connected
sevseg.begin(hardwareConfig, numDigits, digitPins, segmentPins, resistorsOnSegments,
updateWithDelays, leadingZeros, disableDecPoint);
sevseg.setBrightness(90);
pinMode(buttonPin, INPUT);
}
static int h1;
static int h0;
static int m1;
static int m0;
static int s1;
static int s0;
static unsigned int t0;
void update_display_time()
{
DateTime now = rtc.now();
int now_hour = now.hour();
int hour = (now_hour % 12);
int now_minute = now.minute();
int now_second = now.second();
// Comment if 24 hs format.
hour = hour % 12;
h1 = hour / 10;
h0 = hour % 10;
m1 = now_minute / 10;
m0 = now_minute % 10;
s1 = now_second / 10;
s0 = now_second % 10;
Serial.print(h1);
Serial.print(h0);
Serial.print(":");
Serial.print(m1);
Serial.print(m0);
Serial.print(":");
Serial.print(s1);
Serial.print(s0);
Serial.println();
}
int time_to_change(unsigned int delta)
{
int ret;
//Serial.println(t0);
ret = millis() - t0 >= delta;
return ret;
}
void change_state_to(enum MachineState new_state)
{
state = new_state;
t0 = millis();
// Serial.print("New state is: ");
// Serial.println(new_state);
}
void print_date_time(DateTime &d)
{
int hour = d.hour();
int minute = d.minute();
int second = d.second();
Serial.print("Current time: ");
Serial.print(hour / 10);
Serial.print(hour % 10);
Serial.print(':');
Serial.print(minute / 10);
Serial.print(minute % 10);
Serial.print(':');
Serial.print(second / 10);
Serial.print(second % 10);
Serial.println();
}
void loop () {
DateTime now = rtc.now();
switch (state) {
case STATE_WAITING_FOR_BUTTON:
buttonState = digitalRead(buttonPin);
if (buttonState) {
Serial.print("Start: ");
print_date_time(now);
change_state_to(STATE_H1_ON);
update_display_time();
sevseg.setNumber(h1, 1);
}
break;
case STATE_H1_ON:
if (time_to_change(1000)) {
change_state_to(STATE_H1_OFF);
sevseg.blank();
}
break;
case STATE_H1_OFF:
if (time_to_change(300)) {
change_state_to(STATE_H0_ON);
sevseg.setNumber(h0, 1);
}
break;
case STATE_H0_ON:
if (time_to_change(1000)) {
change_state_to(STATE_H0_OFF);
sevseg.blank();
}
break;
case STATE_H0_OFF:
if (time_to_change(300)) {
change_state_to(STATE_M1_ON);
sevseg.setNumber(m1, 1);
}
break;
case STATE_M1_ON:
if (time_to_change(1000)) {
change_state_to(STATE_M1_OFF);
sevseg.blank();
}
break;
case STATE_M1_OFF:
if (time_to_change(300)) {
change_state_to(STATE_M0_ON);
sevseg.setNumber(m0, 1);
}
break;
case STATE_M0_ON:
if (time_to_change(1000)) {
sevseg.blank();
change_state_to(STATE_M0_OFF);
}
break;
case STATE_M0_OFF:
if (time_to_change(300)) {
change_state_to(STATE_WAITING_FOR_BUTTON);
Serial.print("End: ");
print_date_time(now);
}
break;
}
// Must run repeatedly
sevseg.refreshDisplay();
}