/* * Have the timer change between 100 ms and 2000 ms * in 17 s periods * Have the duty change between 10 % and 80 % * in 13 s periods */ #define timer_min 100 #define timer_max 2000 #define timer_time 17000 #define duty_min 100 #define duty_max 800 #define duty_time 13000 void caotico_tico(void) { unsigned long last_time; unsigned long next_time = 0; unsigned long last_duty; unsigned long next_duty = 0; bool time_step = false; bool duty_step = true; long timer_reading; long throttle_reading; static unsigned long last_swap = 0; unsigned long now; long deltatime; long duty_promille; last_time = millis(); last_duty = millis(); do { now = millis(); if (now > next_time) { last_time = next_time; next_time = now + timer_time; time_step = !time_step; } if (now > next_duty) { last_duty = next_duty; next_duty = now + duty_time; duty_step = !duty_step; } if (time_step) { deltatime = map(now, last_time, next_time, timer_min, timer_max); } else { deltatime = map(now, last_time, next_time, timer_max, timer_min); } if (duty_step) { duty_promille = map(now, last_duty, next_duty, duty_min, duty_max); } else { duty_promille = map(now, last_duty, next_duty, duty_max, duty_min); } if (now > last_swap + deltatime) { swap(!swapper); if (swapper) { digitalWrite(pole1, HIGH); digitalWrite(pole2, LOW); } else { digitalWrite(pole2, HIGH); digitalWrite(pole1, LOW); } last_swap = now; duty(true); digitalWrite(LED_BUILTIN, HIGH); } if (now > last_swap + duty_promille * deltatime / 1000) { duty(false); digitalWrite(pole1, LOW); digitalWrite(pole2, LOW); } } while (digitalRead(mode3p) == LOW); }