Control the brightness of bulb using Triac module and NodeMCU

Control the brightness of bulb
using Triac module and NodeMCU

Control the brightness of bulb using Triac module and NodeMCU

Keep in mind:

  1. Signal pin of triac needs to modified before using it with NodeMCU but
    zero-crossing pin can work straight forward without any modifications.

  2. Signal pin of triac module works on 5v as it has 330Ω resistor, led and
    opto-coupler in series. You can either use level shifter between NodeMCU
    and triac module so that it will shift the voltage from 3.3v to 5v or you
    could simply replace the 330Ω with 100Ω resistor.
  3. You can use any pin for detecting zero crossing, expect for GPIO 16 as it
    does not come with interrupt. I have used D5(GPIO 14) for detecting zerocross
    and D7(GPIO 13) for triggering the triac.
  4. For timer interrupts, I have used Ticker library in replacement for
    TimerOne library. Ticker library count in mili seconds and is not very
    precise but you can always make your own code to count it micro seconds
    and get better result.
  5.  Add ICACHE_RAM_ATTR in code if you are using new core(2.5.2) as it
    forces to run ISR in IRAM.
    you can get more detail in following link;



#include <Ticker.h>
Ticker trigger;
void ICACHE_RAM_ATTR zeroCrossingInterrupt(); //add ISR
in IRAM, neceassry for 2.5.2 core
int zc_pin = D5; // connected to GPIO14
int sig_pin = D7; // connected to GPIO13
int brightness=0; // variable for counting delay for
triggering pulse
int state=0;
void pulse_gen(){ // timer interrupt to triger gate
// Serial.println(“pulse genrated”);
digitalWrite(sig_pin,HIGH); //turns on the triac
trigger.attach_ms(1, pulse_gen); // repeat timer
interupt after 1ms
}// turn on gate
else {
trigger.detach(); //disable timer interupt
} // turn off gate
void zeroCrossingInterrupt(){ //zero cross detect
trigger.attach_ms(brightness, pulse_gen); //run timer
interupt after selected time by user
//Serial.println(“interupt generated”);
void setup()
pinMode(zc_pin, INPUT_PULLUP); //zero cross detect
pinMode(sig_pin, OUTPUT); //TRIAC gate control
attachInterrupt(zc_pin,zeroCrossingInterrupt, RISING);
//interupt for detecting zero cross
//Serial.begin(115200); //serial monitor for debuging
//Serial.println(“Board is ready”);
void loop(){
brightness = map(analogRead(A0), 0, 1023, 2,9); //read
user input and convert it into time in mili-seconds
if(brightness>8) {
detachInterrupt(zc_pin); // disconnect interrrupt if
triggering is closed to next cycle
attachInterrupt(zc_pin,zeroCrossingInterrupt, RISING);
// connect interrupt
//Serial.print(“brightness : “);

Leave a Reply

Your email address will not be published. Required fields are marked *