Помогите разобраться с функцией millis ()
- Войдите на сайт для отправки комментариев
Сделал простую плату выбора режима работы для будущего устройства.
Плата состоит из 2 кнопок (переключающие режимы вперед-назад) и 6 светодиодов (индикаторы выбранного режима работы)
Написал скетч.
При запуске программы должно происходить следующее - поочередно зажигаются шесть светодиодов и плата переходит в режим ожидания, горит 1-й светодиод
Если нажать на кнопку 1 происходит переключение режима с одновременной индикацией режима соответствующим светодиодом. Если на кнопку 2, то происходит возврат к предыдущему режиму работы.
Вопрос. Хотел избавится от функции delay () в нижеуказанной части кода
/* Устанавливаем выводы, к которым подключены светодиоды платы режимов,
в OUTPUT. Далее зажигаем и гасим светодиоды с интервалом в 0.5 сек
для проверки их работы */
for (vmode = 0; vmode < 6; vmode = vmode + 1)
{
pinMode(vledpins[vmode], OUTPUT);
digitalWrite(vledpins[vmode],HIGH);
delay (500);
digitalWrite(vledpins[vmode], LOW);
}
* Устанавливаем выводы, к которым подключены светодиоды платы режимов,
в OUTPUT. Далее зажигаем и гасим светодиоды с интервалом в 0.5 сек
для проверки их работы */
for (vmode = 0; vmode < 6; vmode = vmode + 1)
{
pinMode(vledpins[vmode], OUTPUT);
digitalWrite(vledpins[vmode], ledpin);
}
и заменить ее на millis(), но не получается. После запуска программы горит только первый светодиод.
Помогите разобраться.
Спасибо.
// Плата управления режимами работы // Заносим в массив номера выводов контроллера, к которым подключены светодиоды // платы выбора режимов работы робота const int vledpins[6]={2,3,4,5,6,7}; int ledpin = LOW; // предыдущее состояние светодиода long previousMillis = 0; // здесь будет храниться время последнего изменения состояния светодиода long interval = 2000; // интервал мигания в миллисекундах // Создаем переменную для сохранения режима работы int vmode; // Создаем переменную для сохранения предыдущего режима работы int vmodeprev = -1; // Заносим в массив номера вывода контроллера, к которым подключены кнопки // платы выбора режимов работы робота const int vbtn[2]={8,9}; void setup() { /* Инициализируем выводы контроллера, к которым подключены кнопки, в INPUT. */ pinMode(vbtn[0], INPUT); pinMode(vbtn[1], INPUT); if (millis() - previousMillis > interval) { previousMillis = millis(); // запоминаем текущее время // если светодиод был выключен – включаем и наоборот :) if (ledpin == LOW) ledpin = HIGH; else ledpin = LOW; } /* Устанавливаем выводы, к которым подключены светодиоды платы режимов, в OUTPUT. Далее зажигаем и гасим светодиоды с интервалом в 0.5 сек для проверки их работы */ for (vmode = 0; vmode < 6; vmode = vmode + 1) { pinMode(vledpins[vmode], OUTPUT); digitalWrite(vledpins[vmode],HIGH); //digitalWrite(vledpins[vmode], ledpin); delay (500); digitalWrite(vledpins[vmode], LOW); } // Устанавливаем значение первого режима работы робота vmode = 0; } //ИСПОЛНЯЕМЫЙ ПРОГРАММНЫЙ МОДУЛЬ void loop() { /* Исполняемый программный модуль переключения режимов работы робота */ // Кнопка переключения на следующий режим - BTN1 if (digitalRead(vbtn[0]) == HIGH) { vmode = vmode + 1; vmodeprev = vmode - 1; if (vmode > 5) { vmode = 0; vmodeprev = 5; } } // Кнопка переключения на предыдущий режим - BTN2 if (digitalRead(vbtn[1]) == HIGH) { vmode = vmode - 1; vmodeprev = vmode + 1; if (vmode < 0) { vmode = 5; vmodeprev = 0; } } // Засвечиваем светодиод текущего режима работы digitalWrite(vledpins[vmode], HIGH); // Гасим светодиод предыдущего режима работы if (vmodeprev > -1) { digitalWrite(vledpins[vmodeprev], LOW); } /* Выбор режима работы */ switch (vmode) { case 0: // Режим 0 break; case 1: // Режим 1 break; case 2: // Режим 2 break; case 3: // Режим 3 break; case 4: //Режим 4 break; case 5: // Режим 5 break; } }