
Ridge3-lite
offgridevices/offgrid-hardware
Open hardware from OffGrid Devices. One folder per board. CERN-OHL-S.

Open hardware from OffGrid Devices. One folder per board. CERN-OHL-S.
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.

Status: designed and verified in simulation, not yet built. Every gate below passes on this revision; no board has been assembled or powered yet.
This folder always holds the latest revision; an ordered revision stays at
its order tag (docs/versioning.md).
| Revision | What changed | Status | Order tag |
|---|---|---|---|
| 1.0 | first design: SGP40 + SCD41 + SHT40 + NTC tab, ATmega328P, 100 dB sounder, 60 × 40 mm, 2 layers | designed and simulation-verified, not yet built | — |
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:
| Evidence | Sensor | Fires on | Alone it means |
|---|---|---|---|
| Gas | Sensirion 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 photoacoustic | rise ≥ 250 ppm/min or ≥ 1500 ppm over baseline (strong ≥ 1200 ppm/min or ≥ 4000 ppm) | WARN (someone breathing on it) |
| Heat | NTC 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/:

| Requirement | How it is checked | Met? |
|---|---|---|
| Order from PCBWay, arrive assembled and working | Gerbers + PCBWay BOM + CPL + firmware HEX in production/; all parts on top; every part has an MPN | Yes (files); hardware not yet built |
| Parts in production today | Distributor check 2026-10-14, docs/sourcing-2026-10-14.md | Yes — one NRND part replaced (NTC) |
| Latest KiCad | KiCad 10.0.6 (kicad/kicad:10.0.6-full), current stable | Yes |
| Schematic clean | kicad-cli sch erc: 0 violations | Yes |
| Board clean, fab's limits | kicad-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 current | check_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 rise | Yes |
| Schematic = circuit = board = firmware | check_netlist.py (27 nets, 0 mismatches), DRC parity, check_pins.py (11 pins, 0 mismatches) | Yes |
| Detects a vent within seconds, ignores single-cause events | HIL 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 scenarios | Yes, in simulation |
| Sounder driver safe | ngspice: drain clamped at 5.4 V on 5 V, clamp diode ≤ 0.34 A, VBUS dip ≥ 4.95 V, for 0.5–4 mH coils | Yes |
| Pack temperature good enough at the thresholds | Tolerance stack-up: ≤ 1.24 °C worst case at 65 °C; rate quantum 0.2 °C/min | Yes |
| Runs from any USB charger | 23.5 mA watching, ~520 mA worst-case peak in alarm | Yes (≤ 900 mA) |
production/canary-gerbers.zip.
production/canary-bom-pcbway.csv (MPN, maker, LCSC # for reference, notes)production/canary-cpl.csv; drawing: production/canary-assembly.pdfproduction/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.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.

t= st= tp= ... sraw= co2= rate= dtdt= e= f=).firmware/src/detect.h may move.src/models3d.py (KiCad 10.0.6 ships none).| Path | What |
|---|---|
production/ | Gerber zip, PCBWay BOM, CPL, netlist, assembly + schematic PDFs, firmware HEX |
canary.kicad_sch, canary.kicad_pcb, canary.kicad_pro | KiCad 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.md | every test with results; the trade-offs |
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.
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.mdRouting 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.
| Qty | Value | Footprint | References |
|---|---|---|---|
| 26 | 100nF 16V | C_0402_1005Metric | C10, C11, C12, C13, C15, C17, C18, C19, C20, C21, C22, C23, C34, C35, C36, C38 +10 |
| 20 | 100 k | R_0402_1005Metric | R6, R10, R13, R18, R23, R24, R26, R27, R37, R39, R41, R43, R45, R47, R52, R60 +4 |
| 12 | WS2812B-2020 | LED-SMD_4P-L2.2-W2.0-P1.00_WS2815C-2020-4P | LED1, LED2, LED3, LED4, LED5, LED6, LED7, LED8, LED9, LED10, LED11, LED12 |
| 9 | 1N4148WS | SOD-323_L1.8-W1.3-LS2.5-RD | D6, D7, D8, D9, D10, D11, D15, D17, D19 |
| 8 | 10 k | R_0402_1005Metric | R8, R11, R12, R21, R22, R25, R35, R66 |
| 6 | 1 k | R_0402_1005Metric | R17, R54, R55, R61, R69, R71 |
| 4 | 1 M | R_0603_1608Metric | R2, R4, R30, R33 |
| 4 | 100nF 100V | C_0603_1608Metric | C3, C4, C14, C27 |
| 4 | 1uF 25V | C_0603_1608Metric | C5, C32, C41, C49 |
| 4 | 4u7F 100V | C_1210_3225Metric | C50, C51, C52, C53 |
| 3 | 10nF 50V | C_0402_1005Metric | C9, C39, C40 |
| 3 | 1nF 50V | C_0402_1005Metric | C6, C8, C16 |
| 3 | 2u2F 100V | C_1210_3225Metric | C1, C2, C26 |
| 3 | BAT46WJ | SOD-323F_L2.0-W1.6-LS2.5-RD | D4, D14, D16 |
| 3 | M3 | MountingHole_M3_Washer | H1, H2, H3 |
| 2 | 10 Ohm | R_0402_1005Metric | R14, R15 |
| 2 | 10 k NTC | R0402 | RT1, RT2 |
| 2 | 100 k | R_0603_1608Metric | R19, R32 |
| 2 | 10uF 10V | C_0805_2012Metric | C30, C31 |
| 2 | 2N7002 | SOT-23_L2.9-W1.3-P1.90-LS2.4-BR | Q8, Q12 |
| 2 | 3.9 Ohm 20 W | TO-263-2 | R_PRE, R_PRE2 |
| 2 | 4u7F 10V | C_0603_1608Metric | C33, C37 |
| 2 | 5.1 k | R_0402_1005Metric | R62, R63 |
| 2 | 52.3 k | R_0402_1005Metric | R31, R34 |
| 2 | BC817 | SOT-23-3_L2.9-W1.6-P1.90-LS2.8-BR | Q5, Q10 |
| 2 | LMV331 | SOT-23-5_L3.0-W1.7-P0.95-LS2.8-BR | U8, U12 |
| 2 | MMBT5401 | SOT-23-3_L2.9-W1.3-P1.90-LS2.4-BR | Q6, Q7 |
| 1 | 0.33 Ohm | R_1206_3216Metric | R67 |
| 1 | 0.47 Ohm | R_0805_2012Metric | R68 |
| 1 | 1 M | R_0402_1005Metric | R7 |
| 1 | 1 k | R_0603_1608Metric | R28 |
| 1 | 1 mOhm | RES-SMD_4P-L3.8-W3.1 | RS1 |
| 1 | 10 Ohm | R_0603_1608Metric | R1 |
| 1 | 10 Ohm | R_0805_2012Metric | R53 |
| 1 | 10 Ohm | R_1206_3216Metric | R75 |
| 1 | 10 V | SOD-123_L2.7-W1.6-LS3.7-RD | D2 |
| 1 | 100 Ohm | R_0402_1005Metric | R16 |
| 1 | 100 Ohm | R_0805_2012Metric | R29 |
| 1 | 12 V | SOD-123_L2.7-W1.6-LS3.7-RD | D20 |
| 1 | 143 k | R_0402_1005Metric | R78 |
| 1 | 15 V | SOD-123_L2.7-W1.6-LS3.7-RD | D18 |
| 1 | 19.6 k | R_0402_1005Metric | R5 |
| 1 | 200 k | R_0402_1005Metric | R38 |
| 1 | 22nF 50V | C_0402_1005Metric | C54 |
| 1 | 2n2F 50V | C_0402_1005Metric | C29 |
| 1 | 30.9 k | R_0402_1005Metric | R76 |
| 1 | 33 Ohm | R_1206_3216Metric | R56 |
| 1 | 357 k | R_0402_1005Metric | R40 |
| 1 | 3n3F 50V | C_0402_1005Metric | C28 |
| 1 | 4.7 M | R_0603_1608Metric | R74 |
| 1 | 4.7 k | R_0402_1005Metric | R72 |
| 1 | 40 A 80 V | Fuse_Eaton_2822HC | F1 |
| 1 | 40.2 k | R_0402_1005Metric | R9 |
| 1 | 453 k | R_0402_1005Metric | R77 |
| 1 | 47 k | R_0805_2012Metric | R20 |
| 1 | 47 k | R_0402_1005Metric | R36 |
| 1 | 47 uH | L_Changjiang_FNR6045S | L1 |
| 1 | 470 k | R_0402_1005Metric | R3 |
| 1 | 49.9 k | R_0402_1005Metric | R70 |
| 1 | 499 k | R_0402_1005Metric | R42 |
| 1 | 56pF 50V | C_0402_1005Metric | C57 |
| 1 | 649 k | R_0402_1005Metric | R44 |
| 1 | 74LVC1G11 | SC-88-6_L2.0-W1.3-P0.65-LS2.1-BL | U7 |
| 1 | 787 k | R_0402_1005Metric | R46 |
| 1 | 820 Ohm | R_0402_1005Metric | R73 |
| 1 | AO3401A | SOT-23_L2.9-W1.3-P1.90-LS2.4-BR | Q9 |
| 1 | BAT54S | SOT-23-3_L3.0-W1.7-P0.95-LS2.9-BR | D5 |
| 1 | BSC070N10LS5 | PG-TDSON-8_L5.9-W5.1-P1.27-LS6.1-BL | Q11 |
| 1 | DRV5032FA | SOT-23-3_L2.9-W1.3-P0.95-LS2.4-BR | U6 |
| 1 | ER-TFT2.25-1 FPC | Hirose_FH12-8S-0.5SH_1x08-1MP_P0.50mm_Horizontal | J7 |
| 1 | INA181A2 | SOT-23-6_L2.9-W1.6-P0.95-LS2.8-BL | U2 |
| 1 | JST-XH 2S | JST_XH_B3B-XH-A_1x03_P2.50mm_Vertical_Tight | J12 |
| 1 | JST-XH 3S | JST_XH_B4B-XH-A_1x04_P2.50mm_Vertical_Tight | J11 |
| 1 | JST-XH 4S | JST_XH_B5B-XH-A_1x05_P2.50mm_Vertical_Tight | J10 |
| 1 | JST-XH 5S | JST_XH_B6B-XH-A_1x06_P2.50mm_Vertical_Tight | J9 |
| 1 | JST-XH 6S | JST_XH_B7B-XH-A_1x07_P2.50mm_Vertical_Tight | J5 |
| 1 | LM5164DDAR | SOIC-8-1EP_3.9x4.9mm_P1.27mm_EP2.41x3.3mm | U3 |
| 1 | Limit + | KEY-SMD_B3U-1000PM | SW3 |
| 1 | Limit - | KEY-SMD_B3U-1000PM | SW2 |
| 1 | MLT-8530 | BUZ-SMD_4P-L8.5-W8.5-P8.50-BR | BZ1 |
The 189 most common of 208 parts.

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

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

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

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

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

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

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

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

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

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


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.

ft-13/Picture-Frame-with-ESP32-and-Camera
Special thanks go to my wife, who has always been very patient with my handicrafts :)

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").




It measures 91.6 × 50.6 mm and has 6 copper layers, 1.6 mm thick.
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.
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.
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).