Open hardware · design stage
A room controller for mushrooms, cheap enough to double.
One small board per grow room, each reading doubled and cross-checked, and every loop keeps running with the network unplugged.
Anyone may build it, sell it or make it better.
DESIGNParts chosen and priced 2026-10-02
FIRMWARELogic outlined below; code not written yet
TESTEDNot yet: first units go into a working farm's rooms
LICENCECERN-OHL-P v2 hardware · MIT firmware
STATUSBUILDING IN THE OPEN
Why cheap, and why two of everything
A fruiting room sits at 85–95 % relative humidity, around the clock. That kills electronics, including expensive industrial sensors, just more slowly. So this design accepts that sensors die. Each one is cheap enough to keep a spare in a drawer and swap in a minute, and every critical reading has two of them.
- Two temperature/humidity sensors and two CO₂ sensors per room, compared on every reading. If they disagree, the room goes to a safe state and raises an alarm instead of trusting either one.
- The room board runs the room. Heat, humidity, fresh air and cooling loops live on the board in that room. The supervisor only logs, displays and alarms, so unplugging it or losing the network changes nothing in the rooms.
- Failure leans to safe. If the board or a sensor fails, fresh air keeps running, humidifying stops, and a local alarm sounds. Moisture is never added while airflow is unproven.
- Upgrade only what fails. If a cheap sensor won't survive a room, swap in an industrial part on the same board (examples below). Everything else stays cheap.
How one installation is laid out
Room nodeESP32-S3 board, doubled sensors, relays and 0–10 V outputs. One per room. Runs the room by itself.
Air plant sensorsDuct temperatures, an airflow switch and a coil freeze switch for each fresh-air unit, wired to the nearest room node.
ActuatorsWhatever the room already uses: fans, dampers, humidifiers, dehumidifiers, a cooling unit, hot-water valves. Relays switch them; 0–10 V sets speed and position.
Supervisor (optional)A Raspberry Pi with a touchscreen. It logs every reading, shows all the rooms, and alarms. It never runs a loop, so the rooms don't need it.
The first installation is six rooms (a lab, an incubation room, two fruiting rooms, a pack room and an airlock), each with its own air supply. A grow tent is one room node.
Parts for one room node
Listed US prices on 2026-10-02, before tax, shipping and import tariffs. Links go to the listing priced.
For a fruiting room, use two Sensirion SCD41 CO₂ sensors ($44.96 each) instead of the S8. The S8 is rated non-condensing, and the SCD41's published range runs to 95 % RH. That makes the node about $243. The enclosure cost is an estimate from filament use. A 24 V-to-5 V converter for the board isn't priced yet.
Each fresh-air unit adds
The supervisor, once per site
A six-room installation, with five fresh-air units and two of each sensor, comes to about $2,500 of parts. An industrial PLC with industrial sensors, priced for the same rooms the same day, was about $14,500.
How the firmware decides
The code isn't written yet. This is the logic it will follow, in plain pseudocode, so anyone can check the reasoning before the code exists. Each room node runs this loop once a second, on its own.
every second, on each room node:
1. read
temp/RH from sensors A and B
CO₂ from sensors A and B
room pressure, leak switch, airflow switch,
duct temperatures, coil freeze switch
2. cross-check each doubled pair
if A and B agree (within 1 °F, 4 % RH, 100 ppm CO₂)
use their average → trusted
else if one is missing, stuck or out of range
use the other one, raise a warning → degraded
else
trust neither, raise an alarm → untrusted
3. safety first (these override every loop)
airflow not proven → humidifier OFF, alarm
leak detected → humidifier OFF, water valve CLOSED, alarm
coil freeze switch → hot-water valve OPEN, fresh air to minimum, alarm
CO₂ untrusted → fresh air to a fixed protective rate, alarm
temp untrusted → hold the last good output for 10 minutes,
then heat to a fixed safe position, alarm
RH untrusted → humidifier OFF, alarm
4. room loops (only with trusted or degraded readings)
fresh air: CO₂ above target → ramp fans and dampers up
CO₂ below target → ramp down, never below the minimum
temperature: below setpoint − band → open the hot-water valve
above setpoint + band → run the cooling unit
never heat and cool at once, except to dry the air
humidity: below the RH band → humidifier ON (needs proven airflow)
above the RH band → dehumidifier ON
inside the band → both OFF
pressure: trim exhaust against supply to hold the room's target
5. write outputs
relays and 0–10 V outputs
minimum on and off times, so compressors and fans don't short-cycle
6. tell the supervisor, if it's there
readings, outputs and alarms every 10 seconds
sound the room's own alarm whether or not anyone is listening
When things fail
- The board stops. A hardware watchdog restarts it within seconds. The relays are wired so a dead board leaves fresh air running and the humidifier off: the fan on a normally-closed contact, the humidifier on a normally-open one.
- The board restarts. Outputs come up in the safe state first, then the loops take over using the setpoints stored in the board's own memory.
- The supervisor or the network goes down. Nothing changes in the rooms. The nodes keep their last setpoints and keep alarming locally.
- Power fails. The controls ride a small UPS. When power returns, every appliance must restart by itself (a requirement for anything this controller switches), and the loops pick up where they left off.
The supervisor's job
on the Raspberry Pi:
collect readings from every node → log them, draw the history
show every room on the touchscreen → readings, outputs, alarms
send setpoint changes to the nodes → each node stores them itself
alarm on any node's alarm, or on a node gone silent
never run a room loop
Example setpoints
These are the first installation's design setpoints, not universal values. Every number is a setting on the node.
If a cheap sensor doesn't survive
The same board takes industrial sensors. Upgrade the one that fails, not all of them:
A 4–20 mA sensor needs a small current-to-voltage input on the node, not priced here.
What's next
- Firmware for the room node, written from the logic above.
- Enclosure files to print, and a wiring diagram.
- A season in real rooms, at 58 °F and 88 % RH in the oyster room. The results will be posted here, including the parts that failed.
Files will go up on this page as they're made. Anyone is welcome to build it, sell it or make a better one.