An experiment with a new SB1K1Y8G light bar.
/**
* Shift Register Example
*
* @author Matthew Edwards
*/
#define PIN_DATA 7
#define PIN_LATCH 6
#define PIN_CLOCK 5
#define PIN_MODE 2
#define ANIMATION_DELAY 60
#define MODE_COUNT 5
#define MODE_RANDOM 0
#define MODE_PROGRESS 1
#define MODE_KITT 2
#define MODE_LEVELS 3
#define MODE_WAITING 4
int mode = MODE_RANDOM;
/**
* System setup.
*/
void setup() {
// Set up pins for use with 74HC595.
pinMode(PIN_DATA, OUTPUT);
pinMode(PIN_LATCH, OUTPUT);
pinMode(PIN_CLOCK, OUTPUT);
// Set up interrupt.
pinMode(PIN_MODE, INPUT);
attachInterrupt(digitalPinToInterrupt(PIN_MODE), switchMode, RISING);
setLedValue(0);
}
/**
* Interrupt to switch modes.
*/
void switchMode() {
mode += 1;
if (mode >= MODE_COUNT) {
mode = MODE_RANDOM;
}
}
/**
* System loop.
*/
void loop() {
int currentAnimation = mode;
if (mode == MODE_RANDOM) {
currentAnimation = random(4) + 1;
}
int loops = random(6) + 5;
for (int i = 0; i < loops; ++i) {
switch (currentAnimation) {
case MODE_PROGRESS:
doProgress();
break;
case MODE_KITT:
doKitt();
break;
case MODE_LEVELS:
doLevels();
break;
case MODE_WAITING:
doWaiting();
break;
default:
delay(ANIMATION_DELAY);
break;
}
}
}
/**
* Do an audio level measuring effect.
*/
void doLevels() {
int currentValue = 0;
for (int loops = 0; loops < 4; ++loops) {
int targetValue = random(10);
for (int i = 0; i > 1);
}
}
}
/**
* Convert a value to a slider position for animation.
*/
uint8_t convertToSlider(int index) {
uint8_t val = 0x7;
if (index >= 3 - index;
} else {
val <<= index - 3;
}
return val;
}
/**
* Do a waiting bar effect.
*/
void doWaiting() {
for (int i = 0; i < 14; ++i) {
setLedValue(convertToSlider(i));
delay(ANIMATION_DELAY);
}
}
/**
* Do a sliding progress bar effect.
*/
void doProgress() {
for (int i = 0; i = 0; --i) {
setLedValue(convertToStackReversed(i));
delay(ANIMATION_DELAY);
}
}
/**
* Do the Nightrider KITT effect.
*/
void doKitt() {
for (int i = 0; i < 14; ++i) {
setLedValue(convertToSlider(i));
delay(ANIMATION_DELAY);
}
for (int i = 0; i < 14; ++i) {
setLedValue(reverseBitwise(convertToSlider(i)));
delay(ANIMATION_DELAY);
}
}
/**
* Push new LED value to the display.
*/
void setLedValue(uint8_t value) {
// Fix LED state while changing shift register values.
digitalWrite(PIN_LATCH, LOW);
// shift out the bits:
shiftOut(PIN_DATA, PIN_CLOCK, MSBFIRST, value);
// Show updated LED state.
digitalWrite(PIN_LATCH, HIGH);
}
/**
* Convert a number to LED stack.
*/
uint8_t convertToStack(int value) {
uint8_t stack = 0;
for (int i = 0; i + 1 <= value; ++i) {
stack <<= 1;
stack |= 0x1;
}
return stack;
}
/**
* Convert a number to LED stack. (Reversed)
*/
uint8_t convertToStackReversed(int value) {
uint8_t stack = 0;
for (int i = 0; i + 1 >= 1;
stack |= 0x80;
}
return stack;
}
/**
* Reverse a uint8_t bitwise.
*/
uint8_t reverseBitwise(uint8_t value) {
uint8_t newValue = 0;
for (int i = 0; i < 8; ++i) {
newValue <>= 1;
}
return newValue;
}