
LogHeat
IfTrueEqualsEqualsTrue/LogHeat
This project is a temperature logging system developed during the 2024 Biomedical Engineering Master Class at Grenoble INP.

Outdoor environmental monitoring system built on a Raspberry Pi Pico W. Sensors are read every 30 minutes, uploaded over WiFi to a FastAPI server running on a Raspberry Pi, and displayed in a browser dashboard.
Sensor hub is an open-source printed circuit board by CustomStuffs, from the CustomStuffs/sensor-projekt-V2 repository on GitHub. It is a 2-layer board of 100 × 100 mm with 64 parts on 57 nets, routed with 691 tracks and 47 vias.
It is built around the ADS1115IDGSR, VEML7700-TT and AD8603AUJZ-R2, with the AP2112K-3.3TRG1, 1N4148W and BC817-40 among its other parts. Its parts include 17 capacitors, 14 resistors, 11 connectors, 5 ICs and 3 diodes. It belongs with the sensors and measurement boards and the RP2040 boards of this library.
Outdoor environmental monitoring system built on a Raspberry Pi Pico W. Sensors are read every 30 minutes, uploaded over WiFi to a FastAPI server running on a Raspberry Pi, and displayed in a browser dashboard.
Pico W (MicroPython)
└─ POST JSON ──► RPi FastAPI server (port 8080)
└─ SQLite DB
└─ Static files ──► Browser dashboardRemote access via Tailscale VPN — no port forwarding, no auth layer needed.
| Sensor | Chip / interface | Board connection | Measures |
|---|---|---|---|
| Temperature | DS18B20, 1-Wire (GP8) | W1 (J2) | °C |
| Humidity | DHT22, GP9 | W2 (J3) | % RH + °C fallback |
| pH | AD8603 buffer → ADS1115 AIN0 (I2C, GP2/3) | BNC (J1), guarded input | pH 0–14 |
| Light | VEML7700, I2C (GP2/3) | on the board, under a light pipe to the lid | lux |
| Soil moisture | Capacitive, Pico ADC (GP26) | J11 solder holes (GP26–28) | % |
| Motion | PIR, GP11 (also wake IRQ), power-gated by GP12 | W3 (J4) | boolean |
| Water level | Float switch, GP16 | W4 (J5) | float |
| Probe temperature | NTC → ADS1115 AIN1 | J8 pins 3/4 | °C (for compensation) |
| EC | not on the v1 board (LMP91200 is EOL; firmware driver exists, keep ec disabled) | — | µS/cm |
All sensor fields are nullable — unconnected sensors send null.
The PCB carries two independent SPDT relays (K1 on GP10, K2 on GP15), rated 230 VAC / 5 A with reinforced insulation to the sensor side, as a hard minimum. Both relays can be switched and scheduled from the dashboard, and local sensor rules can target either one ("relay": 2 in a rule; default is relay 1). This allows two simultaneous actuator channels (e.g. pump + valve) without external modules. Future board variants can add more relays.
firmware/src/config.jsonconfig.jsonfirmware/ MicroPython source + flash/dev tools
server/ FastAPI app, SQLite schema, systemd unit
dashboard/ Vanilla HTML/JS/CSS frontend
hardware/ KiCad project + generation scripts, BOM, JLCPCB order filesEach folder has its own CLAUDE.md with subproject-specific rules.
Requires MicroPython 1.28+ (RPI_PICO_W build).
cd firmware
bash tools/setup.sh # install mpremote, check device
cp src/config.json.example src/config.json # fill in WiFi + server URL
bash tools/flash.sh # copy all files to device
bash tools/monitor.sh # watch serial outputFor daily development, use the mount workflow instead of reflashing:
bash tools/mount.sh # edits in src/ take effect on Ctrl-Dcd server
pip install -r requirements.txt
uvicorn api.main:app --host 0.0.0.0 --port 8080Or run as a systemd service:
sudo cp sensor_hub.service /etc/systemd/system/
sudo systemctl enable --now sensor_hubServed as static files by the FastAPI server — no build step. Open http://<pi-ip>:8080 in a browser.
100 × 100 mm, 2-layer PCB (hardware/kicad/), generated and routed by the scripts in hardware/tools/. JLCPCB fabricates the board and places all SMD parts (hardware/fab/, regenerate with python3 hardware/tools/jlc_export.py); the through-hole parts — Pico WH sockets, relays, Wago push-in terminals, BNC, X2 capacitors, UART header — are hand-soldered. Details: hardware/CLAUDE.md and hardware/docs/.
ADC(29) (GPIO29), not ADC(3). On Pico W, GPIO29 is the VSYS/3 voltage divider. ADC(3) reads GPIO3 (I2C SCL) and gives garbage.wlan.active(True) — GPIO29 is shared with the WiFi SPI bus and returns wrong values while the radio is up.machine.lightsleep(ms) can fail silently on Pico W after WiFi use. The firmware falls back to time.sleep() automatically and logs when this happens.mpremote (bash tools/monitor.sh), not minicom. On immutable distros (Bazzite/Silverblue), minicom is not available.mpremote unreachable. Flash immediately after plugging in USB, or interrupt via REPL first.| State | Current |
|---|---|
| Lightsleep | 0.30 mA |
| Sensing (all sensors) | 25 mA |
| WiFi active | 80 mA |
| Average (30 min cycle) | ~1.2 mA |
A 10 000 mAh power bank lasts roughly 6–11 months.
MIT
| Qty | Value | Footprint | References |
|---|---|---|---|
| 9 | 100nF | Capacitor_SMD:C_0603_1608Metric | C1, C2, C6, C7, C8, C9, C10, C11, C12 |
| 4 | 10k | Resistor_SMD:R_0603_1608Metric | R6, R7, R9, R17 |
| 4 | 10uF | Capacitor_SMD:C_0805_2012Metric | C13, C14, C15, C16 |
| 4 | MountingHole_3.2mm_M3 | MountingHole:MountingHole_3.2mm_M3 | H1, H2, H3, H4 |
| 3 | 4k7 | Resistor_SMD:R_0603_1608Metric | R5, R10, R11 |
| 3 | MountingHole_2.2mm_M2 | MountingHole:MountingHole_2.2mm_M2 | H5, H6, H7 |
| 2 | 100R | Resistor_SMD:R_1206_3216Metric | R19, R20 |
| 2 | 100k | Resistor_SMD:R_0603_1608Metric | R2, R3 |
| 2 | 100nF X2 275VAC | Capacitor_THT:C_Rect_L13.0mm_W6.0mm_P10.00mm_FKS3_FKP3_MKS4 | C19, C20 |
| 2 | 1N4148W | Diode_SMD:D_SOD-123 | D2, D3 |
| 2 | 1k | Resistor_SMD:R_0603_1608Metric | R8, R18 |
| 2 | 1uF | Capacitor_SMD:C_0603_1608Metric | C17, C18 |
| 2 | BC817-40 | Package_TO_SOT_SMD:SOT-23 | Q1, Q3 |
| 2 | G2RL-1-E DC5 | Relay_THT:Relay_SPDT_Omron_G2RL-1-E | K1, K2 |
| 1 | 1-1478035-0 | Connector_Coaxial:BNC_TEConnectivity_1478035_Horizontal | J1 |
| 1 | 10M | Resistor_SMD:R_0603_1608Metric | R1 |
| 1 | AD8603AUJZ | Package_TO_SOT_SMD:TSOT-23-5 | U4 |
| 1 | ADS1115IDGSR | Package_SO:MSOP-10_3x3mm_P0.5mm | U2 |
| 1 | AP2112K-3.3TRG1 | Package_TO_SOT_SMD:SOT-23-5 | U5 |
| 1 | BAV99 | Package_TO_SOT_SMD:SOT-23 | D1 |
| 1 | BSS84PXUMA1 | Package_TO_SOT_SMD:SOT-23 | Q2 |
| 1 | Debug-UART | Connector_PinHeader_2.54mm:PinHeader_1x04_P2.54mm_Vertical | HDR1 |
| 1 | NetTie_2 | NetTie:NetTie-2_SMD_Pad0.5mm | NT1 |
| 1 | Pico WH | Module:RaspberryPi_Pico_Common_THT | U1 |
| 1 | Spare-GPIO | Connector_PinHeader_2.54mm:PinHeader_2x08_P2.54mm_Vertical | J11 |
| 1 | VEML7700-TT | sensor_hub:VEML7700_TT | U6 |
| 1 | Wago-DHT22 | TerminalBlock_WAGO:TerminalBlock_WAGO_2601-1103_1x03_P3.50mm_Horizontal | J3 |
| 1 | Wago-DS18B20 | TerminalBlock_WAGO:TerminalBlock_WAGO_2601-1103_1x03_P3.50mm_Horizontal | J2 |
| 1 | Wago-EC4pin | TerminalBlock_WAGO:TerminalBlock_WAGO_2601-1104_1x04_P3.50mm_Horizontal | J8 |
| 1 | Wago-GP16 | TerminalBlock_WAGO:TerminalBlock_WAGO_2601-1103_1x03_P3.50mm_Horizontal | J5 |
| 1 | Wago-GP17 | TerminalBlock_WAGO:TerminalBlock_WAGO_2601-1103_1x03_P3.50mm_Horizontal | J6 |
| 1 | Wago-PIR | TerminalBlock_WAGO:TerminalBlock_WAGO_2601-1103_1x03_P3.50mm_Horizontal | J4 |
| 1 | Wago-Power | TerminalBlock_WAGO:TerminalBlock_WAGO_2601-1102_1x02_P3.50mm_Horizontal | J9 |
| 1 | Wago-Relay1 | TerminalBlock_WAGO:TerminalBlock_WAGO_236-403_1x03_P5.00mm_45Degree | J7 |
| 1 | Wago-Relay2 | TerminalBlock_WAGO:TerminalBlock_WAGO_236-403_1x03_P5.00mm_45Degree | J10 |
It measures 100 × 100 mm and has 2 copper layers, 1.6 mm thick.
64 parts, built around the ADS1115IDGSR, VEML7700-TT, AD8603AUJZ-R2 and AP2112K-3.3TRG1. 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 CustomStuffs/sensor-projekt-V2 repository on GitHub, at the commit this page was made from: the board is hardware/kicad/sensor_hub.kicad_pcb and its schematic PCB/V1 pico sensorhub/V1 pico sensorhub.kicad_sch. PCBKit opens the board in the browser, with nothing to install.
Its repository states no licence, so its author keeps all rights: ask CustomStuffs before reusing the design.

IfTrueEqualsEqualsTrue/LogHeat
This project is a temperature logging system developed during the 2024 Biomedical Engineering Master Class at Grenoble INP.

jayis1/hardware-design-lab
Full-cycle hardware device designs — each device in its own subfolder with architecture, schematics, PCB layout, and software stack

Eniemooo/Sensor-HAT
Open-hardware indoor air sensor (CO2, VOC/NOx, T/RH, light, sound): HAT for Raspberry Pi or standalone with Seeed XIAO + ESPHome. KiCad 10.




vbartusevicius/weather-station
Open-source rooftop weather and air-quality station with no moving parts (Ø 96 × 235 mm, UV-stabilised ASA): ultrasonic wind, acoustic rain and hail, UV / sunlight / night-sky brightness, temperature, humidity…

KarpelesLab/ledger_implant_detector
A small hand-held tool for spotting extra conductive structures hidden inside the plastic shell of a hardware wallet (e.g. a Ledger).