Индикация состояний при помощи светодиода

В своих скетчах я почти всегда сталкиваюсь с тем, что мне требуется запрограммировать индикацию состояний при помощи светодиода. Например, светодиод и кнопка - светодиод один, а состояний два: кнопка нажата и кнопка отпущена. Пусть бы этот светодиод мигал раз в секунду, когда кнопка отпущена, и быстро-быстро мигал, когда кнопка нажата.

Это пример, на практике вариантов может быть гораздо больше. И светодиодов больше, и разных состояний.

Так родилась идея написать простую в использовании библиотеку, с помощью которой можно было бы задавать последовательности блинков и дальше в коде просто переключать состояния индикации.

Библиотека получила название 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 used

LEDseq led1(LED1PIN,      // Номер пина светодиода.
            states1,      // Последовательности состояний
            2,            // Кол-во состояний
            delays,       // Задержки
            4,            // Кол-во задержек
            stateChars,   // Символы, использованные для кодирования задержек
            0);           // Предыдущий объект LEDseq
 
LEDseq led2(LED2PIN,      // Номер пина светодиода.
            states2,      // Последовательности состояний
            2,            // Кол-во состояний
            delays,       // Задержки
            4,            // Кол-во задержек
            stateChars,   // Символы, использованные для кодирования задержек
            &led1);       // Предыдущий объект LEDseq

void 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>