diff --git a/modules/dht11/.keep b/modules/dht11/.keep new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/modules/dht11/HW_DHT11.c b/modules/dht11/HW_DHT11.c new file mode 100644 index 0000000000000000000000000000000000000000..cf34f464c89e7bd82601581769ef9073fecb7143 --- /dev/null +++ b/modules/dht11/HW_DHT11.c @@ -0,0 +1,64 @@ +#include "stm32f1xx_hal.h" +#include "HW_DHT11.h" +#include "main.h" + +void HW_DWT_Init(void){ + CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk; + DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk; + DWT->CYCCNT=0; +} +void HW_DELAY_Us(uint32_t delayUsCount) { + uint32_t sys_clk = HAL_RCC_GetHCLKFreq(); + uint32_t ticks = delayUsCount * (sys_clk / 1000000); + uint32_t start = DWT->CYCCNT; + while ((DWT->CYCCNT - start) < ticks); +} + +uint8_t HW_DHT11_Read(float *tempValue, float *humidValue) { + uint8_t data[5] = {0}; + uint8_t retryCount = 0; + + HAL_GPIO_WritePin(DHT11_GPIO_Port, DHT11_Pin, GPIO_PIN_RESET); + HW_DELAY_Us(18000); + HAL_GPIO_WritePin(DHT11_GPIO_Port, DHT11_Pin, GPIO_PIN_SET); + HW_DELAY_Us(40); + + retryCount = 100; + while (HAL_GPIO_ReadPin(DHT11_GPIO_Port, DHT11_Pin) == GPIO_PIN_RESET) { + if (retryCount-- == 0) return DHT11_ERROR_TIMEOUT; + HW_DELAY_Us(1); + } + + retryCount = 100; + while (HAL_GPIO_ReadPin(DHT11_GPIO_Port, DHT11_Pin) == GPIO_PIN_SET) { + if (retryCount-- == 0) return DHT11_ERROR_TIMEOUT; + HW_DELAY_Us(1); + } + + for (uint8_t i = 0; i < 40; i++) { + retryCount = 100; + while (HAL_GPIO_ReadPin(DHT11_GPIO_Port, DHT11_Pin) == GPIO_PIN_RESET) { + if (retryCount-- == 0) return DHT11_ERROR_TIMEOUT; + HW_DELAY_Us(1); + } + + HW_DELAY_Us(40); + if (HAL_GPIO_ReadPin(DHT11_GPIO_Port, DHT11_Pin) == GPIO_PIN_SET) { + data[i/8] |= (1 << (7 - (i%8))); + retryCount = 100; + while (HAL_GPIO_ReadPin(DHT11_GPIO_Port, DHT11_Pin) == GPIO_PIN_SET) { + if (retryCount-- == 0) return DHT11_ERROR_TIMEOUT; + HW_DELAY_Us(1); + } + } + } + + if (data[4] != (data[0] + data[1] + data[2] + data[3])) { + return DHT11_ERROR_CHECKSUM; + } + + *humidValue = (float)data[0]; + *tempValue = (float)data[2]; + + return DHT11_OK; +} diff --git a/modules/dht11/HW_DHT11.h b/modules/dht11/HW_DHT11.h new file mode 100644 index 0000000000000000000000000000000000000000..718fcb3e2e0306dd5c58b607fdb574793e8c9ee7 --- /dev/null +++ b/modules/dht11/HW_DHT11.h @@ -0,0 +1,34 @@ +#ifndef __HW_DHT11_H__ +#define __HW_DHT11_H__ + + +// 定义一个枚举类型 DHT11_Status,用于表示 DHT11 传感器操作的状态 +typedef enum { + DHT11_OK = 0, // 表示操作成功,状态码为 0 + DHT11_ERROR_TIMEOUT, // 表示操作超时错误 + DHT11_ERROR_CHECKSUM // 表示校验和错误 +} DHT11_Status; + +/** + * @brief 初始化 DWT(数据观察点和跟踪)功能 + * @param 无 + * @retval 无 + */ +void HW_DWT_Init(void); +/** + * @brief 实现微秒级的延时 + * @param delayUsCount: 需要延时的微秒数 + * @retval 无 + */ +void HW_DELAY_Us(uint32_t delayUsCount); +/** + * @brief 从 DHT11 传感器读取温湿度数据 + * @param tempValue: 指向 float 类型的指针,用于存储读取到的温度值 + * @param humidValue: 指向 float 类型的指针,用于存储读取到的湿度值 + * @retval uint8_t 类型,实际代表 DHT11_Status 枚举类型的值,用于表示操作状态 + */ +uint8_t DHT11_Read(float *tempValue, float *humidValue); + + + +#endif diff --git a/modules/oled/OLED.c b/modules/oled/OLED.c new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391