Timer for leds jumping to random value?

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
}
}
}


Don’t use int for anything related to timing or millis, use unsigned long

2 Likes

An int counting milliseconds can get to 32767 milliseconds before something goes wrong

1 Like

Thanks!! after I changed the int for a few variables to unsigned it stopped doing that.

Thanks! it was after I made this distinct change that it stopped the massive overshoot of values.

My only comment on the code now that it’s working, would be to use switch & arrays to reduce the amount of repeated code.

2 Likes

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.