Flickering LEDs with Shift Register


i have 5 led modules daisy chained basic 595 shift registers.

i thought had code squared away , going go ahead , jump external power thats thread.

went bed, woke , last shift register behaving oddly.

i have panels 1-4 set high , panel 5 low. have panels 1-4 connected pwm pin dimming, works great. panel 5 not pwm , grounded dont want dim.

when dim panels 1-4, , panel 5 off randomly half second flickering occurs in leds. isnt wiring issue because ive rotated panels around , 5th panel.

the on/off of panels 1-4 on 1 button. on/off panel 5 on button.

code: [select]
int datapin = 3;   //pin 14 on 75hc595
int latchpin = 4;  //pin 12 on 75hc595
int clockpin = 13; //pin 11 on 75hc595
int emergencyswitch = 11; //pin button
int headlightswitch = 12;
int embuttonpushcounter = 0;   // counter number of button presses
int embuttonstate = 0;// current state of button
int hlbuttonstate = 0;
int hlbuttonpushcounter = 0;
int lasthlbuttonstate = 0;
int lastembuttonstate = 0;     // previous state of button
int outputenablepin = 9;
int headlightbrightnesspin = 5;

//how many of shift registers - change this
#define number_of_74hc595s 5

//do not touch
#define numofregisterpins number_of_74hc595s * 8

boolean registers[numofregisterpins];

void setup(){
  pinmode(datapin, output);
  pinmode(latchpin, output);
  pinmode(clockpin, output);
  pinmode(outputenablepin, output);
  pinmode(outputenablepin, output);
  pinmode(emergencyswitch, input_pullup);
  pinmode(headlightswitch, input_pullup);


  //reset register pins
  clearregisters();
  writeregisters();
 
//  switchoff();
   serial.begin(9600);
}               


//set register pins low
void clearregisters(){
  for(int = numofregisterpins - 1; >=  0; i--){
     registers[i] = low;
  }
}


//set , display registers
//only call after values set how (slow otherwise)
void writeregisters(){
  digitalwrite(latchpin, low);

  for(int = numofregisterpins - 1; >=  0; i--){
    digitalwrite(clockpin, low);

    int val = registers[i];

    digitalwrite(datapin, val);
    digitalwrite(clockpin, high);
  }
  digitalwrite(latchpin, high);

}

//set individual pin high or low
void setregisterpin(int index, int value){
  registers[index] = value;
}


void loop(){

emergencylights();
headlights();
 
}

void headlights()
{
  //button 2
   hlbuttonstate = digitalread(headlightswitch);
  // compare embuttonstate previous state
  if (hlbuttonstate != lasthlbuttonstate) {
    // if state has changed, increment counter
    if (hlbuttonstate == low) {
      // if current state high button
      // went off on:
      hlbuttonpushcounter++;
      serial.print("number of button pushes:  ");
      serial.println(hlbuttonpushcounter);
      delay(20);     // delay button deboucning
    }         
   if (hlbuttonpushcounter == 0){
        serial.println("light setting 1");
       hlswitchoff();
      }
      if (hlbuttonpushcounter == 1){
        serial.println("light setting 2");
        steadywhitefront();       
      }

}
  if (hlbuttonstate == lasthlbuttonstate) {
    if (hlbuttonpushcounter == 0){
        serial.println("light setting 1");
        hlswitchoff();
      }
      if (hlbuttonpushcounter == 1){
        serial.println("light setting 2");
        steadywhitefront();     
      }

  }
   
 
  if (hlbuttonpushcounter >=2) {
    hlbuttonpushcounter = 0;
    serial.println(hlbuttonpushcounter);

   lasthlbuttonstate = hlbuttonstate;
   


void emergencylights()
{
  embuttonstate = digitalread(emergencyswitch);
 
  if (embuttonstate != lastembuttonstate) {
   
    if (embuttonstate == low) {
     
      embuttonpushcounter++;
      serial.print("number of button pushes:  ");
      serial.println(embuttonpushcounter);
      delay(20);     // delay button deboucning
    }         
   if (embuttonpushcounter == 0){
        serial.println("light setting 1");
        switchoff();
      }
      if (embuttonpushcounter == 1){
        serial.println("light setting 2");
        // nothing right now     
      }
      if (embuttonpushcounter == 2){
        serial.println("light setting 3");
        steadyon();
      }   
      if (embuttonpushcounter == 3){
        serial.println("light setting 4");
        steadysidesondim();
      }   

}
  if (embuttonstate == lastembuttonstate) {
    if (embuttonpushcounter == 0){
        serial.println("light setting 1");
        switchoff();
      }
      if (embuttonpushcounter == 1){
        serial.println("light setting 2");
               // nothing right now
      }
      if (embuttonpushcounter == 2){
        serial.println("light setting 3");
        steadyon();
      }   
      if (embuttonpushcounter == 3){
        serial.println("light setting 4");
        steadysidesondim();
      }   
 
  if (embuttonpushcounter >=4) {
    embuttonpushcounter = 0;
    serial.println(embuttonpushcounter);

   lastembuttonstate = embuttonstate;
}
}
 
void steadyon()
{
  int index;

  setbrightness(255);

  for(index = 0; index <=31; index++)
  {
    setregisterpin(index, high);
   writeregisters();
  }
}

void steadysidesondim()
{
  int index;
   for(index = 0; index <= 31; index++)
  {
    setbrightness(30);
    setregisterpin(index, high);
    writeregisters();   
     
  }   
}

void hlswitchoff()
{
  int index1;

sethlbrightness(0);
  for(index1 = 32; index1 <= 39; index1 ++)
    {
      setregisterpin(index1, low);
      delay(0);
      writeregisters();
    }

}


void switchoff()
{
  int index;
 
  for(index = 0; index <= 31; index ++)
    {
      setregisterpin(index, low);
      writeregisters();
    }
}


void steadywhitefront()
  {
    int index;
 
    for(index = 32; index <= 39; index ++)
    {
      sethlbrightness(255);     
      setregisterpin(index, high);
      writeregisters();
    }
  }


void setbrightness(byte brightness) // 0 255
{
  analogwrite(outputenablepin, 255-brightness);
}
void sethlbrightness(byte brightness) // 0 255
{
  analogwrite(headlightbrightnesspin, 255-brightness);
}

code: [select]
void clearregisters(){
  for(int = numofregisterpins - 1; >=  0; i--){
     registers[i] = low;
  }
}

for loops count far easier understand. why counting down?

code: [select]
    int val = registers[i];

    digitalwrite(datapin, val);

why necessary copy value?

code: [select]
//set individual pin high or low
void setregisterpin(int index, int value){
  registers[index] = value;
}

one line functions waste of time , effort.

code: [select]
void steadyon()
{
  int index;

  setbrightness(255);

  for(index = 0; index <=31; index++)
  {
    setregisterpin(index, high);
   writeregisters();
  }
}

i think write values registers first, write register values pins.


Arduino Forum > Using Arduino > Programming Questions > Flickering LEDs with Shift Register


arduino

Comments

Popular posts from this blog

Connecting Raspberry Pi 2 to P10(1R)-V706 LED Dot Matrix - Raspberry Pi Forums

datso and removing imagetitle - Joomla! Forum - community, help and support

RC Receiver into Arduino as PC Controller (UnoJoy)