#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;
// 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 = 100; // Shortest time possible in millis to wait before next numberchange. Should be <= interval
long startMillis = 0; // Variable for storing millis
void setup() {
byte numDigits = 2;
byte digitPins[] = {7,8};
byte segmentPins[] = {5, 6, 13, 11, 12, 9, 10};
bool resistorsOnSegments = false; // '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. 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);
sevseg.blank();
number = 0;
Serial.begin(9600);
}
void loop() {
// 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;
}
long currentMillis = millis(); // Capture current milliseconds for interval calculations
// Increase button
if (digitalRead(b_incr) == 0 && currentMillis - 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 = currentMillis; // Store new startMillis after interval of time has passed
}
// Decreace button
if (digitalRead(b_decr) == 0 && currentMillis - 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 = currentMillis; // 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;
}
sevseg.setNumber(number);
sevseg.refreshDisplay();
delay(5);
}