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



Иногда (хотя нет, скорее всего, ВСЕГДА) полезно знать что происходит с твоим устройством в данный момент времени. Для отладки всяких поделок на Ардуино и вообще анализа происходящих процессов очень удобно пользоваться выводом нужной служебной информации в 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


Добавить комментарий

Arduino

Что такое Arduino?
Зачем мне Arduino?
Начало работы с Arduino
Для начинающих ардуинщиков
Радиодетали (точка входа для начинающих ардуинщиков)
Первые шаги с Arduino

Разделы

  1. Преимуществ нет, за исключением читабельности: тип bool обычно имеет размер 1 байт, как и uint8_t. Думаю, компилятор в обоих случаях…

  2. Добрый день! Я недавно начал изучать программирование под STM32 и ваши уроки просто бесценны! Хотел узнать зачем использовать переменную типа…

3D-печать AI Arduino Bluetooth CraftDuino DIY Google IDE iRobot Kinect LEGO OpenCV Open Source Python Raspberry Pi RoboCraft ROS swarm ИК автоматизация андроид балансировать бионика версия видео военный датчик дрон интерфейс камера кибервесна манипулятор машинное обучение наше нейронная сеть подводный пылесос работа распознавание робот робототехника светодиод сервомашинка собака управление ходить шаг за шагом шаговый двигатель шилд юмор

OpenCV
Робототехника
Будущее за бионическими роботами?
Нейронная сеть - введение