I have LED1 fading on and off with millis, and LED2 blinking with millis. There are not any delays, but when LED2 blinks ON, LED1 gets slightly dimmer, and when LED2 blinks back off, LED1 gets brighter. Is this something in my code? I suppose it could be a hardware issue, but I think it might be this code (which I borrowed from someone online).
heres my code:
#define BLINK_RATE 1000 // On/off blink every 1 second
#define FADE_RATE 6000 // Fade up and down every 2 seconds
int ledPin = 5;
int pwmPin = 10;
void setup()
{
pinMode(ledPin, OUTPUT);
pinMode(pwmPin, OUTPUT);
}
void loop()
{
unsigned long time = millis();
// Blink the LED
if (time % BLINK_RATE > BLINK_RATE/2)
digitalWrite(ledPin, HIGH);
else
digitalWrite(ledPin, LOW);
// Synthesize a sawtooth wave: a value from 0 to FADE_RATE/2 and back down
long val = labs((FADE_RATE / 2) - (time % FADE_RATE));
val = 255 * val / (FADE_RATE / 2); // convert to range 0..255..0
analogWrite(pwmPin, val);
}
Just tried your code on my Uno and I can't reproduce what you're seeing. How do you have these wired up? Are you sharing the resistor for both LEDs (the only way I was able to get what you're describing ...)
The resistor was indeed the problem(it doesnt say "newbie" by my name for nothing). Sorry bout the hardware issue on the software forum.
This code works.
Now I'm trying to alter this code to blink sequentially through 11 LEDs while fading, instead of blinking just one LED.
My attempt gave me no blinking LEDs.
#define BLINK_RATE 1000 // On/off blink every 1 second
#define FADE_RATE 5000 // Fade up and down every 2 seconds
int x = 0;
int pwmPin = 10;
void setup()
{
pinMode(ledPin, OUTPUT);
pinMode(pwmPin, OUTPUT);
pinMode(1, OUTPUT);
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
pinMode(8, OUTPUT);
pinMode(9, OUTPUT);
pinMode(10, OUTPUT);
pinMode(11, OUTPUT);
pinMode(12, OUTPUT);
pinMode(13, OUTPUT);
}
void loop()
{
unsigned long time = millis();
// Blink the LED
if (time % BLINK_RATE > BLINK_RATE/2)
digitalWrite(x, HIGH);
else
digitalWrite(x, LOW);
x = x+1;
if (x = 14)
x = 0;
// Synthesize a sawtooth wave: a value from 0 to FADE_RATE/2 and back down
long val = labs((FADE_RATE / 2) - (time % FADE_RATE));
val = 255 * val / (FADE_RATE / 2); // convert to range 0..255..0
analogWrite(pwmPin, val);
}
thanks KirAsh4!
Now I'm getting all the blinking LED's blinking together instead of sequentially. Should I put it in a "for" statement? If so, where would I put it?
UPDATE:
I tried using a for statement but got the same problem (all LEDs besides the fading one are blinking together instead of sequentially.
heres that code:
#define BLINK_RATE 1000 // On/off blink every 1 second
#define FADE_RATE 5000 // Fade up and down every 2 seconds
int x = 0;
int pwmPin = 10;
void setup()
{
pinMode(pwmPin, OUTPUT);
pinMode(1, OUTPUT);
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
pinMode(8, OUTPUT);
pinMode(9, OUTPUT);
pinMode(10, OUTPUT);
pinMode(11, OUTPUT);
pinMode(12, OUTPUT);
pinMode(13, OUTPUT);
}
void loop()
{
unsigned long time = millis();
// Blink the LED
for (x = 0; x <= 13; x++){
if (time % BLINK_RATE > BLINK_RATE/2)
digitalWrite(x, HIGH);
else
digitalWrite(x, LOW);
if (x == 14)
x = 0;
}
// Synthesize a sawtooth wave: a value from 0 to FADE_RATE/2 and back down
long val = labs((FADE_RATE / 2) - (time % FADE_RATE));
val = 255 * val / (FADE_RATE / 2); // convert to range 0..255..0
analogWrite(pwmPin, val);
}
Actually, they're not blinking together. However, because you're turning them on and 1ms second you're turning them off again, it appears as if they're all blinking together. Trust me, they're not. One simple way of testing that is to add a delay(50) before your if statement.
And by doing that, you will also discover another problem, which I will leave for you to find.
No, the delay nor millis() has nothing to do with it getting chopped up. Think about it for a moment. You are using pin 10 for the fade, and you are cycling from 0 to 13 to turn LEDs on/off ... 0 to 13 ... pin 10 ... pin 10 ... 0 to 13 ... Write it out if you don't quite see it. Start with x == 0. Your loop goes 0, 1, 2, 3 ... 8, 9, ?? What just happened?
I'm not trying ot be a PITA here, but I don't want to just hand you the answer either. This is how you learn (at least I do), by figuring out where my mistakes are. In your case, just step through your loop one by one, and hopefully you'll understand why your fade on pin 10 gets all chopped up. It's not that hard. If you really can't tell, I'll try to explain it.
And to further try to help you understand the problem, the delay(50) I suggested was merely to illustrate that your LEDs are in fact blinking on and off in sequence, and not all at once. So if you remove that delay you will once again get what would appear to be a smooth fade on pin 10, however that's merely an illusion. Because of your for loop, the fade gets interrupted every 13 cycles.
You should rethink how you're delaying the blinking and not interrupt the fade at the same time.