Попытался скомпилировать код из шапки под arduino mega - сыпало ошибки
написал свой, может кому пригодится:
используется библиотека TimerOne код компилится для любой платы, в цикле loop рандомно меняется яркость первого диммера каждые 100мс.
PHP код:
#include <TimerOne.h>
//#include <CyberLib.h>
volatile uint8_t tic ;
uint8_t data;
int startDimPin = 3; //первый диммер
int endDimPin = 12; //последний диммер
int Dimmer[9]; //количество диммеров минус 1
void setup() {
//*********************Настраиваем порты на выход**********************
for ( int i = startDimPin; i <= endDimPin; i++) //пройдемся циклом по портам
{
pinMode (i, OUTPUT);
digitalWrite(i, LOW); // гасим оответствующий пин
Dimmer[i - startDimPin] = 10; //выставим яркость соответствующего диммера в 0
}
//CHANGE – прерывание вызывается при любом изменении значения на входе;
//RISING – вызов прерывания при изменении уровня напряжения с низкого (Low) на высокий(HIGH)
//FALLING – вызов прерывания при изменении уровня напряжения с высокого (HIGH) на низкий (Low)
attachInterrupt(0, detect_up, LOW); // настроить срабатывание прерывания interrupt0 на pin 2 на низкий уровень
Timer1.initialize(40); // Интервал срабатывания таймера в мкс
Timer1.attachInterrupt(halfcycle); //будет вызыватся каждый раз при отсчете заданого времени
Timer1.stop();
Serial.begin(115200); //инициализация порта
randomSeed(analogRead(0)); //псевдогенератор случайных чисел будет использовать шумы на аналог пин 0
}
//********************обработчики прерываний*******************************
void halfcycle() //прерывания таймера
{
tic--; //счетчик
for ( int i = startDimPin; i <= endDimPin; i++)
{
if (Dimmer[i - startDimPin] > tic )
digitalWrite(i, HIGH); //управляем выходом (откроем семистор)
}
}
void detect_up() // обработка внешнего прерывания. Сработает по переднему фронту
{
tic = 200; //обнулить счетчик
Timer1.resume(); //запустить таймер
attachInterrupt(0, detect_down, HIGH); //перепрограммировать прерывание на другой обработчик
}
void detect_down() // обработка внешнего прерывания. Сработает по заднему фронту
{
Timer1.stop(); //остановить таймер
for ( int i = startDimPin; i <= endDimPin; i++)
{
digitalWrite(i, LOW);
}
tic = 200; //обнулить счетчик
attachInterrupt(0, detect_up, LOW); //перепрограммировать прерывание на другой обработчик
}
void loop() {
{
//********помигаем первым диммером рандомно********
Dimmer[0] = random(10, 200);
//Задержка для более плавного эффекта мерцания
delay(100);
}
}