Building a Shop Air Filter with Box Fans

Over the years, I’ve seen many versions of a shop air filter, made from box fans and 20×20 inch furnace filters. A few years ago I picked up some old box fans on Facebook Marketplace and bought a pack of filters from Sam’s Club. They’ve been stacked in the corner.

It was finally time to build my air filter. I removed the back covers, feet, handles, and knobs from the fans. I got my first look at the switches inside, which are nearly identical.

I’d easily be able to wire the fans together, so I removed the switches and power cords.

I put together a frame from OSB, cut slots to feed the wires through, and screwed the box fans in.

Then I grabbed wood that had been salvaged from a pallet to construct a door.

On the back side, I used glue and brad nails to attach plywood rails. I also made tabs to hold the filters secure.

I attached the door with a couple hinges and made some notched tabs to hold the door shut.

Then it was time to work on the wiring and electronics. I had recently watched a YouTube video showing how to make an old fan smart and his code with ESPHome and Home Assistant gave my a great start. I bought a 4 channel relay board to use with a an ESP8266 development board, a button, and some LEDs. I tore open an old USB power plug and was originally going to tie in the 120 volt line, but decided against it. First, I tested out the circuit and code on a breadboard and then soldering things up more permanently.

A plastic screw container was a good side, so I used hot glue to secure the boards and then wired up all of the fan connections.

I’m not sure if I’ll ever use the button, but it allows me to cycle between the three speeds and turn it off. The three LEDs show which speed is currently running. The only thing I got wrong was reversing the low and high speeds, which was a quick fix in the ESPHome code. Speaking of the code, here’s mine.

esphome:
  name: shop-air-filter
  friendly_name: Shop Air Filter

esp8266:
  board: d1_mini

logger:
  level: WARN

api:
  encryption:
    key: "input_yours"

ota:
  - platform: esphome
    password: "input_yours"

wifi:
  min_auth_mode: WPA2
  ssid: !secret wifi_ssid
  password: !secret wifi_password
  manual_ip:
    static_ip: 192.168.1.2
    gateway: 192.168.1.1
    subnet: 255.255.255.0

time:
  - platform: homeassistant
    id: home_time

binary_sensor:
  - platform: gpio
    pin: {number: D5, mode: INPUT_PULLUP, inverted: true}
    name: "Speed Button"
    on_press:
      then:
        - script.execute: cycle_fan_speed

  - platform: template
    id: active
    lambda: 'return id( fan_speed ).state > 0;'

switch:
  # Relays
  - platform: gpio
    pin: D3
    id: speed_1
    inverted: true
    interlock: &fan_interlock [speed_1, speed_2, speed_3]
    internal: true
  - platform: gpio
    pin: D2
    id: speed_2
    inverted: true
    interlock: *fan_interlock
    internal: true
  - platform: gpio
    pin: D1
    id: speed_3
    inverted: true
    interlock: *fan_interlock
    internal: true

  # LEDs
  - platform: gpio
    pin: D6
    id: led_1
    internal: true
  - platform: gpio
    pin: D7
    id: led_2
    internal: true
  - platform: gpio
    pin: D8
    id: led_3
    internal: true

number:
  - platform: template
    name: "Fan Speed"
    id: fan_speed
    min_value: 0
    max_value: 3
    step: 1
    optimistic: true
    restore_value: true
    on_value:
      then:
        - script.execute: set_shop_filter_speed

text_sensor:
  - platform: template
    name: "Current State"
    id: current_state

sensor:
  - platform: duty_time
    name: "Filter Runtime"
    id: shop_filter_usage
    sensor: active
    restore: true
    unit_of_measurement: h
    accuracy_decimals: 1
    filters:
      - multiply: 0.000277778 # Convert seconds to hours

button:
  - platform: template
    name: "Reset Filter Timer"
    icon: "mdi:timer-off"
    on_press:
      then:
        - sensor.duty_time.reset: shop_filter_usage

script:
  - id: set_shop_filter_speed
    mode: restart
    then:
      - switch.turn_off: speed_1
      - switch.turn_off: speed_2
      - switch.turn_off: speed_3
      - switch.turn_off: led_1 
      - switch.turn_off: led_2
      - switch.turn_off: led_3
      - delay: 300ms 
      - lambda: |-
          if ( id( fan_speed ).state == 0 ) {
            id( current_state ).publish_state( "Off" );
          } else if ( id( fan_speed ).state == 1 ) {
            id( speed_1 ).turn_on();
            id( led_1 ).turn_on();
            id( current_state ).publish_state( "Low" );
          } else if ( id( fan_speed ).state == 2 ) {
            id( speed_2 ).turn_on();
            id( led_1 ).turn_on(); id( led_2 ).turn_on();
            id( current_state ).publish_state( "Medium" );
          } else if ( id( fan_speed ).state == 3 ) {
            id( speed_3 ).turn_on();
            id( led_1 ).turn_on(); id( led_2 ).turn_on(); id( led_3 ).turn_on();
            id( current_state ).publish_state( "High" );
          }
  - id: cycle_fan_speed
    then:
      - lambda: |-
          int next_speed = id( fan_speed ).state + 1;
          if ( next_speed > 3 ) next_speed = 0;
          id( fan_speed ).publish_state( next_speed );

I used Google Gemini to help and it had a great suggestion to track the run time and add a maintenance reminder when it was time to replace the filters.

In Home Assistant I created some automations. My dust collector uses a smart plug, so when it draws electricity, the air filter automatically turns on at high speed. When the dust collector turns off, the air filter continues to run for 15 minutes before turning off. If I had to remember to turn on the air filter all the time, it would rarely happen, so this is amazing.

I’m still on lifting restrictions for several weeks so Brandi helped me install the air filter on the ceiling.

I wish I hadn’t waited so long to build this!

Upgrading a Used Table Saw – Part 2

I’ve done a lot more to my used Craftsman table saw (model 113.298032) since the upgrades in part 1 of this series.

To go along with building my dust separator, I needed a way to connect it to the table saw. I used a dust hood ($8), 4″ hose ($20, with plenty extra for future uses), hose clamps (2x $1.29), 4 in.- 2 1/4 in. adapter ($1.78), and some scrap wood.

While I was grabbing parts from Menard’s I grabbed a push stick (yellow-orange in picture below) for $2. Eventually I’ll make one or two other versions on my own to use with different cuts or sizes of wood. Since I had to add the insert on a side for the dust hose, I add some places to hook stuff. I’ll probably add something similar to the other side of the stand and maybe put in a bottom for more storage space.

I grabbed a nice Diablo 60 tooth blade ($34) from Amazon, a zero clearance insert ($34), and a splitter kit ($35). After installing the blade, I tuned up all of the alignments on the saw following tips from parts 1 and 2 of a YouTube guide. Once everything was aligned properly I was able to install the insert and splitter. The combo will help prevent tearout, not give space for pieces of wood to fall down into the saw, and help prevent kickback since this old saw doesn’t allow a riving knife. You can never be too safe on these machines.

In part 1, I mentioned fence customizations. The plan there was mainly based on reviews I read about this saw before buying it. Many people said the fence was junk. After aligning everything, making sure to move the fence from the T end (not the end by the blade), and using the saw for a bit, I think it’ll work just fine for me.

At an estate sale I found a miter gauge that actually fits my slots. I bought a digital angle gauge ($15), which not only helps to make sure the blade is aligned properly with the table, but will allow accuracy when setting angled cuts.

Check out part 3.

Used Tools

I’ve been wanting to get more tools so I can do different projects with wood. It’s a lot cheaper to start out with used tools, especially as I learn. If I use certain tools a lot and find I need an upgrade, then I’ll fork over cash for new.

On a Saturday I hopped in the car and drove all over Saginaw looking for garage sales. There was no plan, other than to follow every sign I saw. I bought and bargained for a few things and then when I went home to eat lunch I found a big community garage sale about 25 minutes away. Off I went!

I probably hadn’t been to a garage sale in over 20 years. It was a lot of fun searching and it was interesting to see how different the items were from one house to the next. I was really hoping to find a table saw, band saw, and drill press, but no luck on any of the 3. I did make a good haul though.

The saw and miter box combo was brand new in the box, but most of the items needed some love. I sanded, stained, and waxed the wooden mallet and hammer handle. You can’t really see from this picture, but they both turned out great. The biggest tasks were taking apart the two sanders for a thorough cleaning because they were full of sawdust. I also disassembled the router but it wasn’t nearly as bad.

What gems have you found at garage sales?

RBT 1911 Pull Back

I’ve always wanted a rubberband gun, so when I saw awesome kits by Rubberband Tech at Maker Faire Detroit I had to get one. I could have a sweet gun and build it myself. The 1911 immediately got my attention because of the slide action and the functional clip. The hardwood version (I picked zebrawood) of the kit was an extra $10 to make it $30 and a big bag of extra rubberbands was $5.

The build, spread over several days, took about 7 or 8 hours, which was much longer and harder than expected. A lot of difficulties were from the instructions being short on details. They tell you to sand several pieces but don’t get into how much sanding is required (A lot and then a lot more!), especially to get the trigger mechanism working properly.

I tried to video the entire process, ending up with over 140 GB of footage! On a first pass through iMovie at 20x fast forward the video was way too long, so I exported and ran it back through at 8x more. At the end of the video is a demo at normal speed showing the gun in action.

The stain I used on the zebrawood pieces was called Espresso and the one I used on the rest of the gun was an English Chestnut. I finished it off with 2 coats of a finishing wax. As mentioned in the video, I’m not happy with the end result of the staining. I wish I had done a second coat of the espresso stain on the hardwood pieces, or gotten a little lighter stain for the rest of the gun, or even both.

Now I need to make some targets. I have some ideas involving electronics for timing and scoring.

Fidget Spinners

I made a couple of fidget spinners out of wood, screws, and a couple of 2 cent coins from Spain. The bearings came out of old Rollerblade wheels. Even after cleaning up the bearings, neither one spins very well, so I think I need to get some ones before making more spinners.


This was a good excuse to buy a Dremel, which I’ve been wanting for a long time. Awesome tool to have. I didn’t buy it until I’d already cut out the basic shapes and done some basic sanding though. The next batch of spinners will be much easier with the Dremel available for the entire process.