// https://forum.arduino.cc/t/water-show-with-timing/1207999
// https://wokwi.com/projects/386308181455826945
# include <Adafruit_NeoPixel.h>
const int dataPin = 2; // DS
const int latchPin = 3; // STCP
const int clockPin = 4; // SHCP
#define NUM_SHIFT_REG 4
const int numRegisterPins = NUM_SHIFT_REG * 8;
bool registers[numRegisterPins];
int pattern = 0b10101010;
int delayTime = 133;
# define NUM_LEDS numRegisterPins
# define LED_PIN A0
Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM_LEDS, LED_PIN, NEO_GRB + NEO_KHZ800);
void setup() {
pinMode(dataPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(latchPin, OUTPUT);
strip.begin();
setRegisterPin(1, 1);
setRegisterPin(31, 1);
writeRegisters();
delay(777);
clearRegisters();
}
void loop() {
// showPattern();
// showFirstLast();
// randomrelay();
cascade();
}
void randomrelay() {
int i = random(32);
int j = random(2);
setRegisterPin(i, j);
writeRegisters();
delay(300);
setRegisterPin(i, !j);
writeRegisters();
}
void cascade() {
for (int i = 0; i < numRegisterPins; i++) {
setRegisterPin(i, 1);
writeRegisters();
delay(delayTime);
setRegisterPin(i, 0);
writeRegisters();
}
}
void firstLast() {
setRegisterPin(0, 1); // set first relay
setRegisterPin(31, 1); // set last relay
writeRegisters(); // display
}
void showPattern() {
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, LSBFIRST, pattern);
digitalWrite(latchPin, HIGH);
delay(500);
pattern = ~pattern; // Invert the pattern
}
void setRegisterPin(int index, int value) {
// Set an individual pin HIGH or LOW
registers[index] = value;
strip.setPixelColor(index, value ? 0xff0000 : 0x010101);
}
void writeRegisters() {
// Set and display registers
digitalWrite(latchPin, LOW);
for (int i = numRegisterPins - 1; i >= 0; i--) {
digitalWrite(clockPin, LOW);
digitalWrite(dataPin, registers[i]);
digitalWrite(clockPin, HIGH);
}
digitalWrite(latchPin, HIGH);
strip.show();
}
void clearRegisters() { // clear all pins
for (int i = numRegisterPins - 1; i >= 0; i--) {
registers[i] = LOW;
}
strip.clear();
}