• 基于I2C的AHT20温湿度传感器的数据采集


    关于:IC( Inter-- Integrated Circuit)总线是一种由 PHILIPS公司开发的两线式串行总线,用于连接微控制器及其外围设备。它是由数据线SDA和时钟SCL构成的串行总线,可发送和接收数据。
    在CPU与被控I2C之间、I2C与I2C之间进行双向传送,高速IC总线一般可达400kbps以上。 I2C总线在传送数据过程中共有三种类型信号,它们分别是:开始信号、结束信号和应答信号。

    开始信号:SCL为高电平时,SDA由高电平向低电平跳变,开始传送数据。

    结束信号:SCL为高电平时,SDA由低电平向高电平跳变,结東传送数据。

    应答信号:接收数据的IC在接收到8bit数据后,向发送数据的IC发出特定的低电平脉冲表示已收到数据。CPU向受控单元发出一个信号后,等待受控单元发出一个应答信号,CPU接
    收到应答信号后,根据实际情况作出是否继续传递信号的判断。若未收到应答信号,由判断为 受控单元出现故障  ;

    关于:AHT20是国内奥松生成的I2C接口的MEMS温湿度传感器,ADC位数为20Bit,具有体积小、精度高、成本低等优点。

    由于AHT10/15/20 具有国产化、体积小、精度高、成本低等特点,可以替代 DHT11/DHT12/AM2320/SHT20/SHT30,单芯片价格在¥2~3,体积小巧很轻松嵌入到产品上

    参数如下:

     AHT20
    供电电压 2.0-5.5V
    工作电流(休眠) 0.25uA
    工作电流(测量) 23uA
    测量范围(湿度) 0~100%RH
    测量范围(温度) -40~+85℃
    温度精度 ±2%RH(25℃)
    湿度精度 ±0.3℃
    分辨率 温度: 0.01℃ 湿度: 0.024%RH
    信号输出 I²C信号
    防护
    封装大小 3x3x1.0mm(DFN)

    AHT20是国内奥松生成的I2C接口的MEMS温湿度传感器,ADC位数为20Bit,具有体积小、精度高、成本低等优点。

    由于AHT10/15/20 具有国产化、体积小、精度高、成本低等特点,可以替代 DHT11/DHT12/AM2320/SHT20/SHT30,单芯片价格在¥2~3,体积小巧很轻松嵌入到产品上

    参数如下:

    历程准备:第一步:下载驱动包:http://www.aosong.com/products-61.html

    网站最下方:历程下载;将下载后的历程解压;得到.C和.h文件;

    第二步:打开正点原子STM32  IIC实验历程;在HARDWARE文件下下新建AHT20文件,将解压的.C和.h文件复制进去;

    第三步:在工程中添加解压的.C和.h文件;

    第四步:历程.c文件的修改:修改AHT20_Clock_Init()函数,历程中为:

    void AHT20_Clock_Init(void) //ÑÓʱº¯Êý
    {
    RCC_APB2PeriphClockCmd(CC_APB2Periph_GPIOB,ENABLE);
    }

    改为:

    void AHT20_Clock_Init(void) //ÑÓʱº¯Êý
    {
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
    }

    函数;

    void Init_I2C_Sensor_Port(void) //³õʼ»¯I2C½Ó¿Ú,Êä³öΪ¸ßµçƽ
    {
    GPIO_InitTypeDef GPIO_InitStruct;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;//ÍÆÍìÊä³ö
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_15;
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB,& GPIO_InitStruct);
    GPIO_SetBits(GPIOB,GPIO_Pin_15);//Êä³ö¸ßµçƽ

    GPIO_InitTypeDef GPIO_InitStruct;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;//ÍÆÍìÊä³ö
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_14;
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB,& GPIO_InitStruct);
    GPIO_SetBits(GPIOB,GPIO_Pin_15);//Êä³ö¸ßµçƽ

    }

    改为:

    void Init_I2C_Sensor_Port(void) //³õʼ»¯I2C½Ó¿Ú,Êä³öΪ¸ßµçƽ
    {
    GPIO_InitTypeDef GPIO_InitStruct;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;//ÍÆÍìÊä³ö
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_11;
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB,& GPIO_InitStruct);
    GPIO_SetBits(GPIOB,GPIO_Pin_11);//Êä³ö¸ßµçƽ

    // GPIO_InitTypeDef GPIO_InitStruct;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;//ÍÆÍìÊä³ö
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10;
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB,& GPIO_InitStruct);
    GPIO_SetBits(GPIOB,GPIO_Pin_10);//Êä³ö¸ßµçƽ
    }

    。。。。。。。。。。。。。源文件中有错误,主要是消错;

    然后,将.C文件中的所有GPIO_Pin_15改为:GPIO_Pin_7,将所有GPIO_Pin_14改为GPIO_Pin_6;与开发板IIC硬件电路对应:

    最后将.c文件中的main()函数注释掉;

    第五步:修改main.c文件为:

    #include "led.h"
    #include "delay.h"
    #include "sys.h"
    #include "usart.h"
    #include "usmart.h"
    #include "myiic.h"
    //#include "24cxx.h"
    #include "AHT20-21_DEMO_V1_3.h"
    /****my code start lee***/
    //struct m_AHT20 AHT20;
    int32_t main(void)
    {
    uint32_t CT_data[2];
    volatile int c1,t1;
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);//
    LED_Init(); //???LED
    delay_init(); //?????
    IIC_Init(); //IIC???
    uart_init(115200); //??????115200
    AHT20_Init();
    // float c2,t2;
    /*********************
    **************************************************************/
    /**刚上电,产品芯片内部需要就绪时间建议延时100-500ms
    /***********************************************************************************/
    Delay_1ms(500);
    /***********************************************************************************/
    /**/上电第一次发送0x71读取状态字,判断是否为0x18,如果不是进行寄存器初始化;
    /***********************************************************************************/
    if((AHT20_Read_Status()&0x18)!=0x18)
    {
    AHT20_Start_Init(); //初始化寄存器
    Delay_1ms(10);
    }

    /***********************************************************************************/
    /**///¢Û¸ù¾Ý¿Í»§×Ô¼ºÐèÇó·¢²âÁ¿ÃüÁî¶ÁÈ¡ÎÂʪ¶ÈÊý¾Ý£¬µ±Ç°while£¨1£©Ñ­»··¢²âÁ¿ÃüÁî¶ÁÈ¡ÎÂʪ¶ÈÊý¾Ý£¬½ö¹©²Î¿¼
    /***********************************************************************************/
    while(1)
    {
    //AHT20_Read_CTdata(CT_data); //不经过CRC校验  推荐每隔1s读一次

    AHT20_Read_CTdata_crc(CT_data); //crc校验

    c1 = CT_data[0]*100*10/1024/1024; //计算得到的湿度值c1,此处放大了10倍
    t1 = CT_data[1]*200*10/1024/1024-500;//计算得到的温度值t1,此处放大了10倍
    ////数据显示打印在串口助手
    printf("*************************** ");
    printf(" "); //插入换行
    printf("AHT20温湿度传感器财务室数据; ");
    printf(" "); //
    printf("温度:%d.%d ℃ ",(t1/10),(t1%10));
    printf(" "); //
    printf("湿度:%d.%d  %% ",(c1/10),(c1%10));
    printf(" "); //
    printf(" ");
    delay_ms(500);
    if(c1>=600||t1>=600)
    {
    LED0=!LED0;
    }
    else
    LED0=1;
    }
    }

    下载到开发板,显示结果为:

    注意:删除历程中的关于24CXX相关内容,.C和.h文件等;



  • 相关阅读:
    Redis在windows下安装过程
    Java中如何使用Redis做缓存
    Redis学习记录之Java中的初步使用
    Java多线程实现简单的售票程序
    list,set,map,数组间的相互转换
    高性能Java Web 页面静态化技术(原创)
    Nginx windows下搭建过程
    高并发解决方案--负载均衡
    高并发解决方案--页面静态化
    phpcms 自定义方法
  • 原文地址:https://www.cnblogs.com/snail-Up-work-hard/p/15540697.html
Copyright © 2020-2023  润新知