DHT22 온습도 센서를 동작시키는데 뜻밖의 우여곡절을 겪었습니다.
데이터시트를 대충 훑어보고 구글링의 도움으로 간단히 코드를 돌려 보았습니다.
아래의 사이트가 많은 도움을 줍니다.
https://controllerstech.com/temperature-measurement-using-dht22-in-stm32/
FreeRTOS로 동작해야 하므로 타이머를 추가하여 microsecond 단위로 동작하는 delay 함수를 구현해야 합니다.
void delay(uint32_t delay)
{
__HAL_TIM_SET_COUNTER(&htim6, 0);
while (__HAL_TIM_GET_COUNTER(&htim6) < delay);
}
그런데 이 함수가 동작하질 않았습니다.
이유는 단순히 타이머를 시작하지 않았기 때문이었습니다..
MX_TIM6_Init();
/* USER CODE BEGIN 2 */
HAL_TIM_Base_Start(&htim6);
이제 타이머는 동작하고 몇 번은 센서의 값이 잘 읽혔습니다.
그런데 몇번의 반복 동작 후 멈추는 현상이 발생했습니다.
그 이후 이런저런 코드 수정 때문인지 센서의 값이 읽히지 않았습니다.
센서가 고장난 것인지 라즈베리파이에서 확인을 해봤습니다.
아래의 사이트를 보고 따라 하면 쉽게 동작이 확인됩니다.
https://pimylifeup.com/raspberry-pi-humidity-sensor-dht22/
센서가 문제없다는 게 확인되었습니다.
다 되어 있는 패키지를 그냥 쓰는 것이 얼마나 편한지 알 수 있었습니다...😓
다시 데이터시트를 자세히 읽어보며 코드 동작들을 확인해 보았습니다.
덕분에 센서의 동작에 대해 잘 이해할 수 있었습니다만 해결책은 이것이 아니었습니다.
태스크의 스택 사이즈가 부족하여 오버플로우가 발생한 것입니다.
오버플로우를 확인할 수 있는 옵션이 정의되어 있습니다.
// FreeRTOSConfig.h
#define configCHECK_FOR_STACK_OVERFLOW 2
// freertos.c
/* USER CODE BEGIN 4 */
__weak void vApplicationStackOverflowHook(xTaskHandle xTask, signed char *pcTaskName)
{
/* Run time stack overflow checking is performed if
configCHECK_FOR_STACK_OVERFLOW is defined to 1 or 2. This hook function is
called if a stack overflow is detected. */
printf("stack overflow in task: %s\n\r", pcTaskName);
}
/* USER CODE END 4 */
스택 사이즈는 128에서 256으로 증가시켜 주니 태스크가 멈추는 현상은 해결되었습니다.
osThreadDef(dht22Task, StartTask02, osPriorityAboveNormal, 0, 256);
이제 온습도값은 잘 읽히는데 parity 값의 계산이 에러가 났습니다.
데이터시트를 다시 보고 온라인상에서 내려받아서 쉽게 썼던 코드의 수정이 필요한 것을 알았습니다.


라즈베리파이에서 테스트할 때 설치했던 패키지의 소스를 봐도 답을 확인할 수 있습니다.
https://github.com/adafruit/Adafruit_CircuitPython_DHT/blob/main/adafruit_dht.py

센서에는 문제가 없었고,
단지 쉽게 사용하려고 했던 얄팍한 자세가 문제였다는 것을 알게 되었습니다. 😭

'STM32' 카테고리의 다른 글
STM32-CAN-Raspberry Pi (0) | 2025.04.07 |
---|---|
OLED display 128x32 (0) | 2025.02.28 |
STM32 clock (0) | 2025.01.23 |
FreeRTOS - STM32F4 포팅 정보 확인 (0) | 2025.01.14 |
FreeRTOS 와 Zephyr 비교 (0) | 2025.01.13 |