#include #define DEBUG true //set to true for debug output, false for no debug output #define DS if(DEBUG)Serial // DS = Debug Serial hw_timer_t *gateTimer = NULL; int dimmerLevel = 0; #define GATE 45 #define SCALEFACTOR 32 // ((80 MHZ / 80 prescale) / 120 hz) / 256 #define ZERO_CROSS_PIN 46 void IRAM_ATTR Zero_Cross_Interrupt() { if (dimmerLevel > 0) { digitalWrite(GATE, HIGH); timerAlarmWrite(gateTimer, SCALEFACTOR*dimmerLevel, true); timerAlarmEnable( gateTimer); timerWrite( gateTimer, 0); timerStart( gateTimer); } else { digitalWrite(GATE, LOW); } delayMicroseconds(400); // debounce zero-crossing } void IRAM_ATTR onGateTimer() { digitalWrite(GATE, LOW ); timerStop( gateTimer); } //*************************************************************************** void setup(){ #if DEBUG Serial.begin(115200); while (!Serial){} #endif pinMode(ZERO_CROSS_PIN,INPUT_PULLUP); pinMode(GATE,OUTPUT); digitalWrite( GATE, LOW); attachInterrupt(ZERO_CROSS_PIN, Zero_Cross_Interrupt, FALLING); gateTimer = timerBegin(0, 80, true); timerAttachInterrupt(gateTimer, &onGateTimer, true); timerAlarmWrite(gateTimer, 4000, true); } void loop(){ dimmerLevel = 0; for (int i=0;i<250;i++) { dimmerLevel++; delay(100); } for (int i=250;i>0;i--) { dimmerLevel--; delay(100); } }