hey, so i'm creating a code that controls a row of leds both by the use of a timer and potentiometer. idea is that when the potentiometer moves a certain amount, it will light up specific leds to a certain brightness, else if it has not moved for a set amount of time, the leds will follow a wave pattern. the main issue that I am facing is that there is no delay between the potentiometer reading and the wave behavior ( I am not trying to use delay() command ), i have tried getting my input_timer to restart both by setting to zero or reapply millis() to it but they only appear to work as the potentiometer moves and returns to wave patterning immediately. what would be a feasible way of resetting that timer? I am attaching a copy of my code below:
// 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
// potentiometer values
int pot_0 = 0; // minimum potentiometer values
int pot_1 = 1023; // maximum potentiometer values
// brightness values
int brightness_0 = 0; //minimum brightness value
int brightness_1 = 256; //maximum brightness value
unsigned long previous_timer = millis(); // store last time timer was updated
unsigned long delay_duration = 500; // delay before wave behavior
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() {
//take initial and secondary potentiometer readings
float initial_pot_reading = analogRead(pot); // //initial potentiometer reading
delay(100) ; // delay for secondary potentiometer reading
float secondary_pot_reading = analogRead(pot); // secondary potentiometer reading
// take the difference in potentiometer readings
float reading_difference = abs( initial_pot_reading - secondary_pot_reading ) ; // applying variable to reading differences
//set way to to get timer to stop once reading difference has passed certain limits and apply led changing portion, else to follow the timed pattern portion
// start timer to decide action
volatile unsigned long input_timer = millis() ;
//if potentiometer reading has not changed limits, apply timed pattern
if ( (reading_difference <10 && input_timer > delay_duration )){
// creating total time variable
unsigned long total_wave_time = 5000; // applying total time to total_wave_time variable
// creating pattern timing variable
unsigned long led_wave_timer = millis() % (total_wave_time); // variable to keep track of timing
// creating time step
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
}
}
//if pot has moved enough in last 500 ms, it will control led location
else {
// creating potentiometer step value
float pot_step = 146;
//defining potentiometer values
float potv1 = 0;
float potv2 = pot_step;
float potv3 = 2 * pot_step;
float potv4 = 3 * pot_step;
float potv5 = 4 * pot_step;
float potv6 = 5 * pot_step;
float potv7 = 6 * pot_step;
// if the potentiometer values range between potv1 and potv2, led 1 and led 2 will be lit
if (initial_pot_reading <= potv2 ){ // for potentiometer value <146
float dimming_brightness = 256 - initial_pot_reading * 1.75 ; // brightness factor for led 1
float lifting_brightness = initial_pot_reading * 1.75; // brightness factor for led 2
// applying outputs to leds
analogWrite(led1, dimming_brightness); // applying output to led 1
analogWrite(led2, 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
input_timer = millis(); //restarting input timer
// graphing variable
Serial.println(input_timer); // input the variable for graphing during current phase
// for potentiometer values between potv2 and potv3, led 2 and led 3 will be lit
}else if (initial_pot_reading > potv2 && initial_pot_reading <= potv3) { // for potentiometer values between 146 & 292
float dimming_brightness = 256 - (initial_pot_reading - potv2) * 1.75 ; // brightness factor for led 2
float lifting_brightness = (initial_pot_reading - potv2) * 1.75; // brightness factor for led 3
// applying outputs to leds
digitalWrite(led1, LOW); // applying output to led 1
analogWrite(led2, dimming_brightness); // applying output to led 2
analogWrite(led3, 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
input_timer = millis(); //restarting input timer
// graphing variable
Serial.println(input_timer); // input the variable for graphing during current phase
// for potentiometer values between potv3 and potv4, led 3 and led 4 will be lit
} else if (initial_pot_reading > potv3 && initial_pot_reading <= potv4){ // for potentiometer values between 512 & 768
float dimming_brightness = 256 - (initial_pot_reading - potv3) * 1.75; // brightness factor for led 5
float lifting_brightness = (initial_pot_reading - potv3) *1.75; // brightness factor for led 6
// applying outputs to leds
digitalWrite(led1, LOW); // applying output to led 1
digitalWrite(led2, LOW); // applying output to led 2
analogWrite(led3, dimming_brightness); // applying output to led 3
analogWrite(led4, 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
input_timer = millis(); //restarting input timer
// graphing variable
Serial.println(input_timer); // input the variable for graphing during current phase
// for potentiometer values between potv4 and potv5, led 4 and led 5 will be lit
} else if (initial_pot_reading > potv4 && initial_pot_reading <= potv5){ // for potentiometer values between 512 & 768
float dimming_brightness = 256 - (initial_pot_reading - potv4) *1.75 ; // brightness factor for led 5
float lifting_brightness = (initial_pot_reading - potv4) *1.75; // brightness factor for led 6
// applying outputs 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, dimming_brightness); // applying output to led 4
analogWrite(led5, 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
input_timer = millis(); //restarting input timer
// graphing variable
Serial.println(input_timer); // input the variable for graphing during current phase
// for potentiometer values between potv5 and potv6, led 5 and led 6 will be lit
} else if (initial_pot_reading > potv5 && initial_pot_reading <= potv6){ // for potentiometer values between 512 & 768
float dimming_brightness = 256 - (initial_pot_reading - potv5) *1.75 ; // brightness factor for led 5
float lifting_brightness = (initial_pot_reading - potv5) *1.75; // brightness factor for led 6
// applying outputs 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, dimming_brightness); // applying output to led 5
analogWrite(led6, lifting_brightness); // applying output to led 6
digitalWrite(led7, LOW); // applying output to led 7
digitalWrite(led8, LOW); // applying output to led 8
input_timer = millis(); //restarting input timer
// graphing variable
Serial.println(input_timer); // input the variable for graphing during current phase
// for potentiometer values between 730 and 876, led 6 and led 7 will be lit
} else if (initial_pot_reading > potv6 && initial_pot_reading <= potv7){ // for potentiometer values between 512 & 768
float dimming_brightness = 256 - (initial_pot_reading - potv6) *1.75 ; // brightness factor for led 6
float lifting_brightness = (initial_pot_reading - potv6) *1.75; // brightness factor for led 7
// applying outputs 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, dimming_brightness); // applying output to led 6
analogWrite(led7, lifting_brightness); // applying output to led 7
digitalWrite(led8, LOW); // applying output to led 8
input_timer = millis(); //restarting input timer
// graphing variable
Serial.println(input_timer); // input the variable for graphing during current phase
}
// for potentiometer values between 876 and 1023, led 7 and led 8 will be lit
else {
float dimming_brightness = 256 - (initial_pot_reading - potv7) *1.75; // brightness factor for led 7
float lifting_brightness = (initial_pot_reading - potv7)*1.75; // brightness factor for led 8
// applying outputs 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, dimming_brightness); // applying output to led 7
analogWrite(led8, lifting_brightness); // applying output to led 8
input_timer = millis(); //restarting input timer
// graphing variable
Serial.println(input_timer); // input the variable for graphing during current phase
}
}
}