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.

Note : Ce tutoriel explique comment utiliser ce capteur avec un microcontrôleur STM32 et la librairie STM32_MP25 (HAL, DMA, UART).

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).

Principe de fonctionnement du SEN0177

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

Branchement SEN0177
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)
Attention : Les niveaux logiques sont en 3.3V pour l'UART !

5. Configuration CubeMX

  1. Configurer un UART (ex : USART1) en mode Asynchronous, 9600 bauds, 8N1, sans contrôle de flux.
  2. Activer le DMA pour la réception UART (mode circulaire recommandé).
  3. Définir un buffer DMA de 32 octets (taille d'une trame).
  4. Connecter RX/TX du capteur aux broches correspondantes du STM32.
Astuce : Utilisez CubeMX pour générer l'initialisation du DMA et de l'UART.

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, prototypes
  • STM32_MP25.c : Implémentation
Important : Le buffer DMA doit faire exactement 32 octets (PM25_FRAME_LEN).

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.
Astuce : Utilisez la fonction PM25_PrintStatus pour afficher un diagnostic détaillé dans le terminal.

10. Ressources