#include "SevSeg.h"
SevSeg sevseg; //Instantiate a seven segment object
// button Pins
const int b_reset = 2;
const int b_decr = 3;
const int b_incr = 4;
// Power off
const int power = A5;
unsigned long inactiveAtTime = millis();
unsigned long inactivityInterval = 300000; // 5min in milliseconds
// Button readibility var
const int pressed = LOW;
// button hold in milliseconds
int resetInterval = 1000;
int resetPressedTime;
int resetLastState = 0;
int resetCurrentState = 0;
// Changing number
int number;
// Numberchange speed
int interval = 500; // Default time in millis to wait before next number change is possible. Should be >= maxSpeed
const int originalInterval = interval; // Stores default interval for resetting its value later
const int maxSpeed = 50; // Shortest time possible in millis to wait before next numberchange. Should be <= interval
unsigned long startMillis = 0; // Variable for storing millis
void setup() {
byte numDigits = 2;
byte digitPins[] = {8,7};
byte segmentPins[] = {5, 6, 13, 11, 12, 9, 10};
bool resistorsOnSegments = false; // 'false' means resistors are on digit pins
byte hardwareConfig = COMMON_ANODE; // 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. Then, you only need to specify 7 segmentPins[]
sevseg.begin(hardwareConfig, numDigits, digitPins, segmentPins, resistorsOnSegments,
updateWithDelays, leadingZeros, disableDecPoint);
pinMode(b_decr, INPUT_PULLUP);
pinMode(b_incr, INPUT_PULLUP);
pinMode(b_reset, INPUT_PULLUP);
// Power pin
pinMode(power, OUTPUT);
digitalWrite(power, HIGH);
sevseg.blank();
number = 0;
Serial.begin(9600);
}
void loop() {
// Inactivity check //////////////////////////////////////////////////////////////////////////////
unsigned long inactiveTime = millis() - inactiveAtTime;
if (inactiveTime > inactivityInterval) {
analogWrite(power, LOW);
}
else {
Serial.println(inactiveTime);
delay(10);
}
if ( (digitalRead(b_incr) && digitalRead(b_decr) && digitalRead(b_reset)) == 0) {
inactiveAtTime = millis();
}
// Reset button ///////////////////////////////////////////////////////////////////////////////////
resetLastState = resetCurrentState;
resetCurrentState = digitalRead(b_reset);
// Store time when reset button is pressed
if (resetLastState == 1 && resetCurrentState == 0) {
resetPressedTime = millis();
}
// If pressed more than set resetInterval time, number will be reset to 0
if (resetCurrentState == 0 && millis() - resetPressedTime > resetInterval) {
number = 0;
}
// Increase button ////////////////////////////////////////////////////////////////////////////////
if (digitalRead(b_incr) == 0 && millis() - startMillis > interval) {
// Loop between 0-99 numbers
if (number != 99) {
number++;
} else number = 0;
// Speed up if on hold
if (interval > maxSpeed) {
interval = interval - 50;
}
startMillis = millis(); // Store new startMillis after interval of time has passed
}
// Decrease button ////////////////////////////////////////////////////////////////////////////////
if (digitalRead(b_decr) == 0 && millis() - startMillis > interval) {
// Loop between 0-99 numbers
if (number != 0) {
number--;
} else number = 99;
// Speed up if on hold
if (interval > maxSpeed) {
interval = interval - 50;
}
startMillis = millis(); // Store new startMillis after interval of time has passed
}
// Reset interval back to its original /////////////////////////////////////////////////////////////
if ( interval < originalInterval
&& digitalRead(b_decr) != pressed
&& digitalRead(b_incr) != pressed ) {
interval = originalInterval;
}
// Update Seven segment displays //////////////////////////////////////////////////////////////////
sevseg.setNumber(number);
sevseg.refreshDisplay();
// Delete delay from real thing
delay(5);
}