Помогите разобраться с функцией 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;
}
}