Tutoriel - Bibliothèque STM32_DHT20_I2C

Interface C pour capteur de température et d'humidité DHT20 via I2C sur microcontrôleurs STM32

Consultez la librairie sur GitHub.

1. Introduction

La bibliothèque STM32_DHT20_I2C est une interface C conçue pour faciliter la communication entre les microcontrôleurs STM32 et le capteur de température et d'humidité DHT20, qui utilise le protocole I2C. Cette bibliothèque s'appuie sur le framework HAL (Hardware Abstraction Layer) de ST Microelectronics pour assurer la portabilité entre les différentes familles de microcontrôleurs STM32.

Note : Le DHT20 est une version améliorée des capteurs DHT précédents, offrant une meilleure précision et utilisant le protocole I2C standard, ce qui simplifie l'intégration par rapport aux protocoles one-wire.

2. Compatibilité et Prérequis

Compatibilité Matérielle

  • Toutes les familles de microcontrôleurs STM32 supportant HAL et disposant d'un périphérique I2C.
  • Capteur DHT20.

Prérequis Logiciels

  • Un microcontrôleur STM32.
  • STM32CubeIDE.
  • Le bus I2C sur lequel se troue votre capteur doit être configuré et initialisé dans votre projet.
  • La librairie HAL STM32_DHT20_I2C présente dans le répertoire STM32_Libraries.

3. Fichiers de la librairie

  • STM32_DHT20_I2C.h : Fichier d'en-tête contenant les déclarations des fonctions et constantes.
  • STM32_DHT20_I2C.c : Fichier source contenant l'implémentation des fonctions.

n'oubliez pas de modifier le fichier STM32_DHT20_I2C.h pour l'adapter à votre configuration matérielle #include "stm32l0xx_hal.h" // Remplacez stm32l0xx_hal.h si vous utilisez une autre série de carte ex : stm32f4xx_hal.h.

4. Installation et Configuration

Pour installer la bibliothèque dans votre projet STM32 :

  1. Créez un dossier nommé STM32_DHT20_I2C dans le répertoire Drivers de votre projet STM32 et copiez y les fichiers STM32_DHT20_I2C.h et STM32_DHT20_I2C.c.
  2. Ajoutez les chemins d'inclusion : dans les propriétés de votre projet STM32CubeIDE, dans C/C++ General, > Paths and Symbols > Onglet Includes, dans GNU ajoutez le chemin vers le dossier STM32_DHT20_I2C.

N'oublier pas d'activer le float dans les propriétés du projet pour afficher le nombres flottants dans le printf.

5. Le Capteur DHT20

Le DHT20 est un capteur numérique de température et d'humidité qui communique via le protocole I2C. Il est connu pour sa bonne précision et sa stabilité.

Caractéristique Valeur
Interface de Communication I2C
Adresse I2C 0x38 (fixe)
Plage de Température -40 à 80°C
Précision Température ±0.3°C
Plage d'Humidité 0 à 100% RH
Précision Humidité ±2% RH (à 25°C)
Tension d'alimentation 2.5V à 5.5V
Note : Toujours consulter la fiche technique (datasheet) du DHT20 pour les informations les plus précises et complètes.

6. Branchement du Capteur

Brochage du capteur DHT20

Le capteur DHT20 (ou le module sur lequel il est monté) a typiquement 4 broches :

  • VCC : Alimentation (typiquement 3.3V pour STM32)
  • GND : Masse
  • SCL : Ligne d'horloge I2C
  • SDA : Ligne de données I2C

Connexion au STM32

  • VCC → 3.3V du STM32
  • GND → GND du STM32
  • SCL → Broche SCL du périphérique I2C configuré sur le STM32 (ex: PB6 pour I2C1_SCL)
  • SDA → Broche SDA du périphérique I2C configuré sur le STM32 (ex: PB7 pour I2C1_SDA)
Diagramme de connexion DHT22 avec STM32

Diagramme de connexion typique du capteur avec un STM32 (exemple avec DHT22 illustrant les connexions I2C).

7. Configuration I2C sur STM32

Le périphérique I2C du STM32 doit être configuré correctement.

Configuration avec STM32CubeMX

  1. Ouvrez votre projet dans STM32CubeMX.
  2. Dans la section "Connectivity", sélectionnez un périphérique I2C (par exemple, I2C1).
  3. Activez le mode I2C.
  4. Configurez les paramètres I2C :
    • I2C Speed Mode: Standard Mode (100kHz) ou Fast Mode (400kHz). Le DHT20 supporte jusqu'à 400kHz.
    • Les autres paramètres peuvent souvent être laissés par défaut.
  5. Note Personnelle : Pour ce tutoriel, et afin de faciliter la transition pour ceux familiers avec l'écosystème Arduino, nous avons choisi d'utiliser les broches PB6 (SCL) et PB7 (SDA) pour I2C1. Ces broches correspondent souvent aux broches I2C dédiées sur les connecteurs compatibles Arduino présents sur certaines cartes de développement STM32 (par exemple, A5/SCL et A4/SDA sur un Arduino Uno, qui peuvent être mappées différemment sur les STM32 mais PB6/PB7 sont un choix commun pour I2C1). Cette configuration a été réalisée à l'aide de STM32CubeMX.

8. Utilisation de la Bibliothèque

8.1 Inclusion de la Bibliothèque

Pour utiliser la bibliothèque, incluez le fichier d'en-tête dans votre `main.c` :


/* USER CODE BEGIN Includes */
#include <stdio.h>            // Pour printf
#include "STM32_DHT20_I2C.h"        // Inclure la bibliothèque STM32_DHT20_I2C
/* USER CODE END Includes */
        

8.2 Fonctions Utilitaires

Incluez le fichier d'en-tête dans la section USER CODE BEGIN Includes :


/* USER CODE BEGIN 0 */
int __io_putchar(int ch) {
    HAL_UART_Transmit(&huart2, (uint8_t*)&ch, 1, HAL_MAX_DELAY);
    return ch;
}
/* USER CODE END 0 */
            

8.3 Initialisation

Initialisez le capteur dans la section USER CODE BEGIN 2 :


/* USER CODE BEGIN 2 */
printf("--- Initialisation ---\r\n");
DHT20_Handle dht20_sensor;                          // Structure pour contenir les données du capteur DHT20
float temperature;                                  // Température lue par le capteur DHT20
float humidity;                                     // Humidité lue par le capteur DHT20

DHT20_Init(&dht20_sensor, &hi2c1, 100);             // Initialise le capteur DHT20 avec le handle I2C et un timeout de 100ms
if (DHT20_Check_Status(&dht20_sensor) == HAL_OK) {  // Vérifie si le capteur est prêt
    printf("Capteur DHT20 prêt.\r\n");              // Affiche un message de succès
} else {                                            // Sinon, affiche un message d'erreur
    printf("Erreur lors de la vérification du statut du capteur DHT20.\r\n");
}
printf("--- Début de la lecture ---\r\n");
/* USER CODE END 2 */
            

8.4 Lecture des Données

Pour lire les données de température et d'humidité dans la section USER CODE BEGIN WHILE :


/* USER CODE BEGIN WHILE */
while (1)
{
    // Lire les données via le handle
    HAL_StatusTypeDef dht_status = DHT20_ReadData(&dht20_sensor, &temperature, &humidity); // &temperature, &humidity);
    if (dht_status == HAL_OK) {
        printf("Température: %.2f °C, Humidité: %.2f %%\r\n", temperature, humidity); // Afficher les données
    }
    HAL_Delay(2000); // 2s entre chaque mesure
    /* USER CODE END WHILE */
            
Attention : Respectez l'intervalle de lecture minimum spécifié dans la datasheet du DHT20 (typiquement 1-2 secondes) pour permettre au capteur de faire ses conversions et éviter de le surcharger.

9. Dépannage

Problèmes Courants et Solutions

Problème Causes Possibles Solutions
Le capteur ne répond pas (erreur de communication, NACK)
  • Mauvais branchement (SDA, SCL, VCC, GND inversés ou mal connectés).
  • Absence ou mauvaise valeur des résistances de pull-up sur SDA/SCL.
  • Adresse I2C incorrecte (le DHT20 est 0x38).
  • Périphérique I2C du STM32 mal configuré.
  • Capteur défectueux.
  • Vérifiez toutes les connexions.
  • Assurez-vous que les pull-ups sont présentes et correctes (4.7kΩ typique).
  • Vérifiez l'adresse I2C utilisée par la bibliothèque.
  • Revoyez la configuration I2C dans CubeMX.
  • Essayez avec un autre capteur. Utilisez un scanner I2C pour voir si le capteur est détecté.
Erreur CRC
  • Interférences électriques sur le bus I2C.
  • Câbles longs ou de mauvaise qualité.
  • Problème d'alimentation.
  • Utilisez des câbles courts et blindés si possible.
  • Assurez une alimentation stable au capteur et au STM32.
  • Vérifiez que les résistances de pull-up sont proches du maître ou de l'esclave.
Valeurs incorrectes ou figées
  • Erreur dans la conversion des données brutes.
  • Capteur saturé ou endommagé.
  • Problème de timing dans la lecture (ne pas attendre assez longtemps après la commande de mesure).
  • Vérifiez la logique de conversion dans la bibliothèque.
  • Assurez-vous de respecter les délais de conversion du capteur.
  • Essayez de réinitialiser le capteur.

10. Référence API (Exemple)

Voici un aperçu des fonctions typiques que pourrait fournir la bibliothèque STM32_DHT20_I2C.h :

  • DHT20_Status_t DHT20_Init(DHT20_Sensor_t* sensor, I2C_HandleTypeDef* hi2c): Initialise le capteur DHT20. Prend en argument un pointeur vers la structure du capteur et le handle I2C. Vérifie la communication et l'état du capteur.
  • DHT20_Status_t DHT20_TriggerMeasurement(DHT20_Sensor_t* sensor): (Optionnel, peut être interne à ReadData) Envoie la commande pour démarrer une conversion de température et d'humidité.
  • DHT20_Status_t DHT20_ReadData(DHT20_Sensor_t* sensor, float* temperature, float* humidity): Déclenche une mesure (si non fait séparément), attend la conversion, lit les données brutes, vérifie le CRC, et convertit les données en température (°C) et humidité (%).
  • DHT20_Status_t DHT20_ReadRawData(DHT20_Sensor_t* sensor, uint8_t* buffer, uint8_t len): (Optionnel) Lit les données brutes du capteur sans conversion.
  • uint8_t DHT20_CalculateCRC(uint8_t *data, uint8_t len): (Interne ou utilitaire) Calcule le CRC8 pour les données.

La structure DHT20_Sensor_t :


typedef struct {
    GPIO_TypeDef* DHT_PORT;     // Pointeur vers le port GPIO auquel le capteur est connecté. 
    uint16_t DHT_PIN;           // Numéro de la broche GPIO à laquelle le capteur est connecté. 
    uint8_t sensorType;         // Type du capteur (utiliser les définitions DHT11, DHT22, DHT21). 
    TIM_HandleTypeDef* htim;    // Pointeur vers le handle du timer utilisé pour les délais/mesures. 
    uint8_t hum1;               // Octet de poids fort de l'humidité (ou partie entière pour DHT11). 
    uint8_t hum2;               // Octet de poids faible de l'humidité (ou partie décimale pour DHT11).
    uint8_t temp1;              // Octet de poids fort de la température (ou partie entière pour DHT11). 
    uint8_t temp2;              // Octet de poids faible de la température (ou partie décimale pour DHT11). 
    uint8_t SUM;                // Somme de contrôle reçue du capteur. 
    uint8_t CHECK;              // Somme de contrôle calculée localement.  
} DHT_Sensor;
        

11. Conclusion

La bibliothèque STM32_DHT20_I2C vise à simplifier l'utilisation du capteur DHT20 avec les microcontrôleurs STM32 en encapsulant la complexité de la communication I2C et de la conversion des données. En suivant ce tutoriel, vous devriez être en mesure de configurer, brancher et lire les données de température et d'humidité de votre capteur DHT20.