Skip to content
All projects
HardwareIn Progress2026 – present

Custom Sensor Telemetry Board

Custom 2-layer STM32F411 PCB with FreeRTOS environmental telemetry

MCU

STM32F411 (LQFP-48)

Board

2-layer · 50 × 40 mm

Sensor

BME280 @ I²C 400 kHz

Link

UART 921600 baud · USB-C

01Overview

An end-to-end embedded product spanning schematic capture, PCB layout, manufacturing, and firmware. The board integrates an STM32F411 microcontroller, a Bosch BME280 environmental sensor on the I²C bus, and USB-C connectivity through a CP2102 UART-to-USB bridge, all on a compact 2-layer board fabricated and assembled through JLCPCB PCBA.

The goal was to own the full hardware-to-firmware stack: design the electronics, get the board manufactured, bring it up on the bench, and write the FreeRTOS firmware that turns raw sensor reads into a reliable telemetry stream.

02Problem Statement

Off-the-shelf dev boards hide the engineering that matters in embedded work: power sequencing, decoupling, bus layout, and bring-up. Building a custom board surfaces all of it.

The system needs to sample environmental data continuously while transmitting telemetry without dropping samples or corrupting the shared buffer. That is a concurrency problem that maps naturally onto an RTOS.

03Architecture

Hardware: STM32F411 in an LQFP-48 package is the controller. A 3.3 V LDO regulator with proper decoupling supplies the MCU and peripherals. The BME280 sits on the I²C bus; a CP2102 bridges the MCU's UART to a USB-C connector for host telemetry and power. An SWD debug header exposes the core for flashing and live debugging.

Firmware: FreeRTOS schedules two concurrent tasks. A sensor-acquisition task reads the BME280 over I²C at 400 kHz, and a telemetry task transmits over UART at 921600 baud. The tasks communicate through a shared buffer protected by a mutex so producer and consumer never tear a sample.

Layout: signal paths were routed with power integrity and I²C bus topology in mind, keeping the bus short and clean and placing decoupling close to the supply pins.

signal_path.svghover or tap a block
5V3V3USBUARTI²CUSB-CHost link + powerCP2102UART to USBSTM32F411Cortex-M4 / FreeRTOSBME280Env. sensorSWD3.3 V LDOPower regulation
STM32F411The controller. FreeRTOS runs an I²C acquisition task and a UART telemetry task that share a mutex-protected buffer.

04Technical Challenges

Power sequencing and bring-up

Early board revisions exposed power-sequencing and bring-up issues that prevented clean start-up. Diagnosing them on the bench and respinning the layout was the core hardware challenge, and it drove multiple board revisions before the board came up reliably.

I²C bus integrity at 400 kHz

Running the BME280 at I²C Fast Mode (400 kHz) requires a clean bus: short traces, correct pull-ups, and careful placement. Bus layout was treated as a first-class signal-integrity concern rather than an afterthought.

Lossless concurrent telemetry

Acquisition and transmission run concurrently, so the shared sample buffer is a contention point. A mutex guards it to guarantee that the telemetry task never reads a partially-written sample.

05Implementation Details

Schematic and 2-layer layout in KiCad

Designed the full schematic and a 2-layer, 50 × 40 mm board in KiCad: STM32F411 (LQFP-48), BME280 over I²C, CP2102 USB-C bridge, 3.3 V LDO with decoupling, and an SWD header. Components were selected and signal paths routed with power integrity and I²C bus layout as explicit constraints.

Manufacturing and assembly

The board was manufactured and assembled through JLCPCB PCBA, then brought up on the bench. Multiple revisions resolved the power-sequencing and bring-up issues found during testing.

FreeRTOS firmware in C

Firmware is written in C on the STM32F411 using FreeRTOS. Concurrent tasks handle sensor acquisition and telemetry transmission, with mutex-protected shared buffers coordinating data between them. I²C runs at 400 kHz; UART telemetry runs at 921600 baud.

Timing validation

Bus and link timing were validated with a logic analyzer against the datasheet specifications to confirm the I²C transactions and UART framing behaved as expected.

06Key Engineering Decisions

Custom board over a dev kit

Designing a custom 2-layer board, rather than wiring a dev kit, was a deliberate choice to own power design, decoupling, and bus layout end to end, which is exactly the skill set embedded roles screen for.

FreeRTOS for concurrency

Acquisition and transmission are naturally concurrent with different timing needs, so an RTOS with mutex-protected sharing is a cleaner, more scalable model than a hand-rolled superloop.

CP2102 + USB-C for the host link

A dedicated UART-to-USB bridge keeps the host interface simple and robust while freeing the MCU to focus on acquisition, and USB-C gives a modern, reversible connector for power and data.

07Future Improvements

  • Add DMA-driven I²C and UART to offload the CPU during transfers.
  • Introduce a framing/CRC layer on the telemetry stream for integrity checking on the host side.
  • Add a host-side dashboard to visualize the environmental telemetry in real time.
  • Characterize current draw and add low-power sleep states between samples.

08Media & Documentation

Visual documentation for this project. Placeholders below are reserved for assets being produced during development.

PCB renderKiCad 3D render of the 2-layer board
Asset pending
PCB photoAssembled board after JLCPCB PCBA
Asset pending
Logic analyzerI²C @ 400 kHz transaction capture
Asset pending
System diagramSensor → MCU → USB-C telemetry path
Asset pending

Open to opportunities

Seeking Fall 2026 embedded / firmware / hardware co-op.

If you're hiring for embedded, firmware, or hardware roles, I'd be glad to talk through my projects and how I work. The fastest way to reach me is email.