总体过程:复位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是直接调用江协的,直接去搜拿来用就好了