Skip to the content
PCBKitNew board
2 layers58.9 × 34.4 mmCrowdAware Node v1.0, the printed circuit board in 3D

Scalable, privacy-aware crowd flow monitoring

Size
58.9 × 34.4 mm
Copper layers
2
Thickness
1.6 mm
Parts
10
Nets
33
Pads
52
Tracks, vias
16, 0
Pours
2
Routed
Yes
KiCad
KiCad 10.0 (file 20260206)
Created
29 Apr 2025
Updated
26 Apr 2026

Overview

CrowdAware Node v1.0 is an open-source printed circuit board by crowdaware-inno-wing-iot, from the crowdaware-inno-wing-iot/crowdaware-node repository on GitHub, published under the GPL-3.0 licence. It is a 2-layer board of 58.9 × 34.4 mm with 10 parts on 33 nets, routed with 16 tracks and 0 vias.

It is built around the MLX90640ESF-BAA-000-TU. Its parts include 2 capacitors, 2 resistors and 1 connector. It belongs with the radio and wireless and home automation and IoT boards and the ESP32 boards of this library.

Main components

1

README

README.md

CrowdAware

CrowdAware is a privacy-aware crowd monitoring prototype that uses low-resolution thermal sensors (MLX90640, 32x24) and edge processing on ESP32 nodes.

Instead of using RGB video, each node detects moving heat blobs, estimates person centroids, and transmits compact telemetry to a central receiver for live visualization and analytics.

image

Why this project

Conventional crowd monitoring systems often trade privacy for visibility. CrowdAware is designed to keep personally identifying information out of the data path while still enabling:

  • occupancy awareness
  • movement and flow analysis
  • congestion monitoring

Current implementation status

This repository currently includes:

  • ESP32 (Heltec WiFi LoRa 32 v3) node firmware for MLX90640 capture and on-device detection
  • Wi-Fi UDP telemetry transport (current active path)
  • Windows Python parser/visualizer for receiving and rendering node output
  • hardware design files for a custom node PCB

The report references LoRaWAN architecture goals. In this codebase, Wi-Fi UDP is the active telemetry path used for development and visualization.

Repository structure

text
Firmware/
	node/                          # ESP32 + MLX90640 node firmware
Visualization/
	parser_win.py                  # UDP receiver + OpenCV live visualizer
PCB Files/
	Altium Files/                  # Schematic + PCB source
	Gerber Files/                  # Manufacturing outputs
README.md

System architecture

  1. Sensor capture
  • ESP32 reads thermal frames from MLX90640 (32x24) over I2C.
  1. On-node processing
  • Convert raw temperatures to 8-bit grayscale.
  • Build/update a running background model.
  • Detect moving hot regions with a lightweight pipeline.
  • Extract person candidates (centroid and area).
  1. Telemetry
  • Serialize processing outputs and detections into a binary packet.
  • Fragment into 4 UDP datagrams with sequence metadata.
  • Transmit to the visualization host.
  1. Central parsing and visualization
  • Reassemble fragments.
  • Decode intermediate images and detections.
  • Render a 2x2 diagnostic view with overlays.

Detection pipeline (firmware)

Implemented in the thermal processor:

  1. Background subtraction
  • Current frame minus running average background.
  1. Morphological opening
  • 3x3 erosion then 3x3 dilation to reduce noise and split weak bridges.
  1. Gaussian blur
  • 3x3 blur to smooth local artifacts.
  1. Distance transform
  • Approximate foreground distance map.
  1. Watershed-like region extraction
  • Connected-region labeling on thresholded distance map.
  • Per-region centroid and area extraction.
  • Area filtering via configurable min/max thresholds.

Adaptive behavior:

  • Background is initialized over N frames.
  • Background updates continue only when no people are detected to reduce contamination.

Packet protocol

Binary packet (reassembled payload)

  • Header magic: FE 01 FE 01
  • Payload length: uint16 little-endian
  • Payload layout:
    • thermal image (768 bytes)
    • background image (768 bytes)
    • distance map (768 bytes)
    • labeled image (768 bytes)
    • num_detected (1 byte)
    • per detection: y (1), x (1), area (uint16 LE)

UDP fragment packet

  • Header magic: FE 02 FE 02
  • Sequence: uint16 little-endian
  • Fragment index: uint8
  • Fragment count: uint8 (fixed at 4)
  • Payload size: uint16 little-endian
  • Payload bytes

Parser behavior:

  • Waits for all 4 fragments for a (sender_ip, sequence) frame.
  • Concatenates fragments in index order.
  • Drops stale partial frames after timeout.

Quick start

1) Firmware (Heltec WiFi LoRa 32 v3 node)

Prerequisites:

  • Arduino IDE with Heltec WiFi LoRa 32(v3) board support
  • MLX90640-compatible libraries required by the firmware

Open and configure:

  • Sketch: Firmware/node/node.ino
  • Main config: Firmware/node/config.h

Update at minimum:

  • WIFI_SSID
  • WIFI_PASSWORD
  • WIFI_REMOTE_IP_A..D (host running parser)
  • WIFI_REMOTE_PORT (default 5100)
  • NODE_DEVICE_ID (if using multiple nodes)

Upload firmware to ESP32, then open serial monitor (57600 baud) if needed for diagnostics.

2) Visualization receiver (Windows)

From repository root:

powershell
pip install numpy opencv-python
python Visualization/parser_win.py

Expected behavior:

  • Listener starts on 0.0.0.0:5100.
  • OpenCV window shows a 2x2 panel:
    • Raw image
    • Background
    • Distance map
    • Watershed labels
  • Detected blobs and (x,y) coordinates are overlaid on the raw panel.

Press q to close the visualizer.

Runtime tuning via serial commands

The firmware accepts newline-terminated commands over serial to tune processing without recompiling.

Supported command format:

text
SET_DT_BG_THRESHOLD=<int>
SET_DT_MAX_DISTANCE=<int>
SET_MIN_PERSON_AREA=<int>
SET_MAX_PERSON_AREA=<int>
SET_BG_FRAME_COUNT=<int>
SET_TEMP_MIN=<float>
SET_TEMP_MAX=<float>

Notes:

  • Changing SET_BG_FRAME_COUNT triggers background re-initialization.
  • TEMP_RANGE is derived internally from min/max values.

Hardware

Node hardware files are provided in:

  • PCB Files/Altium Files/
  • PCB Files/Gerber Files/

These include board-level design artifacts for the thermal node platform.

Known limitations

  • Current telemetry path in code is Wi-Fi UDP, not production LoRaWAN.
  • Deployment and parameter management still rely on source-level/serial workflows.
  • Multi-node global fusion and de-duplication are currently outside this repository's Python visualizer scope.

Suggested next milestones

  • Add a central server service for multi-node ingestion and global coordinate fusion.
  • Build an operator/admin UI for node registration, calibration, and parameter control.
  • Add replay logging and offline evaluation tools for algorithm benchmarking.

Team

Innovation Wing IoT Team

  • Ilo Japar
  • Zhifang Li
  • Nuth Kitchongcharoenying
  • Netitorn Kawmali
  • Pitimontreekul Chalida

Parts

10
QtyValueFootprintReferences
21k 0603 10%MyLib:R_0603_1608Metric_Pad0.98x0.95mm_HandSolderR1, R2
1100u 10V 1206Capacitor_SMD:C_1206_3216Metric_Pad1.33x1.80mm_HandSolderC1
110u 10V 1206Capacitor_SMD:C_1206_3216Metric_Pad1.33x1.80mm_HandSolderC2
12 pcs 1x20 socket 2.54mmLibrary:Connector_HeltecWiFiLoRa32v3J1
1MLX90640ESF-BAA-000-TULibrary:MLX90640ESF-BAA-000-TUA1

The 6 most common of 10 parts.

Questions

How big is the CrowdAware Node v1.0 PCB?

It measures 58.9 × 34.4 mm and has 2 copper layers, 1.6 mm thick.

What parts does the CrowdAware Node v1.0 use?

10 parts, built around the MLX90640ESF-BAA-000-TU. 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 CrowdAware Node v1.0 KiCad files?

From the crowdaware-inno-wing-iot/crowdaware-node repository on GitHub, at the commit this page was made from: the board is PCB/CrowdAware Node v1.0.kicad_pcb and its schematic PCB/CrowdAware Node v1.0.kicad_sch. PCBKit opens the board in the browser, with nothing to install.

Can I use the CrowdAware Node v1.0 design in my own project?

Its repository publishes it under the GPL-3.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).

Similar boards

  • 2 layers72.4 × 42.4 mmWork, the printed circuit board in 3D

    Work

    Heartland-Data/esp32-mintia-sensor-kit

    本リポジトリは、MINTIAケースにESP32と各種センサを組み込む試作用ファームウェアの参考実装です。

    71 parts1Apache-2.0
  • 2 layers56 × 75 mmSurvivornode, the printed circuit board in 3D

    Survivornode

    aneeshlingala/FirstResponderSystem

    reverie hacks submission

    16 parts
  • 2 layersThermal Camera, the printed circuit board in 3D

    Thermal Camera

    Cameronrlewis/Thermal-Camera-Project

    Repository for a new PCB Project

    56 parts
  • 2 layers80 × 40 mmHKU Thermal Node Rev1.1, the printed circuit board in 3D

    HKU Thermal Node Rev1.1

    jhbryan0817-del/IoT_Beyond_Lab_Thermal_ML

    Privacy-oriented thermal occupancy estimation with edge ML for HKU learning spaces.

    14 parts
  • 2 layers57 × 55.2 mmLogicAnalyzer, the printed circuit board in 3D

    LogicAnalyzer

    gusmanb/logicanalyzer

    24 channel, 100Msps logic analyzer hardware and software

    10 parts5.1kGPL-3.0
  • 2 layers32.2 × 15.4 mmProtector, the printed circuit board in 3D

    Protector

    byrantech/laptop

    anyon_e, a highly integrated, high end, open source laptop. Attempt the impossible.

    10 parts4.3kMIT
  • 2 layers26 × 18 mmConn, the printed circuit board in 3D

    Conn

    yaqwsx/KiKit

    Automation tools for KiCAD

    10 parts2.1kMIT