ESP32 · Bluetooth LE · iPhone

Know your filament.
Know its moisture.

SpoolDry connects your filament dryer to your iPhone using Bluetooth. Watch temperature and humidity live, start drying with engineering-polymer profiles and follow the timer on your Lock Screen. No account. No cloud.

No subscription. One-time purchase. · Coming to the App Store

SpoolDry app dashboard showing PA-CF drying at 67.2 °C and 18 % humidity

Everything your dryer was missing

ESP32 BLE Sync

Direct, paired Bluetooth LE link to the ESP32. Versioned protocol with acknowledged commands: the app always shows the dryer's real state.

Engineering Polymers Data

PLA to PEEK, PA-CF and PPS: typical starting guidance with manufacturer sources, never presented as an official requirement.

Live Activity Timers

Lock Screen and Dynamic Island show filament, target, current temperature, humidity and remaining time, straight from the device.

Zero Cloud Setup

No account, no server, no internet. Everything stays between your iPhone and your dryer.

Temperature & Humidity

Sensirion SHT40 accuracy with live charts.

Smart Drying Profiles

Built-in guidance plus your own brand profiles.

Offline History

Start/end humidity, average temperature, charts and statistics.

Safety Monitoring

Firmware limits, watchdog, fan tach, relay, thermostat and thermal fuse.

Multiple Devices

Name and switch between SpoolDry #1, #2 and more.

Lifetime Access

Pay once. Every future improvement included.

How it works

1

Build the dryer or flash the firmware to your ESP32-C6.

2

Pair it with SpoolDry over Bluetooth in seconds.

3

Pick a filament profile and start drying. Follow it on your Lock Screen.

Build Your SpoolDry

A low-voltage (24 V DC) architecture: all mains voltage stays inside a certified, enclosed power adapter. The chamber is limited to 70 °C by the fan rating; independent hardware protects against software faults.

Espressif ESP32-C6-DevKitC-1-N8

Purpose
Controller: BLE link, sensors, control loop and all firmware safety logic.
Recommended specification
ESP32-C6-WROOM-1 · RISC-V 160 MHz · BLE 5 · Wi-Fi 6 · 8 MB flash · 2× USB-C · 3.3 V logic
Why it is used
Official Espressif board, native BLE 5 with mature NimBLE support, USB-C, 8 MB flash for future dual-slot OTA, sold by major distributors.
Example links
DigiKey · Adafruit · Espressif user guide

Sensirion SHT40 breakout (Adafruit #4885)

Purpose
Measures chamber temperature and relative humidity.
Recommended specification
±0.2 °C / ±1.8 %RH typ. · −40…125 °C · I²C 0x44 · STEMMA QT
Why it is used
Modern, accurate, CRC-protected digital sensor rated to 125 °C. DHT11/DHT22 are slower and far less accurate; AHT20 has no comparable accuracy at high humidity.
Example links
Adafruit · DigiKey

Insulated PTC air heater 24 V / 100 W

Purpose
Heats the air that the fan blows through the chamber.
Recommended specification
24 V DC · ~100 W (≈4.2 A) · finned aluminium · insulated housing · self-limiting ≤200 °C surface · ~113×35×26 mm
Why it is used
Low-voltage DC (no mains switching), and PTC ceramic limits its own temperature if airflow fails: a physical safety layer.
Example links
Amazon (Bestol 24V 100W) · VXB · DBK (industrial PTC, alternative)

San Ace 80 9GA0824P4G001 (24 V, tach)

Purpose
Moves air through the PTC heater and around the spools; removes moist air.
Recommended specification
80×80×25 mm · 24 V · 0.21 A · 67 CFM · pulse sensor (2 p/rev) · −20…+70 °C · 60,000 h at 60 °C
Why it is used
Industrial ball-bearing fan rated to 70 °C with a tachometer, so the firmware detects a stalled fan and shuts the heater off. This rating sets SpoolDry's 70 °C chamber limit.
Example links
Sanyo Denki · Mouser (9GA0824P4 series)

Infineon IRLB8721PBF logic-level N-MOSFET

Purpose
Low-side switches for heater PWM (Q1), fan (Q2) and relay coil (Q3).
Recommended specification
30 V · 62 A · R_DS(on) 8.7 mΩ @ 4.5 V · TO-220 · with 100 Ω gate resistor + 10 kΩ pull-down each
Why it is used
Fully enhanced from 3.3 V logic, runs cool at 4.2 A without a heatsink. Pull-downs keep every load OFF while the ESP32 boots or resets.
Example links
Adafruit #355 · Mouser · Infineon

Omron G5LE-1A4 DC24 relay (K1)

Purpose
Second, independent heater switch in series with the MOSFET.
Recommended specification
SPST-NO · 24 V coil · 10 A contacts · + 1N4001 flyback diode
Why it is used
If Q1 fails shorted, the relay still cuts the heater. Its coil is fed through the 85 °C thermostat, so overheating opens it without any software.
Example links
DigiKey · Omron datasheet

Cantherm F20A08505ACFA06E thermostat (TS1)

Purpose
Independent hardware over-temperature protection for the chamber.
Recommended specification
85 °C ±5 K · normally closed · auto-reset · potted · 2 A (coil circuit only)
Why it is used
Opens the relay-coil circuit at 85 °C regardless of firmware state (rated 2 A, so it switches the coil, not the 4 A heater).
Example links
DigiKey · Cantherm F20 series

Cantherm SDF-DF100S thermal cutoff (TCO)

Purpose
Last-resort, non-resettable fuse in the heater current path.
Recommended specification
100 °C one-shot · 10 A AC/DC · axial · crimp, do not solder close to body
Why it is used
Covers the double fault (shorted MOSFET + welded relay). Mount it on the heater duct; replace it if it ever opens and find the cause.
Example links
DigiKey

Semitec 104GT-2 NTC thermistor + 47 kΩ 1 % resistor

Purpose
Measures heater-outlet temperature for derating and fault detection.
Recommended specification
100 kΩ @ 25 °C · B 4267 K · glass bead to 300 °C
Why it is used
Detects a stalled fan or stuck heater even if the chamber sensor reads normal.
Example links
Mouser

Mean Well GST220A24-R7B desktop adapter

Purpose
Powers everything from 24 V DC. All mains voltage stays inside this certified adapter.
Recommended specification
24 V · 9.2 A · 221 W · enclosed, safety-certified, 3-pin IEC inlet · 4-pin DIN output
Why it is used
No user mains wiring. 220 W leaves headroom for PTC inrush (2–3× nominal for seconds) plus fan and electronics.
Example links
Mouser · Newark

Kycon KPJX-PM-4S panel jack (mates with R7B plug)

Purpose
Locking 24 V input on the controller box.
Recommended specification
4-pin DIN power jack · panel mount · 7.5 A
Why it is used
Rated for the current; avoids underrated barrel jacks.
Example links
DigiKey · Kycon datasheet

ATO blade fuse 7.5 A + Littelfuse inline holder

Purpose
Protects wiring from short circuits.
Recommended specification
Slow-acting automotive blade fuse on +24 V directly after the input jack
Why it is used
Sized above heater inrush but below wire and connector ratings.
Example links
Littelfuse 0FHA0002XP (Amazon) · Keystone 3557-2 PCB holder

Pololu D24V10F5 step-down regulator

Purpose
Feeds the ESP32 board's 5 V pin from 24 V.
Recommended specification
5.1–36 V in · 5 V 1 A out · 18×13 mm
Why it is used
Efficient switching regulator; a linear regulator would overheat dropping 24 → 5 V.
Example links
Pololu

Small parts

Purpose
Assembly, connectors and passive components.
Recommended specification
Perma-Proto board · Phoenix Contact 1935161 terminal blocks · 3× 100 Ω, 4× 10 kΩ, 1× 47 kΩ 1 % · 2× 1N4001 · STEMMA QT 400 mm cable · 18 AWG silicone wire (heater) · 22 AWG (signals)
Why it is used
Screw terminals and silicone wire tolerate heat and vibration better than breadboards and PVC wire.
Example links
Adafruit Perma-Proto (Pololu) · Phoenix 1935161 (DigiKey) · Adafruit 1N4001 #755 · STEMMA QT 400 mm #5385

Hammond 1591XXDSBK ABS enclosure + insulated dry box

Purpose
Keeps electronics cool and away from the heated chamber.
Recommended specification
152×82×50 mm controller box outside the hot zone · chamber: rigid, insulated box rated ≥ 90 °C (e.g. PP/ABS with foil-faced insulation), heater duct in aluminium or ASA/PC
Why it is used
Only the sensor, NTC, heater, fan, thermostat and TCO sit inside the chamber. Never print the heater duct in PLA or PETG.
Example links
Hammond 1591XX

Bill of Materials

ComponentSelected partPurposeQtyExample links
ESP32Espressif ESP32-C6-DevKitC-1-N8Controller: BLE link, sensors, control loop and all firmware safety logic.1DigiKey · Adafruit
Temperature/humidity sensorSensirion SHT40 breakout (Adafruit #4885)Measures chamber temperature and relative humidity.1Adafruit · DigiKey
PTC heaterInsulated PTC air heater 24 V / 100 WHeats the air that the fan blows through the chamber.1Amazon (Bestol 24V 100W) · VXB
FanSan Ace 80 9GA0824P4G001 (24 V, tach)Moves air through the PTC heater and around the spools; removes moist air.1Sanyo Denki · Mouser (9GA0824P4 series)
MOSFETInfineon IRLB8721PBF logic-level N-MOSFETLow-side switches for heater PWM (Q1), fan (Q2) and relay coil (Q3).3Adafruit #355 · Mouser
Safety relayOmron G5LE-1A4 DC24 relay (K1)Second, independent heater switch in series with the MOSFET.1DigiKey · Omron datasheet
Thermostat 85 °CCantherm F20A08505ACFA06E thermostat (TS1)Independent hardware over-temperature protection for the chamber.1DigiKey · Cantherm F20 series
Thermal fuse 100 °CCantherm SDF-DF100S thermal cutoff (TCO)Last-resort, non-resettable fuse in the heater current path.1DigiKey
Heater NTCSemitec 104GT-2 NTC thermistor + 47 kΩ 1 % resistorMeasures heater-outlet temperature for derating and fault detection.1Mouser
Power supplyMean Well GST220A24-R7B desktop adapterPowers everything from 24 V DC. All mains voltage stays inside this certified adapter.1Mouser · Newark
Power connectorKycon KPJX-PM-4S panel jack (mates with R7B plug)Locking 24 V input on the controller box.1DigiKey · Kycon datasheet
FuseATO blade fuse 7.5 A + Littelfuse inline holderProtects wiring from short circuits.1Littelfuse 0FHA0002XP (Amazon) · Keystone 3557-2 PCB holder
5 V regulatorPololu D24V10F5 step-down regulatorFeeds the ESP32 board's 5 V pin from 24 V.1Pololu
Wires, terminals, passivesSmall partsAssembly, connectors and passive components.1Adafruit Perma-Proto (Pololu) · Phoenix 1935161 (DigiKey)
EnclosureHammond 1591XXDSBK ABS enclosure + insulated dry boxKeeps electronics cool and away from the heated chamber.1Hammond 1591XX

Links are examples verified during research (October 2026); availability changes. Equivalent parts with the same ratings work.

Wiring diagram

Wiring diagram

ESP32-C6 pin map

GPIOFunctionComponentDirNotes
GPIO23I²C SDASHT40I/OArduino default SDA on ESP32-C6
GPIO22I²C SCLSHT40Out100 kHz, 25 ms timeout, bus recovery
GPIO18Heater PWMQ1 gate (100 Ω, 10 kΩ pull-down)OutLEDC 1 kHz, 10-bit, soft-start
GPIO21Heater enableQ3 gate → relay K1 coilOutHIGH only while PREHEATING/DRYING
GPIO19Fan enableQ2 gate (100 Ω, 10 kΩ pull-down)OutForced ON whenever heating
GPIO20Fan tachSan Ace pulse sensorIn10 kΩ pull-up to 3V3, 2 pulses/rev
GPIO2Heater NTC (ADC1_CH2)104GT-2 + 47 kΩ to 3V3In12 dB attenuation, 8-sample average
GPIO8Status LEDOn-board RGB LEDOutStrapping pin; LED only
GPIO9Local buttonOn-board BOOT buttonInShort: stop · 3 s: reset fault · 10 s: clear bonds
5V / GNDPowerPololu D24V10F5 output—Do not also power from USB while on 24 V without care

ESP32 Setup

  1. 1. Required hardware

    ESP32-C6-DevKitC-1-N8 · USB-C data cable · SHT40 + STEMMA QT cable
    (full dryer: see the Bill of Materials above)
  2. 2. Install Arduino IDE or PlatformIO

    # Arduino IDE 2.x: https://www.arduino.cc/en/software
    # or PlatformIO Core:
    python3 -m pip install -U platformio
  3. 3. Install ESP32 board support

    # Arduino IDE → Settings → Additional boards manager URLs:
    https://espressif.github.io/arduino-esp32/package_esp32_index.json
    # Boards Manager → install "esp32 by Espressif Systems" ≥ 3.3.12
    
    # arduino-cli
    arduino-cli core update-index --additional-urls https://espressif.github.io/arduino-esp32/package_esp32_index.json
    arduino-cli core install esp32:esp32
  4. 4. Connect USB

    # Use the USB-C port labelled "UART" on the DevKitC-1.
    # Unplug the 24 V supply while flashing from your computer.
  5. 5. Select board

    # Arduino IDE: Tools → Board → esp32 → "ESP32C6 Dev Module"
    #   Flash Size: 8MB · Partition Scheme: Custom (uses SpoolDry/partitions.csv)
    # PlatformIO: board = esp32-c6-devkitc-1 (already in platformio.ini)
  6. 6. Select port

    # macOS: /dev/cu.usbserial-*  ·  Linux: /dev/ttyUSB0  ·  Windows: COM3
    arduino-cli board list
  7. 7. Install required libraries

    # Library Manager → "NimBLE-Arduino" by h2zero ≥ 2.5.1
    arduino-cli lib install "NimBLE-Arduino@2.5.1"
    # PlatformIO installs it automatically (lib_deps)
  8. 8. Compile firmware

    cd esp32
    pio run
    # or
    arduino-cli compile --fqbn esp32:esp32:esp32c6:FlashSize=8M,PartitionScheme=custom SpoolDry
  9. 9. Flash firmware

    pio run -t upload
    # or
    arduino-cli upload -p /dev/ttyUSB0 --fqbn esp32:esp32:esp32c6:FlashSize=8M,PartitionScheme=custom SpoolDry
  10. 10. Open Serial Monitor

    pio device monitor -b 115200
    # expected:
    SpoolDry firmware 1.0.0 (BLE protocol v1) ready as "SpoolDry-A1B2"
    Advertising SpoolDry service 5D0F0001-2B7E-4C8A-9B1E-53504F4F4C44
  11. 11. Verify BLE advertising

    # Any BLE scanner (e.g. nRF Connect) must show "SpoolDry-XXXX"
    # advertising service 5D0F0001-2B7E-4C8A-9B1E-53504F4F4C44
  12. 12. Open the SpoolDry iOS app

    # SpoolDry → Device → Add Dryer (Bluetooth permission prompt appears)
  13. 13. Connect device

    # Tap "SpoolDry-XXXX" → accept the iOS pairing request
    # New phones can pair within 5 min after power-on
    # (or hold BOOT for 10 s to clear bonds and reopen pairing)

Firmware download

  • Version: 1.0.0 · BLE Protocol v1
  • Board: Espressif ESP32-C6-DevKitC-1-N8 (8 MB)
  • Framework: Arduino-ESP32 3.3.x (PlatformIO: pioarduino)
  • Dependencies: NimBLE-Arduino 2.5.x (h2zero)
  • Configuration: SpoolDry/src/core/Config.h (pins, limits)
  • Partitions: SpoolDry/partitions.csv (2× 3 MB OTA slots)
  • Tests: make -C test/host test (33 safety & protocol tests)
  • Service UUID: 5D0F0001-2B7E-4C8A-9B1E-53504F4F4C44
Download firmware source (.zip)

Typical drying guidance

Typical starting guidance compiled from official manufacturer pages, not a universal requirement. Always follow your filament's data sheet. SpoolDry hardware v1 reaches 70 °C.

MaterialTypical temperatureTypical timeSpoolDry startSources
PLA45–60 °C4–8 h50 °C · 6 h · <20% RHBambu Lab: 50–60 °C · 8 h (blast oven)
Prusa Research: 45 °C · 6 h
Fiberlogy: 50 °C · 4 h
3DXTECH: 45 °C · 4 h
PETG55–70 °C4–8 h65 °C · 6 h · <20% RHBambu Lab: 60–70 °C · 8 h (blast oven)
Prusa Research: 55 °C · 6 h
Fiberlogy: 60 °C · 4 h
3DXTECH: 65 °C · 4 h
ABS60–85 °C4–8 h70 °C · 6 h · <20% RHBambu Lab: 75–85 °C · 8 h (blast oven)
Fiberlogy: 60 °C · 4 h
3DXTECH: 80 °C · 4 h
ASA65–85 °C4–8 h70 °C · 6 h · <20% RHBambu Lab: 75–85 °C · 8 h (blast oven)
Prusa Research: 80 °C · 4 h
Fiberlogy: 80 °C · 4 h
3DXTECH: 80 °C · 4 h
TPU50–75 °C4–8 h60 °C · 6 h · <15% RHBambu Lab: 65–75 °C · 8 h (blast oven)
Prusa Research: 60 °C · 4–6 h
3DXTECH: 65 °C · 4 h
PA (Nylon)70–90 °C4–12 h70 °C · 12 h · <10% RHBambu Lab: 75–85 °C · 8–12 h (blast oven)
Fiberlogy: 70 °C · 4 h
3DXTECH: 80 °C · 4 h / 90 °C · 4–6 h
PC70–90 °C4–8 h70 °C · 8 h · <15% RHPolymaker: 70–80 °C · 6–8 h
Bambu Lab: 75–85 °C · 8 h (blast oven)
Prusa Research: 85 °C · 5 h
3DXTECH: 120 °C · 4 h+
PVA55–85 °C4–12 h65 °C · 8 h · <15% RHRaise3D: 80 °C · 8–12 h
Bambu Lab: 75–85 °C · 8–12 h (blast oven)
3DXTECH: 65 °C · 4 h
BVOH50–85 °C4–12 h55 °C · 6 h · <15% RHFiberlogy: 50 °C · 4 h
Bambu Lab: 75–85 °C · 8–12 h (blast oven)
PEEK 110–150 °C120–150 °C3–6 h70 °C · 6 h · <10% RH3DXTECH: 150 °C · 3 h
PEI / ULTEM 110–150 °C130–150 °C4–8 h70 °C · 6 h · <10% RH3DXTECH: 150 °C · 4–6 h / 130 °C · 4–6 h
Prusa Research: 150 °C · 8 h
PPS 110–150 °C110–140 °C4–12 h70 °C · 6 h · <10% RHBambu Lab: 110–140 °C · 8–12 h (blast oven)
3DXTECH: 110 °C · 4 h
PA-CF70–100 °C4–12 h70 °C · 12 h · <10% RHBambu Lab: 75–85 °C · 8–12 h (blast oven)
Prusa Research: 90 °C · 6 h
Fiberlogy: 80 °C · 4 h
3DXTECH: 90 °C · 4 h
PA-GF 110–150 °C75–100 °C4–16 h70 °C · 12 h · <10% RHForward AM (BASF): 100 °C · 4–16 h
Fiberlogy: 80 °C · 4 h
3DXTECH: 90 °C · 4 h
Bambu Lab: 75–85 °C · 8–12 h (blast oven)
PETG-CF60–70 °C4–8 h65 °C · 6 h · <20% RHBambu Lab: 60–70 °C · 8 h (blast oven)
3DXTECH: 65 °C · 4 h
PLA-CF45–60 °C4–8 h50 °C · 6 h · <20% RHBambu Lab: 50–60 °C · 8 h (blast oven)
PC-CF 110–150 °C80–120 °C4–8 h70 °C · 10 h · <15% RHPrusa Research: 90 °C · 4 h
3DXTECH: 120 °C · 4 h
ASA-CF65–85 °C4–8 h70 °C · 6 h · <20% RH3DXTECH: 80 °C · 4 h
Bambu Lab: 75–85 °C · 8 h (blast oven)
PPS-CF 110–150 °C110–140 °C8–12 h70 °C · 6 h · <10% RHBambu Lab: 110–140 °C · 8–12 h (blast oven)

Safety

SpoolDry hardware is a hobby / prototyping project. It is not certified (no CE, UL or similar). You build and operate it at your own risk.
  • Never bypass the thermal fuse or the thermostat.
  • Never operate damaged wiring or connectors.
  • Use the specified, certified 24 V power supply.
  • Do not exceed the heater, wire and connector ratings.
  • Keep flammable materials away from exposed heating elements.
  • Use a proper, heat-rated enclosure; keep electronics outside the hot zone.
  • Use independent thermal protection in addition to the firmware.
  • Do not leave an experimental prototype unattended.

Protection layers

  1. Firmware: 80 °C absolute, target +8 °C/30 s, sensor CRC & plausibility, fan tach, heater-NTC derating, runaway & stuck-heater detection, 5 s watchdog
  2. Heater defaults OFF: 10 kΩ gate pull-downs, outputs driven LOW first at boot, sessions never resume after reset
  3. Two independent switches in the heater path: MOSFET Q1 + relay K1
  4. 85 °C bimetal thermostat opens the relay coil without software
  5. 100 °C one-shot thermal cutoff in the heater current
  6. Self-limiting PTC element (power collapses without airflow)
  7. 7.5 A fuse · certified, enclosed 24 V supply (no user mains wiring)

Simple pricing

Free

0

3 complete drying sessions with every feature, one dryer.

Frequently asked questions

No. SpoolDry talks to your dryer over Bluetooth LE. There is no account, no server and no cloud.

The ESP32 keeps running the session on its own with all safety limits. When you come back, SpoolDry reconnects and updates history, widgets and the Live Activity.

An Espressif ESP32-C6-DevKitC-1, a Sensirion SHT40 sensor, a 24 V PTC heater, a San Ace 80 fan, logic-level MOSFETs, a relay, an 85 °C thermostat, a 100 °C thermal cutoff and a Mean Well 24 V adapter. See the full BOM above.

Hardware v1 is limited to 70 °C chamber temperature (fan rating). That covers PLA, PETG, ABS, ASA, TPU, PA, PC and fiber-filled grades. PEEK, PEI and PPS need 110–150 °C and a dedicated dryer or vacuum oven.

A session counts when your dryer confirms the start command. Failed attempts, app launches and timer views never count. After 3 sessions, SpoolDry Lifetime unlocks unlimited use.

No. The built-in values are typical starting guidance summarised from manufacturer pages (linked). Always follow your filament's data sheet.