Go Down

Topic: Shift register led patterns (Read 1 time) previous topic - next topic

bld

I am trying shift registers for the first time, and would like to be able to make patterns for how the leds would be turned on and off.

Right now I got this test code running, which is just a boring sweep...
Code: [Select]

int dataPin = 2;        //Define which pins will be used for the Shift Register control
int latchPin = 3;
int clockPin = 4;

int seq[14] = {1,2,4,8,16,32,64,128,64,32,16,8,4,2};       //The byte sequence

void setup()
{
    pinMode(dataPin, OUTPUT);       //Configure each IO Pin
    pinMode(latchPin, OUTPUT);
    pinMode(clockPin, OUTPUT);
}

void loop()
{
    for (int n = 0; n < 14; n++)
    {
        digitalWrite(latchPin, LOW);             //Pull latch LOW to start sending data
        shiftOut(dataPin, clockPin, MSBFIRST, seq[n]);          //Send the data
        digitalWrite(latchPin, HIGH);            //Pull latch HIGH to stop sending data
        delay(75);
    }
}


But how would I do it if I would have multiple pins enabled? like 00011000 then 00100100, followed by 01000010...
captain-slow.dk | non contagious!

Osgeld

you just make an array with the patterns as bits

byte seq = {B00011000,B00100100,B01000010}
http://arduino.cc/forum/index.php?action=unread;boards=2,3,4,5,67,6,7,8,9,10,11,66,12,13,15,14,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,86,87,89,1;ALL

marco_c

Here's code I wrote a long time ago to make patterns. See if you can figure out how to make your from this. FYI my LEDs were in a circle.

Code: [Select]
// 595 tester

//Pin Definitions
//The 74HC595 using a protocol called SPI (for more details http://www.arduino.cc/en/Tutorial/ShiftOut)
//Which has three pins
#define  DATA_PIN  10   
#define  CLOCK_PIN  9
#define  LATCH_PIN  8

#define  MAX_LED    8  // the number of LEDs we want to flash, should be a number >= 2
#define  MAX_REPEAT 2  // the maximum number of times each sequence will repeat
#define  PAUSE_DELAY  100  // delay between each LED animation on/off

#define  DEBUG  1  // Enable Debugging code if required

//Used for single LED manipulation
int ledState = 0;
const int ON = HIGH;
const int OFF = LOW;
                       
void setup()
{
  // We set the three control pins to outputs
  pinMode(DATA_PIN, OUTPUT);
  pinMode(CLOCK_PIN, OUTPUT); 
  pinMode(LATCH_PIN, OUTPUT); 
#if  DEBUG
  Serial.begin(57600);
  Serial.println("[LED Sequence Flasher]");
#endif
}

void updateLEDs(byte value, boolean bReverse, int nPause)
// Handle the interface to the 74HC595 to write the 8 bits of the byte 
// Optionally reversethe bit string and then delay at the end
{
  if (bReverse) value = ~value;

  digitalWrite(LATCH_PIN, LOW);  //Pulls the chips latch low
  shiftOut(DATA_PIN, CLOCK_PIN, MSBFIRST, value); //Shifts out the 8 bits to the shift register
  digitalWrite(LATCH_PIN, HIGH);   //Pulls the latch high displaying the data
 
  if (nPause != 0) delay(nPause);
}

void Sequence01(boolean bReverse)
// Flash each LED in sequence
{
#if  DEBUG
  Serial.println("Seq 01");
#endif
  for (byte i=0; i<MAX_LED; i++)
  {
    updateLEDs((1 << i), bReverse, PAUSE_DELAY);
  }   
}


void Sequence02(boolean bReverse)
// Scan back and forth
{
#if  DEBUG
  Serial.println("Seq 02");
#endif
  for (byte i=0; i<MAX_LED; i++)
  {
    updateLEDs((1 << i), bReverse, PAUSE_DELAY);
  }   
  for (byte i=MAX_LED-1; i>0; i--)
  {
    updateLEDs((1 << i), bReverse, PAUSE_DELAY);
  }   
}


void Sequence03(boolean bReverse)
// Start at each end towards the middle
{
#if  DEBUG
  Serial.println("Seq 03");
#endif
  for (byte i=0; i<MAX_LED/2; i++)
  {
    updateLEDs((1 << i) | (1 << MAX_LED-i-1), bReverse, PAUSE_DELAY);
  }   
}


void Sequence04(boolean bReverse)
// Start in the middle towards each end
{
#if  DEBUG
  Serial.println("Seq 04 ");
#endif
  for (int i=MAX_LED/2-1; i>=0; i--)
  {
    updateLEDs((1 << i) | (1 << MAX_LED-i-1), bReverse, PAUSE_DELAY);
  }   
}


void Sequence05(boolean bReverse)
// Start at each end towards the middle, cross over and keep going
// Looks like they bounce off each other!
{
#if  DEBUG
  Serial.println("Seq 05");
#endif
  for (byte i=0; i<MAX_LED; i++)
  {
    updateLEDs((1 << i) | (1 << MAX_LED-i-1), bReverse, ((i==MAX_LED/2) ? PAUSE_DELAY/2 : PAUSE_DELAY));
  }   
}


void Sequence06(boolean bReverse)
// Bouncing ball, each bounce is one less LED
{
  byte  j;
#if  DEBUG
  Serial.println("Seq 06");
#endif
  for (byte i=0; i<MAX_LED; i++)
  {
    for (j=0; j<MAX_LED-i-1; j++)
    {
      updateLEDs((1 << j), bReverse, PAUSE_DELAY);
    }   
    for ( /* wherever j is from before */; j>0; --j)
    {
      updateLEDs((1 << j), bReverse, PAUSE_DELAY);
    }
  }   
}

void Sequence07(boolean bReverse)
// Binary counter
{
  int maxCount = (1<<MAX_LED)-1;  // use up all the bits in the number

#if  DEBUG
  Serial.println("Seq 07");
#endif
  for (int i=0; i<maxCount; i++)
  {
    updateLEDs(i, bReverse, PAUSE_DELAY/4);
  }   
}

void loop()
{
  static int  n = 0;
  static boolean bReverse = false;

  switch (n/MAX_REPEAT)  // repeat each sequence MAX_REPEAT times
  {
    case 0:  Sequence01(bReverse);  break;
    case 1:  Sequence02(bReverse);  break;
    case 2:  Sequence03(bReverse);  break;
    case 3:  Sequence04(bReverse);  break;
    case 4:  Sequence05(bReverse);  break;
    case 5:  Sequence06(bReverse);  break;
    case 6:  Sequence07(bReverse);  break;
    default:
      n=-1;    // reset the loop counter - it gets incremeted again at the end of loop()
      bReverse = ~bReverse;
  }

  n++;  // increment the loop counter for next time
}
Arduino libraries http://arduinocode.codeplex.com
Parola for Arduino http://parola.codeplex.com

bld


Here's code I wrote a long time ago to make patterns. See if you can figure out how to make your from this. FYI my LEDs were in a circle.

Awesome! :)

Just tested the code, and it worked right away, just need to take it apart now to make it fit what I need, thank you! :D

My led's will be in a circle too, going to be 8 under this.

captain-slow.dk | non contagious!

bld


you just make an array with the patterns as bits

byte seq = {B00011000,B00100100,B01000010}

And I actually ended up using this way instead, fits my application a bit better :)
captain-slow.dk | non contagious!

Go Up
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy