资讯详情

鸿蒙之获取温湿度

获得鸿蒙的温湿度

  • 介绍
    • HarmonyOS
    • AHT20
    • I2C
  • 具体设计
    • 配置I2C
    • AHT20数字温湿度传感器命令
    • 获取AHT20数字温湿度传感器值
    • 例程实现
  • 后续

介绍

HarmonyOS

HarmonyOS轻量级和小型系统适用于内存较小的系统IOT设备。开发者可以快速熟悉本文HarmonyOS环境建设、编译、烧录、调测和运行的轻量化和小系统Hello World”等。 开发轻量化和小型系统有两种方法: 用Windows开发和烧录环境,使用环境Linux编译环境。 统一使用Linux开发、编译、烧录环境。

AHT20

AHT20温湿度传感器尺寸小,性能可靠,响应快,抗干扰能力强,完全校准,I2C数字接口等特点。

I2C

IC( Inter-- Integrated Circuit)总线是一种由 PHILIPS连接微控制器及其外围设备的公司开发的两线串行总线。它由数据线组成SDA和时钟SCL构成的串行总线,可发送和接收数据。 在CPU与被控I2C之间、I2C与I2C双向传输,高速IC总线一般可达400kbps以上。 I2C在传输数据的过程中,总线有三种信号:开始信号、结束信号和响应信号。 开始信号:SCL高电平时,SDA数据从高电平跳转到低电平跳转。 结束信号:SCL高电平时,SDA数据从低电平跳转到高电平,数据从结东传输。 响应信号:接收数据IC在接收到8bit数据发送到数据后IC发出特定的低电平脉冲表示已收到数据。CPU向受控单位发出信号后,等待受控单位发出响应信号,CPU接收响应信号后,根据实际情况判断是否继续传输信号。未收到响应信号的,判断为 受控单元出现故障。 在这些信号中,起始信号是必要的,不需要结束信号和响应信号。

具体设计

配置I2C

  1. 调用I2cInit接口可配置I2C接口
hi_i2c_init(HI_I2C_IDX_0, 400*1000); 
  1. I2C接口读函数
static uint32_t AHT20_Read(uint8_t* buffer, uint32_t buffLen) { 
             hi_i2c_data data = { 
         0 };     data.receive_buf = buffer;///将获得的数据放入data.receive_buf     data.receive_len = buffLen;////放入数据的长度data.receive_len     uint32_t retval = hi_i2c_read(AHT20_I2C_IDX, AHT20_READ_ADDR, &data);     if (retval != HI_ERR_SUCCESS) { 
                 printf("I2cRead() failed, %0X!\n", retval);         return retval;     }     return HI_ERR_SUCCESS; } 
  1. I2C写程序
static uint32_t AHT20_Write(uint8_t* buffer, uint32_t buffLen) { 
          hi_i2c_data data = { 
          0 }; data.send_buf = buffer; data.send_len = buffLen; uint32_t retval = hi_i2c_write(AHT20_I2C_IDX, AHT20_WRITE_ADDR, &data); if (retval != HI_ERR_SUCCESS) { 
          printf("I2cWrite(%02X) failed, %0X!\n", buffer[0], retval); return retval; } return HI_ERR_SUCCESS; } 

AHT20数字温湿度传感器命令

  1. 发送获取状态命令
static uint32_t AHT20_StatusCommand(void)
{ 
        
    uint8_t statusCmd[] = { 
         AHT20_CMD_STATUS };
    return AHT20_Write(statusCmd, sizeof(statusCmd));
}
  1. 发送软复位命令
static uint32_t AHT20_ResetCommand(void)
{ 
        
    uint8_t resetCmd[] = { 
        AHT20_CMD_RESET};
    return AHT20_Write(resetCmd, sizeof(resetCmd));
}
  1. 发送初始化校准命令
static uint32_t AHT20_CalibrateCommand(void)
{ 
        
    uint8_t clibrateCmd[] = { 
        AHT20_CMD_CALIBRATION, AHT20_CMD_CALIBRATION_ARG0, AHT20_CMD_CALIBRATION_ARG1};
    return AHT20_Write(clibrateCmd, sizeof(clibrateCmd));
}
  1. 发送 触发测量 命令,开始测量
uint32_t AHT20_StartMeasure(void)
{ 
        
    uint8_t triggerCmd[] = { 
        AHT20_CMD_TRIGGER, AHT20_CMD_TRIGGER_ARG0, AHT20_CMD_TRIGGER_ARG1};
    return AHT20_Write(triggerCmd, sizeof(triggerCmd));
}

获取AHT20数字温湿度传感器的值

  1. 读取温湿度值之前, 首先要看状态字的校准使能位Bit[3]是否为 1(通过发送0x71可以获取一个字节的状态字), // 如果不为1,要发送0xBE命令(初始化),此命令参数有两个字节, 第一个字节为0x08,第二个字节为0x00。
uint32_t AHT20_Calibrate(void)
{ 
        
    uint32_t retval = 0;
    uint8_t buffer[AHT20_STATUS_RESPONSE_MAX];
    memset(&buffer, 0x0, sizeof(buffer));

    retval = AHT20_StatusCommand();
    if (retval != HI_ERR_SUCCESS) { 
        
        return retval;
    }

    retval = AHT20_Read(buffer, sizeof(buffer));
    if (retval != HI_ERR_SUCCESS) { 
        
        return retval;
    }

    if (AHT20_STATUS_BUSY(buffer[0]) || !AHT20_STATUS_CALI(buffer[0])) { 
        
        retval = AHT20_ResetCommand();
        if (retval != HI_ERR_SUCCESS) { 
        
            return retval;
        }
        usleep(AHT20_STARTUP_TIME);
        retval = AHT20_CalibrateCommand();
        usleep(AHT20_CALIBRATION_TIME);
        return retval;
    }

    return HI_ERR_SUCCESS;
}
  1. 接收测量结果,拼接转换为标准值
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));//清空memset
    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;
}

例程实现

static void EnviromentTask(void *arg)     
{ 
        
    (void)arg;
    uint32_t retval = 0;
    float humidity = 0.0f;//定义存放湿度的变量
    float temperature = 0.0f;//定义存放温度的变量
    I2cInit(AHT20_I2C_IDX, AHT20_BAUDRATE);//初始化I2C
    while (WIFI_IOT_SUCCESS != AHT20_Calibrate()) { 
        
        printf("AHT20 sensor init failed!\r\n");
        usleep(1000);
    }
    while(1) { 
        
        retval = AHT20_StartMeasure();//发送 触发测量 命令,开始测量
        if (retval != WIFI_IOT_SUCCESS) { 
        
            printf("trigger measure failed!\r\n");
        }

        retval = AHT20_GetMeasureResult(&temperature, &humidity);//温湿度的值放入变量的地址中
        if (retval != WIFI_IOT_SUCCESS) { 
        
            printf("get humidity data failed!\r\n");
        }
        snprintf(line, sizeof(line), "temp: %.2f", temperature);
        OledShowString(0, 1, line, 1);
        snprintf(line, sizeof(line), "humi: %.2f", humidity);
        OledShowString(0, 2, line, 1);
        sleep(1);
    }

}

后续

完整源码,可以关注我的程序设计专栏。 或者关注微信公众号上,发送“鸿蒙之获取温湿度”获取。 在这里插入图片描述

编写不易,感谢支持。

标签: sht20数字式温湿度传感器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台