Tutoriel Complet - Capteur PM2.5 Laser (DFRobot SEN0177)
Interface C pour capteur de particules fines PM1.0/2.5/10 sur STM32 (UART, DMA, HAL)
Consultez la librairie sur GitHub
1. Introduction
Le capteur DFRobot SEN0177 est un capteur laser de particules fines (PM2.5) permettant de mesurer la concentration de particules PM1.0, PM2.5 et PM10 dans l'air. Il communique via une interface série UART (3.3V) et fournit des mesures précises pour la surveillance de la qualité de l'air.
2. Principe de fonctionnement
Le capteur SEN0177 utilise la diffusion laser pour détecter et compter les particules en suspension dans l'air. Un faisceau laser éclaire les particules, la lumière diffusée est analysée pour déterminer la taille et la concentration des particules (0.3 à 10 µm).

Illustration : Principe de fonctionnement du SEN0177.
3. Caractéristiques techniques
- Tension d'alimentation : 5V (4.95 ~ 5.05V)
- Consommation max : 120 mA
- Plage de mesure : 0.3-10 µm (PM1.0, PM2.5, PM10)
- Plage de concentration : 0 ~ 999 µg/m³
- Temps de réponse : ≤ 10 s
- Sortie : UART 9600 bauds, 32 octets par trame
- Température de fonctionnement : -20 ~ 50°C
- Humidité : 0 ~ 99% RH
4. Branchement du capteur

Broche | Nom | Description |
---|---|---|
1 | GND | GND |
2 | VCC | +5V |
3 | RST | Laisser flottant |
4 | RXD | Vers TX STM32 (3.3V) |
5 | TXD | Vers RX STM32 (3.3V) |
5. Configuration CubeMX
- Configurer un UART (ex : USART1) en mode Asynchronous, 9600 bauds, 8N1, sans contrôle de flux.
- Activer le DMA pour la réception UART (mode circulaire recommandé).
- Définir un buffer DMA de 32 octets (taille d'une trame).
- Connecter RX/TX du capteur aux broches correspondantes du STM32.
6. Utilisation de la librairie STM32_MP25
La librairie STM32_MP25 fournit une API simple pour :
- Initialiser la réception DMA du capteur
- Parser et vérifier les trames reçues (header, checksum)
- Extraire les valeurs PM1.0, PM2.5, PM10
- Interpréter la qualité de l'air (indice, emoji, label, texte)
- Définir un callback utilisateur pour chaque trame valide
- Afficher les mesures et leur interprétation dans le terminal
Fichiers principaux
STM32_MP25.h
: API, structures, prototypesSTM32_MP25.c
: Implémentation
7. Exemple de code
Inclusion
/* USER CODE BEGIN Includes */
#include <stdio.h> // Pour printf
#include <pm25.h> // Inclure la librairie PM2.5
/* USER CODE END Includes */
Variables
/* USER CODE BEGIN PV */
uint8_t pm25_rx_buffer[PM25_FRAME_LEN]; // Buffer DMA pour réception PM2.5 (PM25_FRAME_LEN = 32)
volatile uint8_t pm25_data_ready = 0; // Indicateur de trame prête
/* USER CODE END PV */
Fonctions
/* USER CODE BEGIN 0 */
// Fonction qui transmet un caractère via UART et le renvoie.Utilisé pour la sortie standard (printf).
int __io_putchar(int ch)
{
HAL_UART_Transmit(&huart2, (uint8_t *)&ch, 1, 0xFFFF); // Pour Envoyer le caractère via UART
return ch; // renvoie le caractère
}
// Callback utilisateur pour traitement asynchrone (MQTT, log, etc.)
void pm25_callback(const PM25_Data *data) {
PM25_PrintStatus(data); // Affichage série à chaque trame valide
// On peut aussi ajouter MQTT, log, etc. ici
}
/* USER CODE END 0 */
Initialisation
/* USER CODE BEGIN 2 */
HAL_Delay(500); // Attendre que l'UART soit prête
printf("Test capteur SEN0177\r\n"); // Afficher un message de démarrage
PM25_init(&huart1, pm25_rx_buffer, PM25_FRAME_LEN); // Initialiser le capteur PM2.5 avec DMA
HAL_Delay(100); // Attendre un peu
PM25_RegisterCallback(pm25_callback); // Enregistrement du callback utilisateur
HAL_Delay(100); // Attendre un peu
/* USER CODE END 2 */
Traitement dans la boucle principale
/* USER CODE BEGIN WHILE */
while (1)
{
PM25_Loop(&pm25_data_ready, &huart1, pm25_rx_buffer, PM25_FRAME_LEN); // Gérer le buffer DMA et le parsing
HAL_Delay(500); // Attendre un peu avant la prochaine itération
/* USER CODE END WHILE */
Fonction d’interruption
/* USER CODE BEGIN 4 */
// Callback de réception UART (HAL) pour trame complète
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if (huart->Instance == USART1) // Vérifier si c'est l'UART du capteur PM2.5
{
pm25_data_ready = 1; // Indiquer qu'une trame est prête
//printf("[DEBUG] DMA RX USART1 OK\r\n");
}
}
/* USER CODE END 4 */
8. Interprétation des mesures
La librairie fournit une fonction PM_Get_Status
qui retourne un indice, un emoji, un label et un
texte explicatif selon la valeur mesurée :
Indice | Emoji | Label | Explication |
---|---|---|---|
1 | 🟢 | Très bon | Air pur, aucun risque. |
2 | 🟢 | Bon | Air sain, très faible risque. |
3 | 🟡 | Moyen | Qualité correcte, attention sensibles. |
4 | 🟠 | Médiocre | Limitez l'exposition prolongée. |
5 | 🟠 | Très mauvais | Évitez l'exposition, risque accru. |
6 | 🔴 | Extrêmement mauvais | Danger, évacuation recommandée ! |
9. Dépannage
- Pas de données ? Vérifiez le câblage RX/TX, l'alimentation 5V, et la configuration UART/DMA.
- Trames invalides ? Vérifiez le niveau logique (3.3V), la taille du buffer DMA, et le baudrate.
- Valeurs incohérentes ? Évitez les perturbations (ventilateur, poussière excessive), vérifiez la stabilité de l'alimentation.
PM25_PrintStatus
pour afficher un diagnostic détaillé dans
le terminal.