Remote control ac dimmer arduino, Zero cross detector, Arduino fan regulator
remote control ac dimmer arduino circuit

Arduino Remote control AC Dimmer

Arduino remote control AC Dimmer

The brightness can be controlled using the IR remote of TV, DVD, etc. Dimming Control system using MOC3021, BT136 Triac and a zero-crossing detector circuit based on the MCT2E optocoupler. Optocoupler provides complete isolation between the AC side and the DC controller side. So if any fault or short circuit happens on the AC side will have no effect on the controller side.

In this tutorial, we will design a circuit using TRIAC and optocoupler to make a 220V AC Light Dimmer or AC Fan Speed Controller using Arduino UNO. most of the home appliances are supplied with the AC mains power.  Sometimes we need to control the brightness of bulb or Speed of Fan/ AC Motor etc or any other dimming control for an instant. Controlling an AC load is not as easy as controlling a DC load. The AC mains with a sinusoidal wave have the frequency of 50Hz to 60 HZ.

The most popular and proper way for Dimming of 230v AC is through phase control with a Triac. To build an AC dimmer, the zero-crossing detector circuit used and zero-crossing points (the points where the wave changes its polarity) are important. A zero-crossing detector is used to generate a sync pulse related to the AC voltage phase angle often used in power control circuits. Zero crossing detector basically detect zero voltage points and inform the controller or controller circuit. It helps to minimize high rate change of current with respect to time (dI/dt) as a result less heating and start-up current in the load which improves the lifetime of load such as motors.  A Zero Crossing Detector can be designed in many ways like using transistor, using op-amp or using optocoupler IC

Zero crossing detector circuit using optocoupler

  • bridge rectifier converts ac into  dc
  • Output of bridge rectifier is fed to opto-coupler
  • Led inside the optocoupler requires minimum of 1V to turn on
  • when ac wave goes near to the zero crossing line,ie below 1V led will turn off
  • as a result output transistor will turn of and pulled up  to 5v

Zero crossing detector waveform

The zero-crossing technique is one of the methods enabling to evaluate the delay time of propagating waves.

In this project I’m going to show how to a remote used to control the circuit for the Dimmer, so that the lamp brightness is controlled from IR remote control instead of the potentiometer.

Connect the circuit as per the given schematic diagram. You can use DB107 or other bridge rectifier ic at the place of 4 separate 1N 4007 diodes. Here I use 2 55k resistor to limit the current from AC input to rectifier, an Optocoupler ic connected, here 4N35 is connected but you can use MCT2E or PC817 etc. In optocoupler ic there is an LED and NPN transistor. connect negative supply from bridge rectifier to pin 2, this is the negative pin of the LED of the optocoupler. the positive terminal of LED at pin 1 in this optocoupler. The emitter of the transistor is connected with the ground pin of Arduino and collector pin which is at pin 5 of optocoupler ic is directly connected with digital input pin of Arduino and one 10K resistor is with pin 5 is connected to +5v of Arduino, here this resistor is working as a pull-up resistor.

Schematic diagram

Remote controlled Fan Regulator AC dimmer circuit

BT 136 TRIAC pin


This is a three-terminal, four-layer, bi-directional semiconductor device that controls AC power. it can conduct in both the direction that means whether the applied gate signal is positive or negative and it passes the current in forward and reverses biased condition, it will conduct. so this device is used as a switch in the AC circuit. Pin 2 is input and MT1 is Output pin and  pin 3 is gate. In general terms, we only know here that the TRIAC can be turned on by applying a pulse on the gate terminal. It can be triggered by the positive or negative polarity of gate pulses.

MOC3021 Optoucoupler –

Optocoupler MOC3021

Here MOC3021 optocoupler IC is used to trigger the Triac BT136. Pin no 6 of this optocoupler ic is used as input AC and pin 4 as output that goes directly to Gate terminal of Triac BT136. This optocoupler is actually optometric which triggered by the internal IR LED in this ic. Internal IR LED works as the DIAC that provides a pulse to the gate of optometric for Turn ON. The reason behind using the optocoupler is isolating the DC controller from the AC, Means there is no physical contact between Ac and Dc.

hs0038 ir sensor

IR Decoding of Remote

copy and paste the following codes to Arduino IDE. Now upload and open the Tools – Serial Monitor. Take the remote to your hand in front of IR receiver and Press the buttons of remote which you want to set for ckt operation. you can see on the serial Monitor some decoded values present in numbers forms. You Can find this code in Arduino IDE in Examples.

#include <IRremote.h>

int RECV_PIN = 2;

IRrecv irrecv(RECV_PIN);

decode_results results;

void setup()
  // In case the interrupt driver crashes on setup, give a clue
  // to the user what's going on.
  Serial.println("Enabling IRin");
  irrecv.enableIRIn(); // Start the receiver
  Serial.println("Enabled IRin");

void loop() {
  if (irrecv.decode(&results)) {
    Serial.println(results.value, DEC);
    irrecv.resume(); // Receive the next value

Serial monitor arduino

decoded value of other button and other remote may vary

Save that values for next dimmer programming.

Now copy and paste the code given below and your AC dimmer circuit is ready for use.


#include "IRremote.h"

int receiver = 3; 
IRrecv irrecv(receiver);           
decode_results results;            

#include <TimerOne.h>           
volatile int i=0;               // Variable to use as a counter
volatile boolean zero_cross=0;  // Boolean to store a "switch" to tell us if we have crossed zero
int AC_pin = 5;                 // Output to Opto Triac

int dim2 = 0;                   // led control
int dim = 128;                  // Dimming level (0-128)  0 = on, 128 = 0ff                  
int freqStep = 75;    // This is the delay-per-brightness step in microseconds.

void setup() {   
  irrecv.enableIRIn(); // Start the IR receiver (classic remote)
  pinMode(AC_pin, OUTPUT);                          // Set the Triac pin as output
  attachInterrupt(0, zero_cross_detect, RISING);    // Attach an Interupt to Pin 2 (interupt 0) for Zero Cross Detection
  Timer1.initialize(freqStep);                      // Initialize TimerOne library for the freq we need
  Timer1.attachInterrupt(dim_check, freqStep);      

void zero_cross_detect() 
  zero_cross = true;               // set the boolean to true to tell our dimming function that a zero cross has occured
  digitalWrite(AC_pin, LOW);
// Turn on the TRIAC at the appropriate time

void dim_check() 
  if(zero_cross == true) {              
    if(i>=dim) {                     
      digitalWrite(AC_pin, HIGH);  // turn on light       
      i=0;  // reset time step counter                         
      zero_cross=false;    // reset zero cross detection
    else {
      i++;  // increment time step counter                     

void translateIR() // takes action based on IR code received
  case 3772829743:  
    if (dim<127)  
    dim = dim + 5;
    if (dim>127) 
      dim=128; // in vechiul sketch era 127

  case  3772833823:  
  if (dim>5)  
     dim = dim - 5;
  if (dim<0) 
      dim=0;  // in vechiul sketch era 1
    } }}}
void loop() {  
 if (irrecv.decode(&results)) // have we received an IR signal?
    irrecv.resume(); // receive the next value




Also read

Logic gates


Leave a Comment

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