1 Star 2 Fork 2

XuKaiSheng / OpenHarmony_LVGL8.3

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
温湿度传感器开发.md 4.01 KB
一键复制 编辑 原始数据 按行查看 历史
XuKaiSheng 提交于 2023-11-02 17:52 . first commit

AHT20

cgi-bin_mmwebwx-bin_webwxgetmsgimg_&MsgID=1161865678247607839&skey=@crypt_3601f3fd_37bbad356b51d02be8b4633e0a3a2890&mmweb_appid=wx_webfilehelper

AHT20是I2C接口的MEMS温湿度传感器,ADC位数为20Bit,具有体积小、精度高、成本低等优点。相对湿度精度 RH=±2%,温度精度 T=±0.3°C。相对湿度测量范围 RH=0100%,温度测量范围 T=-4085°C。

cgi-bin_mmwebwx-bin_webwxgetmsgimg_&MsgID=5777622283710240960&skey=@crypt_3601f3fd_37bbad356b51d02be8b4633e0a3a2890&mmweb_appid=wx_webfilehelper

引脚定义

主板引脚 释义
GPIO0 SDA
GPIO1 SCL

cgi-bin_mmwebwx-bin_webwxgetmsgimg_&MsgID=8635530985746145697&skey=@crypt_3601f3fd_37bbad356b51d02be8b4633e0a3a2890&mmweb_appid=wx_webfilehelper

AHT20传感器使用I2C接口,I2C通讯协议(Inter-Integrated Circuit)引脚少,硬件实现简单,可扩展性强,实现I2C需要两根信号线完成信息交换。

·一个I2C总线只使用两条总线线路,一条双向串行数据线(SDA),一条串行时钟线(SCL)。数据线即用来表示数据,时钟线用于数据收发同步。

流程

  1. 读取温湿度值前,检查传感器是否就绪
  2. 如果不为1,要发送0xBE命令(初始化以及校准)
  3. 发送测量命令至AHT20,开始测量
  4. 持续接收AHT20数据
  5. AHT20数据发送的是20bit的相对湿度信号$S_{RH}$和温度信号$S_{T}$,我们还需要做以下转换

相对湿度转换

相对湿度RH可以根据SDA输出的相对湿度信号$S_{RH}$通过以下公式获得: $$ RH[%] = (\frac{S_{RH}}{2^{20}})*100% $$

温度转换

温度T可以根据SDA输出的温度信号$S_{T}$通过以下公式获得: $$ T[^{\circ}C] = (\frac{S_{T}}{2^{20}})*200-50 $$

测量代码

// 接收测量结果,拼接转换为标准值
uint32_t AHT20_GetMeasureResult(float* temp, float* humi)
{
    uint32_t retval = 0, i = 0;
    if (temp == NULL || humi == NULL) {
        return HI_ERR_FAILURE;
    }

    uint8_t buffer[AHT20_STATUS_RESPONSE_MAX];
    memset(&buffer, 0x0, sizeof(buffer));
    retval = AHT20_Read(buffer, sizeof(buffer));  // recv status command result
    if (retval != HI_ERR_SUCCESS) {
        return retval;
    }

    for (i = 0; AHT20_STATUS_BUSY(buffer[0]) && i < AHT20_MAX_RETRY; i++) {
        // printf("AHT20 device busy, retry %d/%d!\r\n", i, AHT20_MAX_RETRY);
        usleep(AHT20_MEASURE_TIME);
        retval = AHT20_Read(buffer, sizeof(buffer));  // recv status command result
        if (retval != HI_ERR_SUCCESS) {
            return retval;
        }
    }
    if (i >= AHT20_MAX_RETRY) {
        printf("AHT20 device always busy!\r\n");
        return HI_ERR_SUCCESS;
    }

    uint32_t humiRaw = buffer[1];
    humiRaw = (humiRaw << 8) | buffer[2];
    humiRaw = (humiRaw << 4) | ((buffer[3] & 0xF0) >> 4);
    *humi = humiRaw / (float)AHT20_RESOLUTION * 100;

    uint32_t tempRaw = buffer[3] & 0x0F;
    tempRaw = (tempRaw << 8) | buffer[4];
    tempRaw = (tempRaw << 8) | buffer[5];
    *temp = tempRaw / (float)AHT20_RESOLUTION * 200 - 50;
    // printf("humi = %05X, %f, temp= %05X, %f\r\n", humiRaw, *humi, tempRaw, *temp);
    return HI_ERR_SUCCESS;
}

效果图

屏幕下方分别是:温度、相对湿度

cgi-bin_mmwebwx-bin_webwxgetmsgimg_&MsgID=1475070280597916011&skey=@crypt_3601f3fd_37bbad356b51d02be8b4633e0a3a2890&mmweb_appid=wx_webfilehelper

1
https://gitee.com/KaiSheng_Xu/open-harmony_-lvgl8.3.git
git@gitee.com:KaiSheng_Xu/open-harmony_-lvgl8.3.git
KaiSheng_Xu
open-harmony_-lvgl8.3
OpenHarmony_LVGL8.3
master

搜索帮助