Advertisement

AHT20温湿度传感器的数据采集

阅读量:

目录

  • 一.I2C
    • 二.温湿度传感器的数据采集
      • 三.参考

一.I2C

1.I2C通讯协议介绍

I2C总线是PHLIPS公司在20世纪80年代推出的一种串行总线。具有引脚少,硬件实现简单,可扩展性强的优点。I2C总线的另一优点是支持多主控,总线上任何能够进行发送/接收数据的设备都可以占领总线。当然,任意时间点上只能存在一个主控。

I2C即是一种总线,也是一种通讯协议。在嵌入式开发中,通讯协议可分为两层:物理层和协议层。物理层是数据在物理媒介传输的保障;协议层主要是规定通讯逻辑,同一收发双方的数据打包、解包标准。打个比方,物理层相当于现实中的公路,而协议层则是交通规则,汽车可以在路上行驶,但是需要交通规则对行驶规则进行约束,不然将出现危险,也就是数据传输紊乱、丢包。

(1)物理层
在这里插入图片描述
(1) 在I2C通讯总线上,可连接多个I2C通讯设备,支持多个通讯主机和多个通讯从机
(2) I2C通讯只需要两条双向总线:串行数据线(SDA),串行时钟线(SCL)。数据线用于传输数据,时钟线用于同步数据收发
(3) 每个连接到总线的设备都有一个独立的地址,主机正是利用该地址对设备进行访问
(4) SDA和SCL总线都需要接上上拉电阻,当总线空闲时,两根线均为高电平。连接到总线上的任意器件输出低电平都会将总线信号拉低。即各器件的SDA和SCL都是线与的关系
(5) 多个主机同时使用总线时,需要用仲裁方式决定哪个设备占用总线,不然数据将会产生冲突
(6) 串行的8位双向数据传输位速率在标准模式下可达100kbps,快速模式下可达400kbps,高速模式下可达3.4Mbps(目前大多数I2C设备还不支持高速)
(2) 协议层**

协议层规约了通讯的起始、停止信号,数据有效性、响应、冲裁同步、地址广播等。

2.“软件I2C”和“硬件I2C

硬件 I2C:对应芯片上的I2C外设,有相应I2C驱动电路,其所使用的I2C管脚也是专用的,因而效率要远高于软件模拟的I2C;一般也较为稳定,但是程序较为繁琐。硬件(固件)I2C是直接调用内部寄存器进行配置;而软件I2C是没有寄存器这个概念的。

软件 I2C:一般是使用GPIO管脚,用软件控制SCL,SDA线输出高低电平,模拟i2c协议的时序。

区别:
硬件I2C的效率要远高于软件的,而软件I2C由于不受管脚限制,接口比较灵活。
模拟I2C 是通过GPIO,软件模拟寄存器的工作方式,而硬件(固件)I2C是直接调用内部寄存器进行配置。如果要从具体硬件上来看,可以去看下芯片手册。因为固件I2C的端口是固定的,所以会有所区别。
至于如何区分它们
可以看底层配置,比如IO口配置,如果配置了IO口的功能(IIC功能)那就是固件IIC,否则就是模拟
可以看IIC写函数,看里面有木有调用现成的函数或者给某个寄存器赋值,如果有,则肯定是固件IIC功能,没有的话肯定是数据一个bit一个bit模拟发生送的,肯定用到了循环,则为模拟。

二.温湿度传感器的数据采集

1.实验要求

(1)每隔2秒钟采集一次温湿度数据
(2)并通过串口发送到上位机(win10)

2.主要代码块

复制代码
    #include "led.h"
    #include "delay.h"
    #include "temhum.h"
    #include "sys.h"
    #include "usart.h"
    
     int main(void)
     {	 	
    u32 CT_data[2]={0};
    volatile float  hum=0,tem=0;     
     
    delay_init();	    	 //延时函数初始化	  
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
    uart_init(115200);	 //串口初始化为115200
    LED_Init();			     //LED端口初始化
    temphum_init();     //ATH20初始化    
    	
    	while(1)
    	{
        AHT20_Read_CTdata(CT_data);       //不经过CRC校验,直接读取AHT20的温度和湿度数据 
    
        hum = CT_data[0]*100*10/1024/1024;  //计算得到湿度值(放大了10倍)
        tem = CT_data[1]*200*10/1024/1024-500;//计算得到温度值(放大了10倍)
    
        printf("湿度:%.1f%%\r\n",(hum/10));
        printf("温度:%.1f度\r\n",(tem/10));
        printf("\r\n");
        
        //延时2s,LED闪烁提示串口发送状态
        LED=0;
        delay_ms(1000);
        LED=1;
        delay_ms(1000);
    	 }
    }
    
    
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    

也可以进GitHub地址下载代码
3.实验结果

下图是串口每隔2s发送的温湿度数据,当用手捂住AHT20模块时可以发现温湿度迅速升高;当手离开AHT20模块时温湿度又逐渐降低。

在这里插入图片描述

三.参考

1.博客借鉴
2.参考文章及书籍:
(1)《零死角玩转STM32—F103指南者》
(2)《STM32F1开发指南(精英版)-库函数版本_V1.2》

全部评论 (0)

还没有任何评论哟~