// тест одного канала
// библиотека универсальная, поэтому требуется свой таймер
// в этом примере делаем на аппаратном таймере
#include <GyverTimers.h> // библиотека таймера
#define D_PIN 3
// zero cross на D2
#include <GyverDimmer.h>
Dimmer<D_PIN> dim; // указать пин диммера
//Dimmer<D_PIN> dim(60); // можно указать 60 Гц (умолч 50)
bool use = true;
void setup() {
Serial.begin(250000);
// завести прерывание на детектор нуля
attachInterrupt(0, isr, RISING); // D2 == 0
// разрешаем прерывания по таймеру
Timer2.enableISR();
}
bool start = false;
// прерывание детектора нуля
void isr() {
start = true;
if (dim.tickZero()) {
Timer2.setPeriod(dim.getPeriod());
}
else Timer2.restart();// иначе перезапустить со старым
}
// прерывание таймера
ISR(TIMER2_A) {
if (use){
dim.tickTimer(); // вызвать tickTimer()
Timer2.stop(); // останавливаем таймер
if(start) {
delayMicroseconds(1070);
isr();
start = false;
}
}
}
int vall = 0;
bool flag = false;
void loop() {
static uint32_t tmr=0;
if(millis() - tmr >300) {
use=!use;
tmr = millis();
}
if(!flag) vall += 1;
if(flag) vall-=1;
if (vall == 255) {
flag = !flag;
}
if (vall == 0) {
flag = !flag;
}
dim.write(30); // принимает 0-255
}