Единственная очевидная вещь - это то, что у вас есть флаг состояния, для которого нужно увеличивать значение, но вы не проверяете его в своем первом if. Было бы лучше структурировать ваш код немного больше. Вы также можете отслеживать более одного значения, если у вас есть более одного пина, если только они не должны появляться и исчезать одновременно. В этом случае вам лучше всего использовать массив struct
s с параметрами для каждой сосны.
Один из способов использования задержки для нескольких задач - заставить каждую задачу работать в течение времени, прошедшего с момента последнего цикла, и отрегулировать задержку в конце цикла на время, которое занимают задачи. Если ваш цикл выглядит примерно так:
static unsigned long last_time = 0; // set to millis() in setup
static unsigned long refresh_period = 20; // 50Hz
void loop()
{
unsigned long time = millis();
unsigned long delta = time - last_time;
doTask1( delta );
doTask2( delta );
doTask3( delta );
doTask4( delta );
// as tasks may have taken some millis, adjust delay
unsigned long post_time = millis();
if ( post_time - last_time < refresh_period )
delay( refresh_period - ( post_time - last_time ) );
last_time = time;
}
Тогда каждая задача будет запускаться примерно раз в 20 мс, и будет проходить примерно через 20 миллисекунд, для которых необходимо обновить их состояние. Таким образом, вы получаете некоторую задержку, но у всего есть шанс обновить.