Skip to content

Instantly share code, notes, and snippets.

@me-no-dev
Created February 22, 2016 14:48
Show Gist options
  • Save me-no-dev/2e185a909000f6ac9605 to your computer and use it in GitHub Desktop.
Save me-no-dev/2e185a909000f6ac9605 to your computer and use it in GitHub Desktop.
#define TRIAC_PIN 5
#define ZERO_CROSS_PIN 4
#define DEBOUNCE_TIME 9000 //9ms - 10ms is the pulse period
static uint32_t lastPulse = 0;
static uint16_t period = 5000; //5ms - 50% for each half wave
void ICACHE_RAM_ATTR onTimerISR(){
if(GPIP(TRIAC_PIN)){//OUTPUT is HIGH
GPOC = (1 << TRIAC_PIN);//low
timer1_write(60);//12us
} else GPOS = (1 << TRIAC_PIN);//high
}
void ICACHE_RAM_ATTR onPinISR(){
uint32_t now = micros();
if(now - lastPulse < DEBOUNCE_TIME) return;
lastPulse = now;
GPOS = (1 << TRIAC_PIN);//high
timer1_write(period * 5);
}
void setup(){
pinMode(TRIAC_PIN, OUTPUT);
pinMode(ZERO_CROSS_PIN, INPUT);
GPOS = (1 << TRIAC_PIN);//high
timer1_attachInterrupt(onTimerISR);
timer1_enable(TIM_DIV16, TIM_EDGE, TIM_SINGLE);
attachInterrupt(ZERO_CROSS_PIN, onPinISR, RISING);
}
@josep112
Copy link

josep112 commented Sep 8, 2017

Thanks devyte!

@ayushsharma82
Copy link

ayushsharma82 commented Mar 28, 2018

@devyte , I think we can use the same onTimerISR() function to control 2 triacs as both lamps would be having the same zero crossing?

@Prathamarora29
Copy link

can i use interrupts instead of timers

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment