Ive been staring at this for a while now and I am going cross-eyed. I am writing a simply program to change colors of a 3 color LED. It is working, but then I noticed the LED would sometimes flash. I did a variety of tests and eventually, using the serial monitor, found out the issue. The brightness should count down to a brightness level of 0 and up to a level of 255. However, sometimes it counts below 0 to -1 and sometimes it continues infinitely past 255. I cant figure out why. Below is the code and the serial monitor outputs. The only way I can stop is by manually setting the value outside the loop. You can see those lines commented out to allow for the error.
int randLeg; // var to pick a random leg
// set all 3 legs to max brightness at start
int legThreeBrightness = 255;
int legFiveBrightness = 255;
int legSixBrightness = 255;
int delayTime = 15;
int increment = 1;
void setup() {
Serial.begin(9600);
// set pins as output
pinMode(3, OUTPUT);
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
// turn all the LEDs on
analogWrite(3, legThreeBrightness);
analogWrite(5, legFiveBrightness);
analogWrite(6, legSixBrightness);
randomSeed(analogRead(0)); // seed rand num generator
}
void loop() {
randLeg = random(4, 7); // pick a random leg
switch (randLeg) {
case 4: //-1 for pin 3
if (legThreeBrightness == 255){
do {
Serial.println(legThreeBrightness);
analogWrite(3, legThreeBrightness);
delay(delayTime);
legThreeBrightness = legThreeBrightness - increment;
} while (legThreeBrightness >= 0);
//legThreeBrightness = 0;
}
else {
do {
Serial.println(legThreeBrightness);
analogWrite(3, legThreeBrightness);
delay(delayTime);
legThreeBrightness = legThreeBrightness + increment;
} while (legThreeBrightness <= 255);
//legThreeBrightness = 255;
}
break;
case 5:
if (legFiveBrightness == 255){
do {
////Serial.println(legFiveBrightness);
analogWrite(5, legFiveBrightness);
delay(delayTime);
legFiveBrightness = legFiveBrightness - increment;
} while (legFiveBrightness >= 0);
//legFiveBrightness = 0;
}
else {
do {
////Serial.println(legFiveBrightness);
analogWrite(5, legFiveBrightness);
delay(delayTime);
legFiveBrightness = legFiveBrightness + increment;
} while (legFiveBrightness <= 255);
//legFiveBrightness = 255;
}
break;
case 6:
if (legSixBrightness == 255){
do {
////Serial.println(legSixBrightness);
analogWrite(6, legSixBrightness);
delay(delayTime);
legSixBrightness = legSixBrightness - increment;
} while (legSixBrightness >= 0);
//legSixBrightness = 0;
}
else {
do {
////Serial.println(legSixBrightness);
analogWrite(6, legSixBrightness);
delay(delayTime);
legSixBrightness = legSixBrightness + increment;
} while (legSixBrightness <= 255);
//legSixBrightness = 255;
}
break;
}
}
10 9 8 7 6 5 4 3 2 1 0 -1
and
250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265
do
loop counts to -1 ... the seconddo
loop prints the -1 and counts to 256 ... seconddo
loop keeps counting from 256 becausedo-while
always runs at least once ... useif (legThreeBrightness > 255){