TL;DR: Three questions determine your choice: (1) load type — resistive (heater, incandescent) or inductive (motor); (2) load power in watts → calculate amps → pick a rating with a ×1.3 safety margin; (3) platform — ESP32 dual-core uses
rbdimmerESP32, Arduino usesRBDdimmer, single-core ESP32 or Raspberry Pi use DimmerLink. The quick-selection table is at the bottom of this article.
How to Use This Guide
Work through the steps in order. Each step narrows your choice:
- Step 1: Is your load compatible?
- Step 2: Calculate current and choose a rating
- Step 3: Platform and library
- Step 4: How many channels?
- Step 5: Standard or high-power module?
- Step 6: Should you use DimmerLink?
Or jump to the Quick Selection Table.
Step 1: Is Your Load Compatible?
AC TRIAC dimmers work by cutting part of the sine wave (phase-cut control). Not all loads respond well to this.
✅ Fully compatible — resistive loads
These are ideal. Current follows voltage in phase, so TRIAC switching is clean:
- Incandescent bulbs (any wattage)
- Halogen bulbs (direct mains or with transformer — see notes below)
- Heating elements and space heaters
- Electric boilers, kettles, irons, toasters
- Oil-filled radiators and underfloor heating mats
- Any pure resistive heating device
⚠️ Compatible with conditions
| Load | Condition |
|---|---|
| Dimmable LED bulbs | Must be labeled "dimmable"; may flicker at low levels |
| Split-phase fans (induction) | RC snubber required; min. dimming ~40–50% |
| Centrifugal pumps (induction) | RC snubber required; min. dimming ~60–70% |
| Transformers (halogen 12V) | RC snubber recommended; reactive current |
| Fan heaters | Min 40–50%; fan cools heater — stalling causes overheating |
| Water pumps | RC snubber required |
⚠️ Inductive loads need a snubber. Motors and transformers cause dv/dt spikes when the TRIAC turns off — these shorten TRIAC lifespan and can cause false triggering. Add an RC snubber (R = 68–100 Ω, C = 47–100 nF class X2 400V) in parallel with the TRIAC. rbdimmer modules already have a built-in RC snubber.
❌ Not compatible
| Load | Why |
|---|---|
| Non-dimmable LED bulbs | Flicker, overheating, premature failure |
| LED strips with SMPS | Switching PSU incompatible with phase-cut |
| CFL bulbs | Electronic ballast conflicts with phase-cut |
| Electronic power supplies | Risk of damage |
| Electronic stabilizers | Conflict with dimmer operation |
ℹ️ LED strips (12V/24V) use a switching power supply (SMPS) — they are not the same as dimmable LED bulbs. SMPS loads are not compatible with phase-cut dimming. For LED strip dimming use a PWM DC controller, not an AC TRIAC dimmer.
Step 2: Calculate Current and Choose a Rating
Dimmer ratings are in amperes (A). Most loads specify power in watts (W), so convert first.
Formula
I = P / U
For 220/230V mains: I = P / 220
For 110/120V mains: I = P / 110Safety margin
Always uprate the dimmer by a safety factor:
| Load type | Safety factor | Reason |
|---|---|---|
| Resistive (heater, bulb) | × 1.3 | Inrush and aging margin |
| Inductive (motor, transformer) | × 1.5 | Reactive current overhead |
| High inrush (cold heater, boiler) | × 1.7 | Cold-start surge |
Selection rule: I_dimmer ≥ I_load × safety_factor
Worked example
Example: 800W space heater at 220V
- I = 800 / 220 = 3.6A
- Safety margin (resistive): 3.6 × 1.3 = 4.7A
- Choose an 8A dimmer (next size up from 4.7A) ✅
Load-to-dimmer reference table
| Load power | Current at 220V | Current at 110V | Min dimmer |
|---|---|---|---|
| Up to 200W | < 1A | < 2A | 4A |
| 200–500W | 1–2.3A | 2–4.5A | 4A |
| 500W–1kW | 2.3–4.5A | 4.5–9A | 8A |
| 1–1.5kW | 4.5–7A | — | 8A + heatsink |
| 1.5–2.5kW | 7–11A | — | 16A |
| 2.5–4.5kW | 11–20A | — | 24A |
| 4.5–7kW | 20–32A | — | 40A |
Values calculated with ×1.3 safety factor for resistive loads at 220V.
Maximum power by voltage (quick reference)
| Dimmer | Max at 110V ¹ | Max at 220/230V |
|---|---|---|
| 4A | 350W | 660W |
| 8A | 700W | 1 300W |
| 10A (4CH) | 850W/ch | 1 700W/ch |
| 16A | 1 300W | 2 600W |
| 24A | 2 000W | 4 000W |
| 40A | 3 400W | 6 400W |
¹ For 127V mains multiply the 110V values by 1.15 (e.g. 4A → 400W, 8A → 800W).
Step 3: Platform and Library
The microcontroller and software stack determine which library you need and how to wire the ZC pin.
| Platform | Library | ZC pin constraint | Notes |
|---|---|---|---|
| Arduino Uno / Nano | RBDdimmer |
Pins 2 or 3 only | ATmega: 2 INT pins |
| Arduino Mega | RBDdimmer |
Pins 2, 3, 18–21 | 6 interrupt-capable pins |
| ESP32 (orig, S3) | rbdimmerESP32 |
Any GPIO | Dual-core; IRAM_ATTR auto |
| ESP32 + 16/24/40A | rbdimmerThermalESP32 |
Any GPIO | NTC + fan control |
| ESP32-S2/C3/H2/C6 | DimmerLink | — | Single-core, ISR not reliable |
| ESP8266 | RBDdimmer |
Any GPIO except GPIO 16 | WiFi may cause jitter |
| Raspberry Pi | DimmerLink | — | No real-time OS for ISR |
| STM32 | RBDdimmer |
Any interrupt-capable GPIO | |
| ESPHome / Tasmota | DimmerLink | — | I2C component |
| Home Assistant | DimmerLink | — | Via ESPHome or UART bridge |
⚠️ Don't use
RBDdimmeron ESP32. That library has noIRAM_ATTRon ISR handlers — it crashes when WiFi is active. UserbdimmerESP32on dual-core ESP32. See: Wrong Library: RBDdimmer vs rbdimmerESP32
VCC logic level
| Platform | Required VCC |
|---|---|
| Arduino Uno/Nano/Mega (ATmega) | 5V |
| ESP32 | 3.3V |
| ESP8266 | 3.3V |
| STM32 | 3.3V |
Do not connect VCC to 12V even if your project uses 12V rails — this will damage the dimmer and your MCU.
Step 4: How Many Channels?
| Module | Channels | Notes |
|---|---|---|
| 1CH 4A | 1 | One load, most compact |
| 1CH 8A | 1 | One load, higher power |
| 2CH 8A | 2 | Two independent loads, shared ZC |
| 4CH 10A | 4 | Up to four loads, shared ZC, 10A each |
All multi-channel modules share one zero-cross signal — one interrupt pin handles all channels. Each DIM pin is separate.
Step 5: Standard or High-Power Module?
| Feature | Standard (4A, 8A, 10A) | High-Power (16A, 24A, 40A) |
|---|---|---|
| TRIAC | Exposed TO-220 | Covered by built-in heatsink |
| Active cooling | None (add external heatsink above 200W) | Built-in 5V fan |
| Temperature sensor | No | NTC10 thermistor included |
| Thermal library | — | rbdimmerThermalESP32 |
| Typical use | Lamps, small heaters | Industrial heating, boilers, kilns |
| Board size | Compact | Larger footprint |
For standard modules handling loads above 200W: add a heatsink to the TRIAC TO-220 tab (with insulating pad — the tab is at mains potential). See: TRIAC Overheating Guide
Step 6: Should You Use DimmerLink?
DimmerLink is a separate controller that handles zero-cross detection and TRIAC timing internally. Your MCU sends only a brightness level (0–100%) via I2C or UART.
See the Platform and Library table in Step 3 for a full list of platforms where DimmerLink is the recommended choice.
Wiring (same for any platform):
DimmerLink → MCU
VCC → 3.3V (ESP32) / 5V (Arduino)
GND → GND
SDA → SDA (GPIO 21 on ESP32, A4 on Uno)
SCL → SCL (GPIO 22 on ESP32, A5 on Uno)Code:
// DimmerLink — brightness 0–100% via I2C
// Works on any platform, no ISR, no IRAM_ATTR
// Docs: https://www.rbdimmer.com/docs/dimmerlink-I2CCommunication
#include <Wire.h>
#define DIMMER_ADDR 0x50
#define REG_LEVEL 0x10
void setLevel(uint8_t level) {
Wire.beginTransmission(DIMMER_ADDR);
Wire.write(REG_LEVEL);
Wire.write(level);
Wire.endTransmission();
}
void setup() {
Wire.begin();
setLevel(50); // 50% brightness
}Quick Selection Table
| Typical use case | Load | Power | Platform | Module | Library |
|---|---|---|---|---|---|
| Table lamp | Incandescent 100W | 0.45A | Arduino Uno | 4A | RBDdimmer |
| Room light | Incandescent 200W | 0.9A | ESP32 | 4A | rbdimmerESP32 |
| Space heater | Resistive 800W | 3.6A | ESP32 | 8A | rbdimmerESP32 |
| Floor heating | Resistive 1.5kW | 6.8A | ESP32 | 8A+heatsink | rbdimmerESP32 |
| High-power heater | Resistive 2kW | 9A | ESP32 | 16A | rbdimmerThermalESP32 |
| Industrial boiler | Resistive 5kW | 22A | ESP32 | 40A | rbdimmerThermalESP32 |
| Fan speed | Induction motor | any | ESP32 | 8A + snubber | rbdimmerESP32 |
| Smart home | Any | any | ESP32-C3 (HA) | DimmerLink | I2C |
| Raspberry Pi | Any | any | RPi | DimmerLink | I2C |
| Multi-zone heating | 2 loads | any | ESP32 | 2CH 8A | rbdimmerESP32 |
| Multi-channel | 4 loads | ≤10A each | ESP32 | 4CH 10A | rbdimmerESP32 |
² "8A+heatsink": for loads above 200W on standard modules, attach a TO-220 heatsink with an insulating pad — the TRIAC tab is at mains potential.
Wiring Checklist
Before powering up, verify:
Safety first:
Power wiring:
Aluminum S (mm²) = I / 5
Wire gauge reference:
| Dimmer | Copper min. | Aluminum min. |
|---|---|---|
| 4A | 0.5 mm² | 0.8 mm² |
| 8A | 1.0 mm² | 1.6 mm² |
| 10A | 1.5 mm² | 2.0 mm² |
| 16A | 2.5 mm² | 4.0 mm² |
| 24A | 3.0 mm² | 5.0 mm² |
| 40A | 5.0 mm² | 8.0 mm² |
Logic wiring:
Next Steps
Now that you've chosen your module:
- Wiring diagram → Hardware Connection Guide
- Library setup → Universal Library for ESP32
- DimmerLink setup → DimmerLink Quick Start
Related Articles
- AC dimmer is not PWM → How Phase-Cut Dimming Works
- Zero-cross not detected → Zero-Cross Not Detected: AC Dimmer Doesn't Respond
- ESP32 crashes with WiFi → ESP32 + AC Dimmer: IRAM_ATTR Causes and Fix
- TRIAC overheating → TRIAC Overheating: AC Dimmer Runs Hot or Burns Out
- LED compatibility → LED Lamps with AC Dimmer: Compatibility Guide
Still have questions?
Ask on forum.rbdimmer.com or open a GitHub Issue.