Hey, so I'm trying to create a system for a project that that has a line of 8 leds to repeat a flowing light pattern. I got it to work generally with the timer reaching the desired value and restarting, however at a random point the timer variable will jump to a massively negative number before rising back to the wanted behavior and repeating the issue. I'm attaching a copy of the code below. could someone explain what exactly is going on and how should I try to tackle it?
Code:
// locations of pins
int pot = A0; // setting potentiometer to A0
int led1 = 2; // setting led1 to 2
int led2 = 3; // setting led2 to 3
int led3 = 4; // setting led3 to 4
int led4 = 5; // setting led4 to 5
int led5 = 6; // setting led5 to 6
int led6 = 7; // setting led6 to 7
int led7 = 8; // setting led7 to 8
int led8 = 9; // setting led8 to 9
// brightness values
int brightness_0 = 0; //minimum brightness value
int brightness_1 = 255; //maximum brightness value
void setup() {
// start serial comms
Serial.begin(9600);
// applying input to potentiometer
pinMode(pot, INPUT);
// applying output to the LED's
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
pinMode(led3, OUTPUT);
pinMode(led4, OUTPUT);
pinMode(led5, OUTPUT);
pinMode(led6, OUTPUT);
pinMode(led7, OUTPUT);
pinMode(led8, OUTPUT);
}
void loop() {
// creating total time variable
int total_wave_time = 4000; // applying total time to total_wave_time variable
// creating pattern timing variable
int led_wave_timer = millis() % (total_wave_time); // variable to keep track of timing
float dt = total_wave_time / 13 ; //[ms] chosen timestep
//creating timing variables
float t1 = 0; //start timer of pattern and start lighting led 1 to led 2
float t2 = dt; // start lighting led 2 to led 3
float t3 = 2*dt; // start lighting led 3 to led 4
float t4 = 3*dt; // start lighting led 4 to led 5
float t5 = 4*dt; // start lighting led 5 to led 6
float t6 = 5*dt; // start lighting led 6 to led 7
float t7 = 6*dt; // start lighting led 7 to led 8
float t8 = 7*dt; // start lighting led 8 to led 7
float t9 = 8*dt; // start lighting led 7 to led 6
float t10 = 9*dt; // start lighting led 6 to led 5
float t11 = 10*dt; // start lighting led 5 to led 4
float t12 = 11*dt; // start lighting led 4 to led 3
float t13 = 12*dt; // start lighting led 3 to led 2
float t14 = 13*dt; // start lighting led 2 to led 1
//creating time dependent behavior
// for t1 < timer < t2 , led 1 and led 2 will be lit
if (led_wave_timer <= t2){ // for t1 < t < t2
float timed_dimming_brightness = 256 - 256/dt * led_wave_timer ; // brightness factor for led 1
float timed_lifting_brightness = 256/dt * led_wave_timer; // brightness factor for led 2
//applying brightness to leds
analogWrite(led1, timed_dimming_brightness); // applying output to led 1
analogWrite(led2, timed_lifting_brightness); // applying output to led 2
digitalWrite(led3, LOW); // applying output to led 3
digitalWrite(led4, LOW); // applying output to led 4
digitalWrite(led5, LOW); // applying output to led 5
digitalWrite(led6, LOW); // applying output to led 6
digitalWrite(led7, LOW); // applying output to led 7
digitalWrite(led8, LOW); // applying output to led 8
// graphing variable
Serial.println(led_wave_timer); // input the variable for graphing during current phase
// for t2 < timer < t3, led 2 and led 3 will be lit
} else if (led_wave_timer > t2 && led_wave_timer <= t3){ // for t2 < t < t3
float timed_dimming_brightness = 256 - 256/dt * (led_wave_timer - t2); // brightness factor for led 2
float timed_lifting_brightness = 256/dt * (led_wave_timer - t2); // brightness factor for led 3
// applying brightness to leds
digitalWrite(led1, LOW); // applying output to led 1
analogWrite(led2, timed_dimming_brightness); // applying output to led 2
analogWrite(led3, timed_lifting_brightness); // applying output to led 3
digitalWrite(led4, LOW); // applying output to led 4
digitalWrite(led5, LOW); // applying output to led 5
digitalWrite(led6, LOW); // applying output to led 6
digitalWrite(led7, LOW); // applying output to led 7
digitalWrite(led8, LOW); // applying output to led 8
// graphing variable
Serial.println(led_wave_timer); // input the variable for graphing during current phase
// for t3 < timer < t4, led 3 and led 4 will be lit
} else if (led_wave_timer > t3 && led_wave_timer <= t4){ // for t3 < t < t4
float timed_dimming_brightness = 256 - 256/dt * led_wave_timer - t3; // brightness factor for led 3
float timed_lifting_brightness = 256/dt * (led_wave_timer - t3); // brightness factor for led 4
// applying brightness to leds
digitalWrite(led1, LOW); // applying output to led 1
digitalWrite(led2, LOW); // applying output to led 2
analogWrite(led3, timed_dimming_brightness); // applying output to led 3
analogWrite(led4, timed_lifting_brightness); // applying output to led 4
digitalWrite(led5, LOW); // applying output to led 5
digitalWrite(led6, LOW); // applying output to led 6
digitalWrite(led7, LOW); // applying output to led 7
digitalWrite(led8, LOW); // applying output to led 8
// graphing variable
Serial.println(led_wave_timer); // input the variable for graphing during current phase
// for t4 < timer < t5, led 4 and led 5 will be lit
} else if (led_wave_timer > t4 && led_wave_timer <= t5){ // for t4 < t < t5
float timed_dimming_brightness = 256 - 256/dt * (led_wave_timer - t4); // brightness factor for led 4
float timed_lifting_brightness = 256/dt * (led_wave_timer - t4); // brightness factor for led 5
// applying brightness to leds
digitalWrite(led1, LOW); // applying output to led 1
digitalWrite(led2, LOW); // applying output to led 2
digitalWrite(led3, LOW); // applying output to led 3
analogWrite(led4, timed_dimming_brightness); // applying output to led 4
analogWrite(led5, timed_lifting_brightness); // applying output to led 5
digitalWrite(led6, LOW); // applying output to led 6
digitalWrite(led7, LOW); // applying output to led 7
digitalWrite(led8, LOW); // applying output to led 8
// graphing variable
Serial.println(led_wave_timer); // input the variable for graphing during current phase
// for t5 < timer < t6, led 5 and led 6 will be lit
} else if (led_wave_timer > t5 && led_wave_timer <= t6){
float timed_dimming_brightness = 256 - 256/dt * (led_wave_timer - t5); // brightness factor for led 5
float timed_lifting_brightness = 256/dt * (led_wave_timer - t5); // brightness factor for led 6
// applying brightness to leds
digitalWrite(led1, LOW); // applying output to led 1
digitalWrite(led2, LOW); // applying output to led 2
digitalWrite(led3, LOW); // applying output to led 3
digitalWrite(led4, LOW); // applying output to led 4
analogWrite(led5, timed_dimming_brightness); // applying output to led 5
analogWrite(led6, timed_lifting_brightness); // applying output to led 6
digitalWrite(led7, LOW); // applying output to led 7
digitalWrite(led8, LOW); // applying output to led 8
// graphing variable
Serial.println(led_wave_timer); // input the variable for graphing during current phase
// for t6 < timer < t7, led 6 and led 7 will be lit
} else if (led_wave_timer > t6 && led_wave_timer <= t7){
float timed_dimming_brightness = 256 - 256/dt * (led_wave_timer - t6); // brightness factor for led 6
float timed_lifting_brightness = 256/dt * (led_wave_timer - t6); // brightness factor for led 7
// applying brightness to leds
digitalWrite(led1, LOW); // applying output to led 1
digitalWrite(led2, LOW); // applying output to led 2
digitalWrite(led3, LOW); // applying output to led 3
digitalWrite(led4, LOW); // applying output to led 4
digitalWrite(led5, LOW); // applying output to led 5
analogWrite(led6, timed_dimming_brightness); // applying output to led 6
analogWrite(led7, timed_lifting_brightness); // applying output to led 7
digitalWrite(led8, LOW); // applying output to led 8
// graphing variable
Serial.println(led_wave_timer); // input the variable for graphing during current phase
// for t7 < timer < t8, led 7 and led 8 will be lit
} else if (led_wave_timer > t7 && led_wave_timer <= t8){
float timed_dimming_brightness = 256 - 256/dt * (led_wave_timer - t7); // brightness factor for led 7
float timed_lifting_brightness = 256/dt * (led_wave_timer - t7); // brightness factor for led 8
// applying brightness to leds
digitalWrite(led1, LOW); // applying output to led 1
digitalWrite(led2, LOW); // applying output to led 2
digitalWrite(led3, LOW); // applying output to led 3
digitalWrite(led4, LOW); // applying output to led 4
digitalWrite(led5, LOW); // applying output to led 5
digitalWrite(led6, LOW); // applying output to led 6
analogWrite(led7, timed_dimming_brightness); // applying output to led 7
analogWrite(led8, timed_lifting_brightness); // applying output to led 8
// graphing variable
Serial.println(led_wave_timer); // input the variable for graphing during current phase
// for t8 < timer < t9, led 8 and led 7 will be lit
} else if (led_wave_timer > t8 && led_wave_timer <= t9) {
float timed_dimming_brightness = 256 - 256/dt * (led_wave_timer - t8); // brightness factor for led 8
float timed_lifting_brightness = 256/dt * (led_wave_timer - t8); // brightness factor for led 7
// applying brightness to leds
digitalWrite(led1, LOW); // applying output to led 1
digitalWrite(led2, LOW); // applying output to led 2
digitalWrite(led3, LOW); // applying output to led 3
digitalWrite(led4, LOW); // applying output to led 4
digitalWrite(led5, LOW); // applying output to led 5
digitalWrite(led6, LOW); // applying output to led 6
analogWrite(led7, timed_lifting_brightness); // applying output to led 7
analogWrite(led8, timed_dimming_brightness); // applying output to led 8
// graphing variable
Serial.println(led_wave_timer); // input the variable for graphing during current phase
// for t9 < timer < t10, led 7 and led 6 will be lit
} else if (led_wave_timer > t9 && led_wave_timer <= t10) {
float timed_dimming_brightness = 256 - 256/dt * (led_wave_timer - t9); // brightness factor for led 7
float timed_lifting_brightness = 256/dt * (led_wave_timer - t9); // brightness factor for led 6
// applying brightness to leds
digitalWrite(led1, LOW); // applying output to led 1
digitalWrite(led2, LOW); // applying output to led 2
digitalWrite(led3, LOW); // applying output to led 3
digitalWrite(led4, LOW); // applying output to led 4
digitalWrite(led5, LOW); // applying output to led 5
analogWrite(led6, timed_lifting_brightness); // applying output to led 6
analogWrite(led7, timed_dimming_brightness); // applying output to led 7
digitalWrite(led8, LOW); // applying output to led 8
// graphing variable
Serial.println(led_wave_timer); // input the variable for graphing during current phase
// for t10 < timer < t11, led 6 and led 5 will be lit
} else if (led_wave_timer > t10 && led_wave_timer <= t11) {
float timed_dimming_brightness = 256 - 256/dt * (led_wave_timer - t10); // brightness factor for led 6
float timed_lifting_brightness = 256/dt * (led_wave_timer - t10); // brightness factor for led 5
// applying brightness to leds
digitalWrite(led1, LOW); // applying output to led 1
digitalWrite(led2, LOW); // applying output to led 2
digitalWrite(led3, LOW); // applying output to led 3
digitalWrite(led4, LOW); // applying output to led 4
analogWrite(led5, timed_lifting_brightness); // applying output to led 5
analogWrite(led6, timed_dimming_brightness); // applying output to led 6
digitalWrite(led7, LOW); // applying output to led 7
digitalWrite(led8, LOW); // applying output to led 8
// graphing variable
Serial.println(led_wave_timer); // input the variable for graphing during current phase
// for t11 < timer < t12, led 5 and led 4 will be lit
} else if (led_wave_timer > t11 && led_wave_timer <= t12) {
float timed_dimming_brightness = 256 - 256/dt * (led_wave_timer - t11); // brightness factor for led 5
float timed_lifting_brightness = 256/dt * (led_wave_timer - t11); // brightness factor for led 4
// applying brightness to leds
digitalWrite(led1, LOW); // applying output to led 1
digitalWrite(led2, LOW); // applying output to led 2
digitalWrite(led3, LOW); // applying output to led 3
analogWrite(led4, timed_lifting_brightness); // applying output to led 4
analogWrite(led5, timed_dimming_brightness); // applying output to led 5
digitalWrite(led6, LOW); // applying output to led 6
digitalWrite(led7, LOW); // applying output to led 7
digitalWrite(led8, LOW); // applying output to led 8
// graphing variable
Serial.println(led_wave_timer); // input the variable for graphing during current phase
// for t12 < t < t13, led 4 and led 3 will be lit
} else if (led_wave_timer > t11 && led_wave_timer <= t12) {
float timed_dimming_brightness = 256 - 256/dt * (led_wave_timer - t12); // brightness factor for led 4
float timed_lifting_brightness = 256/dt * (led_wave_timer - t12); // brightness factor for led 3
// applying brightness to leds
digitalWrite(led1, LOW); // applying output to led 1
digitalWrite(led2, LOW); // applying output to led 2
analogWrite(led3, timed_lifting_brightness); // applying output to led 3
analogWrite(led4, timed_dimming_brightness); // applying output to led 4
digitalWrite(led5, LOW); // applying output to led 5
digitalWrite(led6, LOW); // applying output to led 6
digitalWrite(led7, LOW); // applying output to led 7
digitalWrite(led8, LOW); // applying output to led 8
// graphing variable
Serial.println(led_wave_timer); // input the variable for graphing during current phase
// for t12 < t < t13, led 3 and led 2 will be lit
} else if (led_wave_timer > t12 && led_wave_timer <= t13) {
float timed_dimming_brightness = 256 - 256/dt * (led_wave_timer - t13); // brightness factor for led 3
float timed_lifting_brightness = 256/dt * (led_wave_timer - t13); // brightness factor for led 2
// applying brightness to leds
digitalWrite(led1, LOW); // applying output to led 1
analogWrite(led2, timed_lifting_brightness); // applying output to led 2
analogWrite(led3, timed_dimming_brightness); // applying output to led 3
digitalWrite(led4, LOW); // applying output to led 4
digitalWrite(led5, LOW); // applying output to led 5
digitalWrite(led6, LOW); // applying output to led 6
digitalWrite(led7, LOW); // applying output to led 7
digitalWrite(led8, LOW); // applying output to led 8
// graphing variable
Serial.println(led_wave_timer); // input the variable for graphing during current phase
// for t13 < t < t14, led 2 and led 1 will be lit
} else {
float timed_dimming_brightness = 256 - 256/dt * (led_wave_timer - t14); // brightness factor for led 3
float timed_lifting_brightness = 256/dt * (led_wave_timer - t14); // brightness factor for led 2
// applying brightness to leds
analogWrite(led1, timed_lifting_brightness); // applying output to led 1
analogWrite(led2, timed_dimming_brightness); // applying output to led 2
digitalWrite(led3, LOW); // applying output to led 3
digitalWrite(led4, LOW); // applying output to led 4
digitalWrite(led5, LOW); // applying output to led 5
digitalWrite(led6, LOW); // applying output to led 6
digitalWrite(led7, LOW); // applying output to led 7
digitalWrite(led8, LOW); // applying output to led 8
// graphing variable
Serial.println(led_wave_timer); // input the variable for graphing during current phase
}
}
}