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.

Board
STM32 · HAL
Schwierigkeit
Mittel
Thema
Sensoranschlüsse
Zugang
Kostenlos

Die Aufgabe

Klimamonitor für Gewächshäuser

Du bist gerade dem Firmware-Team bei VerdeGrow beigetreten, einem Start-up, das intelligente Gewächshäuser baut. Jeder „Grow-Pod“ verfügt über einen STM32-Controller, der über I2C mit einem HS3001 Temperatur- und Feuchtigkeitssensor verbunden ist. Das Cloud-Dashboard erwartet einen kontinuierlichen Strom von Klimadaten über die UART-Schnittstelle des Controllers.

Das Hardware-Team hat die Platine fertiggestellt. Der Sensor ist angeschlossen und mit Strom versorgt. Das Einzige, was noch fehlt, ist die Firmware, die tatsächlich mit dem Sensor kommuniziert und die Klimadaten meldet – das ist deine Aufgabe.

Deine Aufgabe

Ergänze userCode() in Core/Src/userCode.c so, dass es:

  1. den HS3001-Sensor über I2C1 ausliest.
  2. die Rohdaten in Temperatur (°C) und relative Luftfeuchtigkeit (%RH) dekodiert.
  3. beide Werte über UART4 ausgibt.
  4. 10 Messwerte erfasst, wobei zwischen jedem Messwert 100 ms gewartet wird.
  5. zurückkehrt, sobald alle 10 Messwerte erfasst sind.

Erwartete Ausgabe (Ihre genauen Dezimalwerte können leicht abweichen):

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

Ausgabe über UART

Formatieren Sie jeden Messwert mit snprintf() und senden Sie ihn mit 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);
Handles sind bereits vorhanden

Die benötigten Handles werden bereits von main.c bereitgestellt:

extern I2C_HandleTypeDef hi2c1;
extern UART_HandleTypeDef huart4;
Ausgabe eines literalen %-Zeichens

%% gibt ein literales %-Zeichen innerhalb einer Formatzeichenfolge aus.


Zeitmessung & Schleife

Nehmen Sie genau 10 Messwerte mit einer Pause von jeweils 100 ms auf:

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);
}
Achten Sie auf die Byte-Reihenfolge

Führen Sie die Berechnung in float durch, achten Sie dabei jedoch auf die Byte-Reihenfolge: Die Temperatur liegt in den Bytes 2–3, die Luftfeuchtigkeit in den Bytes 0–1.


Erfolgskriterien

Ihre Lösung ist vollständig, wenn:

  1. Die Firmware kompiliert wird.
  2. userCode() ausgeführt wird und den Sensor ausliest.
  3. Über UART werden 10 Zeilen ausgegeben, jede mit einem Temperatur- und einem Feuchtigkeitswert.
  4. Zwischen den Messwerten liegt ein Abstand von 100 ms.
  5. userCode() kehrt nach dem 10. Messwert zurück.

Was du bekommst

  • Deine Firmware wird auf einem emulierten Board gebaut, ausgeführt und durch Hardware-Tests geprüft.
  • Ein Video zur Lösung.
  • Kein Entwicklungsboard und keine lokale Toolchain nötig.

Neu bei Embedded? Starte mit der Roadmap: Embedded-Systeme lernen (Englisch)