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.
- Placa
- STM32 · HAL
- Dificultad
- Media
- Tema
- Interconexión de sensores
- Acceso
- Gratis
La tarea
Monitor climático para invernaderos
Acabas de incorporarte al equipo de firmware de VerdeGrow, una startup dedicada a la construcción de invernaderos inteligentes. Cada módulo de cultivo cuenta con un controlador STM32 conectado a un sensor de temperatura y humedad HS3001 a través de I2C. El panel de control en la nube espera un flujo constante de lecturas climáticas a través del enlace UART del controlador.
El equipo de hardware ha terminado la placa. El sensor está conectado y alimentado. Lo único que falta es el firmware que realmente se comunique con el sensor y transmita los datos climáticos: esa es tu tarea.
Tu tarea
Completa userCode() en Core/Src/userCode.c para que:
- Lea el sensor HS3001 a través de
I2C1. - Decodifique los bytes sin procesar en temperatura (°C) y humedad relativa (%RH).
- Imprima ambos valores a través de
UART4. - Realice 10 lecturas, con una espera de 100 ms entre cada una.
- Vuelva una vez que se hayan completado las 10 lecturas.
Salida esperada (los decimales exactos pueden variar ligeramente):
Temp: 25.01 C Humidity: 60.02 %RH
Temp: 25.01 C Humidity: 60.02 %RH
Temp: 25.01 C Humidity: 60.02 %RH
...
Impresión a través de UART
Da formato a cada lectura con snprintf() y envíala con 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);
Los identificadores ya están proporcionados
Los identificadores que necesitas ya están proporcionados desde main.c:
extern I2C_HandleTypeDef hi2c1;
extern UART_HandleTypeDef huart4;
Imprimir el signo % literal
%% imprime el signo % literal dentro de una cadena de formato.
Temporización y bucle
Toma exactamente 10 lecturas con una pausa de 100 ms entre ellas:
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);
}
Presta atención al orden de los bytes
Realiza los cálculos de float, pero presta atención al orden de los bytes: la temperatura se encuentra en
los bytes 2–3, y la humedad en los bytes 0–1.
Criterios de éxito
Tu solución estará completa cuando:
- Se compile el firmware.
userCode()se ejecute y lea el sensor.- El UART imprima 10 líneas, cada una con un valor de temperatura y de humedad.
- Haya un intervalo de 100 ms entre lecturas.
userCode()vuelva tras la décima lectura.
Qué incluye
- Tu firmware se compila y ejecuta en una placa emulada y se comprueba con pruebas a nivel de hardware.
- Un vídeo con la solución.
- No necesitas placa de desarrollo ni toolchain local.
¿Nuevo en embebidos? Empieza por la hoja de ruta: Cómo aprender sistemas embebidos (en inglés)