当前位置: 首页 > news >正文

基于STM32F411的AM2320温湿度采集程序

基于STM32F411的AM2320温湿度采集程序。AM2320是一款常用的数字温湿度复合传感器,它支持I2C单总线两种通信方式。由于其出厂已校准并能直接输出补偿后的数字信息,因此使用起来比较方便。

硬件连接 (AM2320 与 STM32F411)

首先,正确连接硬件是成功读取数据的第一步。AM2320通常采用4引脚封装(VDD、SDA、GND、SCL),但其通信方式可以配置。

AM2320 引脚 STM32F411 引脚 说明
VDD 3.3V 电源正极
GND GND 电源地
SDA 可选 PB7 或 PB9 串行数据线
SCL 可选 PB6 或 PB8 串行时钟线 (I2C模式)

注意

  • I2C 模式:需要连接 SDASCL 两条线,并且通常都需要连接上拉电阻(例如4.7KΩ)到3.3V。
  • 单总线模式:只需连接 SDA 线,SCL引脚需要接地。SDA线上同样需要上拉电阻。

软件编程

I2C 通信模式示例

以下是基于HAL库的STM32F411程序示例,采用I2C通信方式读取AM2320。

1. I2C 初始化

首先需要初始化I2C外设。

#include "stm32f4xx_hal.h"I2C_HandleTypeDef hi2c1;void MX_I2C1_Init(void) {hi2c1.Instance = I2C1;hi2c1.Init.ClockSpeed = 100000; // AM2320建议I2C时钟频率在100kHz以内hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2;hi2c1.Init.OwnAddress1 = 0;hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;hi2c1.Init.OwnAddress2 = 0;hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;if (HAL_I2C_Init(&hi2c1) != HAL_OK) {Error_Handler();}
}

2. AM2320 读取函数

AM2320的读取过程通常分为三步:唤醒传感器发送读取指令读取数据

// 函数声明
uint8_t AM2320_Read_Temp_Hum(I2C_HandleTypeDef *hi2c, float *Temperature, float *Humidity);// 读取AM2320的温湿度数据
// 返回值: 0-成功, 其他-错误
uint8_t AM2320_Read_Temp_Hum(I2C_HandleTypeDef *hi2c, float *Temperature, float *Humidity) {uint8_t buf[8];uint16_t hum, temp;// 1. 唤醒传感器(这个步骤有时可以省略,但为了保证稳定性最好加上)// 发送设备地址(写操作) HAL_I2C_Master_Transmit(hi2c, 0xB8, 0x00, 0, HAL_MAX_DELAY);HAL_Delay(1); // 等待至少800us// 2. 发送读取指令buf[0] = 0x03; // 功能码:读取寄存器buf[1] = 0x00; // 起始地址高字节buf[2] = 0x04; // 起始地址低字节(这里是从湿度寄存器开始读)buf[3] = 0x02; // 读取的寄存器数量(温湿度共两个寄存器)if (HAL_I2C_Master_Transmit(hi2c, 0xB8, buf, 4, HAL_MAX_DELAY) != HAL_OK) {return 1; // 发送指令失败}HAL_Delay(2); // 等待传感器准备数据// 3. 读取数据(6个字节:2字节湿度 + 2字节温度 + 2字节CRC)if (HAL_I2C_Master_Receive(hi2c, 0xB9, buf, 6, HAL_MAX_DELAY) != HAL_OK) {return 2; // 读取数据失败}// 4. 校验CRC(此处简化处理,实际应用建议添加CRC校验)// 可参考AM2320数据手册中的CRC校验方法// 5. 数据转换hum = (buf[0] << 8) | buf[1];   // 组合湿度值temp = (buf[2] << 8) | buf[3];  // 组合温度值*Humidity = hum / 10.0;    // 湿度转换为百分比*Temperature = temp / 10.0; // 温度转换为摄氏度return 0; // 读取成功
}

3. 主循环中的调用

int main(void) {HAL_Init();SystemClock_Config();MX_GPIO_Init();MX_I2C1_Init();float temperature, humidity;while (1) {if (AM2320_Read_Temp_Hum(&hi2c1, &temperature, &humidity) == 0) {// 读取成功,在这里处理温湿度数据// 例如:通过串口打印,或者显示到OLED上printf("Temperature: %.1f C, Humidity: %.1f %%\n", temperature, humidity);} else {printf("Failed to read from AM2320 sensor!\n");}HAL_Delay(2000); // 每2秒读取一次}
}

单总线通信模式要点

如果你选择使用单总线模式,需要注意以下几点:

  1. 接线:只连接SDA线,并将SCL引脚接地。SDA需要上拉电阻。
  2. 时序要求:单总线通信对时序要求非常严格,需要精确的微秒级延时。
  3. 通信过程
    • 启动信号:主机(MCU)拉低总线至少800μs,然后释放。
    • 传感器响应:AM2320会拉低总线80μs左右作为应答,然后拉高80μs左右。
    • 数据传输:之后开始传输40位(5字节)数据(湿度高位、湿度低位、温度高位、温度低位、CRC校验码)。
  4. 信号表示:位信号“0”和“1”由高电平的持续时间区分(“0”通常为26~28μs,“1”通常为70μs)。

参考程序与资源

  1. Keil5平台上的AM2320单总线示例:这个资源提到在Keil5平台上有用单总线实现AM2320温湿度采集的STM32F411程序。
  2. 代码 AM2320的温度湿度采集的STM32F411程序 www.youwenfan.com/contentcng/51683.html
  3. STM32F103与AM2320的示例:虽然基于STM32F103,但其读取AM2320的逻辑(包括I2C和单总线)是相似的,具有很强的参考价值,尤其提供了CRC校验和数据处理细节。
  4. AM2320数据手册:始终是最权威的参考资料,包含了详细的电气特性、通信协议、时序图和CRC校验算法。
http://www.wxhsa.cn/company.asp?id=328

相关文章:

  • jmeter测试mysql
  • 博弈论杂谈
  • 基于MATLAB的图像配准与拼接实现
  • ESP-IDF在vscode环境下编译速度
  • Docker容器
  • EtherCAT总线介绍及耦合器EK1100
  • centos服务器定时任务备份数据库脚本
  • 小红书全量笔记数据集(含标题、正文、标签、互动量、图片等),可用于NLP、推荐算法、大模型训练、爆款文章生成、精准营销与市场分析
  • PVE跨集群迁移虚机
  • CF2022E 题解 | 数学、并查集
  • 领悟2025.9.10
  • Codeforces Round 1049 (Div. 2)
  • 告别资料混乱!PJMan 让项目文件管理,简单到不用找
  • 公众号文章如何添加附件?微信公众号支持附件下载Word、Excel、PDF、PPT等
  • 揭秘LedgerCTF的AES白盒挑战:逆向工程与密码学分析
  • Java11-快速启动指南-全-
  • 三万小时PB级院线级电影数据集,包含完整视频、音频和字幕多模态资源,专为视频大模型训练和多模态研究设计,适用于文生视频生成、影视剪辑、语义检索及智能内容管理
  • openssl编程之sm3哈希代码示例
  • CRMEB标准版PHP订单列表功能解析与实战应用
  • timescaledb在ubuntu上的高可用部署步骤记录
  • Mybatis
  • vue3不允许缓存组件keep-alive直接包裹router-view
  • 你的部署流程已然落伍-热重启的失传艺术
  • 安全不是一个功能-而是一个地基
  • Hall 定理相关
  • docker save load 案例
  • Python中的枚举类
  • 数据结构与算法-25.红黑树
  • 第一周个人作业
  • Python 虚拟环境使用和打包成exe程序