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:
- den HS3001-Sensor über
I2C1ausliest. - die Rohdaten in Temperatur (°C) und relative Luftfeuchtigkeit (%RH) dekodiert.
- beide Werte über
UART4ausgibt. - 10 Messwerte erfasst, wobei zwischen jedem Messwert 100 ms gewartet wird.
- 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:
- Die Firmware kompiliert wird.
userCode()ausgeführt wird und den Sensor ausliest.- Über UART werden 10 Zeilen ausgegeben, jede mit einem Temperatur- und einem Feuchtigkeitswert.
- Zwischen den Messwerten liegt ein Abstand von 100 ms.
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)