基于STM32读取AHT20温湿度(简单易懂!!!)

总体过程:复位AHT20->初始化AHT20->开始测量温湿度->读取数值、

(本人能力有限,就不做校验检测了,直接复位初始化就行了,也能正常用)

指令说明:

1.软复位     通过I2C写入0X70 ->应答 ->发送软件复位指令0XBA->应答->然后I2C_Stop 

后面的也类似,看我发的图结合代码就能懂啥意思

void  reset_AHT20(void)
{
    MY_I2C_Start();
    MY_I2C_SendByte(0x70);
    MYI2C_ReceiveAck();
    MY_I2C_SendByte(0xBA);
    MYI2C_ReceiveAck();
    MY_I2C_Stop();
}

2.初始化:

void  init_AHT20(void)
{
    MY_I2C_Start();
    MY_I2C_SendByte(0x70);
    MYI2C_ReceiveAck();    
    MY_I2C_SendByte(0xBE);
    MYI2C_ReceiveAck();
    MY_I2C_SendByte(0x08);
    MYI2C_ReceiveAck();
    MY_I2C_SendByte(0x00);
    MYI2C_ReceiveAck();
    MY_I2C_Stop();
}

3.触发测量数据

void startMeasure_AHT20(void)
{
    MY_I2C_Start();

    MY_I2C_SendByte(0x70);
    MYI2C_ReceiveAck();

    MY_I2C_SendByte(0xAC);
    MYI2C_ReceiveAck();
    MY_I2C_SendByte(0x33);
    MYI2C_ReceiveAck();

    MY_I2C_SendByte(0x00);
    MYI2C_ReceiveAck();
    MY_I2C_Stop();
}

4.读取数据在做数据处理,换算换算公式手册上有

代码

void read_AHT20(void)
{
    uint8_t   i;

    for(i=0; i<6; i++)
    {
        readByte[i]=0;//将数组清空,接收数据
    }
    MY_I2C_Start();

    MY_I2C_SendByte(0x71);//读地址
    MYI2C_ReceiveAck();
    readByte[0]= MY_I2C_ReciveByte();
    MYI2C_SendACK(0);//给应答是为了继续接收数据
    readByte[1]= MY_I2C_ReciveByte();
    MYI2C_SendACK(0);
    readByte[2]= MY_I2C_ReciveByte();
    MYI2C_SendACK(0);
    readByte[3]= MY_I2C_ReciveByte();
    MYI2C_SendACK(0);
    readByte[4]= MY_I2C_ReciveByte();
    MYI2C_SendACK(0);
    readByte[5]= MY_I2C_ReciveByte();
    MYI2C_SendACK(1);
    MY_I2C_Stop();

    //--------------
    if( (readByte[0] & 0x68) == 0x08 )//揭衾NOR Modㄛ眒苺袧
    {
        H1 = readByte[1];
        H1 = (H1<<8) | readByte[2];
        H1 = (H1<<8) | readByte[3];
        H1 = H1>>4;

        H1 = (H1*1000)/1024/1024;

        T1 = readByte[3];
        T1 = T1 & 0x0000000F;
        T1 = (T1<<8) | readByte[4];
        T1 = (T1<<8) | readByte[5];

        T1 = (T1*2000)/1024/1024 - 500;
    }

}

最后整合起来

void  read_AHT20_once(void)
{
    SysTick_delay_ms(10);//SysTick延时,没讲究

    reset_AHT20();
    SysTick_delay_ms(10);

    init_AHT20();
    SysTick_delay_ms(10);

    startMeasure_AHT20();
    SysTick_delay_ms(80);//数据手册上写着,最少给75ms,这里就给80就行

    read_AHT20();
    SysTick_delay_ms(5);
}

以上是AHT20的部分代码

I2C我不想加了,去看野火,或者江协的I2C软件读取就行了。

主函数部分

#include "stm32f10x.h"                  // Device header
#include <stdio.h>
#include <OLED.H>
#include <IIC.H>

#include <AHT20.H>
extern uint32_t  H1;  //Humility
extern uint32_t  T1;  //Temperature
int main(void){
    OLED_Init();
    IIC_GPIO_Init_Config();
    OLED_ShowString(1,1,"Temp:");
    OLED_ShowString(2,1,"Humility:");
//    MPU6050_Init();
    while(1){
        read_AHT20_once();
        OLED_ShowNum(1,6,T1/100,1);
        OLED_ShowNum(1,7,T1/10%10,1);
        OLED_ShowChar(1,8,'.');
        OLED_ShowNum(1,9,T1%10,1);
        
        OLED_ShowNum(2,10,H1,3);
        OLED_ShowNum(2,11,H1/10%10,1);
        OLED_ShowChar(2,12,'.');
        OLED_ShowNum(2,13,H1%10,1);
        SysTick_delay_ms(500);
    }
}

OLED是直接调用江协的,直接去搜拿来用就好了

  • 42
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值