OpenHarmony鸿蒙硬件-Kaihong_Hi3861_温湿度感应板-获取温湿度

OpenHarmony鸿蒙硬件-Kaihong_Hi3861 温湿度感应板介绍

// 标准输入输出头文件(printf)
#include <stdio.h>
// 延时函数头文件(usleep)
#include <unistd.h>

// OpenHarmony 1.0 老版 GPIO 驱动头文件
#include "wifiiot_gpio.h"
// GPIO 复用功能配置头文件
#include "wifiiot_gpio_ex.h"
// OpenHarmony 1.0 老版 I2C 驱动头文件
#include "wifiiot_i2c.h"
// 错误码定义
#include "wifiiot_errno.h"

// 解决 uint8_t / uint16_t 未定义问题
#include <stdint.h>

// 系统启动入口宏 SYS_RUN 必须包含
#include "ohos_init.h"

// SHT40 I2C 8位地址(深开鸿专用)
#define SHT40_ADDR       0x88
// SHT40 测量命令(中等精度)
#define SHT40_CMD_MEASURE 0xFD

/**
 * @brief  SHT40 初始化(GPIO + I2C)
 */
static void SHT40_Init(void)
{
    // 初始化GPIO模块
    GpioInit();

    // 设置GPIO13为I2C0_SDA
    IoSetFunc(WIFI_IOT_IO_NAME_GPIO_13, WIFI_IOT_IO_FUNC_GPIO_13_I2C0_SDA);
    // 设置GPIO14为I2C0_SCL
    IoSetFunc(WIFI_IOT_IO_NAME_GPIO_14, WIFI_IOT_IO_FUNC_GPIO_14_I2C0_SCL);

    // 初始化I2C0,速率100KHz
    I2cInit(WIFI_IOT_I2C_IDX_0, 100000);
}

/**
 * @brief  读取SHT40温湿度数据
 * @param  temp  温度值输出指针
 * @param  humi  湿度值输出指针
 * @return 0成功
 */
static int SHT40_ReadData(float *temp, float *humi)
{
    uint8_t cmd = SHT40_CMD_MEASURE;
    uint8_t raw_data[6] = {0};
    WifiIotI2cData i2c_data = {0};

    // 发送测量命令
    i2c_data.sendBuf = &cmd;
    i2c_data.sendLen = 1;
    I2cWrite(WIFI_IOT_I2C_IDX_0, SHT40_ADDR, &i2c_data);

    // 等待测量完成
    usleep(10000);

    // 读取6字节原始数据
    i2c_data.receiveBuf = raw_data;
    i2c_data.receiveLen = 6;
    I2cRead(WIFI_IOT_I2C_IDX_0, SHT40_ADDR, &i2c_data);

    // 拼接两个8位数据,转换为16位原始温度值
    uint16_t temp_raw = (raw_data[0] << 8) | raw_data[1];
    // SHT40官方公式,计算真实温度
    *temp = -45.0f + 175.0f * temp_raw / 65535.0f;

    // 拼接两个8位数据,转换为16位原始湿度值
    uint16_t humi_raw = (raw_data[3] << 8) | raw_data[4];
    // SHT40官方公式,计算真实湿度
    *humi = -6.0f + 125.0f * humi_raw / 65535.0f;

    // 限制湿度范围在 0%~100%
    if (*humi < 0)   *humi = 0;
    if (*humi > 100) *humi = 100;

    return 0;
}

/**
 * @brief  主任务函数
 */
void sht40_main(void)
{
    float temperature, humidity;

    // 传感器初始化
    SHT40_Init();

    // 循环读取并打印温湿度
    while (1) {
        SHT40_ReadData(&temperature, &humidity);
        printf("Temperature: %.2f C    Humidity: %.2f %%RH\n", temperature, humidity);
        // 每隔1秒刷新一次
        usleep(1000000);
    }
}

// 系统开机自动运行
SYS_RUN(sht40_main);

原文出处:/show_1GW32AL3kV6E.html