Go Down

Topic: 4 rgb leds digital low issue (Read 454 times) previous topic - next topic

Twiener

I have 4 common anode RGB LED's. Each R, G and B pin on the 4 LED's are wired to 3 pwm pins. 3 modes are selected by a button, the syncPin. The code below IS working off a arduino uno.

Code: [Select]
int redPin = 11; // to red pin on rgb led
int bluePin = 10;   // to blue pin on rgb led
int greenPin = 9;   // to green pin on rgb led
int xButton = 7;     // to x button
int aButton = 6;     // to a button
int yButton = 5;     // to y button
int bButton = 4;     // to b button
int syncPin = A5;     // to syny button, button which changes modes
int counter;         // used to keep track of the mode
int sensorValue;

void setup()

{
  pinMode(redPin, OUTPUT);     
  pinMode(greenPin, OUTPUT);   
  pinMode(bluePin, OUTPUT);   
  pinMode(yButton, OUTPUT);
  pinMode(aButton, OUTPUT);
  pinMode(bButton, OUTPUT);
  pinMode(xButton, OUTPUT);
  pinMode(syncPin, INPUT);
  int counter = 1;

}

void loop()

{
  if (counter == 1)                //mode 1
 
  {
    color(0, 0, 0);
    digitalWrite(yButton, HIGH);        //all buttons off, no color  (off position)
    digitalWrite(xButton, HIGH);
    digitalWrite(bButton, HIGH);
    digitalWrite(aButton, HIGH);
    delay(1);
  }
     
if (counter == 2)                    //mode 2
  {
      color(255, 255, 0);                   //set color yellow
      digitalWrite(yButton, HIGH);          //set y button high
      delay(1);                             // emits yellow to y button for one thousandth of second
      digitalWrite(yButton, LOW);           // turn y button off
           
      color(0, 0 , 255 );                   // new color, new button on, new button off ect.
      digitalWrite(xButton, HIGH);
      delay(1);
      digitalWrite(xButton, LOW);
           
      color(255, 0, 0);
      digitalWrite(bButton, HIGH);
      delay(1);
      digitalWrite(bButton, LOW);
           
      color(0, 255, 0);
      digitalWrite(aButton, HIGH);
      delay(1);
      digitalWrite(aButton, LOW);
  }
     
     if(counter == 3)             //mode 3
 
  {
   
    color(255,255,0);                   //set color YELLOW!

    digitalWrite(yButton, HIGH);    //all buttons on
    digitalWrite(xButton, HIGH);    //
    digitalWrite(bButton, HIGH);    //
    digitalWrite(aButton, HIGH);    //
    delay(1);
  }

   
    int sensorValue = analogRead(syncPin);

    float voltage = sensorValue * (5 / 1023.0);

     if(analogRead(sensorValue) < 5)
    {
      delay(200);
      counter++;
      delay(200);
    }



    if(counter > 3)        //if mode is over 3, reset to off or mode 1
    {
     counter = 1;
    }
   
  //end loop
}


void color(unsigned char red, unsigned char green, unsigned char blue)     // the color generating function

{

  analogWrite(bluePin, 255-blue);

  analogWrite(greenPin, 255-green);

  analogWrite(redPin, 255-red);

}


The problem I am having is that this part of the code below(mode 2) is NOT working when wired to an attiny44.

Code: [Select]
if (counter == 2)                    //mode 2
  {
      color(255, 255, 0);                   //set color yellow
      digitalWrite(yButton, HIGH);          //set y button high
      delay(1);                             // emits yellow to y button for one thousandth of second
      digitalWrite(yButton, LOW);           // turn y button off
           
      color(0, 0 , 255 );                   // new color, new button on, new button off ect.
      digitalWrite(xButton, HIGH);
      delay(1);
      digitalWrite(xButton, LOW);
           
      color(255, 0, 0);
      digitalWrite(bButton, HIGH);
      delay(1);
      digitalWrite(bButton, LOW);
           
      color(0, 255, 0);
      digitalWrite(aButton, HIGH);
      delay(1);
      digitalWrite(aButton, LOW);
  }
     


The mode 2 is not working. I believe it is not working because at least one digital LOW is given to any of a, b, x or y buttons. So because a digital low is given to to the LED or LED's, the if loop is only run once, and because the loop is only 4 thousandths of second, it is skipped over with a delay equal to the 2 delays here:

Code: [Select]
   {
      delay(200);
      counter++;
      delay(200);
    }


Which adds up to 400 thousandths of a second. So, I conclude that the counter is incremented upwards at the end of the if loop for mode 2? So, I do not understand why a digital low is not working with the attiny44 and why the if loop is only run once?

The other modes a working fine, the LED's are lighting up beautifully, I just need help implementing the code with my attiny44.

Thank you.

johnwasser

This part looks wrong:
Code: [Select]

    int sensorValue = analogRead(syncPin);
     if(analogRead(sensorValue) < 5) {
Send Bitcoin tips to: 1L3CTDoTgrXNA5WyF77uWqt4gUdye9mezN
Send Litecoin tips to : LVtpaq6JgJAZwvnVq3ftVeHafWkcpmuR1e

Twiener

I believe it's correct. When the sync button is pressed, the voltage drops to nearly zero, giving a value of around 1. Do this part of the code you suggested could be causing the problems?

Go Up