温柔的接触器Moly
QuecPython使用体验2:简易的温湿检测
前言
在前文中我们提到,QuecPython_EC600X_EVB开发板板载资源丰富,具有温湿度传感器,SIM卡座,光敏电阻,甚至SPK功放等模块。
在本文中,我们将主要介绍使用EC600S中的I2C接口从开发板中AHT10温湿度传感器获取温湿度,以此构建一个简单的环境检测系统。
1. AHT10温湿度传感器
AHT10传感器开发板位置,及电路图如下
AHT10 是一款高精度,完全校准,贴片封装的温湿度传感器。传感器包括一个电容式感湿元件和一个高性能 CMOS 微处理器相连接。AHT10采用标准I2C通信方式,
常用于气象站、家电、湿度调节、医疗及其他相关温湿度检测控制。在使用AHT10进行温度,湿度测量时需注意:
- 上电后传感器最多需要20ms时间(此时SCL为高电平)以达到空闲状态即做好准备接收由主机发送的命令
- 主机通过IIC与AHT10通信,AHT10的从机地址为
0x38
。在主机发出初始化 命令之后(‘11100001’代表初始化,‘10101100’代表温湿度测量), 主机必须等待测量完成
- 主机发送采集指令(0xAC)触发AHT10采集温湿度信息,延时75ms以上,等待AHT10完成采集之后再读取AHT10温湿度数据。
- 主机获取AHT10数据后,需要对原始数据进行转化,得到需要的温湿度信息。相对湿度 RH 根据 SDA 输出的相对湿度信号 SRH 通过如下公式计算获得:
相对湿度:
Rh \left [ \% \right ] = (\frac{S_{RH}}{2^{20}}) \times 100\%
温度T:
T (^\circ C) = (\frac{S_{T}}{2^{20}}) \times 200 - 50
2. QuecPython API
QuecPython已具有I2C驱动模块,使用时仅需创建对象,发送读取数据即可轻松实现对I2C设备的控制,主要API如下:
class machine.I2C(I2Cn, MODE)
参数描述:
- I2Cn - I2C 通路索引号,int类型,说明如下:
I2C0 : 0 - 通道0
I2C1 : 1 - 通道1
I2C2 : 2 - 通道2 - MODE - I2C 的工作模式,int类型,说明如下:
STANDARD_MODE : 0 - 标准模式
FAST_MODE :1 - 快速模式
EC600S-CN引脚布局如下:
EC600S | Pin | footprint |
---|---|---|
I2C1 | 56 | SDA_1V8 |
I2C1 | 57 | SCL_1V8 |
I2C.write(slaveaddress, addr, addr_len, data, datalen)
I2C.read(slaveaddress, addr, addr_len, r_data, datalen, delay)
3. 代码时间
- 初始化AHT10
# Initialization command
AHT10_CALIBRATION_CMD = 0xE1
# Trigger measurement
AHT10_START_MEASURMENT_CMD = 0xAC
# reset
AHT10_RESET_CMD = 0xBA
def sensor_init(self):
'''
传感器初始化,校准
'''
# calibration
self.write_data([self.AHT10_CALIBRATION_CMD, 0x08, 0x00])
time.sleep_ms(300) # at last 300ms
def aht10_init(self, addre=0x38, Alise="Ath10"):
#self.i2c_log = log.getLogger(Alise)
self.i2c_dev = I2C(I2C.I2C1, I2C.FAST_MODE) # 返回i2c对象 i2c类功能:用于设备之间通信的双线协议。
self.i2c_addre = addre
self.sensor_init()
- 准备采集
def write_data(self, data):
print(self.i2c_addre, data, len(data))
self.i2c_dev.write(self.i2c_addre,
bytearray(0x00), 0,
bytearray(data), len(data))
pass
def Trigger_measurement(self):
# Trigger data conversion
self.write_data([self.AHT10_START_MEASURMENT_CMD, 0x33, 0x00])
time.sleep_ms(200) # at last delay 75ms
# check has success
r_data = self.read_data(6)
# check bit7
if (r_data[0] >> 7) != 0x0:
print("Conversion has error")
else:
self.aht10_transformation_temperature(r_data[1:6])
- 转换数据
def read_data(self, length):
print("read_data start")
r_data = [0x00 for i in range(length)]
r_data = bytearray(r_data)
print("read_data start1")
ret = self.i2c_dev.read(self.i2c_addre,
bytearray(0x00), 0,
r_data, length,
0)
print("read_data start2")
print('ret',ret)
print('r_data:',r_data)
return list(r_data)
def aht10_transformation_temperature(self, data):
r_data = data
# 根据数据手册的描述来转化温度
humidity = (r_data[0] << 12) | (
r_data[1] << 4) | ((r_data[2] & 0xF0) >> 4)
humidity = (humidity/(1 << 20)) * 100.0
print("current humidity is {0}%".format(humidity))
temperature = ((r_data[2] & 0xf) << 16) | (
r_data[3] << 8) | r_data[4]
temperature = (temperature * 200.0 / (1 << 20)) - 50
print("current temperature is {0}°C".format(temperature))
4. 运行结果
将脚本加载至开发板,运行
>>> uos.listdir('usr')
['system_config.json', 'AHT10_measure.py']
>>> import example
>>> example.exec('usr/AHT10_measure.py')
···
···
current humidity is 54.512%
current temperature is 25.167°C
···
···
>>>
可以看到开发板成功通过AHT10测量到当前温度为25℃,湿度为54.512%!
工程附件
QuecPython_v1.3.pdf
Aosong_AHT10_en_draft_0c.pdf
AHT10_measure.rar
版块:
开发板测评
2023/12/10 15:34
全部评论