New released MPDMv4 (MAINS Power Dimmer) Driver Board !

WARNING!! You will play with LIVE MAINS!! Deadly zone!! 
If you don’t have any experience and are not qualified for working with MAINS power I will not ecourage you to play arround!

    For any new requests please feel free to use as usual: tech at esp8266-projects.com.
     If you want to order MAINS POwer Dimmer/Switch bare PCBs only, you can also do it directly at Dirty PCBs, our preferred PCB House:


    For that ones of you that have already read my articles related with MAINS Power Switching
 you remember that the above modules were ON/OFF switching only.

    Now it’s about time to talk also about what many of you has asked for: DIMMING!
It’s a total different story, liitle bit complicated but, as you will see, not so hard to understand.

General considerations

    There are several types of dimmers generally available. These are used for resistive, and inductive loads, such as incandescent,cold cathode and low voltage (inductive) lamp sources. Note that not all electronic transformers used for low voltage lamps are suitable for dimming by Triac or Thyristors dimmers. In case of Thyristors you need 2 of them as Thyristor is a Unidirectional device and because AC power flows in both directions! 
   Why using Thyristors? One of the reasons is that they are available in higher power ratings than Triacs and are more robust. A 4-500 A to 1kA ratings is something common for Thyristors. 
Usually you will find this kind of Thyristors in Industrial applications, not exacty a hobbist part.  
 Just look, for example,  at the specifications of ABB 5STP27H2801  and you will understand why 🙂

  I don’t remember a highly available Triac rated more than 40A. BTA40-700B is a good example.

  For resistive loads ON-OFF only jobs (no dimming required) a winning combination is between  MOC304X for  Triac driver (Zero voltage crossing one) and a good quality Triac, decently sized at the power needs. 

   In case of dimming you DON’T want to use a zero crossing voltage one! And this is because of the way the dimming process is going and depending on our own ZCD (zero cross detection) function. In our case zero cross detection is done by the biphase optocoupler as in the schematic below

                                 Zero Cross Detection output example

    Mains power is comprised of an alternating current that flows in one direction and then in the other, along the cable, at the rate of 50 or 60 cycles per second.

The number of cycles in one second is called the frequency.  The frequency is given in a unit called hertz (symbol Hz) where 1 Hz = 1 cycle per second .

The value 50 or 60Hz is dependent on the countries power system. The current alternates back and forth changing direction at the zero point.

If we will to look at the waveform (yellow) with the Osciloscope it would appear as a sinusoidal shape. Drawing a line through the middle and this is what is called the zero crossing point. At this instant in time no current is flowing in either direction.

                                  MAINS 50Hz and ZCD waveforms

The Triac is electronically synchronized with the help of the ZCD to turn the power ON or OFF. By chopping the waveform at the zero-crossing point, smooth dimming can be achieved without the lamp flickering. This turning on and off of the power device occurs every time the mains crossing point is reached (half phase), 100 or 120 times per second (50 or 60Hz).

                                          Firing Triac at 50%

ZCD determines the point in time (Firing delay time) at which they turn ON (conduct). The ON state continues until the next zero-crossing point, at which point the Triac turns itself OFF. The command circuit then provides a delay, which equates to the dimness of the lamp, before turning the control device back on. The slight capacitance of the load, filters the chopped waveform resulting in a smooth light output.

NOTE: If you notice that the 50Hz AC Voltage repesented up (yellow) is not around 240VAC and is nor pure sinusoide as should be, it’s a simple explanation: I didn’t want to put Osciloscope directly on MAINS. For very simple reasons. But this is not affecting at all the general view of the process.

What we will need:

  • CBDB Board or any other ESP/Arduino /MSP/ARM/Whaterver Board you may like
  • USB adapter (take a look on Part 1 for details about the USB Adapter)
  • Main Power Dimmer/Switch module (MPDMv3 – details below)

Main Power Dimmer/Switch module (MPDMv3)


     This time the MAINS Dimmer switch module was designed as a standalone unit, not including the ESP8266 anymore, as people were asking for a more general usage one that can be used with existing Setup/Environments. 

    Because the MPSMv2 was designed more as a DevBoard for MAINS switching application and the FUSE and MAINS input / output /filtering unit was keept separatelly  has created some confusion and a lot of talks about, Hackaday thread included :).

    So, this time, you have on the same board, fuse and connectors to directly connect de MPDMv3 module to MAINS, Lightbulb/Lamp and your MCU Board. 

                                       MPDMv3 – Schematic
                     MPDMv3 – MAINS Dimmer/Switch Module

Both signals, phase detect (PHS) for ZCD and Triac command (CMD) are fully optocoupled and you have a proper galvanic separation between the low side and the MAINS side voltage, but,  as a general practice DO NOT TOUCH any part of the circuit as long as MAINS power it’s applied!! The scope of LED1 is just to help you in the testing phase process, it does not have any other sense on dimming.

Proper clearance and creepage distance were also taken in consideration when PCB was designed:

                                             MPDMv3 – PCB – Bottom side

MPDMv3 Software

For programming CBDBv2 Board and uploading the driver and the software we will continue to use the LuaUploader as before. 

1. Define used GPIO pin

       outpin=7                                                       -- Select Triac Command pin - GPIO13 
      gpio.write(outpin,gpio.LOW)                       -- Triac OFF
      inpin=6                                                         -- Zero crossing detector input - GPIO12  
      gpio.mode(inpin,gpio.INT,gpio.PULLUP)   -- attach interrupt to ZCD

2. Zero Cross Detector function

As you have seen above on the Osciloscope, zero crossing is the moment when the sinusoide goes through zero. After each zero crossing there is one full half of the sinuswave available to send through the Triac to the Load.

So what the software needs to do is to detect the zerocrossing, and then wait for a set amount of time on that sinuswave to switch on the TRIAC.

We have a 50Hz VAC that means is 50 waves per second.
Each sinuswave thus takes 1000ms/50=20ms
They are 2 sinus peaks in a wave.  That means that after every zero crossing detection there is a 10ms period that we can regulate.
If we switch Triac directly at the beginning of that period, the load will receive full power
If we do it at the end of that 10ms period the load will receive none and if we do it halfway, the load will receive half power.

Now, how can we obtain the desired number of dimming steps?

If you look at the above explanation you know already the answer: we will divide the 10ms to the number of the steps we want and that’s it. The obtained value can be tweaked a bit, depending on how is really looking your AC MAINS and how clean it is, filtering, delays, etc, but that’s the dimming steps value you need to start with.

Let’s assume we have:
Dimming steps = 128
Waveform Time= 10 ms
Step = 10000/128 = 78

Total dim time then is calculated as desired dimming steps * step value.

Also what we need to take in consideration after we fire the Triac is the Triac ON Propagation time (the time Triac needs to become fully ON).

       function zero_cross()
           dt = 76*dim
           --print("Zero cross detected!") 
           stat = "ON" 
           tmr.delay(dt)                                 -- Firing delay time calculated above 
           gpio.write(outpin,gpio.HIGH)     -- Triac ON - Zero cross detected
           tmr.delay(100)                              -- Triac ON - Propagation time  
          gpio.write(outpin,gpio.LOW)        -- Triac OFF - let's be sure it's OFF before next cycle 🙂
          return stat

3. Fading function for testing mode

      function fading()
         if(dim_up==1) then dim=dim+1 
              else dim=dim-1
         if(dim < 10) then dim_up=1 dim=10
              else if (dim > 120 ) then dim_up=0 dim=120
         print("Dimmer level : " .. dim)
         print("Fading mode  : " .. dim_up)

4. Main code

        dim = 120                                                          -- Dimmer level - smaller value is brighter
       dim_up=0                                                          -- Fading direction - for test  run
        gpio.trig(inpin,"up",zero_cross)                       -- ZCD interrupt attached - trigger on falling edge
       tmr.alarm(0, 100, 1, function() fading() end)     --timer for testing mode

For testing, just save the code on ESP as ‘dimmer.lua‘, restart ESP and run:   

             dofile("dimmer.lua")  -- Start the Dimmer Testing  mode

If you want the MPDMv3 software to start automatically when your CBDB module starts or reboots, then you neet to create and add some lines in your ‘init.luafile:

            dofile("dimmer.lua")  -- Start the Dimmer Testing mode

Save the code on ESP as ‘init.lua‘, restart ESP. It should reboot and restart automatically the program.

Testing Zero Cross Detector

First test – Dimming a Lamp


As requested, please find below MPDMv3 BOM:

No Part Value Package Description
1 R1 470 R1206 RESISTOR, European symbol
2 R2 360/1W 0204/7 RESISTOR, European symbol
3 R3 470/1W 0204/7 RESISTOR, European symbol
4 R4 470 R1206 RESISTOR, European symbol
5 R5 39/1W 0207/5V RESISTOR, European symbol
6 R6 47k/1W 0207/10 RESISTOR, European symbol
7 R7 47k/1W 0207/10 RESISTOR, European symbol
8 R8 10k R1206 RESISTOR, European symbol
9 C1 0.01uF/400 X2 C075-032X103 CAPACITOR, European symbol
10 C2 0.05uF/400V C075-032X103 CAPACITOR, European symbol
11 IC1 MOC3021 DIL06B 6-Pin DIP Optoisolators Triac Driver Output
12 IC2 SFH620A DIL04 Optocoupler, Phototransistor Output, AC Input
13 T1 BT137 TO220BV TRIAC
15 PWR_IN DG3XX-02-5.0 DG306-5.0-02P DG350-3.5-02P
16 SW_OUT DG3XX-02-5.0 DG306-5.0-02P DG350-3.5-02P
17 FUSE 5A SHK20Q Fuse
18 U$3 1X4 1X4 2mm Header or 2mm socket

That’s all for today, next time we will talk about WEB Interface implementation for our MAINS Power Dimmer / Switch Module!

Leave a Reply

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

Related Posts

AC Dimmer

MPDMv7.5 Arduino IDE driver example

For a more detailed description please take a look at the Part 1: MPDMv7.5 AC Dimmer devboard overview MPDMv7.5 AC Dimmer devboard is also available on Tindie Store A very simple MPDMv7.5 Arduino IDE driver Read more…

AC Dimmer

AC Dimmer DevBoard – MPDMv7.5 – Part 3 – DAC

For a more detailed description please take a look at the Part 1: MPDMv7.5 AC Dimmer devboard overview MPDMv7.5 AC Dimmer devboard ESP Basic program example for the Extra DAC version configuration: address = 96 Read more…

AC Dimmer

AC Dimmer DevBoard – MPDMv7.5 – Part 2

For a more detailed description please take a look at the Part 1: MPDMv7.5 AC Dimmer devboard overview MPDMv7.5 AC Dimmer devboard ESP Basic program example for the basic version configuration: 'write("starttimer",10) cls 'VCNT GPIO Read more…