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