Community project

Soldering Stand Fume Extractor

Arduino
Photo of Soldering Stand Fume Extractor
Generated with AI

prahaladh.pradeep

Published September 21, 2026

This soldering stand fume extractor keeps your workspace clean and safe during electronics projects. It combines a 12V brushed DC blower fan controlled through an Arduino Uno, dual servo-driven helper arms for holding the iron and sponge, a 24-LED ring for status indication, and an LCD display showing the current state.

This guide provides a complete wiring diagram, detailed parts list, Arduino firmware, and step-by-step assembly instructions. You'll learn how to wire the motor driver for fan speed control, integrate the LCD display, calibrate the servo helpers, and safely configure the dual-voltage power system using a buck converter to step down 12V to 5V for the microcontroller.

Wiring diagram

Wiring diagram for Soldering Stand Fume Extractor

Gather all the parts

QtyComponent
1

Standard 16x2 HD44780 LCD

16x2, 5V

A 16-character, two-line screen that shows the soldering-stand status without using I2C.

1

10kΩ Potentiometer

10 kΩ

A 3-terminal passive resistive voltage divider with a total resistance of 10kΩ. One end connects to 5V, the other to GND, and the wiper outputs a variable voltage between 0V and 5V.

1

Resistor

220 Ω

Through-hole resistor (current-limiting in series with an LED)

1

L298N Dual H-Bridge Motor Driver Module

L298N module

A motor-driver board that switches the 12V fume-extractor blower from the Uno's small control signals.

1

12V Brushed DC Blower Fan

12V

A 12V blower that pulls solder fumes through a carbon filter and away from the work area.

1

WS2812B 24-LED Ring

24 LEDs

A colored status ring that shows when the fume extractor is on or off.

1

Resistor

330 Ω

Through-hole resistor (current-limiting in series with an LED)

1

SG90 Helper Servo — Iron Holder

SG90

A small servo that can lift or lower a simple soldering-iron holder mechanism.

1

SG90 Helper Servo — Sponge Cover

SG90

A small servo that opens or closes a cover over the brass-wool or sponge cleaner.

1

Push Button

Normally open

Momentary push button switch

1

12V 3A DC Power Adapter

12V, 3A

A plug-in 12V supply with enough current for the blower and the 5V helper electronics.

1

LM2596 Adjustable Buck Converter Module

Adjusted to 5V

A DC converter adjusted to 5V for the Uno, display, LEDs, and servos.

1

Electrolytic Capacitor

1000 µF, 10V or higher

A capacitor placed across the LED ring supply to soften sudden power changes.

Assemble it in 6 steps

1. Set the 5V converter before connecting the Uno

With the 12V adapter unplugged, turn the LM2596 adjustment screw fully counter-clockwise. Connect the adapter to LM2596 VIN+ and VIN-, plug in the adapter, and measure VOUT+ to VOUT- with a meter. Turn the screw slowly until it reads 5.0V, then unplug the adapter. This creates the safe supply for the Uno, LCD, LED ring, and servos.

  • Mark the measured 5V output wire red and its ground wire black.
  • Do not connect the converter to the Uno until it measures 5.0V — a higher voltage can damage the Uno and every 5V part.

2. Make the 12V and 5V power connections

Connect adapter +12V to LM2596 VIN+ and L298N VS (motor supply). Connect adapter GND to LM2596 VIN- and L298N GND. Connect LM2596 VOUT+ to Uno 5V, L298N 5V, LCD VCC, both servo red wires, and LED ring 5V. Connect LM2596 VOUT- to all ground points. Remove the L298N 5V-EN jumper and leave its ENA jumper fitted.

  • Use a terminal block or power distribution strip for the many 5V and ground wires.
  • Never connect 12V to the Uno 5V pin, LCD, LED ring, or servos — it will damage them.
  • Every ground must be connected together or the Uno cannot control the other parts reliably.

3. Wire the fume extractor fan through the L298N

Connect the blower wires to L298N OUT1 and OUT2 (motor power). Connect L298N IN1 to Uno D5 (fan control) and IN2 to Uno D6 (fan control). The L298N receives 12V at VS and 5V at its logic pin from the power connections.

  • Mount the blower so it pulls smoke through a filter and sends it away from your face.
  • Unplug the adapter before swapping fan wires; if airflow is backwards, swap only the two wires at OUT1 and OUT2.

4. Wire the LCD directly to the Uno

Connect LCD GND to GND (ground), VCC to 5V (power), and RW to GND (write-only control). Connect the 10k potentiometer outer legs to 5V and GND, then its middle leg to LCD VO (contrast control). Connect LCD RS to Uno D9 (control), EN to D12 (control), D4 to D13 (data), D5 to A0 (data), D6 to A1 (data), and D7 to A2 (data). Connect 5V through the 220 ohm resistor to LCD LED+ (backlight power), then LCD LED- to GND (ground).

  • The LCD uses direct wires now; no shift register is used. Turn the contrast knob slowly after powering up until letters appear.
  • Make sure LCD VCC and GND are not swapped — swapped power can damage the display.

5. Add the button, LED ring, and servo helpers

Connect Uno D7 through the 330 ohm resistor to the LED ring DIN pad (data). Connect the 1000 µF capacitor across the ring 5V and GND pads: its long positive lead goes to 5V and striped negative lead to GND. Connect the button between Uno D8 and GND (button signal). Connect the iron-holder servo signal wire to D10 and the sponge-cover servo signal wire to D11 (servo control); both red wires go to 5V and brown or black wires go to GND.

  • Use the LED ring pad marked DIN, not DOUT. The button has no positive or negative side.
  • Make sure the capacitor striped lead goes to ground — reversing it can overheat or burst it.
  • Do not force servo arms by hand while powered; unplug power before repositioning them.

6. Mount and test the stand safely

Mount the blower, filter, iron cradle, sponge cover, button, and servos where moving arms cannot touch the hot iron. With power applied, the display starts at SOLDERING STAND, the ring is orange, the fan is off, and the helpers are parked. Press the button once to run the L298N-controlled fan, turn the ring green, and move both servo helpers out.

  • If a servo arm reaches a hard stop, disconnect power and adjust its horn position before using the stand.
  • Never solder directly above the Uno, LCD, LED ring, servos, or fan housing — heat and flux can damage them.

Review all connections

1. Connections between "supply_5v" and "Arduino"

Functionsupply_5vArduino
power+12VVIN
groundGNDGND

2. Connections between "buck_5v" and "Arduino"

Functionbuck_5vArduino
powerVIN+VIN
groundVIN-GND
powerVOUT+5V
groundVOUT-GND

3. Connections between "fan_driver" and "Arduino"

Functionfan_driverArduino
powerVSVIN
groundGNDGND
power5V5V
digitalIN1GPIO 5
digitalIN2GPIO 6
powerENA5V
dataOUT112V Brushed DC Blower Fan M+EXT
dataOUT212V Brushed DC Blower Fan M-EXT

4. Connections between "lcd_16x2" and "Arduino"

Functionlcd_16x2Arduino
groundGNDGND
powerVCC5V
analogVO10kΩ Potentiometer Wiper (middle)EXT
groundRWGND
powerLED+Resistor P2EXT
groundLED-GND
digitalRSGPIO 9
digitalENGPIO 12
digitalD4GPIO 13
digitalD5GPIO 14
digitalD6GPIO 15
digitalD7GPIO 16

5. Connections between "contrast_pot" and "Arduino"

Functioncontrast_potArduino
powerEnd1 (VCC side)5V
groundEnd2 (GND side)GND

6. Connections between "lcd_backlight_resistor" and "Arduino"

Functionlcd_backlight_resistorArduino
powerP15V

7. Connections between "status_ring" and "Arduino"

Functionstatus_ringArduino
powerVCC5V
groundGNDGND
digitalDINResistor P2EXT

8. Connections between "ws2812_data_resistor" and "Arduino"

Functionws2812_data_resistorArduino
digitalP1GPIO 7

9. Connections between "servo_iron" and "Arduino"

Functionservo_ironArduino
powerVCC5V
groundGNDGND
pwmSIGNALGPIO 10

10. Connections between "servo_sponge" and "Arduino"

Functionservo_spongeArduino
powerVCC5V
groundGNDGND
pwmSIGNALGPIO 11

11. Connections between "stand_button" and "Arduino"

Functionstand_buttonArduino
groundGNDGND
digitalSIGNALGPIO 8

12. Connections between "ring_capacitor" and "Arduino"

Functionring_capacitorArduino
power+5V
ground-GND

Deploy the firmware

#include <Arduino.h>
#include <Adafruit_NeoPixel.h>
#include <LiquidCrystal.h>
#include <Servo.h>


// Forward declarations
void setRingColor(uint8_t red, uint8_t green, uint8_t blue);
void showState();
void applyState();

const uint8_t LCD_RS_PIN = 9;
const uint8_t LCD_ENABLE_PIN = 12;
const uint8_t LCD_D4_PIN = 13;
const uint8_t LCD_D5_PIN = A0;
const uint8_t LCD_D6_PIN = A1;
const uint8_t LCD_D7_PIN = A2;
const uint8_t FAN_IN1_PIN = 5;
const uint8_t FAN_IN2_PIN = 6;
const uint8_t RING_PIN = 7;
const uint8_t BUTTON_PIN = 8;
const uint8_t IRON_SERVO_PIN = 10;
const uint8_t SPONGE_SERVO_PIN = 11;

const uint8_t LED_COUNT = 24;
const unsigned long DEBOUNCE_MS = 35;

LiquidCrystal lcd(LCD_RS_PIN, LCD_ENABLE_PIN, LCD_D4_PIN, LCD_D5_PIN,
                  LCD_D6_PIN, LCD_D7_PIN);
Adafruit_NeoPixel ring(LED_COUNT, RING_PIN, NEO_GRB + NEO_KHZ800);
Servo ironServo;
Servo spongeServo;

bool extractorOn = false;
bool lastButtonReading = HIGH;
bool stableButtonState = HIGH;
unsigned long lastButtonChangeMs = 0;

void setRingColor(uint8_t red, uint8_t green, uint8_t blue) {
  const uint32_t color = ring.Color(red, green, blue);
  for (uint8_t i = 0; i < LED_COUNT; i++) {
    ring.setPixelColor(i, color);
  }
  ring.show();
}

void showState() {
  lcd.setCursor(0, 0);
  if (extractorOn) {
    lcd.print(F("FUME EXTRACTOR  "));
    lcd.setCursor(0, 1);
    lcd.print(F("ON HELPERS OUT  "));
  } else {
    lcd.print(F("SOLDERING STAND "));
    lcd.setCursor(0, 1);
    lcd.print(F("OFF HELPERS PARK"));
  }
}

void applyState() {
  if (extractorOn) {
    digitalWrite(FAN_IN1_PIN, HIGH);
    digitalWrite(FAN_IN2_PIN, LOW);
    ironServo.write(105);  // Set these angles to suit the finished mechanics.
    spongeServo.write(75);
    setRingColor(0, 80, 0);
  } else {
    digitalWrite(FAN_IN1_PIN, LOW);
    digitalWrite(FAN_IN2_PIN, LOW);
    ironServo.write(20);
    spongeServo.write(10);
    setRingColor(80, 20, 0);
  }
  showState();
}

void setup() {
  pinMode(FAN_IN1_PIN, OUTPUT);
  pinMode(FAN_IN2_PIN, OUTPUT);
  pinMode(BUTTON_PIN, INPUT_PULLUP);
  digitalWrite(FAN_IN1_PIN, LOW);
  digitalWrite(FAN_IN2_PIN, LOW);

  lcd.begin(16, 2);
  ring.begin();
  ring.setBrightness(32);  // Limits current drawn by the 24 LEDs.
  ring.show();

  ironServo.attach(IRON_SERVO_PIN);
  spongeServo.attach(SPONGE_SERVO_PIN);
  applyState();
}

void loop() {
  const bool reading = digitalRead(BUTTON_PIN);
  if (reading != lastButtonReading) {
    lastButtonChangeMs = millis();
    lastButtonReading = reading;
  }

  if ((millis() - lastButtonChangeMs >= DEBOUNCE_MS) &&
      (reading != stableButtonState)) {
    stableButtonState = reading;
    if (stableButtonState == LOW) {
      extractorOn = !extractorOn;
      applyState();
    }
  }
}

Remix this project

Make it yours in one click

Open a full copy of this project in your own Schematik workspace — diagram, code, parts, and assembly steps included. Swap the sensor, add features, or redesign the whole thing with AI. The author's original stays untouched.

Open in Schematik