ANVARD
@ANVARD

Как мигать светодиодами без delay?

Здравствуйте,
Два светодиода, мигают с эффектом стробоскопа. Пожалуйста, помогите примером, как переписать код, чтобы избавиться от delay() ?

long previousMillis = 0;

void loop () {
  flash();
}

void flash () {
  if (millis() - previousMillis > 840) {
    previousMillis = millis();
    digitalWrite(NoSoundLed, LOW);
    digitalWrite(NotifyLed, HIGH);
    delay(120);
    digitalWrite(NotifyLed, LOW);
    delay(120);
    digitalWrite(NotifyLed, HIGH);
    delay(120);
    digitalWrite(NotifyLed, LOW);
    delay(120);
    digitalWrite(NoSoundLed, HIGH);
    delay(120);
    digitalWrite(NoSoundLed, LOW);
    delay(120);
    digitalWrite(NoSoundLed, HIGH);
    delay(120);
    digitalWrite(NoSoundLed, LOW);
  }
}

Благодарю за внимание!
  • Вопрос задан
  • 3161 просмотр
Пригласить эксперта
Ответы на вопрос 2
if ((millis() % 1000) > 500) digitalWrite(Pin, HIGH);
else digitalWrite(Pin, LOW);


Берем остаток от деления текущего времени (с момента старта МК, в мсек) на 1000.
Если он выйдет более 500 - включаем диод, иначе вырубаем.
Получим переключение каждые 500 мс.

Вставляем это туда, где будет частенько проверятся и наслаждаемся.

Для твоего случая, вот такую ф-цию и почаще её вызывать в главном цикле.
void setup() {
pinMode(13, OUTPUT);
}

unsigned int millisCounter = 0;
void migalka(void)
{
millisCounter = millis() % 8400;
if(millisCounter  < 1200 )
{digitalWrite(13,1);}
else
if(millisCounter  < 2400)
{digitalWrite(13,1);}
else
if(millisCounter  < 3600)
{digitalWrite(13,1);}
else
if(millisCounter  < 4800)
{digitalWrite(13,0);}
else
if(millisCounter < 5200)
{digitalWrite(13,0);}
else
if(millisCounter  < 6400)
{digitalWrite(13,1);}
else
if(millisCounter  < 7200)
{digitalWrite(13,1);}
else
{digitalWrite(13,0);}
}
/*основной цикл*/
void loop() {
migalka();
}
Ответ написан
Комментировать
Rou1997
@Rou1997
delay можно переписать вот так:

long previousMillis = millis();
while (true) {
  if (millis() - previousMillis >= 120) {
    break;
  }
  previousMillis = millis();
}


Или так:

for (int i = 0; i < 1000000; i++) { ; }

Или так:
digitalWrite(NotifyLed, HIGH);
    digitalWrite(NotifyLed, HIGH);
    digitalWrite(NotifyLed, HIGH);
    digitalWrite(NotifyLed, HIGH);
    digitalWrite(NotifyLed, HIGH);
    digitalWrite(NotifyLed, HIGH);
    digitalWrite(NotifyLed, HIGH);
    digitalWrite(NotifyLed, HIGH);
    digitalWrite(NotifyLed, HIGH);
    digitalWrite(NotifyLed, HIGH);
    digitalWrite(NotifyLed, HIGH);
    digitalWrite(NotifyLed, HIGH);
    digitalWrite(NotifyLed, HIGH);
    digitalWrite(NotifyLed, HIGH);
    digitalWrite(NotifyLed, HIGH);
    digitalWrite(NotifyLed, HIGH);
    digitalWrite(NotifyLed, HIGH);
    digitalWrite(NotifyLed, HIGH);
    digitalWrite(NotifyLed, HIGH);
    digitalWrite(NotifyLed, HIGH);
    digitalWrite(NotifyLed, HIGH);
    digitalWrite(NotifyLed, HIGH);
    digitalWrite(NotifyLed, HIGH);
    digitalWrite(NotifyLed, HIGH);
    digitalWrite(NotifyLed, HIGH);
    digitalWrite(NotifyLed, HIGH);
    digitalWrite(NotifyLed, HIGH);
    //TODO If delay is too low, use Ctrl+C Ctrl+V


Достаточно или еще придумать?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы