QuecPython+IIC 应用示例和常见问题

应用案例

温湿度传感器AHT10

AHT10 配有一个全新设计的 ASIC专用芯片、一个经过改进的MEMS半导体电容式湿度传感元件和一个标准的片上温度传感元件。主要引用场景有:
暖通空调 、除湿器、测试及检测设备、消费品、汽车 、自动控制、数据记录器、气象站、家电、湿度调节、医疗及其他相关温湿度检测控制。

AHT10工作流程如下:

  • 给传感器上电,上电后传感器最多需要20ms时间(此时SCL为高电平)以达到空闲状态即做好准备接收由主机 (蜂窝模组)发送的命令。

  • 主机通过IIC与AHT10通信,AHT10的从机地址为0x38。在主机发出初始化 命令之后(‘11100001’代表初始化,‘10101100’代表温湿度测量), 主机必须等待测量完成。基本的命令在下表中进行概述。

下表为从机返回的状态位说明。

  • 主机发送采集指令(0xAC)触发AHT10采集温湿度信息,延时75ms以上,等待AHT10完成采集之后再读取AHT10温湿度数据。

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])
  • 主机获取AHT10数据后,需要对原始数据进行转化,得到需要的温湿度信息。相对湿度 RH 根据 SDA 输出的相对湿度信号 SRH 通过如下公式计算获得

温度 T可以通过将温度输出信号 ST 代入到下面的公式计算得到

def aht10_transformation_temperature(self, data):
    r_data = data
    # Convert raw data into temperature and humidity
    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))

AHT10详细驱动可参考AHT10驱动

常见问题和故障

IIC是一种非常简单和直接的通信协议,在实际应用中遇到的问题也比较少。

1. 数据接收或者接收一直失败

这可能是由于几种原因引起的,包括:波特率设置错误、硬件连接问题等。故障排查步骤可能包括:

  • 检查模组IIC波特率是否超过外设芯片最高波特率限制。

  • 检查硬件连接,确保SDA和SCL线正确连接,并且地线(GND)也要正确连接。

2. 可以正常进行收发,但是有错误数据

可能是以下几个原因:

  • 主机SDA、SCL和从机SDA、SCL电平不一致。当主机电平为3.3V,从机为1.8V,此时从机的高电平是1.8V,但是主机一般认为电平高于1.65V是高电平,容易产生误判。

  • IIC上拉电阻过大,上拉能力不够,导致上升沿和下降沿持续时间过长,主机判断数据错误。