Индикация состояний при помощи светодиода
В своих скетчах я почти всегда сталкиваюсь с тем, что мне требуется запрограммировать индикацию состояний при помощи светодиода. Например, светодиод и кнопка - светодиод один, а состояний два: кнопка нажата и кнопка отпущена. Пусть бы этот светодиод мигал раз в секунду, когда кнопка отпущена, и быстро-быстро мигал, когда кнопка нажата.
Это пример, на практике вариантов может быть гораздо больше. И светодиодов больше, и разных состояний.
Так родилась идея написать простую в использовании библиотеку, с помощью которой можно было бы задавать последовательности блинков и дальше в коде просто переключать состояния индикации.
Библиотека получила название 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>