Помогите разобраться с функцией 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(), но не получается. После запуска программы горит только первый светодиод.
Помогите разобраться.
Спасибо.
001 | // Плата управления режимами работы |
002 | // Заносим в массив номера выводов контроллера, к которым подключены светодиоды |
003 | // платы выбора режимов работы робота |
004 | const int vledpins[6]={2,3,4,5,6,7}; |
005 | int ledpin = LOW; // предыдущее состояние светодиода |
006 | long previousMillis = 0; // здесь будет храниться время последнего изменения состояния светодиода |
007 | long interval = 2000; // интервал мигания в миллисекундах |
008 |
009 | // Создаем переменную для сохранения режима работы |
010 | int vmode; |
011 | // Создаем переменную для сохранения предыдущего режима работы |
012 | int vmodeprev = -1; |
013 | // Заносим в массив номера вывода контроллера, к которым подключены кнопки |
014 | // платы выбора режимов работы робота |
015 | const int vbtn[2]={8,9}; |
016 |
017 |
018 | void setup () |
019 |
020 | { |
021 | |
022 | /* Инициализируем выводы контроллера, к которым подключены кнопки, в INPUT. */ |
023 | pinMode(vbtn[0], INPUT); |
024 | pinMode(vbtn[1], INPUT); |
025 | |
026 | if (millis() - previousMillis > interval) |
027 | { |
028 | previousMillis = millis(); // запоминаем текущее время |
029 | // если светодиод был выключен – включаем и наоборот :) |
030 | if (ledpin == LOW) |
031 | ledpin = HIGH; |
032 | else |
033 | ledpin = LOW; |
034 | } |
035 | |
036 | /* Устанавливаем выводы, к которым подключены светодиоды платы режимов, |
037 | в OUTPUT. Далее зажигаем и гасим светодиоды с интервалом в 0.5 сек |
038 | для проверки их работы */ |
039 | for (vmode = 0; vmode < 6; vmode = vmode + 1) |
040 | { |
041 | pinMode(vledpins[vmode], OUTPUT); |
042 | digitalWrite(vledpins[vmode],HIGH); |
043 | //digitalWrite(vledpins[vmode], ledpin); |
044 | delay (500); |
045 | digitalWrite(vledpins[vmode], LOW); |
046 | } |
047 | |
048 | // Устанавливаем значение первого режима работы робота |
049 | vmode = 0; |
050 | } |
051 |
052 | //ИСПОЛНЯЕМЫЙ ПРОГРАММНЫЙ МОДУЛЬ |
053 |
054 | void loop () |
055 | { |
056 | /* Исполняемый программный модуль переключения режимов работы робота */ |
057 |
058 | // Кнопка переключения на следующий режим - BTN1 |
059 | if (digitalRead(vbtn[0]) == HIGH) |
060 | { |
061 | vmode = vmode + 1; |
062 | vmodeprev = vmode - 1; |
063 | if (vmode > 5) |
064 | { |
065 | vmode = 0; |
066 | vmodeprev = 5; |
067 | } |
068 | |
069 | } |
070 | // Кнопка переключения на предыдущий режим - BTN2 |
071 | if (digitalRead(vbtn[1]) == HIGH) |
072 | { |
073 | vmode = vmode - 1; |
074 | vmodeprev = vmode + 1; |
075 | |
076 | if (vmode < 0) |
077 | { |
078 | vmode = 5; |
079 | vmodeprev = 0; |
080 | } |
081 | |
082 | } |
083 | // Засвечиваем светодиод текущего режима работы |
084 | digitalWrite(vledpins[vmode], HIGH); |
085 | // Гасим светодиод предыдущего режима работы |
086 | if (vmodeprev > -1) |
087 | { |
088 | digitalWrite(vledpins[vmodeprev], LOW); |
089 | } |
090 | |
091 | /* Выбор режима работы */ |
092 | switch (vmode) |
093 | { |
094 | case 0: // Режим 0 |
095 | break ; |
096 | |
097 | case 1: // Режим 1 |
098 | break ; |
099 |
100 | case 2: // Режим 2 |
101 | |
102 | break ; |
103 | |
104 | case 3: // Режим 3 |
105 | |
106 | |
107 | break ; |
108 | |
109 | case 4: //Режим 4 |
110 | |
111 | break ; |
112 | |
113 | case 5: // Режим 5 |
114 | break ; |
115 | } |
116 | } |