Go Down

Topic: LED brightness control (Read 1 time) previous topic - next topic

zoom

Have just got the arduino and trying some simple things on it, here one of them;
I want to increase the brightness of the LED 20 unit each time I press the push button, quite simple.
However, It doesn't work, the LED light tremble and when I push the button it stops trembling.

Here's the code;

Quote
int but = 8;
int led = 9;
int val = 0;

void setup()
{
  pinMode(but, INPUT);
  pinMode(led, OUTPUT);
}

void loop()
{
  if(digitalRead(but) == 1)
  {
    val = val + 20;
  }
  analogWrite(led,val);
}

HazardsMind

I dont think it is actually trembling, I think it is just cycling so fast that it is hard to see anything. Look at the state change example, and debounce example, then try the LED.

zoom

But at least at the beginning the led must not shine, right ?
However, it immediately starts trebling.

HazardsMind

Quote
However, it immediately starts trebling.
Even without the button being pressed? Does your button have a pull down or up resistor?
Code: [Select]
if(digitalRead(but) == 1) This is looking for the button to be HIGH when pressed, so if you have a floating input (no pulling resistor), that would cause the flicker.

zoom


Quote
However, it immediately starts trebling.
Even without the button being pressed? Does your button have a pull down or up resistor?
Code: [Select]
if(digitalRead(but) == 1) This is looking for the button to be HIGH when pressed, so if you have a floating input (no pulling resistor), that would cause the flicker.


The button I have is that;

MaJiG

Here's my try:

Connect a SPST N.O. momentary from pin 8 to GND with no resistor.
Connect an LED from pin 9 to an LED in series with a current-limiting resistor (220 to 330 ohm) to GND.

My code:
Code: [Select]

int but = 8;
int led = 9;
int val = 0;

void setup()
{
 pinMode(but, INPUT_PULLUP);
 pinMode(led, OUTPUT);             // not needed, but I like to be explicit
}

void loop()
{
 if(digitalRead(but) == LOW)
 {
   //here: the button is pushed
    val += 20;                                 // increment the brightness of the LED by 1/24th
   val = min(val, 255);                     // maximum PWM value is 255
 }
 else
 {
   //here: the button has been released
   val = 0;                                  // turn the LED OFF
 }

 analogWrite(led,val);                 // adjust the PWM
 delay( 250 );                           // give yourself a chance to see the result
}


should take about 3 seconds from OFF to full brightness. If you need it to be quicker, adjust the delay time
the delay also tends to debounce the switch too

HazardsMind

Ok those need to be debounced to work properly. So even if you just press it once, being that it is not being debounce, it will put out a LOT of noise. Meaning even if YOU press it once, the arduino will see that it was pressed multiple times, because of that noise. Also did you include a pulling resistor?

zoom


Here's my try:

Connect a SPST N.O. momentary from pin 8 to GND with no resistor.
Connect an LED from pin 9 to an LED in series with a current-limiting resistor (220 to 330 ohm) to GND.

My code:
Code: [Select]

int but = 8;
int led = 9;
int val = 0;

void setup()
{
 pinMode(but, INPUT_PULLUP);
 pinMode(led, OUTPUT);             // not needed, but I like to be explicit
}

void loop()
{
 if(digitalRead(but) == LOW)
 {
   //here: the button is pushed
    val += 20;                                 // increment the brightness of the LED by 1/24th
   val = min(val, 255);                     // maximum PWM value is 255
 }
 else
 {
   //here: the button has been released
   val = 0;                                  // turn the LED OFF
 }

 analogWrite(led,val);                 // adjust the PWM
 delay( 250 );                           // give yourself a chance to see the result
}


should take about 3 seconds from OFF to full brightness. If you need it to be quicker, adjust the delay time
the delay also tends to debounce the switch too


Thank you, that one worked, but I didn't know input_pullup thing.


Ok those need to be debounced to work properly. So even if you just press it once, being that it is not being debounce, it will put out a LOT of noise. Meaning even if YOU press it once, the arduino will see that it was pressed multiple times, because of that noise. Also did you include a pulling resistor?


Don't know what pulling resistor is
What exactly is it ?


MaJiG


HazardsMind

A "pulling" resistor is my terminology of a resistor being either a pull down or pull up resistor. Now being that most of the time (if not all the time) we don't know what your setup is, so we assume it is being pulled down when it could be pulling up. So by saying "pulling" it means either or.

zoom


Here's my try:

Connect a SPST N.O. momentary from pin 8 to GND with no resistor.
Connect an LED from pin 9 to an LED in series with a current-limiting resistor (220 to 330 ohm) to GND.

My code:
Code: [Select]

int but = 8;
int led = 9;
int val = 0;

void setup()
{
 pinMode(but, INPUT_PULLUP);
 pinMode(led, OUTPUT);             // not needed, but I like to be explicit
}

void loop()
{
 if(digitalRead(but) == LOW)
 {
   //here: the button is pushed
    val += 20;                                 // increment the brightness of the LED by 1/24th
   val = min(val, 255);                     // maximum PWM value is 255
 }
 else
 {
   //here: the button has been released
   val = 0;                                  // turn the LED OFF
 }

 analogWrite(led,val);                 // adjust the PWM
 delay( 250 );                           // give yourself a chance to see the result
}


should take about 3 seconds from OFF to full brightness. If you need it to be quicker, adjust the delay time
the delay also tends to debounce the switch too


After inspected the code, I realised that you also used "LOW" for if statement with buttons. Why is it so ?
I think if the button is not pushed it should be act as "LOW" and the led starts shining, but it doesn't and the code works pretty well.
But didn't get the idea underlying.

zoom



Here's my try:

Connect a SPST N.O. momentary from pin 8 to GND with no resistor.
Connect an LED from pin 9 to an LED in series with a current-limiting resistor (220 to 330 ohm) to GND.

My code:
Code: [Select]

int but = 8;
int led = 9;
int val = 0;

void setup()
{
 pinMode(but, INPUT_PULLUP);
 pinMode(led, OUTPUT);             // not needed, but I like to be explicit
}

void loop()
{
 if(digitalRead(but) == LOW)
 {
   //here: the button is pushed
    val += 20;                                 // increment the brightness of the LED by 1/24th
   val = min(val, 255);                     // maximum PWM value is 255
 }
 else
 {
   //here: the button has been released
   val = 0;                                  // turn the LED OFF
 }

 analogWrite(led,val);                 // adjust the PWM
 delay( 250 );                           // give yourself a chance to see the result
}


should take about 3 seconds from OFF to full brightness. If you need it to be quicker, adjust the delay time
the delay also tends to debounce the switch too


After inspected the code, I realised that you also used "LOW" for if statement with buttons. Why is it so ?
I think if the button is not pushed it should be act as "LOW" and the led starts shining, but it doesn't and the code works pretty well.
But didn't get the idea underlying.


Suppose found my answer;

"Because the internal pull-up on pin 2 is active and connected to 5V, we read HIGH when the button is open"

MaJiG


Go Up