Prices are not final on website because of big currency devaluation of PKR.

 0312-400-2221 WhatsApp Logo PNG Images Free DOWNLOAD | By

Arduino 4 Channel Triac Module With Zero Crossing Sensor in Pakistan



Rs. 700
Out of stock
Add to Wishlist Add to comparison list

This is 4 Channel Triac Module Module which gives you the ability to make Arduino Ac Dimmer or arduino ac phase angel controller or it can  control AC related applications with your Arduino,Raspberry pi, PIC or Any other microcontroller. There are four channels as mentioned in the item description and all channels can be used same time. 


  1.  Comprises with MOC3021 Zero Cross Phototriac Driver optocoupler and BT16 Triac
  2.  Simplifies Logic Control of 115/240 Vac Power
  3.  Zero Voltage Crossing Signal
  4.  dv/dt of 1500 V/µs Typical, 600 V/µs Guaranteed


  1.  Solenoid/Valve Controls
  2.  Temperature Controls
  3.  Lighting Controls
  4.  E.M. Contactors
  5.  Static Power Switches
  6.  AC Motor Starters
  7.  AC Motor Drives
  8.  Solid State Relays

Here is example code and please see video for more details.

// By Irfan Ahmad

#define DETECT 2 //zero cross detect
#define GATE 9 //TRIAC gate
#define PULSE 500 //trigger pulse width (counts)
int brightness=0;

void setup(void)
pinMode(DETECT, INPUT); //zero cross detect
digitalWrite(DETECT, HIGH); //enable pull-up resistor
pinMode(GATE, OUTPUT); //TRIAC gate control
attachInterrupt(0,zeroCrossingInterrupt, RISING);
Timer1.attachInterrupt(timer1_interrupt); // blinkLED to run every 0.15 seconds
void loop(void)
int variable_value = analogRead(A0);
brightness = map(variable_value, 0, 1023, 0,9000);
if(brightness>7500) detachInterrupt(0); // disconnect interrrupt
else attachInterrupt(0,zeroCrossingInterrupt, RISING); // connect interrupt


void zeroCrossingInterrupt(){ //zero cross detect interrupt
int state=0;
void timer1_interrupt(void) // timer interrupt to triger gate
if(state==0){state=1;Timer1.initialize(PULSE);digitalWrite(GATE,HIGH);}// turn on gate
else {state=0;Timer1.stop();digitalWrite(GATE,LOW);} // turn off gate


AC Phase Control

One method of controlling power to AC circuits uses a TRIAC to turn the power on and off at precisely timed intervals that are synchronized with the AC signal. This method is called AC phase control. It is the method used in many light dimmer and heater power control circuits.

See Also


Using an Arduino microcontroller with some simple circuitry, we can monitor the AC wave to determine the proper time to turn the power on and off with the TRIAC

The circuit consists of an opto-isolated zero-crossing detector and an opto-isolated trigger circuit for the TRIAC. The opto-isolators are necessary to keep the low voltage signal circuits away from the power circuits and provide an appropriate level of safety. As with all circuits involving mains voltage, make sure you know what you are doing.

Theory of Operation

The zero-crossing detection circuit provides a 5V pulse every time the AC signal crosses zero volts. We detect this with the Arduino and leverage interrupts to time the trigger circuit precisely in synchronization with these zero-crossing events. The method for power control is shown in the diagram below.

Once a zero crossing is detected, the TRIAC remains off for a controlled amount of time (t1) . The longer this time is, the less power the AC circuit receives. Once the “off-time”, t1 has elapsed, the microcontroller turns on the TRIAC by applying a voltage to the gate (shown in red). Once turned on, the TRIAC will remain on even after the gate voltage has been removed. It will turn off if the gate voltage is zero the next time the AC wave crosses zero. Because of this, we do not need to take care to turn the TRIAC off when the AC signal crosses zero again. All we need to do is to ensure that the TRIAC gets turned off inside of the period of ½ wave (t3). The duration of the gate pulse (t2) is determined by a minimum requirement of the traic. If this pulse is too short, the traic will not fire Once the second zero crossing occurs, since there is no voltage on the gate, the TRIAC remains off until triggered again in the next ½ cycle. The net result here is that we “chop” parts of the wave out resulting in lower average power. This is essentially how one accomplishes “PWM” control of an AC wave.

We will be using interrupts and the Arduino timer to precisely control the timing of the TRIAC gate. To get a feel for the time intervals, we need to look at the AC signal and the Arduino clock.

The AC signal (in the US anyway) is 60 Hz. What this means is that the AC signal crosses zero, reaches peak positive voltage, crosses zero, reaches peak negative voltage and returns to zero 60 times each second. The period (length of time this takes) is 1/60 or 0.01667 seconds (16.67 milliseconds). A half cycle (the time between two zero-crossings) occurs in 8.33 milliseconds. This is t3 in the figure above.

The Arduino clock runs at 16 MHz, which is 16,000,000 cycles per second: one clock cycle takes 0.0625 microseconds. A single half cycle of the 60 Hz AC signal contains 133,333 clock cycles. This is important because we will be determining the time intervals by clock counts in the Arduino code, not by seconds.

There is quite a bit of good information on use of interrupts with the Arduino out on the web so I won’t cover that in much detail here. Basically the way an interrupt works is that when some event happens (either internal or external to the microprocessor), the microprocessor immediately stops what it is doing to “service” the interrupt. This allows the microprocessor to handle very time sensitive events such as the AC Phase control task here.



// AC Control V1.1
// This Arduino sketch is for use with the heater 
// control circuit board which includes a zero 
// crossing detect function and an opto-isolated TRIAC.
// AC Phase control is accomplished using the internal 
// hardware timer1 in the Arduino
// Timing Sequence
// * timer is set up but disabled
// * zero crossing detected on pin 2
// * timer starts counting from zero
// * comparator set to "delay to on" value
// * counter reaches comparator value
// * comparator ISR turns on TRIAC gate
// * counter set to overflow - pulse width
// * counter reaches overflow
// * overflow ISR turns off TRIAC gate
// * TRIAC stops conducting at next zero cross
// The hardware timer runs at 16MHz. Using a
// divide by 256 on the counter each count is 
// 16 microseconds.  1/2 wave of a 60Hz AC signal
// is about 520 counts (8,333 microseconds).
#define DETECT 2  //zero cross detect
#define GATE 9    //TRIAC gate
#define PULSE 4   //trigger pulse width (counts)
int i=483;
void setup(){
  // set up pins
  pinMode(DETECT, INPUT);     //zero cross detect
  digitalWrite(DETECT, HIGH); //enable pull-up resistor
  pinMode(GATE, OUTPUT);      //TRIAC gate control
  // set up Timer1 
  //(see ATMEGA 328 data sheet pg 134 for more details)
  OCR1A = 100;      //initialize the comparator
  TIMSK1 = 0x03;    //enable comparator A and overflow interrupts
  TCCR1A = 0x00;    //timer control registers set for
  TCCR1B = 0x00;    //normal operation, timer disabled
  // set up zero crossing interrupt
  attachInterrupt(0,zeroCrossingInterrupt, RISING);    
    //IRQ0 is pin 2. Call zeroCrossingInterrupt 
    //on rising signal
//Interrupt Service Routines
void zeroCrossingInterrupt(){ //zero cross detect   
  TCCR1B=0x04; //start timer with divide by 256 input
  TCNT1 = 0;   //reset timer - count from zero
ISR(TIMER1_COMPA_vect){ //comparator match
  digitalWrite(GATE,HIGH);  //set TRIAC gate to high
  TCNT1 = 65536-PULSE;      //trigger pulse width
ISR(TIMER1_OVF_vect){ //timer1 overflow
  digitalWrite(GATE,LOW); //turn off TRIAC gate
  TCCR1B = 0x00;          //disable timer stopd unintended triggers
void loop(){ // sample code to exercise the circuit
OCR1A = i;     //set the compare register brightness desired.
if (i<65){i=483;}                      
Best circuit but Kindly replace the 1/2 Watt resistor with 1 Watt . It is getting really hot.
Write a review