Skip to the content
PCBKitNew board
2 layers28.3 × 27.5 mmParticle, the printed circuit board in 3D

particle is an ESP32-C6-based particulate matter sensor. It measures PM1.0, PM2.5, and PM10, displays the latest measurements locally via an e-paper display, and can send them to a paired AQM (air quality monitor) over…

Size
28.3 × 27.5 mm
Copper layers
2
Thickness
1.6 mm
Parts
9
Nets
23
Pads
45
Tracks, vias
77, 8
Pours
1
Routed
Yes
KiCad
KiCad 10.0 (file 20260206)
Created
28 Oct 2026
Updated
28 Oct 2026

Overview

Particle is an open-source printed circuit board by Tsquash, from the Tsquash/particle repository on GitHub. It is a 2-layer board of 28.3 × 27.5 mm with 9 parts on 23 nets, routed with 77 tracks and 8 vias.

Its parts include 3 connectors, 2 switches and 1 IC. It belongs with the sensors and measurement boards and the ESP32 boards of this library.

README

README.md

particle: A Particulate Matter Sensor

particle is an ESP32-C6-based particulate matter sensor. It measures PM1.0, PM2.5, and PM10, displays the latest measurements locally via an e-paper display, and can send them to a paired AQM (air quality monitor) over Bluetooth Low Energy (BLE). The AQM is the Matter-connected device. This device acts as its PM sensor peripheral and does not commission itself as a separate Matter device.

Hardware

  • MCU: Seeed Studio XIAO ESP32-C6
  • Particulate sensor: DFRobot Fermion BMV080, connected over SPI and driven with the SparkFun BMV080 Arduino library
  • Display: 2.13", 250 x 122 pixel monochrome e-paper display using the GDEY0213B74 panel/SSD1680 driver, driven with GxEPD2 and Adafruit GFX
  • PCB Custom particle PCB, can be found in /KICAD directory

Operating modes

Standalone / Normal Operation

The PM sensor starts collecting data even when no AQM is available. It polls the BMV080 for new output approximately every 500 ms and forms one-minute averages. Measurements that are obstructed or outside the valid range are not included in the average. When all samples in an interval indicate obstruction, the display shows an obstructed status on the screen instead of a numerical reading.

Standalone operation does not require BLE or a network connection. The first boot makes one automatic attempt to pair with an AQM; the attempt ends after 2 minutes have elapsed, then the device runs standalone until pairing is explicitly requested again with the pairing button or a factory reset.

Note! Device takes a full minute from seeing the particle, Pairing Successful, or Pairing Timed Out screen to transition into displaying values on the EPD. This is due to the sensor having an initialization period.

Linked to an AQM

The PM sensor pairs with the companion Matter AQM over BLE. The AQM supplies the measurement schedule and its RTC time; the PM sensor sends its one-minute PM averages to the AQM when a BLE connection and notification subscription are available. The AQM can then use the readings in its air-quality matter cluster data. The PM sensor continues to take and display local readings if the AQM is temporarily disconnected.

Pairing is initiated automatically on the first boot. Put the AQM into its corresponding PM-pairing mode while the PM sensor displays its pairing screen. The pairing window lasts up to 120 seconds. On success, the peer is saved in non-volatile storage and the PM sensor will try to reconnect to that AQM on subsequent boots. If pairing times out, the PM sensor continues in standalone mode; hold the pairing button for one second during a later boot to try again.

Buttons

Both buttons are checked at boot. Hold the pairing button for at least one second to enter AQM pairing mode. Hold the factory reset for at least one second, then release, to factory reset.

ButtonLocationGPIOAction
AQM pairClosest to back opening0Force a new pairing attempt, replacing the previously saved AQM peer
Factory resetFurther from back opening1Erase non-volatile storage, including the saved pairing state, and restart

Build, upload, and serial output

Install PlatformIO and the Espressif platform dependencies, connect the XIAO ESP32-C6, then run these commands from the project directory:

sh
pio run -e esp32c6
pio run -e esp32c6 -t upload
pio device monitor -b 115200

The PlatformIO environment is defined in platformio.ini. The project uses the Arduino and ESP-IDF frameworks and is configured for the seeed_xiao_esp32c6 board. Serial diagnostics run at 115200 baud. Upload port selection may need to be configured for the host computer.

Project layout

text
main/                  Firmware source, display assets, and project component config
  font/                Embedded Adafruit GFX fonts
lib/                   Project-local libraries (including modified GxEPD2 and BMV080 libs)
managed_components/    ESP-IDF managed components
KICAD/                 PCB and schematic design files
2D/                    Drawings
3D/                    Board, component, and enclosure models
UI/                    Display/UI mockups and PCB graphics
.vscode/               VS Code project configuration
platformio.ini         PlatformIO build environment
sdkconfig.defaults.*   ESP-IDF default configuration for the target
huge_app.csv           ESP-IDF flash partition table
dependencies.lock      Locked ESP-IDF component dependencies

The primary firmware files are:

  • main/main.cpp: boot behavior, button handling, sensor sampling, averaging, and the main loop
  • main/sensor.cpp: BMV080 initialization and reading validation
  • main/screen.cpp: e-paper initialization, measurement display, and status screens
  • main/pm_link.cpp: BLE pairing, reconnection, timing, and PM-reading transfer
  • main/pm_protocol.h: BLE data structures shared with the companion AQM project

Parts

9
QtyValueFootprintReferences
2SW_Pushparticle_button:SW_BUTT-2SW1, SW2
1BATTERYConnector_PinHeader_2.54mm:PinHeader_1x02_P2.54mm_VerticalJ1
1BMV080Connector_PinHeader_2.54mm:PinHeader_1x07_P2.54mm_VerticalJ2
1EPDConnector_PinHeader_2.54mm:PinHeader_2x04_P2.54mm_VerticalJ3
1LOGOgraphics:2026G***
1LOGOgraphics:meG***
1LOGOgraphics:pV2G***
1XIAO-ESP32-S3-SMDxiao:XIAO-ESP32C6-SMDU1

Questions

How big is the Particle PCB?

It measures 28.3 × 27.5 mm and has 2 copper layers, 1.6 mm thick.

What parts does the Particle use?

9 parts. 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 Particle KiCad files?

From the Tsquash/particle repository on GitHub, at the commit this page was made from: the board is KICAD/particle.kicad_pcb and its schematic KICAD/particle.kicad_sch. PCBKit opens the board in the browser, with nothing to install.

Can I use the Particle design in my own project?

Its repository states no licence, so its author keeps all rights: ask Tsquash before reusing the design.

Similar boards

  • 2 layers103 × 30.5 mmTS Back Endcap, the printed circuit board in 3D

    TS Back Endcap

    EEVengers/ThunderScope

    ThunderScope GitHub Repo

    9 parts1.3kMIT
  • 2 layers31.8 × 47.6 mmNGC 38 connector, the printed circuit board in 3D

    NGC 38 connector

    rusefi/rusefi

    rusefi - GPL internal combustion engine control unit

    9 parts1.2k
  • 2 layers24 × 27.3 mmExpansion Card Retrofit, the printed circuit board in 3D

    Expansion Card Retrofit

    FrameworkComputer/ExpansionCards

    Reference designs and documentation to create Expansion Cards for the Framework Laptop

    9 parts1.1kCC-BY-4.0
  • 2 layers15.6 × 17.3 mmSKR Mini TFT Thermistor Board, the printed circuit board in 3D

    SKR Mini TFT Thermistor Board

    VoronDesign/Voron-Hardware

    Cool Hardware designed by the Voron Design group

    9 parts1.1kGPL-3.0
  • 2 layers39.1 × 49.5 mmLearnoliver, the printed circuit board in 3D

    Learnoliver

    hackclub/OnBoard

    💡 Join 1,000 teenagers and make your first PCB with a $100 grant!

    9 parts915
  • 2 layers17.4 × 16.9 mmToolhead, the printed circuit board in 3D

    Toolhead

    tanaes/whopping_Voron_mods

    9 parts787GPL-3.0
  • 2 layers9.8 × 108 mmExpander, the printed circuit board in 3D

    Expander

    wntrblm/Castor_and_Pollux

    A Juno-inspired dual oscillator

    9 parts587
  • 2 layersKeyboard after, the printed circuit board in 3D

    Keyboard after

    adamws/kicad-kbplacer

    KiCad plugin for automatic keyboard's key placement and routing

    9 parts547GPL-3.0