Go Down

### Topic: 8x8 Led matrix turn signal control by switches (Read 1 time)previous topic - next topic

#### yunsheng94

##### Apr 25, 2014, 07:30 pmLast Edit: Apr 25, 2014, 08:34 pm by CrossRoads Reason: 1
I having a problem with my right and left signal.
I connect the 8x8 LED matrix to 2 shift register.
I desire to create a code with (left switch on) left signal on for 1 second then off for 1 second and keep repeat. This goes same to right switch.

This is my code. The output of this code is when left switch on the left signal blinking very fast. The blinking rate as i desire is 1 sec for on and off.

Code: [Select]
`int latchPin = 8;int clockPin = 12;int dataPin = 11;int inputPin2 = 2;            // input pin for left (switch) int inputPin3 = 3;            //input pin for right (switch)int valleft = 0;int valright =0;int LEDs[8][8] = {    {0, 0, 0, 0, 0, 0, 0, 0},      //blank  {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}      };int right[8][8] = {    {0, 0, 0, 0, 1, 0, 0, 0},      //right signal  {0, 0, 0, 0, 1, 1, 0, 0},  {1, 1, 1, 1, 1, 1, 1, 0},  {1, 1, 1, 1, 1, 1, 1, 1},  {1, 1, 1, 1, 1, 1, 1, 1},  {1, 1, 1, 1, 1, 1, 1, 0},  {0, 0, 0, 0, 1, 1, 0, 0},  {0, 0, 0, 0, 1, 0, 0, 0}      };int left[8][8] = {    {0, 0, 0, 1, 0, 0, 0, 0},        //left signal  {0, 0, 1, 1, 0, 0, 0, 0},  {0, 1, 1, 1, 1, 1, 1, 1},  {1, 1, 1, 1, 1, 1, 1, 1},  {1, 1, 1, 1, 1, 1, 1, 1},  {0, 1, 1, 1, 1, 1, 1, 1},  {0, 0, 1, 1, 0, 0, 0, 0},  {0, 0, 0, 1, 0, 0, 0, 0}      };void setup() {  pinMode(latchPin, OUTPUT);  pinMode(clockPin, OUTPUT);  pinMode(dataPin, OUTPUT);  pinMode(inputPin2, INPUT);  pinMode(inputPin3, INPUT);}void loop() {valleft = digitalRead (inputPin2);valright = digitalRead (inputPin3);    if (valleft == HIGH) {      //when the left switch is on lightLED(left);                    //display left signal delay(1000);                      //waits for 1 sec ( this code seem like not working) lightLED(LEDs);                   // off delay(1000):  }  else if (valright == HIGH) {lightLED(right);delay(1000);lightLED(LEDs);delay(1000):  }else lightLED(LEDs);}void lightLED(int tempLED[8][8]) {          //run the lightLED  bit by bit  byte columnbitsToSend = 0;  byte rowbitsToSend = 0;    int x = 0;  int y = 0;  for (x = 0; x < 8; x++) {    columnbitsToSend = 0;    rowbitsToSend = 0;          for (y = 0; y < 8; y ++) {      if (tempLED[x][y] == 1) {        bitWrite(rowbitsToSend, y, HIGH);      }    }        digitalWrite(latchPin, LOW);    bitWrite(columnbitsToSend, x, HIGH);    shiftOut(dataPin, clockPin, MSBFIRST, columnbitsToSend);    shiftOut(dataPin, clockPin, MSBFIRST, rowbitsToSend);    digitalWrite(latchPin, HIGH);      delay(2);  }  }`(code tags added by moderator)

#1
##### Apr 25, 2014, 08:37 pm
You need to make the delay part of the multiplexing, instead of cyclying thru all the data and then delaying.
Run the multiplexing for longer than just the one pass it gets now.
Designing & building electrical circuits for over 25 years.  Screw Shield for Mega/Due/Uno,  Bobuino with ATMega1284P, & other '328P & '1284P creations & offerings at  my website.

#### Paul__B

#2
##### Apr 26, 2014, 01:46 pm
Code: [Select]
`int latchPin = 8;int clockPin = 12;int dataPin = 11;int inputPin2 = 2;            // input pin for left (switch) int inputPin3 = 3;            //input pin for right (switch)int valleft = 0;int valright =0;int LEDs[8][8] = {     {    0, 0, 0, 0, 0, 0, 0, 0        }  ,      //blank  {    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        }      };int right[8][8] = {     {    0, 0, 0, 0, 1, 0, 0, 0        }  ,      //right signal   {    0, 0, 0, 0, 1, 1, 0, 0        }  ,  {    1, 1, 1, 1, 1, 1, 1, 0        }  ,  {    1, 1, 1, 1, 1, 1, 1, 1        }  ,  {    1, 1, 1, 1, 1, 1, 1, 1        }  ,  {    1, 1, 1, 1, 1, 1, 1, 0        }  ,  {    0, 0, 0, 0, 1, 1, 0, 0        }  ,  {    0, 0, 0, 0, 1, 0, 0, 0        }      };int left[8][8] = {     {    0, 0, 0, 1, 0, 0, 0, 0        }  ,        //left signal   {    0, 0, 1, 1, 0, 0, 0, 0        }  ,  {    0, 1, 1, 1, 1, 1, 1, 1        }  ,  {    1, 1, 1, 1, 1, 1, 1, 1        }  ,  {    1, 1, 1, 1, 1, 1, 1, 1        }  ,  {    0, 1, 1, 1, 1, 1, 1, 1        }  ,  {    0, 0, 1, 1, 0, 0, 0, 0        }  ,  {    0, 0, 0, 1, 0, 0, 0, 0        }      };void setup() {  pinMode(latchPin, OUTPUT);  pinMode(clockPin, OUTPUT);  pinMode(dataPin, OUTPUT);  pinMode(inputPin2, INPUT);  pinMode(inputPin3, INPUT);}void loop() {  int t;  valleft = digitalRead (inputPin2);  valright = digitalRead (inputPin3);    if (valleft == HIGH) {                 //when the left switch is on     for (t = 0; t < 64) lightLED(left);  //display left signal     lightLED(LEDs);                      // off     delay(1000):  }  else if (valright == HIGH) {    for (t = 0; t < 64) lightLED(right);    lightLED(LEDs);    delay(1000):  }  else     lightLED(LEDs);}void lightLED(int tempLED[8][8]) {          //run the lightLED  bit by bit   byte columnbitsToSend = 0;  byte rowbitsToSend = 0;  int x;  int y;  for (x = 0; x < 8; x++) {    columnbitsToSend = 0;    rowbitsToSend = 0;    for (y = 0; y < 8; y ++) {      if (tempLED[x][y] == 1) {        bitWrite(rowbitsToSend, y, HIGH);      }     }    digitalWrite(latchPin, LOW);    bitWrite(columnbitsToSend, x, HIGH);    shiftOut(dataPin, clockPin, MSBFIRST, columnbitsToSend);    shiftOut(dataPin, clockPin, MSBFIRST, rowbitsToSend);    digitalWrite(latchPin, HIGH);       delay(2);  }}`

#### yunsheng94

#3
##### May 04, 2014, 07:38 pm

Code: [Select]
`int latchPin = 8;int clockPin = 12;int dataPin = 11;int inputPin2 = 2;            // input pin for left (switch) int inputPin3 = 3;            //input pin for right (switch)int valleft = 0;int valright =0;int LEDs[8][8] = {     {    0, 0, 0, 0, 0, 0, 0, 0        }  ,      //blank  {    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        }      };int right[8][8] = {     {    0, 0, 0, 0, 1, 0, 0, 0        }  ,      //right signal   {    0, 0, 0, 0, 1, 1, 0, 0        }  ,  {    1, 1, 1, 1, 1, 1, 1, 0        }  ,  {    1, 1, 1, 1, 1, 1, 1, 1        }  ,  {    1, 1, 1, 1, 1, 1, 1, 1        }  ,  {    1, 1, 1, 1, 1, 1, 1, 0        }  ,  {    0, 0, 0, 0, 1, 1, 0, 0        }  ,  {    0, 0, 0, 0, 1, 0, 0, 0        }      };int left[8][8] = {     {    0, 0, 0, 1, 0, 0, 0, 0        }  ,        //left signal   {    0, 0, 1, 1, 0, 0, 0, 0        }  ,  {    0, 1, 1, 1, 1, 1, 1, 1        }  ,  {    1, 1, 1, 1, 1, 1, 1, 1        }  ,  {    1, 1, 1, 1, 1, 1, 1, 1        }  ,  {    0, 1, 1, 1, 1, 1, 1, 1        }  ,  {    0, 0, 1, 1, 0, 0, 0, 0        }  ,  {    0, 0, 0, 1, 0, 0, 0, 0        }      };void setup() {  pinMode(latchPin, OUTPUT);  pinMode(clockPin, OUTPUT);  pinMode(dataPin, OUTPUT);  pinMode(inputPin2, INPUT);  pinMode(inputPin3, INPUT);}void loop() {  int t;  valleft = digitalRead (inputPin2);  valright = digitalRead (inputPin3);    if (valleft == HIGH) {                 //when the left switch is on     for (t = 0; t < 64) lightLED(left);  //display left signal     lightLED(LEDs);                      // off     delay(1000):  }  else if (valright == HIGH) {    for (t = 0; t < 64) lightLED(right);    lightLED(LEDs);    delay(1000):  }  else     lightLED(LEDs);}void lightLED(int tempLED[8][8]) {          //run the lightLED  bit by bit   byte columnbitsToSend = 0;  byte rowbitsToSend = 0;  int x;  int y;  for (x = 0; x < 8; x++) {    columnbitsToSend = 0;    rowbitsToSend = 0;    for (y = 0; y < 8; y ++) {      if (tempLED[x][y] == 1) {        bitWrite(rowbitsToSend, y, HIGH);      }     }    digitalWrite(latchPin, LOW);    bitWrite(columnbitsToSend, x, HIGH);    shiftOut(dataPin, clockPin, MSBFIRST, columnbitsToSend);    shiftOut(dataPin, clockPin, MSBFIRST, rowbitsToSend);    digitalWrite(latchPin, HIGH);       delay(2);  }}`

May i know why the delay command work with
lightLED(LEDs);
delay(1000);          //it is working

and does not work with
lightLED(right);
delay(1000);         //not working

#### Paul__B

#4
##### May 05, 2014, 12:30 amLast Edit: May 05, 2014, 12:38 am by Paul__B Reason: 1
My apologies - I corrected the program flow, but failed to spot the glaring typo!  Picked that up on my little netbook reading  in bed this morning.

This should work now - I think!

Code: [Select]
`int latchPin = 8;int clockPin = 12;int dataPin = 11;int inputPin2 = 2;            // input pin for left (switch) int inputPin3 = 3;            //input pin for right (switch)int valleft = 0;int valright =0;int LEDs[8][8] = {     { 0, 0, 0, 0, 0, 0, 0, 0 } , //blank  { 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 }   };int right[8][8] = {     { 0, 0, 0, 0, 1, 0, 0, 0 } , //right signal   { 0, 0, 0, 0, 1, 1, 0, 0 } ,  { 1, 1, 1, 1, 1, 1, 1, 0 } ,  { 1, 1, 1, 1, 1, 1, 1, 1 } ,  { 1, 1, 1, 1, 1, 1, 1, 1 } ,  { 1, 1, 1, 1, 1, 1, 1, 0 } ,  { 0, 0, 0, 0, 1, 1, 0, 0 } ,  { 0, 0, 0, 0, 1, 0, 0, 0 }    };int left[8][8] = {     { 0, 0, 0, 1, 0, 0, 0, 0 } , //left signal   { 0, 0, 1, 1, 0, 0, 0, 0 } ,  { 0, 1, 1, 1, 1, 1, 1, 1 } ,  { 1, 1, 1, 1, 1, 1, 1, 1 } ,  { 1, 1, 1, 1, 1, 1, 1, 1 } ,  { 0, 1, 1, 1, 1, 1, 1, 1 } ,  { 0, 0, 1, 1, 0, 0, 0, 0 } ,  { 0, 0, 0, 1, 0, 0, 0, 0 }    };void setup() {  pinMode(latchPin, OUTPUT);  pinMode(clockPin, OUTPUT);  pinMode(dataPin, OUTPUT);  pinMode(inputPin2, INPUT);  pinMode(inputPin3, INPUT);}void loop() {  int t;  valleft = digitalRead (inputPin2);  valright = digitalRead (inputPin3);    if (valleft == HIGH) {                 //when the left switch is on     for (t = 0; t < 64; t++) lightLED(left);  //display left signal     lightLED(LEDs);                      // off     delay(1000);  }  else if (valright == HIGH) {    for (t = 0; t < 64; t++) lightLED(right);    lightLED(LEDs);    delay(1000);  }  else     lightLED(LEDs);}void lightLED(int tempLED[8][8]) {          //run the lightLED  bit by bit   byte columnbitsToSend = 0;  byte rowbitsToSend = 0;  int x;  int y;  for (x = 0; x < 8; x++) {    columnbitsToSend = 0;    rowbitsToSend = 0;    for (y = 0; y < 8; y ++) {      if (tempLED[x][y] == 1) {        bitWrite(rowbitsToSend, y, HIGH);      }     }    digitalWrite(latchPin, LOW);    bitWrite(columnbitsToSend, x, HIGH);    shiftOut(dataPin, clockPin, MSBFIRST, columnbitsToSend);    shiftOut(dataPin, clockPin, MSBFIRST, rowbitsToSend);    digitalWrite(latchPin, HIGH);       delay(2);  }}`

And a few more bugs - wouldn't compile.

#### yunsheng94

#5
##### May 06, 2014, 07:09 pm

My apologies - I corrected the program flow, but failed to spot the glaring typo!  Picked that up on my little netbook reading  in bed this morning.

This should work now - I think!

Code: [Select]
`int latchPin = 8;int clockPin = 12;int dataPin = 11;int inputPin2 = 2;            // input pin for left (switch) int inputPin3 = 3;            //input pin for right (switch)int valleft = 0;int valright =0;int LEDs[8][8] = {     { 0, 0, 0, 0, 0, 0, 0, 0 } , //blank  { 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 }   };int right[8][8] = {     { 0, 0, 0, 0, 1, 0, 0, 0 } , //right signal   { 0, 0, 0, 0, 1, 1, 0, 0 } ,  { 1, 1, 1, 1, 1, 1, 1, 0 } ,  { 1, 1, 1, 1, 1, 1, 1, 1 } ,  { 1, 1, 1, 1, 1, 1, 1, 1 } ,  { 1, 1, 1, 1, 1, 1, 1, 0 } ,  { 0, 0, 0, 0, 1, 1, 0, 0 } ,  { 0, 0, 0, 0, 1, 0, 0, 0 }    };int left[8][8] = {     { 0, 0, 0, 1, 0, 0, 0, 0 } , //left signal   { 0, 0, 1, 1, 0, 0, 0, 0 } ,  { 0, 1, 1, 1, 1, 1, 1, 1 } ,  { 1, 1, 1, 1, 1, 1, 1, 1 } ,  { 1, 1, 1, 1, 1, 1, 1, 1 } ,  { 0, 1, 1, 1, 1, 1, 1, 1 } ,  { 0, 0, 1, 1, 0, 0, 0, 0 } ,  { 0, 0, 0, 1, 0, 0, 0, 0 }    };void setup() {  pinMode(latchPin, OUTPUT);  pinMode(clockPin, OUTPUT);  pinMode(dataPin, OUTPUT);  pinMode(inputPin2, INPUT);  pinMode(inputPin3, INPUT);}void loop() {  int t;  valleft = digitalRead (inputPin2);  valright = digitalRead (inputPin3);    if (valleft == HIGH) {                 //when the left switch is on     for (t = 0; t < 64; t++) lightLED(left);  //display left signal     lightLED(LEDs);                      // off     delay(1000);  }  else if (valright == HIGH) {    for (t = 0; t < 64; t++) lightLED(right);    lightLED(LEDs);    delay(1000);  }  else     lightLED(LEDs);}void lightLED(int tempLED[8][8]) {          //run the lightLED  bit by bit   byte columnbitsToSend = 0;  byte rowbitsToSend = 0;  int x;  int y;  for (x = 0; x < 8; x++) {    columnbitsToSend = 0;    rowbitsToSend = 0;    for (y = 0; y < 8; y ++) {      if (tempLED[x][y] == 1) {        bitWrite(rowbitsToSend, y, HIGH);      }     }    digitalWrite(latchPin, LOW);    bitWrite(columnbitsToSend, x, HIGH);    shiftOut(dataPin, clockPin, MSBFIRST, columnbitsToSend);    shiftOut(dataPin, clockPin, MSBFIRST, rowbitsToSend);    digitalWrite(latchPin, HIGH);       delay(2);  }}`

And a few more bugs - wouldn't compile.

Yup. It is working.
Thanks a lot. ^^

Go Up

Please enter a valid email to subscribe