Matthew Edwards

Creating Patterns on an LED Bar


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;
}