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