IIC协议读取温湿度数据(HAL库)

一、I2C总线协议

1.1、I2C简介

I2C协议,引脚少,硬件实现简单,可扩展性强,不需要USART、CAN等通讯协议的外部收发设备,现被广泛的使用在系统内多个集成电路(IC)间的通讯。
对于通讯协议,我们也
以分层的方式来理解,最基本的是把它分为物理层和协议层。物理层规定通讯系统中具有
机械、电子功能部分的特性,确保原始数据在物理媒体的传输。协议层主要规定通讯逻辑,
统一收发双方的数据打包、解包标准。简单来说物理层规定我们用嘴巴还是用肢体来交流,
协议层则规定我们用中文还是英文来交流。

1.2、硬件I2C

常见的I2C通讯系统:
在这里插入图片描述

它的物理层有如下特点:
(1) 它是一个支持设备的总线。“总线”指多个设备共用的信号线。在一个 I2C 通讯总线中,可连接多个 I2C 通讯设备,支持多个通讯主机及多个通讯从机。
(2) 一个 I2C 总线只使用两条总线线路,一条双向串行数据线(SDA) ,一条串行时钟线(SCL)。数据线即用来表示数据,时钟线用于数据收发同步。
(3) 每个连接到总线的设备都有一个独立的地址,主机可以利用这个地址进行不同设备之间的访问。
(4) 总线通过上拉电阻接到电源。当 I2C 设备空闲时,会输出高阻态,而当所有设备都空闲,都输出高阻态时,由上拉电阻把总线拉成高电平。
(5) 多个主机同时使用总线时,为了防止数据冲突,会利用仲裁方式决定由哪个设备占用总线。
(6) 具有三种传输模式:标准模式传输速率为 100kbit/s ,快速模式为 400kbit/s ,高速模式下可达 3.4Mbit/s,但目前大多 I2C 设备尚不支持高速模式。

1.3、协议层

I2C 的协议定义了通讯的起始和停止信号、数据有效性、响应、仲裁、时钟同步和地址广播等环节。

1.3.1 I2C通讯复合格式

在这里插入图片描述

1.3.2 通讯的起始和停止信号

在这里插入图片描述

1.3.3 数据有效性

在这里插入图片描述

1.3.4 地址及数据方向

在这里插入图片描述

1.3.5 响应

在这里插入图片描述

二、IIC协议读取温湿度数据

2.1 实验内容与AHT20

实验内容: 使用STM32F103完成基于I2C协议的AHT20温湿度传感器的数据采集,并将采集的温度-湿度值通过串口输出。实现每隔2秒钟采集一次温湿度数据,并通过串口发送到上位机(win10)。
AHT20: 标准 I2C 格式的温湿度传感器
AHT20工作范围
由下图可知,AHT20工作在20℃到60℃左右时测量空气中的温度效果最好,传感器需要与空气充分接触。
在这里插入图片描述
AHT20接口定义
在这里插入图片描述
温湿度转换公式
相对湿度 RH 都可以根据 SDA 输出的相对湿度信号 SRH 通过如下公式计算获得(结果以 %RH 表示):
在这里插入图片描述
温度 T 都可以通过将温度输出信号 ST 代入到下面的公式计算得到(结果以温度 ℃ 表示):
在这里插入图片描述

在AHT20产品手册中还有电器特性,包含输入输出特性、发送命令等,在实验寄存器编写代码或标准库时可能会用到,但我使用的HAL库,没有用到这些,此处就不展示了,可以在链接中找到

2.2 CubeMX配置

2.2.1 系统时钟(RCC配置)

在这里插入图片描述

2.2.2 SYS配置

在这里插入图片描述

2.2.3 USART1配置

在这里插入图片描述

2.2.4 GPIO配置

在这里插入图片描述

2.2.5 I2C1配置

点击ADD添加,选择RX和TX
在这里插入图片描述

2.2.6 NVIC配置

在这里插入图片描述

2.2.7 时钟配置

在这里插入图片描述

2.2.8 生成项目

在这里插入图片描述
在这里插入图片描述
然后点击右上角的GENERATE CODE,生成keil文件

2.2 Keil实现

2.2.1 添加模块代码文件

将模块的AHT20-21_DEMO_V1_3.h和AHT20-21_DEMO_V1_3.c文件复制到MDK-ARM下的AHT20文件夹下,没有此文件夹就需新建此文件夹
在这里插入图片描述
在这里插入图片描述
在项目中添加文件
在这里插入图片描述
**将刚才的AHT20文件夹加入到此处的Include Path下
在这里插入图片描述
在这里插入图片描述

2.2.2 更改代码main.c

1、基于HAL库的重定向输出函数

#include<stdio.h>
int fputc(int ch, FILE *f)
 
{
 
  HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff);
 
  return ch;
 
}

2、添加AHT20的头文件

#include "AHT20-21_DEMO_V1_3.h" 

3、实现功能的主函数:在while循环下添加下列代码

	  printf("start read...\r\n");
    /* USER CODE END WHILE */
	  AHT20_Read_CTdata(CT_data);//没有CRC校验,直接读取AHT20的温度和湿度数据
	  HAL_Delay(1500);//延时等待本次读取
	  c1 = CT_data[0]*1000/1024/1024;  //计算得到湿度值c1(放大了10倍)
	  t1 = CT_data[1]*2000/1024/1024-500;//计算得到温度值t1(放大了10倍)
	  printf("temperature:%d%d.%d  ",t1/100,(t1/10)%10,t1%10);
	  printf("humidity:%d%d.%d\r\n",c1/100,(c1/10)%10,c1%10);
	  printf("waiting next...\r\n");
	  printf("\n");
	  HAL_Delay(500);//延时0.5s等待,下一次的测量
    /* USER CODE BEGIN 3 */

三、实验效果

3.1 Keil编译结果

在这里插入图片描述

3.2 FlyMCU烧录结果

需要先将boot0置为0,才能烧录,使用串口传输数据时,将boot0置为1,可以按下复位键。
在这里插入图片描述

3.3 物理连接

片上引脚如图,按图所示引脚对应模块的引脚连接
在这里插入图片描述

芯片AHT20UAB20转TTL
PA9(TXD)白线(RXD)
PA10(RXD)绿线(TXD)
PB6 (SCL)SCL
PB7 (SDA)SDA

在这里插入图片描述

3.4 运行效果

在这里插入图片描述

AHT20手册和用到的头文件

链接:https://pan.baidu.com/s/1cExUzq0cE4S6gmsqplPxGw?pwd=8ruc
提取码:8ruc

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是一份基于STM32的硬件IIC读取温湿度传感器的代码示例: ```c #include "main.h" #include "i2c.h" #define HTU21D_ADDRESS 0x80 // HTU21D传感器地址 // HTU21D传感器命令 #define HTU21D_TRIGGER_TEMP_HOLD 0xE3 #define HTU21D_TRIGGER_HUMI_HOLD 0xE5 #define HTU21D_READ_TEMP_HOLD 0xE0 #define HTU21D_READ_HUMI_HOLD 0xE0 uint8_t i2c_buffer[4]; // I2C接收数据缓存 /** * @brief 读取HTU21D传感器温度数据 * @return 温度值,单位:0.01℃ */ uint16_t HTU21D_Read_Temperature(void) { uint16_t temperature = 0; // 发送温度测量命令 i2c_buffer[0] = HTU21D_TRIGGER_TEMP_HOLD; HAL_I2C_Master_Transmit(&hi2c1, HTU21D_ADDRESS, i2c_buffer, 1, 1000); // 等待传感器测量完成 HAL_Delay(50); // 读取温度数据 HAL_I2C_Master_Receive(&hi2c1, HTU21D_ADDRESS, i2c_buffer, 3, 1000); // 计算温度值 temperature = ((uint16_t)i2c_buffer[0] << 8) | (uint16_t)i2c_buffer[1]; temperature &= 0xFFFC; // 温度数据的最后两位为小数位,需要清零 temperature = (uint16_t)((float)temperature * 175.72 / 65536.0 - 46.85) * 100; return temperature; } /** * @brief 读取HTU21D传感器湿度数据 * @return 湿度值,单位:0.01% */ uint16_t HTU21D_Read_Humidity(void) { uint16_t humidity = 0; // 发送湿度测量命令 i2c_buffer[0] = HTU21D_TRIGGER_HUMI_HOLD; HAL_I2C_Master_Transmit(&hi2c1, HTU21D_ADDRESS, i2c_buffer, 1, 1000); // 等待传感器测量完成 HAL_Delay(50); // 读取湿度数据 HAL_I2C_Master_Receive(&hi2c1, HTU21D_ADDRESS, i2c_buffer, 3, 1000); // 计算湿度值 humidity = ((uint16_t)i2c_buffer[0] << 8) | (uint16_t)i2c_buffer[1]; humidity &= 0xFFFC; // 湿度数据的最后两位为小数位,需要清零 humidity = (uint16_t)((float)humidity * 125.0 / 65536.0 - 6.0) * 100; return humidity; } ``` 需要注意的是,以上代码中的`hi2c1`变量为`I2C_HandleTypeDef`类型,需要在`main.c`文件中定义并初始化。此外,还需要在`main.c`文件中调用`MX_I2C1_Init()`函数初始化I2C接口。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值