STM32硬件IIC AHT10传感器数据采集与分析

本文详细介绍了如何在STM32硬件上使用IIC接口读取AHT10温湿度传感器的数据,并展示了数据解析过程,包括状态数据判断、湿度和温度的计算公式及其实现代码。
摘要由CSDN通过智能技术生成

介绍

使用STM32硬件IIC 读取AHT10温湿度传感器的数据 并根据参考文献做数据解析
参考代码:https://download.csdn.net/download/ciqujinnian_/88846167

数据格式

在发送完触发动作后 我们将会接收6个数据

recdata[0]:24recdata[1]:40recdata[2]:49recdata[3]:37recdata[4]:180recdata[5]:198
0x180x280x310x250xb40xc6
状态湿度数据湿度数据湿度数据|温度数据温度数据温度数据

ret:0 temp:21.33 humi:15.70

状态数据

状态数据 24 -> 0001 1000
解释如下
image.png
我们只关心Bit[7] 和 bit3 如果设备忙 就等待 如果设备未校准 就执行reset命令校准
代码实现

//定义一些数据
uint8_t recdata[6]={0x18,0x28,0x31,0x25,0xb4,0xc6};
//定义一些变量
uint8_t CALEnable=0;//校准使能位 
uint8_t BusyIndication=0;//繁忙指示位

 CALEnable = (recdata[0] >> 3 )&0x01;
BusyIndication = (recdata[0] >> 7)&0x01;
if(BusyIndication == 0){
    //设备空闲
    printf("device is not busy!\n");
    
}
else{
    //设备繁忙
    printf("device is busy!");
    return 0;
}

明白了基本的数据结构 我们通过基本的移位以及与的方式获取到对应的位的状态信息

湿度数据

湿度数据计算公式
R H [ % ] = S R H 2 20 ∗ 100 % RH[\%]= \frac{S_{RH} }{2^{20} } *100\% RH[%]=220SRH100%
这里除的底数是20位的 所以湿度数据也应该是20位的recdata[1] recdata[2] recdata3一共20 位 所以需要定义数据格式未32位的才可以装下
将其整理下组合得到的湿度数据为
0000 0000 0000 0010 1000 0011 0001 0010 -> 0x00028312 = 164626
0000 0000 0001 0000 0000 0000 0000 0000 -> 0x00100000 = 1048576
164626/1048576 = 0.1569 ≈ 15.7% 和上面计算的一致

代码实现

//读取湿度数据
AHT10_RAW = (AHT10_RAW&0xffffff00);//低8位清零 为与做准备
AHT10_RAW = (AHT10_RAW | recdata[1]) << 12; //取到第一组数据 再左移12位
AHT10_RAW = (AHT10_RAW&0xffffff00);//低8位清零 为与做准备
AHT10_RAW = (AHT10_RAW | recdata[2] << 4); //取到第一组数据 再左移4位
AHT10_RAW = (AHT10_RAW&0xfffffff0);//低4位清零 为与做准备
AHT10_RAW = (AHT10_RAW | ((recdata[3]>> 4)& 0x0f )); //第三个数据左移四位 高四位清零 与 元素RAW或 取到低四位
//根据湿度原始数据计算湿度值
humi = (float)((AHT10_RAW*100)/1048576);
printf("eaw:%X %d humi:%.2f\n",AHT10_RAW,2^20,humi);

温度数据

温度数据计算公式
T [ ℃ ] = S T 2 20 ∗ 200 − 50 T[℃]= \frac{S_{T} }{2^{20} } *200 - 50 T[]=220ST20050
计算方法和湿度差不多 我们将其数据组合
0000 0000 0000 0101 1011 0100 1100 0110 -> 0x0005b4c6 = 373958
0000 0000 0001 0000 0000 0000 0000 0000 ->0x00100000 = 1048576
(373958/1048576 )*200 -50 = 21.32 ≈ 21.33 和上面的数据相同

代码实现

  //读取温度数据
AHT10_RAW = (AHT10_RAW&0xffffff00);//低8位清零 为与做准备
AHT10_RAW = (AHT10_RAW | recdata[3] & 0x0f) << 16; //取到第一组数据 再左移16位
AHT10_RAW = (AHT10_RAW&0xffffff00);//低8位清零 为与做准备
AHT10_RAW = (AHT10_RAW | recdata[4] << 8); //取到第一组数据 再左移8位
AHT10_RAW = (AHT10_RAW&0xffffff00);//低4位清零 为与做准备
AHT10_RAW = (AHT10_RAW | (recdata[5] )); //第三个数据左移四位 高四位清零 与 元素RAW或 取到低四位
//根据湿度原始数据计算温度值
temp = (float)((AHT10_RAW*200)/1048576)-50.0;
printf("eaw:%X %d temp:%.2f\n",AHT10_RAW,AHT10_RAW,temp);

全部代码

全部代码 C语言实现

#include "add.h"
#include "sub.h"
#include "mult.h"
#include "div.h"
#include <stdio.h>
#include <string.h>

typedef unsigned          char uint8_t;
typedef unsigned short     int uint16_t;
typedef unsigned           int uint32_t;


int main(int argc,char **argv)
{
     //定义一些数据
    uint8_t recdata[6]={0x18,0x28,0x31,0x25,0xb4,0xc6};
    //定义一些变量
    uint8_t CALEnable=0;//校准使能位 
    uint8_t BusyIndication=0;//繁忙指示位
    uint32_t AHT10_RAW=0;
    float humi,temp;

    CALEnable = (recdata[0] >> 3 )&0x01;
    BusyIndication = (recdata[0] >> 7)&0x01;
    if(BusyIndication == 0){
        //设备空闲
        printf("device is not busy!\n");
        
    }
    else{
        //设备繁忙
        printf("device is busy!");
        return 0;
    }
    if(CALEnable == 1){
        //设备已校准
        printf("device have calibratied\n");
        //读取湿度数据
        AHT10_RAW = (AHT10_RAW&0xffffff00);//低8位清零 为与做准备
        AHT10_RAW = (AHT10_RAW | recdata[1]) << 12; //取到第一组数据 再左移12位
        AHT10_RAW = (AHT10_RAW&0xffffff00);//低8位清零 为与做准备
        AHT10_RAW = (AHT10_RAW | recdata[2] << 4); //取到第一组数据 再左移4位
        AHT10_RAW = (AHT10_RAW&0xfffffff0);//低4位清零 为与做准备
        AHT10_RAW = (AHT10_RAW | ((recdata[3]>> 4)& 0x0f )); //第三个数据左移四位 高四位清零 与 元素RAW或 取到低四位
        //根据湿度原始数据计算湿度值
        humi = (float)((AHT10_RAW*100)/1048576);
        printf("eaw:%X %d humi:%.2f\n",AHT10_RAW,2^20,humi);

        AHT10_RAW = AHT10_RAW&0x00;
        //读取温度数据
        AHT10_RAW = (AHT10_RAW&0xffffff00);//低8位清零 为与做准备
        AHT10_RAW = (AHT10_RAW | recdata[3] & 0x0f) << 16; //取到第一组数据 再左移16位
        AHT10_RAW = (AHT10_RAW&0xffffff00);//低8位清零 为与做准备
        AHT10_RAW = (AHT10_RAW | recdata[4] << 8); //取到第一组数据 再左移8位
        AHT10_RAW = (AHT10_RAW&0xffffff00);//低4位清零 为与做准备
        AHT10_RAW = (AHT10_RAW | (recdata[5] )); //第三个数据左移四位 高四位清零 与 元素RAW或 取到低四位
        //根据湿度原始数据计算温度值
        temp = (float)((AHT10_RAW*200)/1048576)-50.0;
        printf("eaw:%X %d temp:%.2f\n",AHT10_RAW,AHT10_RAW,temp);

    }
    else{
        //设备未校准
        printf("device have not calibratied");
    }
   

    return 0;
}

运行结果

与我们算的基本一致
image.png

SMT32实现

使用STM32F103C8T6 HAL库硬件IIC实现对数据的读取

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值