В своих скетчах я почти всегда сталкиваюсь с тем, что мне требуется запрограммировать индикацию состояний при помощи светодиода. Например, светодиод и кнопка - светодиод один, а состояний два: кнопка нажата и кнопка отпущена. Пусть бы этот светодиод мигал раз в секунду, когда кнопка отпущена, и быстро-быстро мигал, когда кнопка нажата.
Это пример, на практике вариантов может быть гораздо больше. И светодиодов больше, и разных состояний.
Так родилась идея написать простую в использовании библиотеку, с помощью которой можно было бы задавать последовательности блинков и дальше в коде просто переключать состояния индикации.
Библиотека получила название LEDseq (LED sequences), и её можно скачать с сервера SourceForge. Код библиотеки использует библиотеку VEduino, которую также можно скачать на сервере SourceForge.
Ниже приведён код примера Button_2_LEDs с комментариями на русском:
/** * Это скетч-пример к библиотеке LEDseq. * В нём показывается, как определять и устанавливать состояния для продвинутой светодиодной индикации состояний. * * Подключите кнопку ко входу Digital 2 платы Adruino. * Подключите второй светодиод к выводу Digital 7. * * http://sites.google.com/site/vanyambauseslinux/arduino/indikacia-sostoanij-pri-pomosi-svetodioda */ #include <ve_avr.h> // Использовать библиотеку VEduino #include <LEDseq.h> // Использовать библиотеку LEDseq #define LED1PIN 13 #define LED2PIN 7 #define BTNPIN 2 const char state0[] = "01"; // 38*4ms ON, 206*4ms OFF const char state1[] = "22222223"; // (19*4ms ON, 19*4ms OFF) * 3 times, 19*4ms ON, 111*4ms OFF const char state2[] = "001"; // 38*4ms ON, 38*4ms OFF, 206*4ms ON, 38*4ms OFF, 38*4ms ON, 206*4ms OFF const char state3[] = "22"; // 19*4ms ON, 19*4ms OFF const char *states1[2] = { state0, state1 }; // 2 состояния для светодиода 13 const char *states2[2] = { state2, state3 }; // 2 состояния для светодиода 7 const short delays[4] = { 38, 206, 19, 111 }; // 4 типа задержки ('0', '1', '2' and '3') const char stateChars[4] = { '0', '1', '2', '3' }; // Characters that usedLEDseq led1(LED1PIN, // Номер пина светодиода. states1, // Последовательности состояний 2, // Кол-во состояний delays, // Задержки 4, // Кол-во задержек stateChars, // Символы, использованные для кодирования задержек 0); // Предыдущий объект LEDseq LEDseq led2(LED2PIN, // Номер пина светодиода. states2, // Последовательности состояний 2, // Кол-во состояний delays, // Задержки 4, // Кол-во задержек stateChars, // Символы, использованные для кодирования задержек &led1); // Предыдущий объект LEDseqvoid setup() { pinMode(BTNPIN, INPUT); } void loop() { if (digitalRead(BTNPIN) == HIGH) { led1.setState(1); led2.setState(0); } else { led1.setState(0); led2.setState(1); } LEDseq::loop(); } Библиотека использует прерывания от таймера-счётчика 1. В файле <LEDseq.h> можно задать, чтобы использовался таймер-счётчик 2 (либо 3/4/5 для Arduino MEGA).
Используя функции ledOn() и ledOff() можно останавливать последовательность блинков, включая и выключая светодиод. Также, если в последовательности задать задержку, равную -1, в этом месте последовательность будет остановлена, и светодиод будет предварительно включен или выключен, в зависимости от позиции задержки (чётной или нечётной, начиная с позиции 0) в данной последовательности состояния.
Приятного программирования и весёлых блинков! =)
Автор: Андрей Шаройко <vanyamboe@gmail.com>