Need Help RGB shift registers

Hi

i can any led to light any colour with no problem but when i try to write a sequence i get stuck

This is what i have so far.

//Pin connected to ST_CP of 74HC595
int latchPin = 8;
//Pin connected to SH_CP of 74HC595
int clockPin = 12;
////Pin connected to DS of 74HC595
int dataPin = 11;

//holders for infromation you're going to pass to shifting function
byte dataRED;
byte dataGREEN;
byte dataBLUE;
byte dataRE1;
byte dataGR1;
byte dataBL1;
byte dataArrayRE1[6];
byte dataArrayGR1[6];
byte dataArrayBL1[6];
byte dataArrayRED[6];
byte dataArrayGREEN[6];
byte dataArrayBLUE[6];

void setup() {
//set pins to output because they are addressed in the main loop
pinMode(latchPin, OUTPUT);
Serial.begin(9600);

//Arduino doesn't seem to have a way to write binary straight into the code
//so these values are in HEX. Decimal would have been fine, too.
dataArrayRED[0] = 0x1; //11111111
dataArrayGREEN[1] = 0x1; //11111110
dataArrayBLUE[2] = 0x1; //11111110

dataArrayRE1[3] = 0x2; //11111111
dataArrayGR1[4] = 0x2; //11111110
dataArrayBL1[5] = 0x2; //11111110

//function that blinks all the LEDs
//gets passed the number of blinks and the pause time
blinkAll(0,10);
}

void loop() {

blinkAll(0,00);
for (int l = 0; l < 12; l++) {
//load the light sequence you want from array
dataRED = dataArrayRE1[l];
dataGREEN = dataArrayGR1[l];
dataBLUE = dataArrayBL1[l];
//ground latchPin and hold low for as long as you are transmitting
digitalWrite(latchPin, 0);
//move 'em out
shiftOut(dataPin, clockPin, dataRE1);
shiftOut(dataPin, clockPin, dataGR1);
shiftOut(dataPin, clockPin, dataBL1);
//return the latch pin high to signal chip that it
//no longer needs to listen for information
digitalWrite(latchPin, 1);
delay(100);

blinkAll(0,00);
for (int j = 6; j < 11; j++) {
//load the light sequence you want from array
dataRED = dataArrayRED[j];
dataGREEN = dataArrayGREEN[j];
dataBLUE = dataArrayBLUE[j];
//ground latchPin and hold low for as long as you are transmitting
digitalWrite(latchPin, 0);
//move 'em out
shiftOut(dataPin, clockPin, dataRED);
shiftOut(dataPin, clockPin, dataGREEN);
shiftOut(dataPin, clockPin, dataBLUE);
//return the latch pin high to signal chip that it
//no longer needs to listen for information
digitalWrite(latchPin, 1);
delay(100);
}
}

// the heart of the program
void shiftOut(int myDataPin, int myClockPin, byte myDataOut)
// This shifts 8 bits out MSB first,
//on the rising edge of the clock,
//clock idles low

//internal function setup
int i=0;
int pinState;
pinMode(myClockPin, OUTPUT);
pinMode(myDataPin, OUTPUT);

//clear everything out just in case to
//prepare shift register for bit shifting
digitalWrite(myDataPin, 0);
digitalWrite(myClockPin, 0);

//for each bit in the byte myDataOut?
//NOTICE THAT WE ARE COUNTING DOWN in our for loop
//This means that %00000001 or "1" will go through such
//that it will be pin Q0 that lights.
for (i=7; i>=0; i--) {
digitalWrite(myClockPin, 0);

//if the value passed to myDataOut and a bitmask result
// true then... so if we are at i=6 and our value is
// %11010100 it would the code compares it to %01000000
// and proceeds to set pinState to 1.
if ( myDataOut & (1<<i) ) {
pinState= 1;
}
else {
pinState= 0;
}

//Sets the pin to HIGH or LOW depending on pinState
digitalWrite(myDataPin, pinState);
//register shifts bits on upstroke of clock pin
digitalWrite(myClockPin, 1);
//zero the data pin after shift to prevent bleed through
digitalWrite(myDataPin, 0);
}

//stop shifting
digitalWrite(myClockPin, 0);
}

//blinks the whole register based on the number of times you want to
//blink "n" and the pause between them "d"
//starts with a moment of darkness to make sure the first blink
//has its full visual effect.
void blinkAll(int n, int d) {
digitalWrite(latchPin, 0);
shiftOut(dataPin, clockPin, 0);
digitalWrite(latchPin, 1);
delay(0);
for (int x = 0; x < n; x++) {
digitalWrite(latchPin, 0);
shiftOut(dataPin, clockPin, 255);
digitalWrite(latchPin, 1);
delay(d);
digitalWrite(latchPin, 0);
shiftOut(dataPin, clockPin, 0);
digitalWrite(latchPin, 1);
delay(d);
}
}

But i get this error

error: at this point in fileC:\Documents and Settings\Andy08\My Documents\arduino-0010\hardware\cores\arduino/wiring.h:100: error: too few arguments to function 'void shiftOut(uint8_t, uint8_t, uint8_t, byte)'

ANy Help appreciated :slight_smile:

Andy, your problem was you were missing some opening and closing brackets. The code below has the missing brackets added and should compile but you need to check that the if and else statment brackets are where you want them.

//Pin connected to ST_CP of 74HC595 
int latchPin = 8; 
//Pin connected to SH_CP of 74HC595 
int clockPin = 12; 
////Pin connected to DS of 74HC595 
int dataPin = 11; 
 
//holders for infromation you're going to pass to shifting function 
byte dataRED; 
byte dataGREEN; 
byte dataBLUE; 
byte dataRE1; 
byte dataGR1; 
byte dataBL1; 
byte dataArrayRE1[6]; 
byte dataArrayGR1[6]; 
byte dataArrayBL1[6]; 
byte dataArrayRED[6]; 
byte dataArrayGREEN[6]; 
byte dataArrayBLUE[6]; 



void setup() { 
  //set pins to output because they are addressed in the main loop 
  pinMode(latchPin, OUTPUT); 
  Serial.begin(9600); 
 
  //Arduino doesn't seem to have a way to write binary straight into the code  
  //so these values are in HEX.  Decimal would have been fine, too.  
  dataArrayRED[0] = 0x1; //11111111 
  dataArrayGREEN[1] = 0x1; //11111110 
 dataArrayBLUE[2] = 0x1; //11111110 
    
     dataArrayRE1[3] = 0x2; //11111111 
  dataArrayGR1[4] = 0x2; //11111110 
   dataArrayBL1[5] = 0x2; //11111110 
 
  //function that blinks all the LEDs 
  //gets passed the number of blinks and the pause time 
  blinkAll(0,10);  
} 
 
void loop() { 
 
blinkAll(0,00); 
  for (int l = 0; l < 12; l++) { 
    //load the light sequence you want from array 
    dataRED = dataArrayRE1[l]; 
    dataGREEN = dataArrayGR1[l]; 
    dataBLUE = dataArrayBL1[l]; 
    //ground latchPin and hold low for as long as you are transmitting 
    digitalWrite(latchPin, 0); 
    //move 'em out 
    shiftOut(dataPin, clockPin, dataRE1);    
    shiftOut(dataPin, clockPin, dataGR1);  
    shiftOut(dataPin, clockPin, dataBL1);   
    //return the latch pin high to signal chip that it  
    //no longer needs to listen for information 
    digitalWrite(latchPin, 1); 
    delay(100); 
  }     
    blinkAll(0,00); 
  for (int j = 6; j < 11; j++) { 
    //load the light sequence you want from array 
    dataRED = dataArrayRED[j]; 
    dataGREEN = dataArrayGREEN[j]; 
    dataBLUE = dataArrayBLUE[j]; 
    //ground latchPin and hold low for as long as you are transmitting 
    digitalWrite(latchPin, 0); 
    //move 'em out 
    shiftOut(dataPin, clockPin, dataRED);    
    shiftOut(dataPin, clockPin, dataGREEN);  
    shiftOut(dataPin, clockPin, dataBLUE);   
    //return the latch pin high to signal chip that it  
    //no longer needs to listen for information 
    digitalWrite(latchPin, 1); 
    delay(100); 
  } 
} 
 
 
 
// the heart of the program 
void shiftOut(int myDataPin, int myClockPin, byte myDataOut) { 
  // This shifts 8 bits out MSB first,  
  //on the rising edge of the clock, 
  //clock idles low 
 
  //internal function setup 
  int i=0; 
  int pinState; 
  pinMode(myClockPin, OUTPUT); 
  pinMode(myDataPin, OUTPUT); 
 
  //clear everything out just in case to 
  //prepare shift register for bit shifting 
  digitalWrite(myDataPin, 0); 
  digitalWrite(myClockPin, 0); 
 
  //for each bit in the byte myDataOut? 
  //NOTICE THAT WE ARE COUNTING DOWN in our for loop 
  //This means that %00000001 or "1" will go through such 
  //that it will be pin Q0 that lights.  
  for (i=7; i>=0; i--)  { 
    digitalWrite(myClockPin, 0); 
 
    //if the value passed to myDataOut and a bitmask result  
    // true then... so if we are at i=6 and our value is 
    // %11010100 it would the code compares it to %01000000  
    // and proceeds to set pinState to 1. 
    if ( myDataOut & (1<<i) ) { 
     pinState= 1; 
    } 
    else {       
     pinState= 0; 
    } 
  }
    //Sets the pin to HIGH or LOW depending on pinState 
    digitalWrite(myDataPin, pinState); 
    //register shifts bits on upstroke of clock pin   
    digitalWrite(myClockPin, 1); 
    //zero the data pin after shift to prevent bleed through 
    digitalWrite(myDataPin, 0); 
   
 
  //stop shifting 
  digitalWrite(myClockPin, 0); 
} 
 
 
//blinks the whole register based on the number of times you want to  
//blink "n" and the pause between them "d" 
//starts with a moment of darkness to make sure the first blink 
//has its full visual effect. 
void blinkAll(int n, int d) { 
  digitalWrite(latchPin, 0); 
  shiftOut(dataPin, clockPin, 0); 
  digitalWrite(latchPin, 1); 
  delay(0); 
  for (int x = 0; x < n; x++) { 
    digitalWrite(latchPin, 0); 
    shiftOut(dataPin, clockPin, 255); 
    digitalWrite(latchPin, 1); 
    delay(d); 
    digitalWrite(latchPin, 0); 
    shiftOut(dataPin, clockPin, 0); 
    digitalWrite(latchPin, 1); 
    delay(d); 
  } 
}

Ok

Thanks for the reply :slight_smile:

That worked. just wondering if you could help with regards to a pattern, eg.

2 red 2 green 2 blue doing a scoll across the 8 leds,

Thanks

When I did a 8 RGB led display I devised algorithms to make the patterns instead of hard coding them.
Read a bit shifting tutorial and you'll see how its done.

I have tried this but i am new to this i can get static colors but cant seqence them

can you help?