Greenhouse Climate Monitor

The HS3001 is a small temperature and humidity sensor that talks over I2C. Your job is to wire it up (including the pull-up resistors on the I2C lines), read its 4 byte measurement, work out the temperature and humidity from those bytes, and send the results out over UART. It's the sort of code you'd write for any board that needs to keep track of its surroundings.

Carte
STM32 · HAL
Difficulté
Moyen
Thème
Interfaçage des capteurs
Accès
Gratuit

La tâche

Moniteur climatique pour serre

Vous venez de rejoindre l’équipe chargée du micrologiciel chez VerdeGrow, une start-up spécialisée dans la conception de serres intelligentes. Chaque module de culture est équipé d’un contrôleur STM32 relié à un capteur de température et d’humidité HS3001 via une interface I2C. Le tableau de bord cloud attend un flux continu de mesures climatiques via la liaison UART du contrôleur.

L'équipe matériel a terminé la carte. Le capteur est connecté et alimenté. La seule chose qui manque, c'est le micrologiciel qui communique avec le capteur et transmet les données climatiques — c'est votre mission.

Votre mission

Complétez la fonction userCode() dans Core/Src/userCode.c afin qu’elle :

  1. Lise le capteur HS3001 via I2C1.
  2. Décode les octets bruts en température (°C) et humidité relative (%RH).
  3. Affiche ces deux valeurs via UART4.
  4. Effectue 10 relevés, en attendant 100 ms entre chacun.
  5. Se termine une fois les 10 relevés effectués.

Résultat attendu (vos décimales exactes peuvent varier légèrement) :

Temp: 25.01 C  Humidity: 60.02 %RH
Temp: 25.01 C  Humidity: 60.02 %RH
Temp: 25.01 C  Humidity: 60.02 %RH
...

Affichage via UART

Mettez en forme chaque mesure avec snprintf() et envoyez-la avec HAL_UART_Transmit() :

char message[48];
snprintf(message, sizeof(message),
         "Temp: %.2f C  Humidity: %.2f %%RH\r\n", tempC, humidityRH);
HAL_UART_Transmit(&huart4, (uint8_t *)message, strlen(message), 100);
Les descripteurs sont déjà fournis

Les descripteurs dont vous avez besoin sont déjà fournis par main.c :

extern I2C_HandleTypeDef hi2c1;
extern UART_HandleTypeDef huart4;
Imprimer le signe % littéral

%% imprime le signe % littéral à l'intérieur d'une chaîne de format.


Synchronisation et boucle

Effectuez exactement 10 relevés en respectant une pause de 100 ms entre chacun d’eux :

for (int i = 0; i < 10; i++)
{
    // 1. read 4 bytes from the sensor
    // 2. decode raw humidity + temperature
    // 3. convert to %RH and °C
    // 4. print over UART4
    HAL_Delay(100);
}
Faites attention à l’ordre des octets

Effectuez les calculs de float, mais faites attention à l’ordre des octets : la température se trouve dans les octets 2 et 3, l’humidité dans les octets 0 et 1.


Critères de réussite

Votre solution est complète lorsque :

  1. Le firmware se compile.
  2. userCode() s'exécute et lit le capteur.
  3. L’UART affiche 10 lignes, chacune contenant une valeur de température et une valeur d’humidité.
  4. Il y a un intervalle de 100 ms entre chaque lecture.
  5. userCode() revient après la 10e lecture.

Ce que vous obtenez

  • Votre firmware est compilé et exécuté sur une carte émulée, puis vérifié par des tests matériels.
  • Une vidéo de la solution.
  • Aucune carte de développement ni toolchain locale requise.

Débutant en embarqué ? Commencez par la feuille de route : Apprendre les systèmes embarqués (en anglais)