基于I2C的AHT20温湿度传感器数据采集
- 一、I2C简介
- 二、硬件I2C与软件I2C的区别
- 三、实现I2CAHT20温湿度传感器数据采集
-
- 1、AHT20简介
- 2.配置函数库,编写函数
- 3.显示最终结果
- 四、总结
一、I2C简介
IC( Inter-- Integrated Circuit)总线是一种由 PHILIPS连接微控制器及其外围设备的公司开发的两线串行总线。它由数据线组成SDA和时钟SCL串行总线可以发送和接收数据。 在CPU与被控I2C之间、I2C与I2C双向传输,高速IC总线一般可达400kbps以上。 I2C在传输数据的过程中,总线有三种信号:开始信号、结束信号和响应信号。
- 开始信号:SCL高电平时,SDA数据从高电平跳转到低电平跳转。
- 结束信号:SCL高电平时,SDA数据从低电平跳转到高电平,数据从结东传输。
- 响应信号:接收数据IC在接收到8bit数据发送到数据后IC发出特定的低电平脉冲表示已收到数据。CPU向受控单位发出信号后,等待受控单位发出响应信号,CPU接收响应信号后,根据实际情况判断是否继续传输信号。未收到响应信号的,判断为受控单位故障。
在这些信号中,起始信号是必要的,不需要结束信号和响应信号。
stm32(正点原子)SLC和SDA连接如下:
二、硬件I2C与软件I2C的区别
硬件I2C
硬件I2C对应芯片I2C外设,有相应的I2C驱动电路,它使用的I2C管脚也是专用的
软件I2C
软件I2C一般是用GPIO管脚用软件控制,模拟管脚状态I2C通信波形
硬件I2C软件的效率远高于软件I2C由于不受管脚限制,接口比较灵活
模拟I2C 是通过GPIO,软件模拟寄存器的工作模式,硬件(固件)I2C直接调用内部寄存器配置。如果要看具体的硬件,可以看芯片手册。因为固件I2C端口是固定的,所以会有区别。
区分他们:
可以看底层配置,比如IO如果配置了口配置IO口的功能(IIC功能)即固件IIC 可以看IIC写函数,看看里面有木头调用现成函数或给寄存器赋值。如果是这样,一定是固件IIC功能,如果没有,必须是数据bit一个bit模拟发生发送,必须使用循环,即模拟。 根据代码量,模拟的代码量必须大于固件。
三、实现I2CAHT20温湿度传感器数据采集
1、AHT20简介
AHT20是国内奥松生成的。I2C接口的MEMS温湿度传感器,ADC位数为20Bit,体积小,精度高,成本低。
由于AHT10/15/20 具有国产化、体积小、精度高、成本低等特点 DHT11/DHT12/AM2320/SHT20/SHT30单芯片价格在2元~3.体积小,容易嵌入产品
参数如下:
2.配置函数库,编写函数
参考 正点原子STM32开发板第27章 IIC实验
step0:驱动代码(官网下载)AHT20.c和AHT20.h,官网有,最重要的是I2C可参考原子代码myiic下就是关于i2c的代码。
对于正点原子的精英版,它SCL和SDL对应的是PB6和PB我们用普通人IO口来模拟I2C实现功能的功能。 step1: 用例程原子I2C例程,例程需要更改,这里不详细说明。基本函数库的基本框架不需要更改,因为串口通信,所以不需要更改lcd与key添加我们的代码的系列函数。
在这里,您可以复制上述两个代码HARDWARE问件夹下
点击manage project items 在HARDWRE下加入上面.c文件。 然后点击魔术棒,C/C ,路径添加AHT20文件夹 step2: 编写主函数
1、检测AHT20是否收集数据,如果收集数据,处理数据
2.根据以下两个公式
c1 = AHT20.HT[0]10010/1024/1024; //湿度 t1 = AHT20.HT[1]20010/1024/1024-500
计算得出温度。
3.指示灯翻转标识正常工作
4、AHT20函数中,有定义结构体,根据结构体来得到相关值 主函数:
#include "led.h" #include "delay.h" #include "sys.h" #include "usart.h" #include "usmart.h" #include "24cxx.h" #include "AHT20.h" /****my code start lee***/ struct m_AHT20 AHT20; int main(void)
{
volatile int c1,t1;
float c2,t2;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);//设置中断优先级
LED_Init(); //初始化LED
delay_init(); //延时初始化
IIC_Init(); //IIC初始化
uart_init(115200); //串口初始化为115200
AHT20.alive=!AHT20_Init(); //AHT20初始化
while(1)
{
if(AHT20.alive)//是否存活
{
//读取其原始数据
AHT20.flag = AHT20_ReadHT(AHT20.HT);
c1 = AHT20.HT[0]*100*10/1024/1024; //湿度
t1 = AHT20.HT[1]*200*10/1024/1024-500;//温度计算公式
//结果都放大了10倍
c2=c1/10.0;
t2=t1/10.0;
printf("湿度:\r\n%f\r\n",c2);
printf("温度:\r\n%f\r\n\r\n",t2);
//正常工作双灯翻转
LED0=!LED0;
LED1=!LED1;
}
delay_ms(2000);
}
}
step3: 编译连接,烧入程序
硬件如下
分别对应
SCL–>PB6
SDA–>PB7
共地
给3.3V电
3、最终结果展示
四、总结
这次的学习我了解了什么是硬件I2C什么是软件I2C,通过对AHT20的配置与实验更加了解了如何使用I2C。获益匪浅。
参考
https://blog.csdn.net/weixin_42048417/article/details/80683556
http://www.aosong.com/products-61.html
https://zhidao.baidu.com/question/693765215942559364.html
https://blog.csdn.net/toopoo/article/details/80053929