河南省旅游网站建设,不关站备案wordpress 2019,wordpress 建站案例,北京制作网站的公司简介SHT20 是一款数字式温湿度传感器#xff0c;通过I2C 接口与 STM32 通信#xff0c;核心特性是#xff1a;无需外部元件、I2C 地址固定#xff08;0x40#xff09;、数据通过寄存器读取并需计算转换为实际温湿度值。 一、硬件连接#xff08;核心前提#xff09; STM32F…SHT20 是一款数字式温湿度传感器通过I2C 接口与 STM32 通信核心特性是无需外部元件、I2C 地址固定0x40、数据通过寄存器读取并需计算转换为实际温湿度值。一、硬件连接核心前提STM32F103SHT20说明PB6SCLI2C1 的 SCL 引脚可自定义建议带 10kΩ 上拉电阻PB7SDAI2C1 的 SDA 引脚建议带 10kΩ 上拉电阻3.3VVDD传感器供电禁止接 5V否则会烧毁GNDGND共地二、完整驱动代码实现1. 头文件sht20.h#ifndef __SHT20_H #define __SHT20_H #include stm32f1xx_hal.h // SHT20 I2C地址固定为0x40HAL库需左移1位包含读写位 #define SHT20_I2C_ADDR (0x40 1) // SHT20指令集 #define SHT20_CMD_TEMP 0xF3 // 触发温度测量主机模式 #define SHT20_CMD_HUMI 0xF5 // 触发湿度测量主机模式 #define SHT20_CMD_RESET 0xFE // 软复位 // 温湿度数据结构体 typedef struct { float temperature; // 温度值℃ float humidity; // 湿度值%RH } SHT20_DataDef; // 函数声明 HAL_StatusTypeDef SHT20_Init(I2C_HandleTypeDef *hi2c); // 初始化SHT20 HAL_StatusTypeDef SHT20_Reset(I2C_HandleTypeDef *hi2c); // 软复位SHT20 HAL_StatusTypeDef SHT20_ReadData(I2C_HandleTypeDef *hi2c, SHT20_DataDef *data); // 读取温湿度数据 #endif2. 源文件sht20.c#include sht20.h /** * brief 等待SHT20测量完成传感器测量需要时间温度约85ms湿度约29ms * param hi2c: I2C句柄 * retval HAL状态 */ static HAL_StatusTypeDef SHT20_WaitReady(I2C_HandleTypeDef *hi2c) { uint32_t timeout 100; // 最大等待100ms while(timeout--) { // 轮询I2C总线直到传感器释放SDA线表示测量完成 if(HAL_I2C_IsDeviceReady(hi2c, SHT20_I2C_ADDR, 1, 1) HAL_OK) { return HAL_OK; } HAL_Delay(1); } return HAL_TIMEOUT; } /** * brief 发送测量指令并读取原始数据 * param hi2c: I2C句柄 * param cmd: 测量指令温度/湿度 * param raw_data: 存储原始数据的缓冲区 * retval HAL状态 */ static HAL_StatusTypeDef SHT20_ReadRawData(I2C_HandleTypeDef *hi2c, uint8_t cmd, uint16_t *raw_data) { uint8_t buf[3] {0}; // 1. 发送测量指令 if(HAL_I2C_Master_Transmit(hi2c, SHT20_I2C_ADDR, cmd, 1, 100) ! HAL_OK) { return HAL_ERROR; } // 2. 等待测量完成 if(SHT20_WaitReady(hi2c) ! HAL_OK) { return HAL_TIMEOUT; } // 3. 读取测量数据2字节数据1字节校验位 if(HAL_I2C_Master_Receive(hi2c, SHT20_I2C_ADDR, buf, 3, 100) ! HAL_OK) { return HAL_ERROR; } // 4. 拼接原始数据忽略校验位新手可暂不做校验 *raw_data ((uint16_t)buf[0] 8) | buf[1]; *raw_data 0xFFFC; // 清除最后2位状态位 return HAL_OK; } /** * brief 软复位SHT20 * param hi2c: I2C句柄 * retval HAL状态 */ HAL_StatusTypeDef SHT20_Reset(I2C_HandleTypeDef *hi2c) { uint8_t cmd SHT20_CMD_RESET; if(HAL_I2C_Master_Transmit(hi2c, SHT20_I2C_ADDR, cmd, 1, 100) ! HAL_OK) { return HAL_ERROR; } HAL_Delay(15); // 复位需要15ms return HAL_OK; } /** * brief 初始化SHT20 * param hi2c: I2C句柄 * retval HAL状态 */ HAL_StatusTypeDef SHT20_Init(I2C_HandleTypeDef *hi2c) { // 软复位传感器恢复默认配置 if(SHT20_Reset(hi2c) ! HAL_OK) { return HAL_ERROR; } return HAL_OK; } /** * brief 读取温湿度数据并转换为实际值 * param hi2c: I2C句柄 * param data: 存储温湿度数据的结构体指针 * retval HAL状态 */ HAL_StatusTypeDef SHT20_ReadData(I2C_HandleTypeDef *hi2c, SHT20_DataDef *data) { uint16_t raw_temp, raw_humi; // 1. 读取温度原始数据 if(SHT20_ReadRawData(hi2c, SHT20_CMD_TEMP, raw_temp) ! HAL_OK) { return HAL_ERROR; } // 2. 读取湿度原始数据 if(SHT20_ReadRawData(hi2c, SHT20_CMD_HUMI, raw_humi) ! HAL_OK) { return HAL_ERROR; } // 3. 转换为实际温度值公式来自SHT20 datasheet >#include stm32f1xx_hal.h #include sht20.h // 全局I2C句柄需与CubeMX配置一致 I2C_HandleTypeDef hi2c1; // 温湿度数据存储 SHT20_DataDef sht20_data; int main(void) { // 1. 初始化HAL库 HAL_Init(); // 2. 配置系统时钟CubeMX自动生成根据硬件调整 SystemClock_Config(); // 3. 初始化I2C1CubeMX自动生成确保参数正确 MX_I2C1_Init(); // 4. 初始化SHT20传感器 if(SHT20_Init(hi2c1) ! HAL_OK) { // 初始化失败可通过指示灯提示 while(1); } while(1) { // 5. 读取温湿度数据 if(SHT20_ReadData(hi2c1, sht20_data) HAL_OK) { // 读取成功可通过串口打印示例 // printf(Temperature: %.2f ℃, Humidity: %.2f %%RH\r\n, // sht20_data.temperature, sht20_data.humidity); } // 6. 延时1秒再读取避免频繁测量 HAL_Delay(1000); } }三、关键配置说明I2C 配置CubeMX外设I2C1模式I2C 主模式速度100kHz标准模式兼容 SHT20地址模式7 位地址引脚PB6 (SCL)、PB7 (SDA)开启内部上拉或硬件外接 10kΩ 上拉电阻常见问题排查初始化失败检查供电必须 3.3V、I2C 接线、上拉电阻、I2C 地址是否左移 1 位数据为 NaN / 异常值检查原始数据读取是否成功转换公式是否正确数据跳变过大传感器需远离热源 / 水汽测量前需稳定 1~2 秒。总结SHT20 驱动核心是通过 I2C 发送测量指令→等待测量完成→读取原始数据→用官方公式转换为实际温湿度必须注意3.3V 供电和I2C 地址左移 1 位这是通信成功的两个关键测量完成需要等待温度 85ms / 湿度 29ms不可立即读取数据否则会导致读取失败。