Помогите разобраться с функцией 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(), но не получается. После запуска программы горит только первый светодиод.

Помогите разобраться.

Спасибо.

// Плата управления режимами работы
// Заносим в массив номера выводов контроллера, к которым подключены светодиоды
// платы выбора режимов работы робота
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;
  } 
}