OpenHarmony鸿蒙硬件Hi3861-AHT20温湿度传感器获取温度 作者:马育民 • 2025-10-21 07:48 • 阅读:10008 # 开发步骤 1. 下载驱动 2. 创建文件夹 3. 编写程序,初始化、主要函数 **主要:**由于主板本身有问题,所以测出的 **不是 空气温度** # 步骤1:下载驱动 下载驱动: https://gitee.com/65242847/OpenHarmony_Hi3861/tree/master/aht20%E9%A9%B1%E5%8A%A8 驱动文件如下: ``` aht20.c aht20.h ``` ### 解释 在 `aht20.h` 文件中定义下面3个方法: ``` // 发送初始化校准命令 uint32_t AHT20_Calibrate(void); // 发送 触发测量 命令,开始测量 uint32_t AHT20_StartMeasure(void); // 接收测量结果,拼接转换为标准值 uint32_t AHT20_GetMeasureResult(float *temp, float *humi); ``` 驱动分析详见链接: https://www.malaoshi.top/show_1GW24q8753qY.html # 步骤2:创建文件夹 在 `applications\sample\wifi-iot\app\code_v2.0` 创建下面文件夹: ``` std_07_aht_wenshidu ``` 将下面驱动文件: ``` aht20.c aht20.h ``` 放到 `std_07_aht_wenshidu` 文件夹中 # 步骤3:程序 创建 `demo.c`,放核心程序: ### 初始化 ``` #include #include #include "ohos_init.h" #include "cmsis_os2.h" #include "wifiiot_i2c.h" #include "wifiiot_gpio.h" #include "wifiiot_gpio_ex.h" #include "wifiiot_errno.h" #include "aht20.h" #define AHT20_BAUDRATE 400 * 1000 #define AHT20_I2C_IDX WIFI_IOT_I2C_IDX_0 void init(void) { GpioInit(); // 设置 13 引脚为 SDA 总线 IoSetFunc(WIFI_IOT_IO_NAME_GPIO_13, WIFI_IOT_IO_FUNC_GPIO_13_I2C0_SDA); // 设置 14 引脚为 SCL 时钟线 IoSetFunc(WIFI_IOT_IO_NAME_GPIO_14, WIFI_IOT_IO_FUNC_GPIO_14_I2C0_SCL); // 设置 I2C 波特率,能够与外部 I2C 设备(如 OLED 屏幕、传感器等)正常通信。 I2cInit(AHT20_I2C_IDX, AHT20_BAUDRATE); //初始化I2c 的波特率 } ``` ### 业务函数 ``` //业务函数 static void start(void) { uint32_t retval = 0; float humidity = 0.0f; //用于保存湿度的变量 float temperature = 0.0f; //用于保存温度的变量 init(); //初始化 // 发送初始化校准命令 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"); } else { // 接收测量结果,拼接转换为标准值 retval = AHT20_GetMeasureResult(&temperature, &humidity); printf("temp: %.2f, humi: %.2f\n", temperature, humidity); } sleep(1); } } APP_FEATURE_INIT(start); //注册为自启动运行函数 ``` ### 完整代码 ``` #include #include #include "ohos_init.h" #include "cmsis_os2.h" #include "wifiiot_i2c.h" #include "wifiiot_gpio.h" #include "wifiiot_gpio_ex.h" #include "wifiiot_errno.h" #include "aht20.h" #define AHT20_BAUDRATE 400 * 1000 #define AHT20_I2C_IDX WIFI_IOT_I2C_IDX_0 void init(void) { GpioInit(); // 设置 13 引脚为 SDA 总线 IoSetFunc(WIFI_IOT_IO_NAME_GPIO_13, WIFI_IOT_IO_FUNC_GPIO_13_I2C0_SDA); // 设置 14 引脚为 SCL 时钟线 IoSetFunc(WIFI_IOT_IO_NAME_GPIO_14, WIFI_IOT_IO_FUNC_GPIO_14_I2C0_SCL); // 设置 I2C 波特率,能够与外部 I2C 设备(如 OLED 屏幕、传感器等)正常通信。 I2cInit(AHT20_I2C_IDX, AHT20_BAUDRATE); //初始化I2c 的波特率 } //业务函数 static void start(void) { uint32_t retval = 0; float humidity = 0.0f; //用于保存湿度的变量 float temperature = 0.0f; //用于保存温度的变量 init(); //初始化 // 发送初始化校准命令 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"); } else { // 接收测量结果,拼接转换为标准值 retval = AHT20_GetMeasureResult(&temperature, &humidity); printf("temp: %.2f, humi: %.2f\n", temperature, humidity); } sleep(1); } } APP_FEATURE_INIT(start); //注册为自启动运行函数 ``` # 编辑BUILD.gn文件 ### 编辑1 在代码同级目录创建下面文件: ``` BUILD.gn ``` 内容: ``` static_library("demo") { sources = [ "demo.c", # "aht20_demo.c", "aht20.c", ] include_dirs = [ "//utils/native/lite/include", "//kernel/liteos_m/components/cmsis/2.0", "//base/iot_hardware/interfaces/kits/wifiiot_lite", ] } ``` ### 编辑2 编辑下面文件: ``` \\applications\sample\wifi-iot\app\BUILD.gn ``` 内容: ``` import("//build/lite/config/component/lite_component.gni") lite_component("app") { features = [ "code_v2.0/std_07_aht_wenshidu:demo", ] } ``` # 启用I2C功能 [OpenHarmony鸿蒙硬件-启用I2C功能(关键)](https://www.malaoshi.top/show_1GW1zIwjYw0z.html "OpenHarmony鸿蒙硬件-启用I2C功能(关键)") # 编译代码 详见链接: https://www.malaoshi.top/show_1GW1wTyUOMPk.html # 烧写固件到芯片 详见链接: https://www.malaoshi.top/show_1GW1wWWflGbq.html 原文出处:http://www.malaoshi.top/show_1GW253m6YGWg.html