AHT20温湿度传感器的数据采集
一、硬件 I2C 和 软件(模拟) I2C
硬件I2C:对应芯片上的I2C外设,有相应I2C驱动电路,它所使用的I2C管脚也是专用的,效率是远高于软件模拟的I2C,较为稳定,但程序较复杂。硬件I2C是直接调用内部寄存器进行配置;软件I2C并没有寄存器。
软件I2C:一般是使用GPIO管脚,用软件控制SCL,SDA线输出高低电平,模拟I2C协议的时序。
主要对比:
- 硬件IIC用法比较复杂,模拟IIC的流程更清楚一些。
- 硬件IIC速度比模拟快,并且可以用DMA
- 模拟IIC可以在任何管脚上,而硬件只能在固定管脚上。
二、使用AHT20温湿度传感器的数据采集
实验器材:
- AHT20温湿度传感器
- stm32F103单片机 野火指南者
实验目的:
每隔两秒实现一次温度采集,并通过串口发送到上位机。
① 工程模板
实验采用的工程模板是正点原子stm32f103精英开发板A盘中的IIC实验
② 移值 AHT20 驱动
AHT20 Demo
主要代码
① 修改模拟I2C的GPIO引脚
因为野火指南者的USART1串口要使用GPIOA的时钟,板载LED灯要使用GPIOB时钟,而原子的I2C实验使用的正是GPIOB时钟,当使用板载LED灯时将会发生冲突。根据自己的实际情况而定,可能你使用的单片机没有这种影响,修改GPIO引脚如下
将 myiic.h 的 “GPIOB 修改为 GPIOC;PBout/PBin 修改为 PCout/Pcin”,myiic.c 的 IIC_Init 函数 中的 “GPIOB 修改为 GPIOC”
保留 AHT20 Demo中的如下函数
TempHum_init函数
/**************************************************
初始化温湿度传感器
**************************************************/
void TempHum_init()
{
delay_ms(40);//刚上电,延时40ms才可以读取状态
//首先发0x71读取状态字bit[3],如果=1,为校准输出,无须初始化!!!正常情况下读回来的状态是0x1C或者是0x18,读回来是0x80表示忙状态;
if(!((AHT20_Read_Status()&0x08)==0x08))
{
AHT20_Init(); //初始化AHT20
}
}
main.c
#include "stm32f10x.h"
#include "bsp_usart.h"
#include "delay.h"
#include "bsp_aht20.h"
#include "bsp_led.h"
int main(void)
{
u32 CT_data[2]={0};
volatile float hum=0,temp=0;
USART_Config(); //USART1初始化
LED_GPIO_Config(); //LED端口初始化
delay_init(); //延时函数初始化
TempHum_init(); //初始化温湿度传感器
while(1)
{
AHT20_Read_CTdata(CT_data); //不经过CRC校验,直接读取AHT20的温度和湿度数据
hum = CT_data[0]*100*10/1024/1024; //计算得到湿度值(放大了10倍)
temp = CT_data[1]*200*10/1024/1024-500;//计算得到温度值(放大了10倍)
printf("湿度:%.1f%%\r\n",(hum/10));
printf("温度:%.1f度\r\n",(temp/10));
printf("\r\n");
/*绿灯闪烁提示串口发送状态*/
green_led_on;
delay_ms(1000);
green_led_off;
delay_ms(1000);
}
}