第10周--IIC协议采集温湿度

I2C总线通信协议、STM32F103与AHT20温湿度传感器数据采集
一、I2C总线通信协议


I2C(Inter-Integrated Circuit)总线是一种用于连接微控制器和外围设备的串行通信协议。它具有高集成度、低成本、简单易用等优点,因此在许多嵌入式系统中得到广泛应用。
二、STM32F103与I2C通信


STM32F103是一款基于ARM Cortex-M3内核的微控制器,具有丰富的外设接口和强大的处理能力。通过STM32F103的I2C接口,可以方便地与AHT20温湿度传感器进行通信,实现数据的采集和控制。


三、AHT20温湿度传感器
AHT20是一款高精度、低功耗的温湿度传感器,采用I2C通信协议。通过与STM32F103的I2C接口连接,可以方便地获取温度和湿度值。


四、数据采集与输出
初始化I2C接口:首先需要对STM32F103的I2C接口进行初始化,包括设置通信速率、数据传输格式等。
启动传感器:通过I2C接口向AHT20发送启动命令,启动传感器进行数据采集。
读取数据:AHT20采集到温度和湿度值后,会通过I2C接口将数据发送给STM32F103。STM32F103读取数据后,可以进行必要的处理或存储。
输出数据:将处理后的温度和湿度值通过串口输出,可以通过串口调试工具或上位机软件查看数据。

如下图所示:

数据格式与应答
I2C数据以字节(即8bits)为单位传输,每个字节传输完后都会有一个ACK应答信号。应答信号的时钟是由主设备产生的。

应答(ACK):拉低SDA线,并在SCL为高电平期间保持SDA线为低电平
非应答(NOACK):不要拉低SDA线(此时SDA线为高电平),并在SCL为高电平期间保持SDA线为高电平

在传输期间,如果从设备来不及处理主设备发送的数据,从设备会保持SCL线为低电平,强迫主设备等待从设备释放SCL线,直到从设备处理完后,释放SCL线,接着进行数据传输。

如下图所示:

4、数据传输通讯
1)写数据

开始数据传输后,先发送一个起始位(S),主设备发送一个地址数据(由7bit的从设备地址,和最低位的写标志位组成的8bit字节数据,该读写标志位决定数据的传输方向),然后,主设备释放SDA线,并等待从设备的应答信号(ACK)。每一个字节数据的传输都要跟一个应答信号位。数据传输以停止位(P)结束,并且释放I2C总线。

2)读数据

开始通讯时,主设备先发送一个起始信号(S),主设备发送一个地址数据(由7bit的从设备地址,和最低位的写标志位组成的8bit字节数据),然后,主设备释放SDA线,并等待从设备的应答信号(ACK),从设备应答主设备后,主设备再发送要读取的寄存器地址,从设备应答主设备(ACK),主设备再次发送起始信号(Sr),主设备发送设备地址(包含读标志),从设备应答主设备,并将该寄存器的值发送给主设备;

读取单字节数据:
主设备要读取的数据,如果是只有一个字节的数值,就要结束应答,主设备要先发送一个非应答信号(NOACK),再发送结束信号(P);
读取多字节数据:
主设备要读取的数据,如果是大于一个字节的多个数据,就发送ACK应答信号(ACK),而不是非应答信号(NOACK),然后主设备再次接收从设备发送的数据,依次类推,直到主设备读取的数值是最后一个字节数据后,需要主设备给从设备发送非应答信号(NOACK),再发送结束信号(P),结束I2C通讯,并释放I2C总线。

 注意:所有的数据传输过程中,SDA线的电平变化必须在SCL为低电平时进行,SDA线的电平在SCL线为高电平时要保持稳定不变。如下图所示:

二、使用STM32F103完成基于I2C协议的AHT20温湿度传感器的数据采集
 
1、什么是AHT20芯片


对于AHT20芯片的解释的链接如下:

DHT20产品规格书(中文版)_A1.cdr (aosong.com)
https://www.aosong.com/userfiles/files/media/AHT20%E4%BA%A7%E5%93%81%E8%A7%84%E6%A0%BC%E4%B9%A6(%E4%B8%AD%E6%96%87%E7%89%88)%20B1.pdf


要是想了解更深一些,请移步到奥松电子ASAIR官方网址:

软件下载-温湿度传感器 温湿度芯片 温湿度变送器模块 气体传感器 流量传感器 广州奥松电子股份有限公司 (aosong.com)
http://www.aosong.com/class-36.html

二、代码实现
这里也是使用Keil uVision5。具体代码请参考链接:
(39条消息) AHT20温度采集_hhhhhh277523的博客-CSDN博客
https://blog.csdn.net/hhhhhh277523/article/details/111397514

部分代码展示:

void IIC_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
    
    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6|GPIO_Pin_7;
    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
    
    GPIO_Init(GPIOB,&GPIO_InitStructure);
    
    IIC_SCL=1;
    IIC_SDA=1;
    
}
void IIC_Init(void);                    //初始化IIC的IO口
void IIC_Start(void);                    //发送IIC开始信号
void IIC_Stop(void);                    //发送IIC停止信号
void IIC_Send_Byte(u8 txd);                //IIC发送一个字节
u8 IIC_Read_Byte(unsigned char ack);    //IIC读取一个字节
u8 IIC_Wait_Ack(void);                    //IIC等待ACK信号
void IIC_Ack(void);                        //IIC发送ACK信号
void IIC_NAck(void);                    //IIC不发送ACK信号
void  read_AHT20_once(void);
void  reset_AHT20(void);
void  init_AHT20(void);    
void  startMeasure_AHT20(void);
void  read_AHT20(void);
uint8_t  Receive_ACK(void);
void  Send_ACK(void);
void  SendNot_Ack(void);
void I2C_WriteByte(uint8_t  input);
uint8_t I2C_ReadByte(void);    
void  set_AHT20sendOutData(void);
void  I2C_Start(void);
void  I2C_Stop(void);
要是想了解串口通信相关知识,请移步
(40条消息) 练习串口传输文件_afadgfansfa的博客-CSDN博客
https://blog.csdn.net/afadgfansfa/article/details/121320433?spm=1001.2014.3001.5502

四、总结
通过使用STM32F103和AHT20温湿度传感器,可以方便地实现基于I2C协议的数据采集。在实际应用中,需要根据具体需求进行相应的硬件和软件配置,以确保数据采集的准确性和稳定性。此外,还需要注意数据处理的算法和效率,以提高整个系统的性能和响应速度。
 

  • 25
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值