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.
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
Post a Comment