I've been handed a 7-segment display with 4 digits that use a LED stripe for the segments. It was originally used as a stopwatch/timer at a school. The original maker passed away so it was handed to me to modify but I haven't coded anything in years so I'm really rusty. I've mashed together some codes but it's not working. I just want it to start with 0000 then 0550,1250,3050,5000 then back to 0000 and have them be able to start over again.
// INCLUDES
// Interfacing to programmable LED strips, see https://fastled.io/
#include <FastLED.h>
// For debouncing button input, see https://github.com/thomasfredericks/Bounce2
#include <Bounce2.h>
// DEFINES
// How many LEDs are used in each digit
#define NUM_LEDS_PER_DIGIT 29
// Total number of LEDs in the strip
#define NUM_LEDS 116
// The pin which is connected to the DataIn of the LED strip
#define DATA_PIN 2
// If defined, timer shows minutes and seconds MM:SS, rather than seconds SSSS
// #define DISPLAY_MMSS
// CONSTANTS
// The following array defines the sequence of LEDs that should be lit to represent each digit 0-9
// This will vary depending on the order in which the strip has been physically wired through
// the segments, the number of LEDs in each segment, whether there are any unused LEDs in the strip
// (e.g. between digits) etc.
// Segments of a 7-segment display are generally labelled as follows:
// /-A-\
// F B
// --G-/
// E C
// \-D-/
// The way I've wired the strips is:
// - Strip is fed through the segments in the order G->B->A->F->E->D->C (then onto the next digit)
// - There are 4 LEDs in each segment
// - There is a single unused LED in the strip between segments F and E
// - This makes the total length of 29 LEDs in the strip for each digit
// - I'm packing these into a single 32-bit integer, and since bitwise operations are MSB, this will
// be counted from the right-hand side, and then padded at the front with 3x0s up to 32 bits.
// e.g. 0b000ccccddddeeee0ffffaaaabbbbgggg
const uint32_t digits[10] = {
0b00011111111111101111111111110000, // 0
0b00011110000000000000000011110000, // 1
0b00000001111111100000111111111111, // 2
0b00011111111000000000111111111111, // 3
0b00011110000000001111000011111111, // 4
0b00011111111000001111111100001111, // 5
0b00011111111111101111111100001111, // 6
0b00011110000000000000111111110000, // 7
0b00011111111111101111111111111111, // 8
0b00011111111000001111111111111111, // 9
};
// Input pins
const byte leftPin = 6;
const byte startPin = 5;
const byte rightPin = 4;
// GLOBALS
// The array of RGB values assigned to each LED in the strip
CRGB leds[NUM_LEDS];
int buttonPushCounter = 1;
int buttonState = 0;
// Bounce objects to read debounced button input
Bounce2::Button btnStart = Bounce2::Button();
Bounce2::Button btnLeft = Bounce2::Button();
Bounce2::Button btnRight = Bounce2::Button();
// FUNCTIONS
// Set the values in the LED strip corresponding to a particular display/value
void setDigit(int display, int val, CHSV colour){
for(int i=0;i<NUM_LEDS_PER_DIGIT; i++){
colour.v = bitRead(digits[val], i) * 255;
leds[display*NUM_LEDS_PER_DIGIT + i] = colour;
}
}
// This function runs once when the program first starts
void setup() {
// Initialise a serial connection, used only for debugging
Serial.begin(115200);
Serial.println(__FILE__ __DATE__);
// Initialise the LED strip
FastLED.addLeds<WS2812B, DATA_PIN, GRB>(leds, NUM_LEDS);
// Configure the debounced inputs
btnStart.attach(startPin, INPUT_PULLUP);
btnLeft.attach(leftPin, INPUT_PULLUP);
btnRight.attach(rightPin, INPUT_PULLUP);
}
int buttonPress()
{
buttonState = digitalRead(startPin);
if (buttonState != lastButtonState)
{
if (buttonState == LOW)
{
buttonPushCounter++;
}
delay(50);
}
lastButtonState = buttonState;
if(buttonPushCounter == 6)
{
buttonPushCounter = 1;
}
}
// This function runs over and over
void loop() {
// Check whether any buttons have been pressed
btnStart.update();
btnLeft.update();
btnRight.update();
// Calculate the value to be displayed
static long timeValue = 0;
// The colour hue in which the time will be displayed
int timeHue = 170;
switch (buttonPushCounter)
{
case 1:
firstnumber();
break;
case 2:
secondnumber();
break;
case 3:
thirdnumber();
break;
case 4:
fourthnumber();
break;
case 5:
restart();
break;
}
}
void firstnumber(){
// Units
setDigit(3, (0 ) % 10, CHSV(timeHue, 255, 255));
// Tens
setDigit(2, (5 ) % 10, CHSV(timeHue, 255, 255));
// Hundreds
setDigit(1, (5 ) % 10, CHSV(timeHue, 255, 255));
// Thousands
setDigit(0, (0 ) % 10, CHSV(timeHue, 255, 255));
}
void secondnumber(){
// Units
setDigit(3, (0 ) % 10, CHSV(timeHue, 255, 255));
// Tens
setDigit(2, (5 ) % 10, CHSV(timeHue, 255, 255));
// Hundreds
setDigit(1, (2 ) % 10, CHSV(timeHue, 255, 255));
// Thousands
setDigit(0, (1 ) % 10, CHSV(timeHue, 255, 255));
}
void thirdnumber(){
// Units
setDigit(3, (0 ) % 10, CHSV(timeHue, 255, 255));
// Tens
setDigit(2, (5 ) % 10, CHSV(timeHue, 255, 255));
// Hundreds
setDigit(1, (0 ) % 10, CHSV(timeHue, 255, 255));
// Thousands
setDigit(0, (3 ) % 10, CHSV(timeHue, 255, 255));
}
void fourthnumber(){
// Units
setDigit(3, (0 ) % 10, CHSV(timeHue, 255, 255));
// Tens
setDigit(2, (0 ) % 10, CHSV(timeHue, 255, 255));
// Hundreds
setDigit(1, (0 ) % 10, CHSV(timeHue, 255, 255));
// Thousands
setDigit(0, (5 ) % 10, CHSV(timeHue, 255, 255));
}
void restart(){
// Units
setDigit(3, (0 ) % 10, CHSV(timeHue, 255, 255));
// Tens
setDigit(2, (0 ) % 10, CHSV(timeHue, 255, 255));
// Hundreds
setDigit(1, (0 ) % 10, CHSV(timeHue, 255, 255));
// Thousands
setDigit(0, (0 ) % 10, CHSV(timeHue, 255, 255));
}
{
// Cycle colour hue while paused (BPM, from_value, to_value)
timeHue = beatsin8(20, 0, 40);
// Send the updated values to the LED strip
FastLED.show();
delay(20);
}