I made a 72 bit shiftregister with 12 595's.
I do not use the shiftout function. Sometimes is don't want to shift out a byte, but just 3 bits (RGB). Therefore I made my function for shifting out the bits.
const int latchPin = 11; //Pin connected to latch pin (ST_CP) of 74HC595
const int clockPin = 10; //Pin connected to clock pin (SH_CP) of 74HC595
const int dataPin = 9; //Pin connected to Data in (DS) of 74HC595
boolean aan[] = {
true};
boolean uit[] = {
false};
boolean groen[] = {
0,1,0};
boolean rood[] = {
0,0,1};
boolean blauw[] = {
1,0,0};
boolean violet[] = {
1,0,1};
boolean turk[] = {
1,1,0};
boolean oranje[] = {
0,1,1};
boolean wit[] = {
1,1,1};
boolean zwart[] = {
0,0,0};
int pauze = 70;
int mode = 0;
long lasttime = 0;
const int lengte = 72;
boolean bar[lengte +1] = {
0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0};
void setup() {
//set pins to output because they are addressed in the main loop
pinMode(latchPin, OUTPUT);
pinMode(dataPin, OUTPUT);
pinMode(clockPin, OUTPUT);
shiftdata(lengte, bar);
Serial.begin(9600);
Serial.println("start, debug");
}
void loop() {
switch (mode){
case 0:
drop();
break;
case 1:
sinnu1();
break;
case 2:
willekeurig();
break;
case 3:
sinnu3();
break;
case 4:
sinnu4();
break;
default:
mode = 0;
}
if (millis() >= lasttime + 10000){
mode ++;
lasttime = millis();
}
}
void shiftdata(int lengte, boolean data[]){
digitalWrite(latchPin, LOW);
for (int i=0; i<lengte; i++){
digitalWrite(dataPin, data[i]);//bit klaarzetten
digitalWrite(clockPin, HIGH);//bit shiften
digitalWrite(clockPin, LOW);
}
digitalWrite(latchPin, HIGH);// toon data
}
void sinnu1(){
int positie = 36 * sin(millis()/250.0) + 36;
int positie2 = 36 * cos(millis()/250.0) + 36;
for (int j=0; j<=lengte; j++){
if (((j <= positie) && (j >= positie2)) || ((j >= positie) && (j <= positie2))){
bar[j] = 1;
}
else
{
bar[j] = 0;
}
}
shiftdata(lengte, bar);
}
void sinnu3(){
int positie = 3*int(12 * sin(millis()/250.0) + 12);
for (int j=0; j<=lengte; j++){
if (j== positie){
bar[j] = 1;
}
else
{
bar[j] = 0;
}
}
positie = 3*int(12 * sin(millis()/250.0 + 0.2) + 12)+1;
for (int j=0; j<=lengte; j++){
if (j== positie){
bar[j] = 1;
}
}
positie = 3*int(12 * sin(millis()/250.0 + 0.4) + 12)+2;
for (int j=0; j<=lengte; j++){
if (j== positie){
bar[j] = 1;
}
}
shiftdata(lengte, bar);
}
void sinnu4(){
int positie = 36 * sin(millis()/200.0) + 36;
for (int j=0; j<=lengte; j++){
if (j== positie){
bar[j] = 1;
}
else
{
bar[j] = 0;
}
}
shiftdata(lengte, bar);
positie = 36 * sin(millis()/225.0) + 36;
for (int j=0; j<=lengte; j++){
if (j== positie){
bar[j] = 1;
}
}
shiftdata(lengte, bar);
positie = 36 * sin(millis()/250.0) + 36;
for (int j=0; j<=lengte; j++){
if (j== positie){
bar[j] = 1;
}
}
shiftdata(lengte, bar);
positie = 36 * sin(millis()/275.0) + 36;
for (int j=0; j<=lengte; j++){
if (j== positie){
bar[j] = 1;
}
}
shiftdata(lengte, bar);
}
void willekeurig(){
bar[random(lengte+1)] = random(2);
shiftdata(lengte, bar);
//delay(pauze);
}
void drop(){
int kleur = random(3);
switch (kleur){
case 0:
shiftdata(3,rood);
delay(pauze);
shiftdata(3,rood);
break;
case 1:
shiftdata(3,groen);
delay(pauze);
shiftdata(3,groen);
break;
case 2:
shiftdata(3,blauw);
delay(pauze);
shiftdata(3,blauw);
break;
default:
shiftdata(3,zwart);
}
delay(pauze);
}