2.3 The fan
The third research topic is the fan. It depends on everything before it, so the brief gave ChatGPT the plan, the gas media from 2.1 and the particle filters' pressure budget from 2.2, on GPT-6 at the Pro setting. It worked for about 39 minutes. Part way through, the page lost its connection and I started a second chat, but the first one finished, so I stopped the second.
The short version: a quiet PC fan can't do this. Pushing 36 m³/h through the whole stack takes about 59 Pa, and 60 m³/h takes about 113 Pa. A Noctua NF-A12x25 makes 23 Pa with no airflow at all. The prototype gets two Arctic S12038-4K server fans in series, which cost £25 for three, and a bigger carbon bed. Whether that can be quiet enough at night is now the hardest open question in the project.
The carbon beds
2.2 gave the particle filters' share of the resistance. The carbon beds' share comes from the Ergun equation, the standard model for air through a packed bed:
where is the bed depth, the air speed at the bed face, the granule size, the share of the bed that's gaps between granules (0.40 here), and and the air's viscosity and density. The first term grows with the speed and the second with its square. At these low speeds both matter. The 150 and 1.75 are Ergun's original constants from 1952. A 1979 revisit proposed 180 and 1.8, and up to 4.0 for rough particles. Those raise the figures below by about 10 to 70%, and carbon pellets aren't smooth, so these are on the low side.
Per bed, at 25 mm and 50 mm deep:
| Granule size | 0.10 m/s | 0.20 m/s | 0.35 m/s |
|---|---|---|---|
| 4 mm pellets | 4 and 7 Pa | 10 and 19 Pa | 24 and 47 Pa |
| 3 mm pellets | 6 and 12 Pa | 15 and 30 Pa | 35 and 70 Pa |
| 2.5 mm, like 4×8 mesh granules | 8 and 16 Pa | 20 and 40 Pa | 46 and 91 Pa |
| 1.8 mm, like 6×12 mesh granules | 15 and 29 Pa | 35 and 69 Pa | 75 and 150 Pa |
So coarse pellets, if the media I want come that way. Purafil's Purakol, the reference plain carbon, comes as 4 mm pellets. The packing matters as much as the granule size, though: the same beds with 0.35 gaps instead of 0.40 have about 70% more drop, and with 0.45 about 40% less.
The bigger lever is the bed's face. ChatGPT recommends 380 × 240 mm, about the same face as the particle filters, with 40 mm of media in each stage. The air then crosses the beds at 0.11 m/s normally and 0.18 m/s on boost, and both beds together cost about 16 Pa at 36 m³/h and 33 Pa at 60 m³/h with 3.5 mm media. The contact time goes up too:
| Bed, per stage | Media | Contact time at 36 m³/h | At 60 m³/h |
|---|---|---|---|
| 220 × 220 × 30 mm, the example in 2.1 | 1.45 L | 0.145 s | 0.087 s |
| 380 × 240 × 40 mm | 3.65 L | 0.365 s | 0.219 s |
That's 7.3 litres of media for the two beds, or roughly 3.3 to 4 kg of carbon. The wall fixing and the cartridge supports have to carry that, not thin printed panels.
The whole system
| Stage | Clean, 36 m³/h | Clean, 60 m³/h | Loaded, 36 m³/h | Loaded, 60 m³/h |
|---|---|---|---|---|
| Hair mesh | 2 Pa | 3 Pa | 4 Pa | 7 Pa |
| ePM1 filter | 8 Pa | 13 Pa | 16 Pa | 27 Pa |
| E11 or E12 filter | 25 Pa | 42 Pa | 50 Pa | 83 Pa |
| Both carbon beds | 16 Pa | 33 Pa | 16 Pa | 33 Pa |
| Screens holding the media | 3 Pa | 8 Pa | 3 Pa | 8 Pa |
| Grilles, turns and plenums | 5 Pa | 14 Pa | 5 Pa | 14 Pa |
| Total | 59 Pa | 114 Pa | 94 Pa | 172 Pa |
"Loaded" doubles the particle filters' resistance and leaves the carbon alone. It's a design case, not a prediction of how long the filters last. The airflow measuring inlet in 2.4 adds another 10 to 20 Pa at 36 m³/h on top.
As curves, with and in m³/h:
The fibrous filters give the straight part and the openings give the squared part. For design, ChatGPT suggests allowing a wider band: 45 to 80 Pa normally and 85 to 145 Pa on boost when clean. Grilles are an easy way to lose it. At 60 m³/h, a grille with 0.02 m² of open area passes air at 0.83 m/s. Cut the open area to 0.005 m² with chunky printed bars and the speed goes to 3.3 m/s, with 16 times the pressure loss.
Why a PC fan won't do
A fan's maximum static pressure is what it makes with the airflow blocked. Its maximum airflow is with nothing in the way. They're opposite ends of its curve, and the useful point is in between. Even assuming a fan could hold its maximum pressure at any airflow, which none can, setting that pressure equal to the clean system curve gives the most air it could possibly push:
| Fan | Maximum pressure | Best case through this stack |
|---|---|---|
| Noctua NF-A14 PWM | 20 Pa | under 15 m³/h |
| Noctua NF-A12x25 PWM | 23 Pa | under 16 m³/h |
| Arctic P12 Max | 43 Pa | under 28 m³/h |
| be quiet! Silent Wings Pro 4 120 mm | 52 Pa | under 33 m³/h |
| Noctua NF-A14 industrialPPC-3000 | 65 Pa | under 39 m³/h |
| Arctic P12 Pro | 68 Pa | under 41 m³/h |
None of them reaches 60 m³/h, and the last two only scrape 36 m³/h in theory. The P12 Pro shows the trap: 68 Pa looks like enough for a 59 Pa system, but its own curve gives only about 49 Pa at 36 m³/h.
What can
| Fan | Maximum pressure | Maximum airflow | Speed | Current | Price |
|---|---|---|---|---|---|
| Arctic S12038-4K, 120 × 38 mm | 112 Pa | 180 m³/h | 4,000 rpm | 0.6 A max | £24.98 for three |
| Arctic S12038-8K, 120 × 38 mm | 363 Pa | 370 m³/h | 8,000 rpm | 3.2 A max | £29.99 for three |
| Delta BFB1012EH blower | about 920 Pa | 77 m³/h | 5,800 rpm | 2.4 A max | not found in UK stock |
The Delta blower can make the pressure, but it would need about 5,100 rpm for clean boost, and its data sheet gives 62 dB(A). A small fast blower isn't automatically quieter than an axial fan.
Two fans in series move the same air and add their pressures. Reading the Arctic curves against the system curve, with 10% knocked off the pair for losses between them:
| Arrangement | 36 m³/h, clean | 60 m³/h, clean | 36 m³/h, loaded | 60 m³/h, loaded |
|---|---|---|---|---|
| Two S12038-4K in series | 2,100 rpm each | 3,100 rpm each | 2,500 rpm each | Can't, about 52 m³/h at most |
| One S12038-8K | 2,600 rpm | 3,800 rpm | 3,100 rpm | 4,400 rpm |
The pair of 4K fans covers everything except full boost with loaded filters, which is a reasonable place to start. The 8K covers it all, but needs a 5 A supply.
Noise
There's no decibel figure that guarantees I won't hear it through a shut door. Door gaps, the cat flap, the walls and how quiet the house is all count. ChatGPT proposes 20 to 25 dB(A) at 1 m for running all night, and 30 to 35 dB(A) for a short boost. That's stricter than the 30 dB that the WHO's guidelines and the UK's BS 8233 give for a bedroom at night, which is fine for a target measured 1 m from the unit. The real test is standing where people sleep, with the WC door shut.
Hardware Busters measured one S12038-4K at 1 m in a quiet chamber, in free air:
| Speed | Noise, one fan | Two fans |
|---|---|---|
| 1,279 rpm | 22.0 dB(A) | about 25 dB(A) |
| 1,670 rpm | 26.4 dB(A) | about 29 dB(A) |
| 2,046 rpm | 32.2 dB(A) | about 35 dB(A) |
| 2,394 rpm | 36.7 dB(A) | about 40 dB(A) |
| 3,057 rpm | 41.6 dB(A) | about 45 dB(A) |
| 3,938 rpm | 48.8 dB(A) | about 52 dB(A) |
Two equal fans are 3 dB louder than one. So the pair would be about 35 dB(A) at the 2,100 rpm that normal flow needs, and about 45 dB(A) on boost, before the case does anything, and working against the filters may add to it. To get the pair down to 25 dB(A) they'd have to run at about 1,300 rpm, which won't push this stack. That's a 10 dB gap at normal flow, so this is the part of the project most likely to fail.
The usual rule of thumb for noise against speed is
which gives about 15 dB less at half speed. The measurements fit it reasonably: from full speed to 2,394 rpm the rule predicts 10.8 dB less, and Hardware Busters measured 12.1 dB less.
The pitch matters as well as the level. The blade-pass tone is
for blades at rpm, so a five-bladed fan at 2,100 rpm hums at 175 Hz, and at 3,100 rpm at 258 Hz. A tone carries through a door better than a hiss.
What the case can do about it:
- Keep the filter and any grille away from the fan's inlet. Noctua measured 1.2 to 3.5 dB(A) less with just a 5 mm spacer on its own fans.
- Starting gaps: 80 to 120 mm from the E12 filter to the first fan, about a fan's width between the two fans, and 60 to 120 mm from the last fan to any turn or grille.
- Rubber fan mounts, and a separate load path, so the fans don't drive the big printed panels.
- A lined outlet chamber with a gentle dog-leg, using faced, non-shedding lining 10 to 25 mm thick, since it's after the last filter.
Control
The ESP32's LEDC peripheral can make the 25 kHz PWM the fans expect. ChatGPT suggested driving the fan's PWM wire through a small MOSFET as an open-drain switch. Noctua's PWM white paper advises against exactly that: the fan sources so little current that the waveform can deform. It recommends a push-pull output, like a microcontroller's own pin. The fan's input is pulled up inside the fan to 3.3 or 5 V, at up to 5 mA, so a small push-pull buffer between the ESP32 and the fan is the safe choice. That goes on the bench list.
A PWM fan with no signal runs flat out. And Arctic lists the S12038s from 600 rpm (800 for the 8K) with no 0 rpm mode, unlike its P12 fans, so I'll assume they don't stop at 0% PWM until I've tested it. So the 12 V to the fans goes through a switch the ESP32 controls, and the PWM is set up before the fans get power. That also gives a real off.
The tach wire gets a 4.7 to 10 kΩ pull-up to 3.3 V, never 12 V. With two pulses a revolution,
where is the pulse rate in Hz. Each fan gets its own input. The firmware ramps the fans up over a second or two, treats about two seconds without tach pulses as a stall, retries a few times, then raises a fault. And rpm isn't airflow: a clogged filter cuts the flow without any change the tach would notice. That's what the pressure sensors are for.
Power
| Fans | Current | Supply |
|---|---|---|
| Two S12038-4K | 1.2 A max | 12 V, 3 A |
| One S12038-8K | 3.2 A max | 12 V, 5 A |
Plus 3 to 5 W for the ESP32 and the sensors, through a 5 V buck converter rated for at least 1 A. The mains side stays outside the case, in a certified UK plug-in adapter.
The layout
The fan goes last, pulling air through everything. That keeps hair, dust and carbon fines off it. It also puts the dirty side of the case below room pressure, so any leak there pulls unfiltered air straight into the clean path, and every cartridge needs a real seal. The air should keep roughly the same face area through all the stages, rather than squeezing down for the carbon. Carbon in an upright cartridge settles and opens a gap at the top, so the beds need splitting into sections or something to keep them packed. The outlet points up or along the wall, away from the trays and from the inlet, and wide rather than fast.
What changes in the design
- The carbon beds grow to 380 × 240 mm, 40 mm per stage, in coarse pellets, matching the filter faces.
- Several kilograms of media, so the wall mount and the cartridge supports take the weight.
- A switched 12 V rail for the fans, a push-pull buffer on the PWM line, and a 3 A supply to start with.
- Before any final case, a test mule: a sealed box with the real filters, the real media and two S12038-4K fans, measured at 36 and 60 m³/h, then listened to with the door shut.
- The fan is a placeholder until that test. If it's too loud, the next thing to look at is a larger, slower centrifugal fan, perhaps on voltage control.
What I checked
I had Claude check sixteen of the claims against the data sheets, reviews and shop pages. I reran ChatGPT's arithmetic myself: the Ergun table, the bed pressures, the contact times, the system curve, the airflow ceilings and the blade-pass tones all came out the same.
These held up: every Noctua, Arctic P12 and be quiet! specification, the S12038-4K and 8K pressure, airflow and current figures, the Scan prices, the Delta blower's data, Noctua's spacer result, the tach and PWM signal details, and Purakol's 4 mm pellets and bulk density.
These needed correcting, and the post above uses the corrected versions:
- ChatGPT said Arctic's published curves show the S12038 fans running at 0% PWM. Arctic publishes no PWM curve for them. They're listed from 600 rpm with no 0 rpm mode, which is why I'll test it rather than assume either way.
- ChatGPT's noise figures for the S12038-4K were scaled from one maximum figure. Hardware Busters measured the whole curve, so the post uses that.
- ChatGPT recommended an open-drain transistor to drive the PWM line, citing Noctua. Noctua's white paper advises against open-collector designs and recommends push-pull.
- The 8K is on preorder as a single fan, but in stock as a three-pack.
- ChatGPT's Sanyo Denki figures couldn't be checked: its data sheet wouldn't open, and the headline numbers match a sibling model without PWM. I've left that fan out.
- ChatGPT cited a 1979 paper for the Ergun equation, which proposes different constants from the ones it used. The post now says which is which.
- The 20 to 25 dB(A) target isn't from any guidance. The WHO and BS 8233 give 30 dB for a bedroom.
The rest, including the casing losses, the 10% series allowance, the operating points read from the fan curves, and the plenum dimensions, are ChatGPT's engineering estimates, and weren't checked claim by claim.
Still open
- Whether any fan that can push this stack can be quiet enough at night.
- The real pressure drop of the media as I pack it, which the test mule will measure.
- A larger centrifugal fan with a published curve, as the fallback.
Sources
Papers and guidance:
- S. Ergun, Fluid flow through packed columns, Chemical Engineering Progress 48, 89 to 94, 1952.
- I. F. Macdonald et al., Flow through porous media: the Ergun equation revisited, Industrial and Engineering Chemistry Fundamentals, 1979.
- WHO, Guidelines for community noise, 1999.
- Punker, Fan acoustics.
Fans:
- Arctic, S12038-4K, its P-Q curve, its support page, S12038-8K spec sheet, P12 PWM PST, P12 Max and P12 Pro spec sheet.
- Hardware Busters, Arctic S12038-4K review.
- Noctua, NF-A12x25 PWM, PWM specifications white paper and NA-IS1 performance guidelines.
- be quiet!, Silent Wings Pro 4 120 mm.
- Delta, BFB1012EH-C18J specification.
- Purafil, Purakol bulletin.
Shops (prices on 13 October 2026):
- Scan, S12038-8K and S12038-8K three-pack.