#include <TimerOne.h>
volatile int i=0;
volatile boolean zero_cross=0;
int AC_pin = 3; // Output ke Opto Triac
int dim = 0; // Dimming level (0-128) 0 = on, 128 = 0ff
int inc=1; // Menghitung naik atau turun , 1=up, -1=down
int freqStep = 75;
void setup() { // mulai set up
pinMode(AC_pin, OUTPUT); // Set Triac pin menjadi output
attachInterrupt(0, zero_cross_detect, RISING); // memberikan Interupt ke Pin 2 (interupt 0) untuk mendeteksi Zero Cross
Timer1.initialize(freqStep);
Timer1.attachInterrupt(dim_check, freqStep);
}
void zero_cross_detect() {
zero_cross = true;
i=0;
digitalWrite(AC_pin, LOW);
}
void dim_check() {
if(zero_cross == true) {
if(i>=dim) {
digitalWrite(AC_pin, HIGH); // lampu menyala
i=0; // reset waktu step counter
zero_cross = false; //reset zero cross detection
}
else {
i++; // increment time step counter
}
}
}
void loop() {
dim+=inc;
if((dim>=128) || (dim<=0))
inc*=-1;
delay(18);
}