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:

  1. Lea el sensor HS3001 a través de I2C1.
  2. Decodifique los bytes sin procesar en temperatura (°C) y humedad relativa (%RH).
  3. Imprima ambos valores a través de UART4.
  4. Realice 10 lecturas, con una espera de 100 ms entre cada una.
  5. 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:

  1. Se compile el firmware.
  2. userCode() se ejecute y lea el sensor.
  3. El UART imprima 10 líneas, cada una con un valor de temperatura y de humedad.
  4. Haya un intervalo de 100 ms entre lecturas.
  5. 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)