Controlling high-power AC or DC loads with a microcontroller requires bridging the gap between 5V logic and mains or high-current circuits. The direct answer for most bench and home automation projects is to use an opto-isolated 5V relay module, specifically the Songle SRD-05VDC-SL-C, wired to a digital output pin via a transistor driver. However, simply connecting the pins is where most projects fail. Improper power budgeting, missing flyback protection, and floating logic states during boot will destroy your microcontroller or cause endless reset loops. This guide covers the exact specifications, wiring topology, fail-safe code, and debugging steps required to run Arduino relays reliably in the field.

Choosing the Right Arduino Relay Module (Specs & Derating)

Not all switching modules are created equal. While the standard blue mechanical relay modules are ubiquitous, they are not always the correct choice for your specific load type. Datasheets list maximum resistive loads, but inductive loads (motors, transformers, solenoids) generate massive back-EMF that can weld mechanical contacts shut or destroy solid-state triacs. According to All About Circuits, you must heavily derate mechanical relays when switching inductive or capacitive loads—often by 50% to 70% of the stated maximum.

Below is a specification and application matrix for the three most common switching modules used in embedded projects. Use this table to select the correct hardware before wiring your circuit.

Table 1: Embedded Switching Module Comparison (2026 Bench Standards)
Module Type Max Resistive Load Max Inductive Load (Derated) Switching Speed Isolation Type Typical Price
Songle SRD-05VDC-SL-C (Mechanical) 10A @ 250VAC / 30VDC 3A @ 250VAC (Motor/Transformer) ~10ms (Bounce prone) Optocoupler + Air Gap $1.50 - $2.50
Omron G3MB-202P (Solid State Relay) 2A @ 240VAC Not rated for DC (Zero-cross) <1ms (Zero-cross sync) Opto-Triac $3.00 - $4.50
IRF520 MOSFET Driver Module 5A @ 24VDC 5A @ 24VDC (Requires flyback) <1µs (PWM capable) None (Common Ground) $1.00 - $1.80
Panasonic TQ2-L2-5V (Latching PCB) 2A @ 250VAC 1A @ 250VAC ~5ms None (Direct Coil Drive) $4.00 - $6.00
⚠️ Safety Callout: When switching mains voltage (>50V AC), local electrical codes (such as NFPA 70 / NEC) dictate specific enclosure, creepage, and clearance requirements. Never leave exposed screw terminals energized on a breadboard. Use proper strain relief and insulated enclosures for any load exceeding 50V.

Wiring the SRD-05VDC-SL-C: Pinout and True Isolation

The most common mistake when wiring Arduino relays is ignoring the JD-VCC jumper on the relay module. Out of the box, a jumper connects VCC to JD-VCC, meaning the relay coil is powered directly from the Arduino's 5V rail. The SRD-05VDC coil draws approximately 70mA to 90mA when engaged. If your Arduino is also powering sensors, an LCD, or a WiFi module, this sudden current spike will sag the 5V rail and reset the microcontroller.

For true galvanic isolation, you must remove the jumper and power the relay coil from a separate 5V source (like a dedicated buck converter or USB power bank), connecting only the control signal and ground reference to the Arduino.

Parts List & Pin Mapping

  • Microcontroller: Arduino Nano V3 (ATmega328P, 16MHz)
  • Relay Module: 1-Channel 5V Optocoupler Isolation Module (Songle SRD-05VDC-SL-C)
  • Power Supply: 5V 2A USB Buck Converter (for isolated coil power)
  • Wiring: 22 AWG solid core for logic, 14 AWG stranded for AC load terminals
  • Protection: 1N4007 Flyback Diode (if not pre-soldered on the module)
Table 2: Isolated Pin Mapping (Arduino Nano V3 to Relay Module)
Arduino Nano V3 Pin Relay Module Pin Function / Notes
D4 (Digital Pin 4) IN1 Logic trigger (Active LOW on most modules)
GND GND Common ground reference for optocoupler LED
External 5V PSU (+) JD-VCC Relay coil power (Remove VCC-JD-VCC jumper!)
External 5V PSU (-) VCC Optocoupler LED anode power (Tie to external GND)

Note: On standard modules, the input is active-LOW. Writing the pin LOW energizes the optocoupler LED, which fires the phototransistor, sinking current through the relay coil.

Fail-Safe Control Code (Arduino Nano V3)

The following C++ code is written specifically for the Arduino Nano V3 (ATmega328P). It includes a critical hardware-safety feature: setting the pin to the inactive state before configuring it as an output. If you call pinMode() first, the pin defaults to LOW, which on an active-low relay module will immediately engage the relay during the milliseconds it takes to execute the next line of code. This "boot-click" can be dangerous if the relay controls a motor or heating element.


/*
 * Fail-Safe Relay Control for Arduino Nano V3
 * Target Board: Arduino Nano V3 (ATmega328P, Old Bootloader or Standard)
 * Module: SRD-05VDC-SL-C (Active LOW)
 */

// Pin Definitions
#define RELAY_PIN 4
#define BUTTON_PIN 2
#define LED_STATUS_PIN 13

// State Variables
bool relayState = false;
unsigned long lastDebounceTime = 0;
unsigned long debounceDelay = 50;
int lastButtonState = HIGH;

void setup() {
  // CRITICAL SAFETY STEP: Set pin HIGH (inactive) BEFORE setting as OUTPUT
  // This prevents the relay from engaging during the boot sequence.
  digitalWrite(RELAY_PIN, HIGH);
  pinMode(RELAY_PIN, OUTPUT);
  
  // Configure inputs and indicators
  pinMode(BUTTON_PIN, INPUT_PULLUP);
  pinMode(LED_STATUS_PIN, OUTPUT);
  digitalWrite(LED_STATUS_PIN, LOW);
  
  Serial.begin(9600);
  Serial.println(F("System Initialized. Relay is SAFE (De-energized)."));
}

void loop() {
  int reading = digitalRead(BUTTON_PIN);

  // Debounce logic to prevent relay chatter from mechanical switch bounce
  if (reading != lastButtonState) {
    lastDebounceTime = millis();
  }

  if ((millis() - lastDebounceTime) > debounceDelay) {
    if (reading == LOW) { // Button pressed (pulled to ground)
      relayState = !relayState; // Toggle state
      
      // Apply state to hardware (Active LOW logic)
      if (relayState) {
        digitalWrite(RELAY_PIN, LOW);  // Energize coil
        digitalWrite(LED_STATUS_PIN, HIGH);
        Serial.println(F("RELAY ENGAGED"));
      } else {
        digitalWrite(RELAY_PIN, HIGH); // De-energize coil
        digitalWrite(LED_STATUS_PIN, LOW);
        Serial.println(F("RELAY DISENGAGED"));
      }
      
      // Wait for button release to prevent rapid toggling
      while(digitalRead(BUTTON_PIN) == LOW) {
        delay(10);
      }
    }
  }
  lastButtonState = reading;
}

Debugging: "Brownout detector was triggered" and Reset Loops

When integrating Arduino relays into a larger system, the most common failure mode is the microcontroller resetting the moment the relay clicks. If you are using an ESP32 for WiFi-enabled relay control, the exact error string printed to the serial monitor is Brownout detector was triggered. On the Arduino Nano V3 or Uno, this manifests as a silent reboot loop, a flashing pin 13 LED, or garbage characters (⸮⸮⸮) on the serial monitor.

This happens because the relay coil demands a sudden surge of current (up to 100mA), causing the voltage on the microcontroller's 5V or 3.3V rail to dip below the Brownout Detection (BOD) threshold, forcing a hardware reset.

The First Three Things to Check

  1. Measure the Rail Under Load: Connect your multimeter to the 5V and GND pins on the Arduino. Trigger the relay. If the voltage drops below 4.7V (or 3.1V on an ESP32), your power supply is inadequate. Standard PC USB ports limit current to 500mA. Upgrade to a dedicated 5V 2A buck converter or wall adapter.
  2. Verify the Flyback Diode: Look at the relay module PCB. There must be a diode (usually a 1N4148 or 1N4007) wired in reverse-parallel across the relay coil pins. When the coil de-energizes, the collapsing magnetic field generates a high-voltage inductive kick (back-EMF). Without the diode to recirculate this current, the voltage spike will arc across the transistor junction and couple noise directly into the microcontroller's ground plane, causing a reset.
  3. Check the Optocoupler Jumper: As detailed in the wiring section, if the VCC to JD-VCC jumper is still in place, the coil current is being drawn directly through the Arduino's onboard 5V linear regulator (which is typically rated for only 500mA to 800mA total). Remove the jumper and use an external power source for the coil.
💡 Bench Tip: If you have verified power and isolation but still experience resets, the issue is likely radiated EMI from the relay contacts arcing when switching the load. Move the high-voltage AC wires at least 2 inches away from the Arduino's logic traces, or use a shielded cable for the load.

Extending the Build: Snubbers and High-Voltage Safety

Once your basic Arduino relay circuit is stable, you will eventually need to adapt it for specific load types or simplify the hardware for DC-only applications.

How to Simplify: The MOSFET Alternative

If your load is strictly DC (e.g., a 12V LED strip, a PC fan, or a 12V solenoid valve) and draws less than 5A, do not use a mechanical relay. Mechanical relays introduce contact bounce, audible noise, and eventual contact degradation. Instead, simplify your build by swapping the relay module for an IRF520 Logic-Level MOSFET module. MOSFETs switch in microseconds, allowing you to use PWM (Pulse Width Modulation) from the Arduino to dim lights or control motor speed—something a mechanical relay cannot do without destroying itself.

How to Extend: Adding an RC Snubber for Inductive AC Loads

If you are using the SRD-05VDC-SL-C to switch an inductive AC load like an AC motor, a large transformer, or a solenoid contactor, the mechanical contacts will arc heavily upon opening. This arc causes electromagnetic interference (EMI) that can scramble I2C sensors or corrupt serial communication on your Arduino.

To extend the life of your relay contacts and suppress EMI, wire an RC snubber network directly across the NO (Normally Open) and COM (Common) screw terminals of the relay. A standard bench-proven snubber consists of a 100Ω (1/2W) carbon film resistor in series with a 0.1µF X2-rated metallized polypropylene capacitor. The capacitor absorbs the inductive voltage spike, while the resistor limits the inrush current when the contacts close. Ensure the capacitor is explicitly rated for X2 (mains AC suppression); using a standard DC ceramic capacitor here is a severe fire hazard.

By respecting the derating curves, implementing true galvanic isolation via the JD-VCC jumper, and utilizing fail-safe boot logic in your firmware, your Arduino relay projects will transition from unreliable breadboard prototypes to robust, field-ready control systems.