前言
以下是AHT10模块官网介绍原话。还有就是官网已经显示停产了,不过淘宝还是有小模块玩玩的。
AHT10是一款高精度,完全校准,贴片封装的温湿度传感器,MEMS的制作工艺,确保产品具有极高的可靠性与卓越的长期稳定性。传感器包括一个电容式感湿元件和一个高性能CMOS微处理器相连接。该产品具有品质卓越、超快响应、抗干扰能力强、性价比极高等优点。
AHT10 通信方式采用标准I²C通信方式,超小的体积、极低的功耗,使其成为各类应用甚至最为苛刻的应用场合的最佳选择。AHT10支持较宽的工作电源电压范围,该器件可为各类常见应用场景提供低成本和低功耗优势,温湿度传感器均在高精度的恒温恒湿腔室中进行出厂校准,直接输出经温度补偿后的湿度、温度等信息,用户无需要对湿度进行温度补偿,便可得到准确的温湿度信息。
参数
- 输入电压范围:1.8V至3.6V;
- 出厂经过标定校准,产品具有温度补偿功能;
- 具有I²C接口;
- 超低功耗;
- SMD封装;
- 湿度精度±2% RH(典型值);
- 温度精度±0.3℃(典型值)。
环境
-
STM32F103C6T6系统板
-
Keil5+STM32的标准库
-
硬件连接:
- OLED模块: PB7 — SDA(OLED),PB6 — SCK(OLED),供电3.3V
- AHT10模块:PB11 — SDA(AHT10),PB10 — SCL(AHT10),供电3.3V
-
末尾会给出工程链接
代码
商家给的资料中好像也有,示例。不过我觉得太乱就没看,自己写了个,下面就展示,AHT10的相关库代码。要拿拿来使用的话,建议还是看我写的例程,因为还有MyI2C库就没粘贴出来了。
-
AHT10.C
#include "stm32f10x.h" #include "MyI2C.h" #include "AHT10.h" uint8_t AHT10_Data[6]; //数据缓冲区 uint32_t AHT10_Temp=0x00000000; // 温度 uint32_t AHT10_Humi=0x00000000; // 湿度 //写寄存器 void AHT10_WriteReg(uint8_t RegAddress,uint8_t Data1,uint8_t Data2) { MyI2C_Start(); MyI2C_SendByte(AHT10_ADDRESS); MyI2C_ReceiveAck(); MyI2C_SendByte(RegAddress); MyI2C_ReceiveAck(); MyI2C_SendByte(Data1); MyI2C_ReceiveAck(); MyI2C_SendByte(Data2); MyI2C_ReceiveAck(); MyI2C_Stop(); } //读寄存器 void AHT10_ReadReg(void) { MyI2C_Start(); MyI2C_SendByte(AHT10_ADDRESS | 0x01); MyI2C_ReceiveAck(); AHT10_Data[0]=MyI2C_ReceiveByte(); MyI2C_SendAck(0); AHT10_Data[1]=MyI2C_ReceiveByte(); MyI2C_SendAck(0); AHT10_Data[2]=MyI2C_ReceiveByte(); MyI2C_SendAck(0); AHT10_Data[3]=MyI2C_ReceiveByte(); MyI2C_SendAck(0); AHT10_Data[4]=MyI2C_ReceiveByte(); MyI2C_SendAck(0); AHT10_Data[5]=MyI2C_ReceiveByte(); MyI2C_SendAck(1); MyI2C_Stop(); } //AHT10复位 void AHT10_Reset() { MyI2C_Start(); MyI2C_SendByte(AHT10_ADDRESS); MyI2C_ReceiveAck(); MyI2C_SendByte(0xBA); MyI2C_ReceiveAck(); MyI2C_Stop(); } //触发测量 void AHT10_TrigMeasu(void) { AHT10_WriteReg(0xac,0x33,0x00); } //读取命令 void AHT10_ReadCmd(void) { AHT10_ReadReg(); } //状态返回 uint8_t AHT10_GetState(void) { return AHT10_Data[0]; } //数据返回 //参数:Mode 0:返回湿度 1:返回温度 uint8_t AHT10_GetValue(uint8_t Mode) { uint32_t humi; uint32_t temp; uint32_t AHT10_Humi=0x00000000; // 湿度 uint32_t AHT10_Temp=0x00000000; // 温度 //下面的选择结构把break屏蔽掉,是因为老是报警告。恢复也行。 switch(Mode) { case 0: // 湿度数据处理 AHT10_Humi |= AHT10_Data[1]; AHT10_Humi <<= 8; AHT10_Humi |= AHT10_Data[2]; AHT10_Humi <<= 4; AHT10_Humi |= (AHT10_Data[3]>>4); // 把小数后的精度丢了,只保留整数部分,方便函数返回 humi = (float)AHT10_Humi / (0x0fffff) * 100; return humi; //break; case 1: // 温度数据处理 AHT10_Temp = AHT10_Data[3] & 0x0F; AHT10_Temp <<= 8; AHT10_Temp |= AHT10_Data[4]; AHT10_Temp <<= 8; AHT10_Temp |= AHT10_Data[5]; // 把小数后的精度丢了,只保留整数部分,方便函数返回 temp = (float)AHT10_Temp / (0x0fffff) * 200 - 50; return temp; //break; default: return 0; //break; } }
-
AHT10.H
#ifndef __AHT10_H__ #define __AHT10_H__ #define AHT10_ADDRESS 0x70 void AHT10_TrigMeasu(void); //触发测量 void AHT10_ReadCmd(void); //读取命令 uint8_t AHT10_GetState(void); //状态返回 uint8_t AHT10_GetValue(uint8_t Mode); //数据返回 void AHT10_Reset(); //AHT10复位 #endif
-
main.c
演示
第一行显示的是湿度,72%
第二行显示的是温度,32℃ (不过我家真的有32度?怪怪的)
第三行显示的是一字节的状态码,具体可以看手册
链接
文中Keil5程序+AHT10官方的手册资料
链接:https://pan.baidu.com/s/1IIucNeW2tkfIMQ4jqwJ10A 提取码:0mw7