Skip to the content
6 layers91.6 × 50.6 mmSmokebreak, the printed circuit board in 3D

Open hardware from OffGrid Devices. One folder per board. CERN-OHL-S.

Size
91.6 × 50.6 mm
Copper layers
6
Thickness
1.6 mm
Parts
208
Nets
123
Pads
674
Tracks, vias
2,464, 488
Pours
29
Routed
Yes
KiCad
KiCad 10.0 (file 20260206)
Created
26 Aug 2026
Updated
6 Nov 2026

Overview

Smokebreak is an open-source printed circuit board by offgridevices, from the offgridevices/offgrid-hardware repository on GitHub, published under the CERN-OHL-S-2.0 licence. It is a 6-layer board of 91.6 × 50.6 mm with 208 parts on 123 nets, routed with 2,464 tracks and 488 vias.

It is built around the INA181A2IDBVR(LX), LM5164DDAR and LMV331IDBVR, with the 74LVC1G11GW,125-JSM, DRV5032FADBZ and RT0402BRD07100KL among its other parts. Its parts include 73 resistors, 55 capacitors, 28 diodes, 8 transistors and 6 ICs.

Main components

12

README

products/canary/README.md

Canary — first-vent detector for lithium batteries

Canary v1

Status: designed and verified in simulation, not yet built. Every gate below passes on this revision; no board has been assembled or powered yet.

Revisions

This folder always holds the latest revision; an ordered revision stays at its order tag (docs/versioning.md).

RevisionWhat changedStatusOrder tag
1.0first design: SGP40 + SCD41 + SHT40 + NTC tab, ATmega328P, 100 dB sounder, 60 × 40 mm, 2 layersdesigned and simulation-verified, not yet built—

What it is

A 60 × 40 mm board you put next to (or on) an e-bike or scooter battery while it charges. It watches for the first vent — the moment a failing cell boils off electrolyte as solvent vapour and CO₂ — which comes before self-heating, thermal runaway and smoke. A smoke alarm reacts at the end of that chain; Canary is built to react near its start.

Grid storage and EV packs already carry off-gas detectors (Honeywell BES, Li-ion Tamer). The battery charging in a hallway has nothing. Canary is that detector as an open, cheap, USB-powered board you can order fully assembled.

It fuses three kinds of evidence and needs two at once to alarm:

EvidenceSensorFires onAlone it means
GasSensirion SGP40 MOX (on the isolated sensor head)raw signal ≥ 700 ticks below its learned clean-air baseline (strong ≥ 2500)WARN (cleaning spray, solvents)
CO₂Sensirion SCD41 photoacousticrise ≥ 250 ppm/min or ≥ 1500 ppm over baseline (strong ≥ 1200 ppm/min or ≥ 4000 ppm)WARN (someone breathing on it)
HeatNTC on the thermal tab (or remote probe)≥ 50 °C, or ≥ 1 °C/min above 35 °C (strong: ≥ 65 °C, or ≥ 3 °C/min above 30 °C)WARN; strong heat alone → ALARM

ALARM = gas and CO₂ (one strong), or heat and any gas evidence, or strong heat alone; held 3 s before it sounds, latched for at least 60 s. Outputs: green breathing (watching), amber (one kind of evidence), red flashing + 100 dB 4 kHz sounder in the smoke-alarm T3 pattern. The button self-tests in normal state and hushes for 2 minutes in alarm — the hush ends early if the evidence gets worse.

Product video: a narrated 4-minute explainer, built by video/ and published rather than committed (video/README.md).

The real firmware, on a simulated ATmega328P with virtual sensors, catching a vent at 400 s (alarm 7.6 s later) — sim/hil/:

vent scenario

Requirements, and whether they are met

RequirementHow it is checkedMet?
Order from PCBWay, arrive assembled and workingGerbers + PCBWay BOM + CPL + firmware HEX in production/; all parts on top; every part has an MPNYes (files); hardware not yet built
Parts in production todayDistributor check 2026-10-14, docs/sourcing-2026-10-14.mdYes — one NRND part replaced (NTC)
Latest KiCadKiCad 10.0.6 (kicad/kicad:10.0.6-full), current stableYes
Schematic cleankicad-cli sch erc: 0 violationsYes
Board clean, fab's limitskicad-cli pcb drc --schematic-parity --severity-all: 0 errors, 0 warnings, 0 unconnected against PCBWay 2-layer limits (with margin)Yes
Clean copper, wide enough for its currentcheck_geometry.py: no corner sharper than 45° (the router's six right angles mitered by miter.py); every power track ≥ 2.4× its IPC-2221 width at a 10 °C riseYes
Schematic = circuit = board = firmwarecheck_netlist.py (27 nets, 0 mismatches), DRC parity, check_pins.py (11 pins, 0 mismatches)Yes
Detects a vent within seconds, ignores single-cause eventsHIL simulation of the real firmware: vent → ALARM in 7.6 s; spray, breath → no alarm; still detecting after 100 min of charging; 65/65 checks across 9 scenariosYes, in simulation
Sounder driver safengspice: drain clamped at 5.4 V on 5 V, clamp diode ≤ 0.34 A, VBUS dip ≥ 4.95 V, for 0.5–4 mH coilsYes
Pack temperature good enough at the thresholdsTolerance stack-up: ≤ 1.24 °C worst case at 65 °C; rate quantum 0.2 °C/minYes
Runs from any USB charger23.5 mA watching, ~520 mA worst-case peak in alarmYes (≤ 900 mA)

How to order (PCBWay, fully assembled)

  1. PCB: upload production/canary-gerbers.zip.
    • 2 layers, FR-4, 1.6 mm, 60 × 40 mm, 1 design
    • Min track/spacing 6/6 mil (the design's tightest gap is 0.2 mm), min hole 0.3 mm
    • Solder mask yellow, silkscreen black (white is fine if black is not offered on yellow)
    • Surface finish ENIG (fine-pitch DFN sensors)
    • The board has three internal routed slots (1.0 mm wide): they are intended, not errors.
  2. Assembly: turnkey, top side only, 43 placements / 27 unique parts.
    • BOM: production/canary-bom-pcbway.csv (MPN, maker, LCSC # for reference, notes)
    • Centroid: production/canary-cpl.csv; drawing: production/canary-assembly.pdf
    • J1 (USB-C) has four plated shell slots — pin-in-paste/hand-solder as PCBWay prefers.
    • Sensirion parts (U3 SGP40, U4 SHT40, U5 SCD41): no washing, no conformal coating.
  3. Programming (PCBWay offers it; ask in the order notes): flash production/canary.hex to U2 (ATmega328P) through the Tag-Connect TC2030 pads (J2, standard 6-pin AVR ISP pinout), with fuses lfuse 0xE2, hfuse 0xD9, efuse 0xFD (internal 8 MHz, no clock divider, brown-out 2.7 V). To do it yourself: a USBasp + TC2030-IDC-NL cable, then make -C firmware flash.

Case

enclosure/print/canary-v1-bumper.stl is an optional printed frame (PLA/PETG, no supports, 64 × 44 × 5 mm). The board presses in from below; its underside stays flush with the frame's so the thermal tab still lies on the pack, and the USB-C, probe connector and the sensor head's air path stay open.

bumper

Bring-up

  1. Plug a USB-C cable from any phone charger. Green blinks for 90 s (gas sensor warm-up), then breathes slowly.
  2. Press TEST/HUSH: green, amber, red sweep, a short beep, and the SGP40 self-test runs. A fault shows as an amber double blink with a chirp every minute.
  3. Telemetry: TXD pad, 3.3 V, 38400 8N1, one line a second (t= st= tp= ... sraw= co2= rate= dtdt= e= f=).
  4. Use: lay the board on the pack with the thermal tab touching it (or plug a 10 kΩ B3950 NTC probe into the JST-PH and tape it to the pack), the sensor head ("AIR IN") facing the air above the pack.

Limits — read these

  • Not a certified safety device. Keep your smoke alarm.
  • The thresholds are not yet validated against a real venting cell. The simulated worlds use stated assumptions (SGP40 drop of thousands of ticks, CO₂ rising by thousands of ppm within a minute, accelerating self-heating), based on how first vent is described for commercial off-gas detectors. A real abuse test (a cell vented beside the board, in a safe facility) is the next step, and the thresholds in firmware/src/detect.h may move.
  • No battery backup: if the outlet loses power, Canary is off.
  • Placement matters: the gas and CO₂ sensors need the vent plume to reach them; inside a closed bag or a frame with no airflow, use the probe and expect slower gas detection.
  • The ATmega328P has no USB: firmware updates need an ISP programmer.
  • 3D models for SGP40, SHT40, SCD41, the sounder and the JST connector are simple dimensioned boxes made by src/models3d.py (KiCad 10.0.6 ships none).

Files

PathWhat
production/Gerber zip, PCBWay BOM, CPL, netlist, assembly + schematic PDFs, firmware HEX
canary.kicad_sch, canary.kicad_pcb, canary.kicad_proKiCad 10 design (generated)
src/the design source: circuit.py (every part and net), schematic.py, board.py, miter.py, finish.py, fab.py, checks
firmware/AVR C firmware (detect.c is the detector logic)
sim/hil/simavr hardware-in-the-loop harness + scenarios
sim/spice/, sim/analysis/sounder driver SPICE, NTC/power/I²C analyses
video/the scripts that build the narrated product video (the MP4 is published, not committed)
web/the interactive bench page (build_page.py → one HTML file); its detector is a port of detect.c checked equal to the firmware second by second
mechanical/STEP model (zipped)
enclosure/3D-printable bumper: bumper.scad, and print/canary-v1-bumper.stl
TESTS.md, docs/decisions.mdevery test with results; the trade-offs

How to build

Needs docker (kicad/kicad:10.0.6-full), Java + xvfb (Freerouting 1.9.0 at /opt/fr/freerouting-1.9.0.jar or FREEROUTING_JAR), avr-gcc, Python 3.

sh
python3 src/make.py                 # schematic, ERC, netlist gate, place, route, DRC gate, fab
python3 src/make.py sch finish fab  # without re-routing (the routed board in out/ is reused)
make -C firmware                    # firmware only
cd sim/hil && gcc -O2 -I<simavr>/simavr/sim ... && python3 scenarios.py   # see sim/hil/README.md

Routing is done by Freerouting and is not bit-for-bit repeatable, so the committed canary.kicad_pcb is the design of record: CI rebuilds the fab outputs from it and checks they match what is committed.

Parts

208
QtyValueFootprintReferences
26100nF 16VC_0402_1005MetricC10, C11, C12, C13, C15, C17, C18, C19, C20, C21, C22, C23, C34, C35, C36, C38 +10
20100 kR_0402_1005MetricR6, R10, R13, R18, R23, R24, R26, R27, R37, R39, R41, R43, R45, R47, R52, R60 +4
12WS2812B-2020LED-SMD_4P-L2.2-W2.0-P1.00_WS2815C-2020-4PLED1, LED2, LED3, LED4, LED5, LED6, LED7, LED8, LED9, LED10, LED11, LED12
91N4148WSSOD-323_L1.8-W1.3-LS2.5-RDD6, D7, D8, D9, D10, D11, D15, D17, D19
810 kR_0402_1005MetricR8, R11, R12, R21, R22, R25, R35, R66
61 kR_0402_1005MetricR17, R54, R55, R61, R69, R71
41 MR_0603_1608MetricR2, R4, R30, R33
4100nF 100VC_0603_1608MetricC3, C4, C14, C27
41uF 25VC_0603_1608MetricC5, C32, C41, C49
44u7F 100VC_1210_3225MetricC50, C51, C52, C53
310nF 50VC_0402_1005MetricC9, C39, C40
31nF 50VC_0402_1005MetricC6, C8, C16
32u2F 100VC_1210_3225MetricC1, C2, C26
3BAT46WJSOD-323F_L2.0-W1.6-LS2.5-RDD4, D14, D16
3M3MountingHole_M3_WasherH1, H2, H3
210 OhmR_0402_1005MetricR14, R15
210 k NTCR0402RT1, RT2
2100 kR_0603_1608MetricR19, R32
210uF 10VC_0805_2012MetricC30, C31
22N7002SOT-23_L2.9-W1.3-P1.90-LS2.4-BRQ8, Q12
23.9 Ohm 20 WTO-263-2R_PRE, R_PRE2
24u7F 10VC_0603_1608MetricC33, C37
25.1 kR_0402_1005MetricR62, R63
252.3 kR_0402_1005MetricR31, R34
2BC817SOT-23-3_L2.9-W1.6-P1.90-LS2.8-BRQ5, Q10
2LMV331SOT-23-5_L3.0-W1.7-P0.95-LS2.8-BRU8, U12
2MMBT5401SOT-23-3_L2.9-W1.3-P1.90-LS2.4-BRQ6, Q7
10.33 OhmR_1206_3216MetricR67
10.47 OhmR_0805_2012MetricR68
11 MR_0402_1005MetricR7
11 kR_0603_1608MetricR28
11 mOhmRES-SMD_4P-L3.8-W3.1RS1
110 OhmR_0603_1608MetricR1
110 OhmR_0805_2012MetricR53
110 OhmR_1206_3216MetricR75
110 VSOD-123_L2.7-W1.6-LS3.7-RDD2
1100 OhmR_0402_1005MetricR16
1100 OhmR_0805_2012MetricR29
112 VSOD-123_L2.7-W1.6-LS3.7-RDD20
1143 kR_0402_1005MetricR78
115 VSOD-123_L2.7-W1.6-LS3.7-RDD18
119.6 kR_0402_1005MetricR5
1200 kR_0402_1005MetricR38
122nF 50VC_0402_1005MetricC54
12n2F 50VC_0402_1005MetricC29
130.9 kR_0402_1005MetricR76
133 OhmR_1206_3216MetricR56
1357 kR_0402_1005MetricR40
13n3F 50VC_0402_1005MetricC28
14.7 MR_0603_1608MetricR74
14.7 kR_0402_1005MetricR72
140 A 80 VFuse_Eaton_2822HCF1
140.2 kR_0402_1005MetricR9
1453 kR_0402_1005MetricR77
147 kR_0805_2012MetricR20
147 kR_0402_1005MetricR36
147 uHL_Changjiang_FNR6045SL1
1470 kR_0402_1005MetricR3
149.9 kR_0402_1005MetricR70
1499 kR_0402_1005MetricR42
156pF 50VC_0402_1005MetricC57
1649 kR_0402_1005MetricR44
174LVC1G11SC-88-6_L2.0-W1.3-P0.65-LS2.1-BLU7
1787 kR_0402_1005MetricR46
1820 OhmR_0402_1005MetricR73
1AO3401ASOT-23_L2.9-W1.3-P1.90-LS2.4-BRQ9
1BAT54SSOT-23-3_L3.0-W1.7-P0.95-LS2.9-BRD5
1BSC070N10LS5PG-TDSON-8_L5.9-W5.1-P1.27-LS6.1-BLQ11
1DRV5032FASOT-23-3_L2.9-W1.3-P0.95-LS2.4-BRU6
1ER-TFT2.25-1 FPCHirose_FH12-8S-0.5SH_1x08-1MP_P0.50mm_HorizontalJ7
1INA181A2SOT-23-6_L2.9-W1.6-P0.95-LS2.8-BLU2
1JST-XH 2SJST_XH_B3B-XH-A_1x03_P2.50mm_Vertical_TightJ12
1JST-XH 3SJST_XH_B4B-XH-A_1x04_P2.50mm_Vertical_TightJ11
1JST-XH 4SJST_XH_B5B-XH-A_1x05_P2.50mm_Vertical_TightJ10
1JST-XH 5SJST_XH_B6B-XH-A_1x06_P2.50mm_Vertical_TightJ9
1JST-XH 6SJST_XH_B7B-XH-A_1x07_P2.50mm_Vertical_TightJ5
1LM5164DDARSOIC-8-1EP_3.9x4.9mm_P1.27mm_EP2.41x3.3mmU3
1Limit +KEY-SMD_B3U-1000PMSW3
1Limit -KEY-SMD_B3U-1000PMSW2
1MLT-8530BUZ-SMD_4P-L8.5-W8.5-P8.50-BRBZ1

The 189 most common of 208 parts.

More from offgridevices/offgrid-hardware

10
  • 8 layers38 × 38 mmRidge3-lite, the printed circuit board in 3D

    Ridge3-lite

    offgridevices/offgrid-hardware

    Open hardware from OffGrid Devices. One folder per board. CERN-OHL-S.

    260 partsCERN-OHL-S-2.0
  • 8 layers36 × 36 mmRidge3-esc, the printed circuit board in 3D

    Ridge3-esc

    offgridevices/offgrid-hardware

    Open hardware from OffGrid Devices. One folder per board. CERN-OHL-S.

    193 partsCERN-OHL-S-2.0
  • 6 layers65.3 × 57.8 mmLayercam pro, the printed circuit board in 3D

    Layercam pro

    offgridevices/offgrid-hardware

    Open hardware from OffGrid Devices. One folder per board. CERN-OHL-S.

    189 partsCERN-OHL-S-2.0
  • 6 layers38 × 53.6 mmLayercam main, the printed circuit board in 3D

    Layercam main

    offgridevices/offgrid-hardware

    Open hardware from OffGrid Devices. One folder per board. CERN-OHL-S.

    168 partsCERN-OHL-S-2.0
  • 4 layers86 × 50 mmPrint hub, the printed circuit board in 3D

    Print hub

    offgridevices/offgrid-hardware

    Open hardware from OffGrid Devices. One folder per board. CERN-OHL-S.

    137 partsCERN-OHL-S-2.0
  • 6 layers36 × 36 mmRidge3-fc, the printed circuit board in 3D

    Ridge3-fc

    offgridevices/offgrid-hardware

    Open hardware from OffGrid Devices. One folder per board. CERN-OHL-S.

    124 partsCERN-OHL-S-2.0
  • 2 layers60 × 40 mmCanary, the printed circuit board in 3D

    Canary

    offgridevices/offgrid-hardware

    Open hardware from OffGrid Devices. One folder per board. CERN-OHL-S.

    52 partsCERN-OHL-S-2.0
  • 2 layers86 × 58 mmPacket logger carrier, the printed circuit board in 3D

    Packet logger carrier

    offgridevices/offgrid-hardware

    Open hardware from OffGrid Devices. One folder per board. CERN-OHL-S.

    22 partsCERN-OHL-S-2.0
  • 2 layers27.2 × 20.3 mmLayercam ring, the printed circuit board in 3D

    Layercam ring

    offgridevices/offgrid-hardware

    Open hardware from OffGrid Devices. One folder per board. CERN-OHL-S.

    11 partsCERN-OHL-S-2.0
  • 2 layers22 × 16 mmLayercam usb, the printed circuit board in 3D

    Layercam usb

    offgridevices/offgrid-hardware

    Open hardware from OffGrid Devices. One folder per board. CERN-OHL-S.

    7 partsCERN-OHL-S-2.0

Similar boards

  • 6 layers168.6 × 242.3 mmMain PDB, the printed circuit board in 3D

    Main PDB

    Malcollm/PDB

    Power distribution board pcb

    241 parts4
  • 2 layers50.8 × 37.1 mmSmart shunt, the printed circuit board in 3D

    Smart shunt

    open-pe/smart-shunt-fw

    This is a energy monitor based on the INA228. It comes with a Würth PowerPlus M5 terminals and a 4026 shunt resistor slot for resistors from e.g. Bourns, Vishay, Isabellenhütte.

    66 parts1
  • 2 layers19.2 × 8.9 mmHall sensor board, the printed circuit board in 3D

    Hall sensor board

    ft-13/Picture-Frame-with-ESP32-and-Camera

    Special thanks go to my wife, who has always been very patient with my handicrafts :)

    3 parts3
  • 6 layers58 × 72 mm12vhpwr standard, the printed circuit board in 3D

    12vhpwr standard

    nathanfraske/CEC-Platform

    ONE board file, kept current by the wave (owner directive 2026-07-25: "the current best should be placed into a candidate folder per board and kept current with only one board ideally so we have a reference").

    110 partsApache-2.0
  • 4 layers120 × 48 mmRobobuoy BMS S6 V1 0, the printed circuit board in 3D

    Robobuoy BMS S6 V1 0

    pnn69/Kicad_PCB

    Schematics and PCB's designed with Kicad

    137 parts
  • 6 layers129.8 × 57.4 mmIIsiA7 Mini, the printed circuit board in 3D

    IIsiA7 Mini

    MelkhiorVintageComputing/IIsiFPGA

    Stuff to put a FPGA in a Macintosh IIsi

    219 parts18
  • 6 layers139.7 × 88.9 mmIMX6-BareBones, the printed circuit board in 3D

    IMX6-BareBones

    a1wolfe/iMX6-BareBones

    i.MX 6ULL Open Source Development Board

    558 parts

Questions

How big is the Smokebreak PCB?

It measures 91.6 × 50.6 mm and has 6 copper layers, 1.6 mm thick.

What parts does the Smokebreak use?

208 parts, built around the INA181A2IDBVR(LX), LM5164DDAR, LMV331IDBVR and 74LVC1G11GW,125-JSM. The full list of its parts is on this page, with links to each part's symbol and footprint where PCBKit's library has them.

Where can I download the Smokebreak KiCad files?

From the offgridevices/offgrid-hardware repository on GitHub, at the commit this page was made from: the board is products/smokebreak/smokebreak.kicad_pcb and its schematic products/canary/canary.kicad_sch. PCBKit opens the board in the browser, with nothing to install.

Can I use the Smokebreak design in my own project?

Its repository publishes it under the CERN-OHL-S-2.0 licence: you may reuse it on that licence's terms (keep the author's notice, and for a copyleft licence share your changes alike).