#include <SevSeg.h>
#include "Button.h"
#include "Clock.h"
#include "config.h"
const int COLON_PIN = 13;
Button hourButton(A0);
Button minuteButton(A1);
Clock clock;
SevSeg sevseg;
const unsigned long INTERVAL = 1000; // 1 second in milliseconds
unsigned long lastDisplayTime = 0;
int numberShift = 0;
unsigned long lastShiftTime = 0;
int displayDuration = 10000; // Display duration in milliseconds
enum DisplayState {
DisplayClock,
};
DisplayState displayState = DisplayClock;
long lastStateChange = 0;
void changeDisplayState(DisplayState newValue) {
displayState = newValue;
lastStateChange = millis();
}
long millisSinceStateChange() {
return millis() - lastStateChange;
}
void setColon(bool value) {
digitalWrite(COLON_PIN, value ? LOW : HIGH);
}
void displayTime() {
DateTime now = clock.now();
bool blinkState = now.second() % 2 == 0;
int hour = now.hour();
if (hour > 12) {
hour -= 12;
}
if (hour == 0) {
hour = 12;
}
sevseg.setNumber(hour * 100 + now.minute());
setColon(blinkState);
}
void clockState() {
displayTime();
if (hourButton.pressed()) {
clock.incrementHour();
}
if (minuteButton.pressed()) {
clock.incrementMinute();
}
}
void displayTenDigitNumber() {
unsigned long currentTime = millis();
if (currentTime - lastDisplayTime >= INTERVAL) {
lastDisplayTime = currentTime;
lastShiftTime = currentTime;
numberShift = 0;
sevseg.setNumber(795995400); // Set the 10-digit number
}
if (currentTime - lastShiftTime >= displayDuration && numberShift < 6) {
// Shift the number to the left
lastShiftTime = currentTime;
numberShift++;
String numberString = String(795995400);
char charArray[7]; // 6 digits + 1 null terminator
numberString.substring(numberShift).toCharArray(charArray, 7); // Convert substring to char array
sevseg.setChars(charArray); // Display the number with a shift
}
}
void setup() {
Serial.begin(115200);
clock.begin();
hourButton.begin();
hourButton.set_repeat(500, 200);
minuteButton.begin();
minuteButton.set_repeat(500, 200);
pinMode(COLON_PIN, OUTPUT);
byte digits = 4;
byte digitPins[] = {2, 3, 4, 5};
byte segmentPins[] = {6, 7, 8, 9, 10, 11, 12};
bool resistorsOnSegments = false;
bool updateWithDelays = false;
bool leadingZeros = true;
bool disableDecPoint = true;
sevseg.begin(DISPLAY_TYPE, digits, digitPins, segmentPins, resistorsOnSegments,
updateWithDelays, leadingZeros, disableDecPoint);
sevseg.setBrightness(90);
}
void loop() {
sevseg.refreshDisplay();
switch (displayState) {
case DisplayClock:
clockState();
break;
}
displayTenDigitNumber();
}