鸿蒙之获取温湿度

介绍HarmonyOSAHT20I2C

具体设计配置I2CAHT20数字温湿度传感器命令获取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

调用I2cInit接口即可配置I2C接口

hi_i2c_init(HI_I2C_IDX_0, 400*1000);

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;

}

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数字温湿度传感器命令

发送获取状态命令

static uint32_t AHT20_StatusCommand(void)

{

uint8_t statusCmd[] = { AHT20_CMD_STATUS };

return AHT20_Write(statusCmd, sizeof(statusCmd));

}

发送软复位命令

static uint32_t AHT20_ResetCommand(void)

{

uint8_t resetCmd[] = {AHT20_CMD_RESET};

return AHT20_Write(resetCmd, sizeof(resetCmd));

}

发送初始化校准命令

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));

}

发送 触发测量 命令,开始测量

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数字温湿度传感器的值

读取温湿度值之前, 首先要看状态字的校准使能位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;

}

接收测量结果,拼接转换为标准值

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);

}

}

后续

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

编写不易,感谢支持。

参考文章

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。