Hi, lately I've been working on a project to control the brightness of an LED strip. So the LEDs are connected to pin 3 on the Arduino and the pushbuttons are connected to pins 7 & 8 on the Arduino and are pressed when shorted to ground. Pin 4 on the Arduino is set to be an input pin in a way that it only allows the LEDs to be lit when voltage is applied to the pin (pin 4), or in other words when pin 4 is HIGH, and turns off the LEDs when voltage is removed from that pin or when pin 4 is LOW. So pin 4 is connected through an 11 kilo ohm resistor to ground so it becomes normally in a LOW state and then any voltage applied to pin 4 lights up the LEDs. My question is that I want my LEDs to light up 100 milliseconds after pin 4 receives voltage, but after adding a simple delay function before the analogueWrite of pin 4, it works on the proper timing but for some reason I lose the ability to control the brightness of the LEDs. So can someone please tell me what I'm doing wrong as I am still a complete beginner to Arduino programming.
Here's my code so far: (I've tried adding the delay function right before the line "analogWrite(LED, brightness);" and that messed up my brightness control)
int brightness = 100;
//const byte LED = 11;
//const byte maximum = 10;
//const byte decrement = 8;
//const byte increment = 9;
const byte LED = 3;
const byte maximum = 4;
const byte decrement = 7;
const byte increment = 8;
void setup()
{
pinMode(LED, OUTPUT); // Set pin 3 to be in output mode
pinMode(decrement, INPUT_PULLUP); // Set pin 7 to be in input mode
pinMode(increment, INPUT_PULLUP); // Set pin 8 to be in input mode
pinMode(maximum, INPUT_PULLUP);
}
void loop()
{
if (digitalRead(decrement) == LOW)
{
brightness--; // If button on pin 7 is pressed, reduce brightness
}
if (brightness < 50)
{
brightness = 50; // Don't let brightness drop below zero
}
if (digitalRead(increment) == LOW)
{
brightness++; // If button on pin 8 is pressed, increase brightness
}
if (brightness > 255)
{
brightness = 255; // Don't let brightness get above 255
}
if (digitalRead(maximum) == HIGH) //if pin 4 is HIGH
{
analogWrite(LED, brightness); // Set pin 3 to the new brightness level
}
else
{
analogWrite(LED, 0); //else turn it off
}
delay(10); // Wait a short time, just to slow things down a little
}
According to your text and your code you want pin 4 active high which means idle low. If this is the case then the external pulldown is correct. Remove the pinMode statement for pin4. By default all pins are set to input so you don't need any pinMode declarations unless you're setting the pullup or configuring the pin for output (or changing from output to input for the pedants).
Hello again, so I just tried it and it did work but now what's happening is that with this 100 millisecond delay added the pushbuttons for the brightness control, pins 7 and 8, take a very long time to increase the brightness from 0 to 255 and vice versa; it seems that that 100 millisecond delay is interfering on the delay of the pushbuttons. The delay of the pushbuttons is only 10 milliseconds and is the last line of my code. Can you please tell me how can I isolate the delay of the push buttons from the delay of the LEDs turning on? I really appreciate your help.
Here's my code:
int brightness = 100;
//const byte LED = 11;
//const byte maximum = 10;
//const byte decrement = 8;
//const byte increment = 9;
const byte LED = 3;
const byte maximum = 4;
const byte decrement = 7;
const byte increment = 8;
void setup()
{
pinMode(LED, OUTPUT); // Set pin 3 to be in output mode
pinMode(decrement, INPUT_PULLUP); // Set pin 7 to be in input mode
pinMode(increment, INPUT_PULLUP); // Set pin 8 to be in input mode
}
void loop()
{
if (digitalRead(decrement) == LOW)
{
brightness--; // If button on pin 7 is pressed, reduce brightness
}
if (brightness < 0)
{
brightness = 0; // Don't let brightness drop below zero
}
if (digitalRead(increment) == LOW)
{
brightness++; // If button on pin 8 is pressed, increase brightness
}
if (brightness > 255)
{
brightness = 255; // Don't let brightness get above 255
}
if (digitalRead(maximum) == HIGH) //if pin 4 is HIGH
{delay(100);
analogWrite(LED, brightness); // Set pin 3 to the new brightness level
}
else
{
analogWrite(LED, 0); //else turn it off
}
delay(10); // Wait a short time, just to slow things down a little
}
Hello again, so I've read those post and they really were helpful and informative but the problem is that I can't figure out how can I implement this into my code so can someone help me with this please or if there is a way to isolate the delay functions from each other.
Here's my code so far:
int brightness = 100;
//const byte LED = 11;
//const byte maximum = 10;
//const byte decrement = 8;
//const byte increment = 9;
const byte LED = 3;
const byte maximum = 4;
const byte decrement = 7;
const byte increment = 8;
void setup()
{
pinMode(LED, OUTPUT); // Set pin 3 to be in output mode
pinMode(decrement, INPUT_PULLUP); // Set pin 7 to be in input mode
pinMode(increment, INPUT_PULLUP); // Set pin 8 to be in input mode
}
void loop()
{
if (digitalRead(decrement) == LOW)
{
brightness--; // If button on pin 7 is pressed, reduce brightness
}
if (brightness < 0)
{
brightness = 0; // Don't let brightness drop below zero
}
if (digitalRead(increment) == LOW)
{
brightness++; // If button on pin 8 is pressed, increase brightness
}
if (brightness > 255)
{
brightness = 255; // Don't let brightness get above 255
}
if (digitalRead(maximum) == HIGH) //if pin 4 is HIGH
{
analogWrite(LED, brightness); // Set pin 3 to the new brightness level
}
else
{
analogWrite(LED, 0); //else turn it off
}
delay(10); // Wait a short time, just to slow things down a little
}[code]
I can't figure out how can I implement this into my code
First you need to be clear on what you want to happen.
What should happen if the up/down buttons are pressed during the "delay" period ?
Should the timing period be ended early and restarted with the new brightness value ? Should the the timing period be ended early and restarted if the up/down buttons are pressed when they brightness is already at its upper or lower limits ?
Actually with the 100 millisecond delay that I'm trying to add, I do not want the brightness control to be active during that delay, like I don't mind if pressing the pushbuttons, within that delay timing, doesn't do anything. I'm trying to add a delay function that won't affect the delay timing of my pushbuttons.
I can't see where you want to add this 100ms delay or why you would add it.
The general principle of an Arduino program is to read all the inputs and check all the timers thousands of times per second. If an input has changed from what it was last time you looked or a time is up then you do something.
int brightness = 100;
//const byte LED = 11;
//const byte maximum = 10;
//const byte decrement = 8;
//const byte increment = 9;
const byte LED = 3;
const byte maximum = 4;
const byte decrement = 7;
const byte increment = 8;
void setup()
{
pinMode(LED, OUTPUT); // Set pin 3 to be in output mode
pinMode(decrement, INPUT_PULLUP); // Set pin 7 to be in input mode
pinMode(increment, INPUT_PULLUP); // Set pin 8 to be in input mode
}
void loop()
{
if (digitalRead(decrement) == LOW)
{
brightness--; // If button on pin 7 is pressed, reduce brightness
}
if (brightness < 0)
{
brightness = 0; // Don't let brightness drop below zero
}
if (digitalRead(increment) == LOW)
{
brightness++; // If button on pin 8 is pressed, increase brightness
}
if (brightness > 255)
{
brightness = 255; // Don't let brightness get above 255
}
if (digitalRead(maximum) == HIGH) //if pin 4 is HIGH
{
analogWrite(LED, brightness); // Set pin 3 to the new brightness level
delay(100);
}
else
{
analogWrite(LED, 0); //else turn it off
}
delay(10); // Wait a short time, just to slow things down a little
}[code]
But it still didn't make the LEDs light up 100 milliseconds after pin 4 gets HIGH and it still interfered with my brightness control.
I bet it does but 100 milliseconds is not long in human terms. As an experiment change it to 1 second so that the delay is more obvious
it also affects my brightness control with that delay.
But earlier you said
I do not want the brightness control to be active during that delay,
I think that the problem is that you have not fully described your requirements. For instance, do you want the delay to happen only when the brightness is changed ?
The application in which my LEDs are functioning in unfortunately makes the 100 milliseconds pretty obvious but what I meant was that I don't mind wheather my brightness control is active or not during that 100 millisecond delay since as you said, 100 milliseconds is really nothing in human terms, but all I want is a 100 millisecond delay right before the LEDs light up when pin 4 is HIGH and I don't want that 100 millisecond delay to also delay the time it take the change the brightness when the pushbuttons are pressed.
When I don't add that delay, the pushbuttons respond within their 10 millisecond delay and do change the brightness within their appropriate timings, but when I add that 100 millisecond delay it does make the LEDs light up 100 milliseconds after pin 4 gets HIGH, which is exactly what I want, but is also make the push buttons also delay 100 milliseconds extra from their 10 millisecond timing meaning that when I press the pushbutton, I gotta press and hold it for a very time time to change the brightness from 0 to 255 and vice versa. Is their a way to make the delay of the LEDs lighting up (the 100 millisecond delay) independent from the 10 millisecond delay of the pushbuttons?
So basically you want it to wait for 100ms before it starts to change the brightness?
Is that correct?
If so, try using a 100ms debounce. That should do it.
else if {
Serial.print("I have no idea what you want")
}