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