Странно а что я не правильного описал и даже зарисовал? Я все таки начинающий всего знать не могу просто вычитал что delay останавливает весь процесс а milis позволяет контроллеру работать дальше но у меня не получается этого реализовать, так чего уж тут неправильного я задал??? Вот например делаю так светодиод просто горит и цикл н завершается .. Мне даже не заставить его погаснуть когда нужно. Код (Text): if (millis() - time <= ligth_time_red + next_red) { for (byte pulse = 0; pulse < Pulse_red; ++pulse) { digitalWrite(RED_PIN, HIGH); //delay(ligth_time_red); if ((millis()>time + pulseIntervalRed)||(millis()<time)) digitalWrite(RED_PIN, LOW); //delay(pulseIntervalRed); }
Смотрите мой пример внимательнее. У вас не должно быть перехвата управления в виде циклов for(). Только реакция на события в главном цикле. Наступление момента времени, когда что-то должно произойти (когда светодиод должен загореться или погаснуть) - это событие. В событийно-ориентированном коде у вас loop() должен выглядеть только так: Код (Text): void loop() { if (событие 1) { // действие 1 } // ... if (событие N) { // действие N } } И никаких явных задержек или циклов.
Несколько импульсов одного светодиода - это несколько событий "настало время зажечь светодиод (в i-тый раз)" и "настало время погасить светодиод (в i-тый раз)".
То есть если сделать так то задержек не будет? Но почему тогда синий светодиод не вступает в работу? Код (Text): if (millis() - time <= ligth_time_red ) { for (byte pulse = 0; pulse < Pulse_red; ++pulse) { digitalWrite(RED_PIN, HIGH); delay(ligth_time_red); digitalWrite(RED_PIN, LOW); delay(pulseIntervalRed); } delay(next_red); } } if (millis() - time <= ligth_time_blue ) { for (byte pulse = 0; pulse < Pulse_blue; ++pulse) { digitalWrite(BLUE_PIN, HIGH); delay(ligth_time_blue); digitalWrite(BLUE_PIN, LOW); delay(pulseIntervalBlue); } delay(next_blue); flag = true; }
Тогда вот эту строку надо повторять в каждом событии? for (byte pulse = 0; pulse < Pulse_red; ++pulse)
В таком варианте тоже не работает что еще не так делаю? Код (Text): boolean flag = false; // текущее системное время long time = millis(); while(!flag) { if (millis() - time <= ligth_time_red) { for (byte pulse = 0; pulse < Pulse_red; ++pulse) { digitalWrite(RED_PIN, HIGH); } if ((millis()>time + pulseIntervalRed)||(millis()<time)) { digitalWrite(RED_PIN, LOW); } flag = true; } }
Тогда без него как определить сколько раз нужно мигнуть? byte Pulse_red = 2; // будет регулироваться от 1 до 5
Когда вы вставляете цикл, он ломает логику кода, блокирует выполнение остального кода пока сам не закончится. А это именно то, с чем вы боретесь.
Вам нужно составить условие, при котором светодиод должен гореть и использовать это условие в главном цикле, вместо того, чтобы явно N раз им моргать.
Пример: Код (Text): void loop() { long int time = millis() - time_start; bool led_on = false; for (int i = 0; i < pulse_count; i++) { if ((time>=(time_start + DELAY_FIRST_PULSE + DELAY_NEXT_PULSE*i)) && (time<(time_start + DELAY_FIRST_PULSE + DELAY_NEXT_PULSE*i + PULSE_LENGTH)) { led_on = true; break; } } digitalWrite(PIN_LED, led_on); }
Не понятно от куда взялось bool led_on = false и что это значит DELAY_FIRST_PULSE, DELAY_NEXT_PULSE ???
DELAY_FIRST_PULSE - интервал времени от нажатия кнопки до первого испульса, DELAY_NEXT_PULSE - интервал времени между импульсами, led_on - флаг включения светодиода. Я же пример привожу, чтобы принцип построения кода объяснить, а не чтобы его бездумно можно было склеить с другим кодом. Имена переменных сами за себя говорят, для чего они нужны. Вы с английским языком знакомы?
Ничего не получается Код (Text): void loop() { long int time = millis() - time_start; bool led_on = false; if ((digitalRead (PIN_BTN_START)) { for (int i = 0; i < Pulse_red; i++) { if ((time>=(time_start + next_red + pulseIntervalRed*i)) && (time<(time_start + next_red + pulseIntervalRed*i + ligth_time_red))) { led_on = true; break; } } digitalWrite(RED_PIN, led_on); } }