Pages: [1]   Go Down
Author Topic: [Noob] Turning on and off LEDs through an IC  (Read 284 times)
0 Members and 1 Guest are viewing this topic.
0
Offline Offline
Newbie
*
Karma: 0
Posts: 2
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ok yes I am a bit of a noob at this but I thought I would ask to see if someone could help. Basicly I'm modifying a piece of code from this website (The http://www.arduino.cc/en/Tutorial/ShiftOut tutorial). So I have wired up everything correctly and the sample code does the job and lights up what it is designed to.

Now what I was wanting to do was use some of this code but convert it so that it just lights up the LEDs depending on the value of certain inputs. The inputs are just 3 LEDs (red, yellow and green) on a WiFi strength testing device. The WiFi strength tester just lights up the LEDs depending on the signal strength. So I was planning on having 3 IC's with 8 LEDs connected to each just light up in groups when 1 of the input LEDs light up.

So far I have got this and then got stuck.

Code:
int inputPin1 = 2;               // choose the input pin (for a pushbutton)
int inputPin2 = 3;               // choose the input pin (for a pushbutton)
int inputPin3 = 4;               // choose the input pin (for a pushbutton)

int val1 = 0;                    // variable for reading the pin status
int val2 = 0;                    // variable for reading the pin status
int val3 = 0;                    // variable for reading the pin status
//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;

//holder for infromation you're going to pass to shifting function
byte data = 0;



void setup() {
  //set pins to output because they are addressed in the main loop
  pinMode(latchPin, OUTPUT);
  pinMode(inputPin1, INPUT);     // declare pushbutton as input
  pinMode(inputPin2, INPUT);     // declare pushbutton as input
  pinMode(inputPin3, INPUT);     // declare pushbutton as input
}

void loop() {

  // Extra code
  val1 = HIGH;//digitalRead(inputPin1);  // read input value
  val2 = LOW;//digitalRead(inputPin2);  // read input value
  val3 = digitalRead(inputPin3);  // read input value
  
  if (val1 == HIGH) {
    // green led is on
  } else {
    // green led is off
  }
  if (val2 == HIGH) {
    // yellow led is on
  } else {
    // yellow led is off
  }
  if (val3 == HIGH) {
    // red led is on
  } else {
    // red led is off
  }
  
  //function that blinks all the LEDs
  //gets passed the number of blinks and the pause time
  blinkAll_2Bytes(1,500);

  // light each pin one by one using a function A
  for (int j = 0; j < 8; j++) {
    //ground latchPin and hold low for as long as you are transmitting
    digitalWrite(latchPin, 0);
    //red LEDs
    lightShiftPinA(7-j);
    //green LEDs
    lightShiftPinA(j);
    //return the latch pin high to signal chip that it
    //no longer needs to listen for information
    digitalWrite(latchPin, 1);
    delay(1000);
  }

  // light each pin one by one using a function A
  for (int j = 0; j < 8; j++) {
    //ground latchPin and hold low for as long as you are transmitting
    digitalWrite(latchPin, 0);
    //red LEDs
    lightShiftPinB(j);
    //green LEDs
    lightShiftPinB(7-j);
    //return the latch pin high to signal chip that it
    //no longer needs to listen for information
    digitalWrite(latchPin, 1);
    delay(1000);
  }

}

//This function uses bitwise math to move the pins up
void lightShiftPinA(int p) {
  //defines a local variable
  int pin;

  //this is line uses a bitwise operator
  //shifting a bit left using << is the same
  //as multiplying the decimal number by two.
  pin = 1<< p;

  //move 'em out
  shiftOut(dataPin, clockPin, pin);  

}

//This function uses that fact that each bit in a byte
//is 2 times greater than the one before it to
//shift the bits higher
void lightShiftPinB(int p) {
  //defines a local variable
  int pin;

  //start with the pin = 1 so that if 0 is passed to this
  //function pin 0 will light.
  pin = 1;

  for (int x = 0; x < p; x++) {
    pin = pin * 2;
  }
  //move 'em out
  shiftOut(dataPin, clockPin, pin);  
}



more on next post
Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 2
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Code:
// 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 both registers 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_2Bytes(int n, int d) {
  digitalWrite(latchPin, 0);
  shiftOut(dataPin, clockPin, 0);
  shiftOut(dataPin, clockPin, 0);
  digitalWrite(latchPin, 1);
  delay(200);
  for (int x = 0; x < n; x++) {
    digitalWrite(latchPin, 0);
    shiftOut(dataPin, clockPin, 255);
    shiftOut(dataPin, clockPin, 255);
    digitalWrite(latchPin, 1);
    delay(d);
    digitalWrite(latchPin, 0);
    shiftOut(dataPin, clockPin, 0);
    shiftOut(dataPin, clockPin, 0);
    digitalWrite(latchPin, 1);
    delay(d);
  }
}

So far I have added my own inputs plus the general IF statements I will use to turn on or off the LEDs. Now what I am lost with is that no matter how much I look at the sample code I can't work out how it is lighting each LED or the whole group. And when I think I know I just stuff it up. Can someone please help me with a little bit of code I can add to my IF statement to get a group of LEDs connected to just one IC to light up and also to turn off once the input changes?
« Last Edit: May 17, 2008, 04:24:56 am by Trinthakis » Logged

Pages: [1]   Go Up
Jump to: