介绍
使用STM32硬件IIC 读取AHT10温湿度传感器的数据 并根据参考文献做数据解析
参考代码:https://download.csdn.net/download/ciqujinnian_/88846167
数据格式
在发送完触发动作后 我们将会接收6个数据
recdata[0]:24 | recdata[1]:40 | recdata[2]:49 | recdata[3]:37 | recdata[4]:180 | recdata[5]:198 |
---|---|---|---|---|---|
0x18 | 0x28 | 0x31 | 0x25 | 0xb4 | 0xc6 |
状态 | 湿度数据 | 湿度数据 | 湿度数据|温度数据 | 温度数据 | 温度数据 |
ret:0 temp:21.33 humi:15.70
状态数据
状态数据 24 -> 0001 1000
解释如下
我们只关心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[%]=220SRH∗100%
这里除的底数是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[℃]=220ST∗200−50
计算方法和湿度差不多 我们将其数据组合
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;
}
运行结果
与我们算的基本一致
SMT32实现
使用STM32F103C8T6 HAL库硬件IIC实现对数据的读取