Мигать несколькими светодиодами
- Войдите на сайт для отправки комментариев
Пнд, 24/02/2014 - 16:22
Доброго дня.
Надо поморгать двумя светиками без delay(). Алгоритм такой примерно: зажигается первый светодиод, потом гаснет, через какое то время загорается второй светодиод, снова гаснет все на время и по кругу.
Читал/пробовал не работает никак.
Помогите, плз.
Так как сделано в коде ниже - не рабоает.
const int ledPin8 = 8; // the number of the LED pin const int ledPin9 = 9; // the number of the LED pin // Variables will change: int ledState8 = LOW; // ledState used to set the LED int ledState9 = LOW; // ledState used to set the LED long previousMillis = 0; // will store last time LED was updated long interval = 3000; // interval at which to blink (milliseconds) void setup() { // set the digital pin as output: pinMode(ledPin8, OUTPUT); pinMode(ledPin9, OUTPUT); } void loop() { unsigned long currentMillis = millis(); if(currentMillis - previousMillis > interval) { // save the last time you blinked the LED if(currentMillis - previousMillis > 1*interval/4) { FirstLap; } if(currentMillis - previousMillis > 2*interval/4) { AllDown; } if(currentMillis - previousMillis > 3*interval/4) { SecondLap; } if(currentMillis - previousMillis > 4*interval/4) { AllDown; } previousMillis = currentMillis; } } // Первый цикл void FirstLap(){ digitalWrite(ledPin8, HIGH); } //Второй цикл void SecondLap(){ digitalWrite(ledPin9, HIGH); } // Гасим все void AllDown(){ digitalWrite(ledPin8, LOW); digitalWrite(ledPin9, LOW); }
1) Про static переменные в функции loop() и про мигание читаем тут.
2)
if
(currentMillis - previousMillis > interval) - если выполнится это условие, то все внутренние условия правдивы (true).
3) Использование переменных разного типа для millis() и операции над ними - прямая дорога к багам.
3) Использование переменных разного типа для millis() и операции над ними - прямая дорога к багам.
К каким именно? Автоматическое преобразование типов подразумевает только расширение разрядности, unsigned long при этом имеет максимальную. Хотелось бы видеть про какие именно типичные баги речь.
Огромное спасибо Лешему.
Все завелось даже на три диода. Ошибку свою понял.
Рабочий код ниже, вдруг понадобится кому.
3) Использование переменных разного типа для millis() и операции над ними - прямая дорога к багам.
К каким именно? Автоматическое преобразование типов подразумевает только расширение разрядности, unsigned long при этом имеет максимальную. Хотелось бы видеть про какие именно типичные баги речь.
long
previousMillis = 0;
unsigned
long
currentMillis = millis();
...
previousMillis = currentMillis;
if
(currentMillis - previousMillis > interval)
Тут видимо проблем нет у вас?
Тут видимо проблем нет у вас?
Есть предупреждение компилятора. Но если его проигнорировать и посмотреть на ассемблерный выход, будут проблемы?
Есть предупреждение компилятора. Но если его проигнорировать и посмотреть на ассемблерный выход, будут проблемы?
В относительной величине нет, но в абсолютном знчении с какого-то момента prev может стать отрицательной величиной и если prev будет испоьзоваться в других вычислениях (скорость изменения чего-либо) или как метка локального времени в логах, то тут появляются проблемы.
Есть предупреждение компилятора. Но если его проигнорировать и посмотреть на ассемблерный выход, будут проблемы?
В относительной величине нет, но в абсолютном знчении с какого-то момента prev может стать отрицательной величиной и если prev будет испоьзоваться в других вычислениях (скорость изменения чего-либо) или как метка локального времени в логах, то тут появляются проблемы.
Я говорил о конкретном коде. В логи вряд ли кто то будет выводить сырой миллис. В общем, я согласен про "неаккуратненько", но реализация арифметики в дополнительном коде скрывает многие проблемы и некоторые даже разрешает.
Еще вопрос возник, друзья.
Каким образом я могу при такой конструкции как у Лешего динамически менять параметр INTERVAL, например при нажатии на кнопку?
Спасибо!