Files
esp32_NPM_only/README.md
PaulVua da7fafabda Update documentation: Add README and revise CLAUDE.md
- Created comprehensive README.md with:
  - Project overview and features
  - Hardware requirements and wiring diagram
  - Installation and usage instructions
  - Detailed troubleshooting guide
  - Learning objectives for students
  - NextPM protocol reference

- Updated CLAUDE.md to reflect:
  - Simplified educational implementation
  - Removal of particle counts
  - Current function structure
  - Educational focus and objectives

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-06 11:50:27 +01:00

11 KiB
Raw Blame History

ESP32 NextPM Sensor Reader

An educational ESP32 project for reading particulate matter (PM) concentrations from a NextPM sensor via UART serial communication. This simplified implementation is designed to help students understand serial communication protocols, binary data parsing, and sensor integration.

📋 Table of Contents

About Particulate Matter

Particulate Matter (PM) refers to tiny particles suspended in the air that can be harmful to human health. This project measures three types:

  • PM1.0: Particles with diameter < 1.0 micrometers
  • PM2.5: Particles with diameter < 2.5 micrometers (common air quality metric)
  • PM10: Particles with diameter < 10 micrometers

Values are reported in µg/m³ (micrograms per cubic meter).

Features

  • Reads PM1.0, PM2.5, and PM10 concentrations from NextPM sensor
  • Uses UART serial communication with 8E1 parity
  • Binary protocol with checksum validation
  • Non-blocking timing pattern with millis()
  • Extensively commented code for educational purposes
  • Real-time data output to Serial Monitor
  • Error handling and debugging support

Hardware Requirements

Component Specification
Microcontroller ESP32 development board
Sensor NextPM (NPM) particulate matter sensor
Connections UART (Serial) communication
Power Supply USB (for ESP32) + sensor power supply

Wiring Connections

Connect the NextPM sensor to your ESP32 as follows:

NextPM Sensor ESP32 Board
TX (Transmit) GPIO 39 (RX)
RX (Receive) GPIO 32 (TX)
GND GND
VCC External power supply (check sensor voltage requirements)

Important Notes:

  • The NextPM sensor typically requires an external power supply (check your sensor's datasheet)
  • ESP32 GPIO 39 is input-only (perfect for RX)
  • Do not connect sensor VCC to ESP32 3.3V unless your sensor specifically supports it

Connection Diagram

┌──────────────┐              ┌──────────────┐
│              │              │              │
│   NextPM     │              │    ESP32     │
│   Sensor     │              │              │
│              │              │              │
│         TX ──┼──────────────┼─→ GPIO 39    │
│              │              │   (RX)       │
│         RX ←─┼──────────────┼── GPIO 32    │
│              │              │   (TX)       │
│              │              │              │
│        GND ──┼──────────────┼── GND        │
│              │              │              │
│        VCC ──┼─→ External   │              │
│              │   Power      │              │
└──────────────┘              └──────────────┘

Software Requirements

  • PlatformIO - Modern embedded development platform

    • Recommended: Use PlatformIO IDE extension for VS Code
    • Alternative: PlatformIO Core CLI
  • VS Code (optional but recommended)

Installation

Step 1: Install PlatformIO

Option A: VS Code Extension (Recommended)

  1. Open VS Code
  2. Go to Extensions (Ctrl+Shift+X)
  3. Search for "PlatformIO IDE"
  4. Click Install

Option B: Command Line

pip install platformio

Step 2: Clone the Repository

git clone http://gitea.aircarto.fr/PaulVua/esp32_NPM_only.git
cd esp32_NPM_only

Step 3: Open in PlatformIO

Using VS Code:

  1. Open the project folder in VS Code
  2. PlatformIO will automatically detect the project

Using CLI:

pio project init

Usage

Building the Project

pio run

Uploading to ESP32

  1. Connect your ESP32 to your computer via USB
  2. Upload the code:
pio run --target upload

Monitoring Serial Output

View real-time sensor readings:

pio device monitor

Or combine upload and monitor:

pio run --target upload && pio device monitor

Exit the monitor: Press Ctrl+C

Cleaning Build Files

pio run --target clean

Understanding the Code

The code is organized into clear sections with extensive comments:

Main Components

  1. Hardware Configuration (main.cpp:18-30)

    • Serial port definitions
    • GPIO pin assignments
  2. Helper Functions (main.cpp:50-107)

    • checksum_valid(): Validates sensor messages
    • send_concentration_command(): Sends read request to sensor
    • print_data(): Debug output for troubleshooting
  3. Sensor Reading Function (main.cpp:109-242)

    • read_concentration(): 11-step process documented in detail
    • Protocol parsing and data extraction
    • Error handling with timeout protection
  4. Arduino Functions

    • setup(): One-time initialization (main.cpp:244-286)
    • loop(): Non-blocking repeated execution (main.cpp:288-318)

Key Concepts Demonstrated

  • Binary Serial Protocol: Reading structured binary data
  • Checksum Validation: Ensuring data integrity
  • Non-blocking Timing: Using millis() instead of delay()
  • UART Communication: 8E1 parity configuration
  • Error Handling: Timeout protection and validation checks
  • Data Scaling: Converting sensor's fixed-point integers to floats

Expected Output

After uploading and opening the Serial Monitor, you should see:

=== NextPM Sensor Reader ===
Simplified version - Concentration readings only
Averaging: 60 seconds, Update: every 10 seconds

Waiting 15 seconds for sensor initialization...
Sensor ready. Starting measurements...

--- Reading NextPM Concentrations ---

=== Particulate Matter Concentrations ===
PM1.0:  12.3 µg/m³
PM2.5:  18.7 µg/m³
PM10:   24.5 µg/m³
======================================

Readings update every 10 seconds.

Troubleshooting

No sensor response

Symptom: ERROR: No response from sensor

Solutions:

  1. Check wiring connections (TX/RX crossed correctly?)
  2. Verify sensor has power
  3. Wait for full 15-second initialization period
  4. Check sensor is compatible with 115200 baud, 8E1 parity

Invalid checksum errors

Symptom: ERROR: Invalid checksum

Solutions:

  1. Check for electrical noise on signal wires
  2. Verify correct parity setting (8E1)
  3. Ensure ground connection between ESP32 and sensor
  4. Try shorter wire lengths

Header not found

Symptom: ERROR: Header not found

Solutions:

  1. Sensor may not be responding correctly
  2. Check baud rate matches (115200)
  3. Verify sensor is in measurement mode
  4. Power cycle the sensor

Can't upload to ESP32

Symptom: Upload fails or port not found

Solutions:

  1. Press and hold BOOT button on ESP32 during upload
  2. Check USB cable (must support data, not just power)
  3. Install USB drivers for your ESP32 board
  4. Try a different USB port

Learning Objectives

This project helps students learn:

Communication Protocols

  • Understanding binary serial communication
  • Request-response patterns
  • Header/state/data/checksum message structure
  • Big-endian vs little-endian byte ordering

Embedded Systems Concepts

  • UART configuration (baud rate, parity, stop bits)
  • GPIO pin assignment and usage
  • Non-blocking vs blocking code patterns
  • Timeout handling in real-time systems

Data Processing

  • Binary data parsing and extraction
  • Checksum validation algorithms
  • Fixed-point to floating-point conversion
  • Byte manipulation with word() function

Arduino/ESP32 Patterns

  • Proper use of setup() and loop()
  • Non-blocking timing with millis()
  • Multiple serial ports (Serial vs Serial1)
  • Error handling and debugging techniques

Configuration

Adjusting Read Interval

To change how often the sensor is read, modify the interval constant:

const long interval = 10000;  // Read every 10 seconds (in milliseconds)

Changing GPIO Pins

To use different pins, modify these definitions:

#define PM_SERIAL_RX 39  // Change RX pin
#define PM_SERIAL_TX 32  // Change TX pin

Note: GPIO 39 is input-only on ESP32, so it's ideal for RX.

Project Structure

esp32_NPM_only/
├── src/
│   └── main.cpp           # Main application with extensive comments
├── include/               # Header files (currently empty)
├── lib/                   # Custom libraries (currently empty)
├── test/                  # Unit tests (currently empty)
├── platformio.ini         # PlatformIO configuration
├── CLAUDE.md             # AI assistant guidance
└── README.md             # This file

NextPM Protocol Reference

Concentration Request Command

Byte Value Description
0 0x81 Command prefix
1 0x12 Concentration request
2 0x6D Checksum

Concentration Response (16 bytes)

Bytes Description Used?
0-1 Header (0x81 0x12) For validation
2 State byte Read but not parsed
3-4 N1.0 particle count Not used
5-6 N2.5 particle count Not used
7-8 N10 particle count Not used
9-10 PM1.0 × 10 Extracted
11-12 PM2.5 × 10 Extracted
13-14 PM10 × 10 Extracted
15 Checksum Validated

Contributing

This is an educational project. Suggestions for improving code clarity and educational value are welcome!

License

This project is provided for educational purposes.

Acknowledgments

  • NextPM sensor documentation
  • ESP32 Arduino core community
  • Students and educators using this project

Questions or Issues?

If you encounter problems or have questions about the code, please open an issue on the repository.