Помогите разобраться с функцией millis ()

Нет ответов
DEN75
Offline
Зарегистрирован: 16.01.2014

Сделал простую плату выбора режима работы для будущего устройства.

Плата состоит из 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// платы выбора режимов работы робота
004const int vledpins[6]={2,3,4,5,6,7};
005int ledpin = LOW;          // предыдущее состояние светодиода
006long previousMillis = 0;  // здесь будет храниться время последнего изменения состояния светодиода
007long interval = 2000;      // интервал мигания в миллисекундах
008 
009// Создаем переменную для сохранения режима работы
010int vmode;
011// Создаем переменную для сохранения предыдущего режима работы
012int vmodeprev = -1;
013// Заносим в массив номера вывода контроллера, к которым подключены кнопки
014// платы выбора режимов работы робота
015const int vbtn[2]={8,9};
016 
017 
018void 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 
054void 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}