CraftDuino v2.0
  • - это CraftDuino - наш вариант полностью Arduino-совместимой платы.
  • CraftDuino - настоящий конструктор, для очень быстрого прототипирования и реализации идей.
  • Любая возможность автоматизировать что-то с лёгкостью реализуется с CraftDuino!
Просто добавьте CraftDuino!

Простой индикатор кода ошибки светодиодом


Иногда (хотя нет, скорее всего, ВСЕГДА) полезно знать что происходит с твоим устройством в данный момент времени. Для отладки всяких поделок на Ардуино и вообще анализа происходящих процессов очень удобно пользоваться выводом нужной служебной информации в COM-порт. А что делать, если такой возможности нет (устройство размещено в корпус, например)? Не будешь же бегать с ноутбуком к устройству, что бы посмотреть как там дела :) Есть очень шикарное решение.
Наверняка, многие сталкивались с устройствами (принтера, телефоны и т.д.) которые разными последовательностями мигания светодиода сообщают о наличии определенной ошибки.
И вот мне в одной моей поделке понадобилась такая «фишка». Работа устройства подразумевала 4-ре возможных аварийных ситуации.
Итак задача, или ТЗ.
Если все хорошо (нет ошибок) — светодиод просто горит (он по совместительству выполнял еще и функцию индикатора работоспособности устройства).
Ошибка с кодом 1 — одна вспышка светодиода
Ошибка с кодом 2 — две вспышки светодиода
и т.д.

Что-то напомнило старика Морзе :)

Как же это сделать?

Я решил не заморачиваться с вариантом «короткая вспышка-длинная вспышка», а выводить только короткие вспышки. Итак для одной вспышки нужно один раз включить светодиод и один раз выключить. Пауза. И снова включить-выключить. Получается нужно осуществить два действия: включить светодиод и выключить. Для кода ошибки 2, соответственно 4 действия… Ага! Решение напросилось вполне очевидное: заведем некую переменную (showErrorCount), значение которой (со старта) будет равно удвоенному значению кода ошибки. И по мере вывода кода ошибки, значение этой переменной будем уменьшать. Ну и для красоты, динамически будем менять интервал между вызовами процедуры отображения ошибок (errorShowInterval). Ну и для синхронизации по времени будем пользоваться штатной функцией (для Ардуино) millis().

Код ниже. Напоминаю! Этот самый примитивный вариант решения вопроса :) В моем варианте куча недостатков: нет очереди ошибок, при коде ошибки больше 5 — очень трудно визуально подсчитать количество вспышки… Зато очень компактно и главное — РАБОТАЕТ
Если кому-то пригодится — я буду очень рад :)

//Пин, к которому подключен светодиод
#define ledPower 3

volatile byte errorCode = 0; //Код ошибки (1 - Первый датчик-Х, 2- 2-ой датчик -Х, 3 - оба датчика - Х, 4- нагреватель - Х)

// пауза для красивого вывода кода ошибки, лучше подобрать под себя
#define pauseFlash 200
volatile unsigned long errorShowTime=0; //время выполнения нужных операций по выводу ошибок
volatile int errorShowInterval=pauseFlash; // интервал времени

void setup() 
{
  pinMode(ledPower, OUTPUT); ///назначаем пин на вывод
}

// Основной цикл программы
void loop()
{
  showError(errorCode); // вызываем в начале цикла всегда (можно в конце цикла)

// по ходу выполнения программы, если обнаружена какая либо ошибка 
// присваиваем глобальной переменной errorCode соответствующее значение кода ошибки
// да, ВАЖНО, наличие в коде всяких delay() не приветствуется :)
}

//=========================
//====== Show error code ========
//=========================
void showError(byte errorCode)
{
  static byte showErrorCount; //Глобальная переменная, видимая только этой процедурой
  if ((millis()-errorShowTime) >= errorShowInterval) //наступило время отображения следующего состояния
  {
    if (errorCode == 0)  //Если нет ошибок, просто включаем светодиод
      {
        digitalWrite(ledPower, HIGH);
        errorShowTime = millis();
        errorShowInterval=pauseFlash;
        showErrorCount=0;
      }
    else //если есть ошибки
      {
        if (showErrorCount == 0) //попали сюда первый раз
          {
            showErrorCount = errorCode * 2; //ставим значение счетчика равное удвоенному коду ошибки
            digitalWrite (ledPower, LOW); //гасим светодиод
            errorShowTime = millis();//следующий вызов через
            errorShowInterval=3*pauseFlash;
           }
        else
          {
            errorShowInterval=pauseFlash;
            digitalWrite(ledPower,showErrorCount%2); // при нечетном значении - включаем светодиод, при четном-выключаем
            showErrorCount = showErrorCount - 1; //уменьшаем значение счетчика
           }  
      }
       errorShowTime = millis();//следующий вызов 
  } 
}//end errorShow

  • +1
  • 3 февраля 2016, 16:48
  • Ghost_D

Комментарии (0)

RSS свернуть / развернуть

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.