

Particle
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.mdparticle: 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.
| Button | Location | GPIO | Action |
|---|---|---|---|
| AQM pair | Closest to back opening | 0 | Force a new pairing attempt, replacing the previously saved AQM peer |
| Factory reset | Further from back opening | 1 | Erase 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:
pio run -e esp32c6
pio run -e esp32c6 -t upload
pio device monitor -b 115200The 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
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 dependenciesThe primary firmware files are:
main/main.cpp: boot behavior, button handling, sensor sampling, averaging, and the main loopmain/sensor.cpp: BMV080 initialization and reading validationmain/screen.cpp: e-paper initialization, measurement display, and status screensmain/pm_link.cpp: BLE pairing, reconnection, timing, and PM-reading transfermain/pm_protocol.h: BLE data structures shared with the companion AQM project
Parts
9| Qty | Value | Footprint | References |
|---|---|---|---|
| 2 | SW_Push | particle_button:SW_BUTT-2 | SW1, SW2 |
| 1 | BATTERY | Connector_PinHeader_2.54mm:PinHeader_1x02_P2.54mm_Vertical | J1 |
| 1 | BMV080 | Connector_PinHeader_2.54mm:PinHeader_1x07_P2.54mm_Vertical | J2 |
| 1 | EPD | Connector_PinHeader_2.54mm:PinHeader_2x04_P2.54mm_Vertical | J3 |
| 1 | LOGO | graphics:2026 | G*** |
| 1 | LOGO | graphics:me | G*** |
| 1 | LOGO | graphics:pV2 | G*** |
| 1 | XIAO-ESP32-S3-SMD | xiao:XIAO-ESP32C6-SMD | U1 |
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 mm

- 2 layers31.8 × 47.6 mm

- 2 layers24 × 27.3 mm

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 mm

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 mm

Learnoliver
hackclub/OnBoard
💡 Join 1,000 teenagers and make your first PCB with a $100 grant!
9 parts915 - 2 layers17.4 × 16.9 mm

- 2 layers9.8 × 108 mm

- 2 layers

Keyboard after
adamws/kicad-kbplacer
KiCad plugin for automatic keyboard's key placement and routing
9 parts547GPL-3.0