-
-
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 For two lamps you would need 2 different timers to trigger the 2 triacs. But the the ESP only has 2 hardware timers, and one is in use by the wifi stack (I think), which his why the gist uses the other. I would use this same code on two different ESPs, one per lamp. A wemos d1 mini v2 goes for under USD3 these days, they're cheap enough.
Having said that, and in view of the current cleanup effort, this is not the right place for "how do I..." questions. This is an issue tracker for tracking issues in the core. Please ask such questions at esp8266.com or stackoverflow.
Thanks devyte!
@devyte , I think we can use the same onTimerISR()
function to control 2 triacs as both lamps would be having the same zero crossing?
can i use interrupts instead of timers
How do I use this code with 2 lamps?