openharmony1.1.3 通过i2c进行温湿度采集

发布时间:2026/10/31 1:31:06

openharmony1.1.3 通过i2c进行温湿度采集 温湿度传感器 也是挂载这个i2c总线上初始化读数据写数据1.1.3 版本的i2c底层接口默认 系统没有开启i2c# CONFIG_I2C_SUPPORT is not setCONFIG_I2C_SUPPORT y开启i2c写一套通过i2c 读写温湿度的文件aht20.h:#ifndef AHT20_H #define AHT20_H #include stdbool.h // 提供 bool 类型 #include iot_errno.h // 提供 IOT_SUCCESS/IOT_FAILURE #include stdint.h unsigned int AHT20_Init(void); unsigned int AHT20_Calibrate(void); unsigned int AHT20_SoftReset(void); unsigned int AHT20_GetMeasureResult(float* temp, float* humi); #endif // AHT20_Haht20.c:/* * Copyright (C) 2021 HiHope Open Source Organization . * Licensed under the Apache License, Version 2.0 (the License); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an AS IS BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include aht20.h #include stdio.h #include string.h // OpenHarmony HAL层I2C头文件替换原海思私有头文件 #include iot_i2c.h // 延时函数头文件 #include hi_time.h // 传感器硬件参数 #define AHT20_I2C_IDX 0 // OpenHarmony标准I2C总线索引 // 传感器命令定义 #define AHT20_INIT_CMD 0xBE // 初始化命令 #define AHT20_CALIBRATE_CMD 0xBA // 校准命令 #define AHT20_MEASURE_CMD 0xAC // 测量命令 #define AHT20_SOFT_RESET_CMD 0xBA // 软复位命令 #define AHT20_STARTUP_TIME 20*1000 // 上电启动时间 #define AHT20_CALIBRATION_TIME 40*1000 // 初始化校准时间 #define AHT20_MEASURE_TIME 75*1000 // 测量时间 #define AHT20_DEVICE_ADDR 0x38 #define AHT20_READ_ADDR ((0x381)|0x1) #define AHT20_WRITE_ADDR ((0x381)|0x0) #define AHT20_CMD_CALIBRATION 0xBE // 初始化校准命令 #define AHT20_CMD_CALIBRATION_ARG0 0x08 #define AHT20_CMD_CALIBRATION_ARG1 0x00 /** * 传感器在采集时需要时间,主机发出测量指令0xAC后延时75毫秒以上再读取转换后的数据并判断返回的状态位是否正常。 * 若状态比特位[Bit7]为0代表数据可正常读取为1时传感器为忙状态主机需要等待数据处理完成。 **/ #define AHT20_CMD_TRIGGER 0xAC // 触发测量命令 #define AHT20_CMD_TRIGGER_ARG0 0x33 #define AHT20_CMD_TRIGGER_ARG1 0x00 // 用于在无需关闭和再次打开电源的情况下重新启动传感器系统软复位所需时间不超过20 毫秒 #define AHT20_CMD_RESET 0xBA // 软复位命令 #define AHT20_CMD_STATUS 0x71 // 获取状态命令 /** * STATUS 命令回复 * 1. 初始化后触发测量之前STATUS 只回复 1B 状态值 * 2. 触发测量之后STATUS 回复6B 1B 状态值 2B 湿度 4b湿度 4b温度 2B 温度 * RH Srh / 2^20 * 100% * T St / 2^20 * 200 - 50 **/ #define AHT20_STATUS_BUSY_SHIFT 7 // bit[7] Busy indication #define AHT20_STATUS_BUSY_MASK (0x1AHT20_STATUS_BUSY_SHIFT) #define AHT20_STATUS_BUSY(status) ((status AHT20_STATUS_BUSY_MASK) AHT20_STATUS_BUSY_SHIFT) #define AHT20_STATUS_MODE_SHIFT 5 // bit[6:5] Mode Status #define AHT20_STATUS_MODE_MASK (0x3AHT20_STATUS_MODE_SHIFT) #define AHT20_STATUS_MODE(status) ((status AHT20_STATUS_MODE_MASK) AHT20_STATUS_MODE_SHIFT) // bit[4] Reserved #define AHT20_STATUS_CALI_SHIFT 3 // bit[3] CAL Enable #define AHT20_STATUS_CALI_MASK (0x1AHT20_STATUS_CALI_SHIFT) #define AHT20_STATUS_CALI(status) ((status AHT20_STATUS_CALI_MASK) AHT20_STATUS_CALI_SHIFT) // bit[2:0] Reserved #define AHT20_STATUS_RESPONSE_MAX 6 #define AHT20_RESOLUTION (120) // 2^20 #define AHT20_MAX_RETRY 10 // 全局变量标记传感器是否初始化完成 static bool g_aht20Initialized false; /** * brief 内部函数I2C读取数据调用OpenHarmony HAL层接口 */ static unsigned int AHT20_I2C_Read(uint8_t* buffer, uint32_t buffLen) { if (buffer NULL || buffLen 0) { return IOT_FAILURE; } // 调用HAL层I2C读函数 return IoTI2cRead(AHT20_I2C_IDX, AHT20_READ_ADDR, buffer, buffLen); } /** * brief 内部函数I2C写入数据调用OpenHarmony HAL层接口 */ static unsigned int AHT20_I2C_Write(uint8_t* buffer, uint32_t buffLen) { if (buffer NULL || buffLen 0) { return IOT_FAILURE; } // 调用HAL层I2C写函数 return IoTI2cWrite(AHT20_I2C_IDX, AHT20_WRITE_ADDR, buffer, buffLen); } /** * brief 软件复位AHT20 */ unsigned int AHT20_SoftReset(void) { uint8_t resetCmd AHT20_SOFT_RESET_CMD; unsigned int retval AHT20_I2C_Write(resetCmd, 1); hi_udelay(20000); // 复位后等待20ms if (retval ! IOT_SUCCESS) { printf(AHT20 soft reset failed, err: %u\n, retval); return retval; } return IOT_SUCCESS; } /** * brief 校准AHT20 */ unsigned int AHT20_Calibrate(void) { uint8_t calCmd[3] {AHT20_CALIBRATE_CMD, 0x00, 0x00}; unsigned int retval AHT20_I2C_Write(calCmd, 3); hi_udelay(30000); // 校准等待30ms if (retval ! IOT_SUCCESS) { printf(AHT20 calibrate failed, err: %u\n, retval); return retval; } return IOT_SUCCESS; } /** * brief 初始化AHT20 */ unsigned int AHT20_Init(void) { uint8_t initCmd[3] {AHT20_INIT_CMD, 0x08, 0x00}; unsigned int retval 0; // 1. 软复位传感器 retval AHT20_SoftReset(); if (retval ! IOT_SUCCESS) { return retval; } // 2. 发送初始化命令 hi_udelay(40000); // 复位后等待40ms retval AHT20_I2C_Write(initCmd, 3); if (retval ! IOT_SUCCESS) { printf(AHT20 init cmd failed, err: %u\n, retval); return retval; } // 3. 标记初始化完成 g_aht20Initialized true; return IOT_SUCCESS; } /** * brief 获取温湿度测量结果 * param temp 温度结果指针单位℃ * param humi 湿度结果指针单位%RH * return 成功返回IOT_SUCCESS失败返回对应错误码 */ unsigned int AHT20_GetMeasureResult(float* temp, float* humi) { // 参数合法性检查 if (temp NULL || humi NULL) { return IOT_FAILURE; } if (!g_aht20Initialized) { printf(AHT20 not initialized!\n); return IOT_FAILURE; } uint8_t measureCmd[3] {AHT20_MEASURE_CMD, 0x33, 0x00}; uint8_t dataBuf[6] {0}; unsigned int retval 0; // 1. 发送测量命令 retval AHT20_I2C_Write(measureCmd, 3); if (retval ! IOT_SUCCESS) { printf(AHT20 measure cmd failed, err: %u\n, retval); return retval; } // 2. 等待测量完成最大80ms hi_udelay(80000); // 3. 读取测量数据 retval AHT20_I2C_Read(dataBuf, 6); if (retval ! IOT_SUCCESS) { printf(AHT20 read data failed, err: %u\n, retval); return retval; } // 4. 解析测量状态 if ((dataBuf[0] 0x80) ! 0) { printf(AHT20 measure not ready!\n); return IOT_FAILURE; } // 5. 计算温湿度 uint32_t humiRaw ((uint32_t)dataBuf[1] 12) | ((uint32_t)dataBuf[2] 4) | ((dataBuf[3] 0xF0) 4); *humi (humiRaw / 1048576.0f) * 100.0f; uint32_t tempRaw ((uint32_t)(dataBuf[3] 0x0F) 16) | ((uint32_t)dataBuf[4] 8) | dataBuf[5]; *temp (tempRaw / 1048576.0f) * 200.0f - 50.0f; return IOT_SUCCESS; }#define AHT20_I2C_IDX 0 // OpenHarmony标准I2C总线索引hi3861 就一条总线AHT20第地址#define AHT20_DEVICE_ADDR 0x38#define AHT20_READ_ADDR ((0x381)|0x1)#define AHT20_WRITE_ADDR ((0x381)|0x0)通I2C读写的方法这个是1.1.3 当中的方法 具体看i2c头文件的描述/*** brief 内部函数I2C读取数据调用OpenHarmony HAL层接口*/static unsigned int AHT20_I2C_Read(uint8_t* buffer, uint32_t buffLen) {if (buffer NULL || buffLen 0) {return IOT_FAILURE;}// 调用HAL层I2C读函数return IoTI2cRead(AHT20_I2C_IDX, AHT20_READ_ADDR, buffer, buffLen);}/*** brief 内部函数I2C写入数据调用OpenHarmony HAL层接口*/static unsigned int AHT20_I2C_Write(uint8_t* buffer, uint32_t buffLen) {if (buffer NULL || buffLen 0) {return IOT_FAILURE;}// 调用HAL层I2C写函数return IoTI2cWrite(AHT20_I2C_IDX, AHT20_WRITE_ADDR, buffer, buffLen);}第一个最底层BUILD.gnimport(//build/lite/config/component/lite_component.gni) lite_component(iothardware) { features [ :aht20, # ] } static_library(aht20) { sources [ aht20.c, ] include_dirs [ //utils/native/lite/include, //kernel/liteos_m/components/cmsis/2.0, //base/iot_hardware/interfaces/kits/wifiiot_lite, //base/iot_hardware/peripheral/interfaces/kits, ] }在 ~/openharmony3/1.1.3/applications/sample/wifi-iot/app下 新建目录aht20_test目录下放2个文件 aht20_test.c 与BUILD.gn。 这里 aht20_test.c 就是根据厂家文档的 test 目录下的那个.c文件进行的修改aht20_test.c 与BUILD.gnaht20_test.c/* * Copyright (C) 2021 HiHope Open Source Organization . * Licensed under the Apache License, Version 2.0 (the License); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an AS IS BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include aht20.h // 引入驱动头文件 #include stdio.h #include unistd.h // OpenHarmony系统头文件使用HAL层接口替代海思私有头文件 #include ohos_init.h #include cmsis_os2.h #include hi_gpio.h #include hi_io.h #include iot_i2c.h // HAL层I2C接口头文件 #include iot_errno.h // HAL层错误码定义 // 任务函数循环采集温湿度 void Aht20TestTask(void* arg) { (void)arg; // 消除未使用参数警告 unsigned int retval 0; // 错误码类型统一为unsigned int匹配HAL层 float temp 0.0f, humi 0.0f; // 步骤1配置GPIO13/GPIO14为I2C0功能Hi3861默认I2C0引脚 hi_io_set_func(HI_IO_NAME_GPIO_13, HI_IO_FUNC_GPIO_13_I2C0_SDA); // SDA引脚 hi_io_set_func(HI_IO_NAME_GPIO_14, HI_IO_FUNC_GPIO_14_I2C0_SCL); // SCL引脚 // 步骤2初始化I2C0使用HAL层接口波特率400kHz retval IoTI2cInit(0, 400 * 1000); // 替换为HAL层初始化函数 if (retval ! IOT_SUCCESS) { // 使用HAL层错误码IOT_SUCCESS printf(I2C0 init failed, err: %u\n, retval); return; } // 步骤3初始化AHT20传感器 retval AHT20_Init(); if (retval ! IOT_SUCCESS) { // 与驱动中错误码统一 printf(AHT20 init failed, err: %u\n, retval); return; } printf(AHT20 init success!\n); // 步骤4循环采集并打印数据1秒/次 while (1) { retval AHT20_GetMeasureResult(temp, humi); if (retval IOT_SUCCESS) { printf(AHT20: Temp %.2f℃, Humi %.2f%%RH\n, temp, humi); } else { printf(AHT20 read failed, err: %u\n, retval); } sleep(1); // 延时1秒 } } // 任务创建函数注册为OpenHarmony启动项 void Aht20Test(void) { osThreadAttr_t taskAttr; // CMSIS-OS2任务属性结构体 // 配置任务属性 taskAttr.name Aht20TestTask; // 任务名称 taskAttr.attr_bits 0U; // 任务属性默认0 taskAttr.cb_mem NULL; // 回调函数内存无 taskAttr.cb_size 0U; // 回调函数内存大小无 taskAttr.stack_mem NULL; // 任务栈内存使用系统分配 taskAttr.stack_size 4096; // 任务栈大小4KB taskAttr.priority osPriorityNormal; // 任务优先级正常 // 创建任务 if (osThreadNew(Aht20TestTask, NULL, taskAttr) NULL) { printf(Create Aht20TestTask failed!\n); } } // 注册任务系统启动时自动执行Aht20Test APP_FEATURE_INIT(Aht20Test);BUILD.gn:static_library(aht20_test) { sources [ aht20_test.c, ] include_dirs [ /home/dragon/openharmony/1.1.3/applications/sample/wifi-iot/app/iothardware, //utils/native/lite/include, //kernel/liteos_m/kal, //base/iot_hardware/peripheral/interfaces/kits, ] deps [ /home/dragon/openharmony/1.1.3/applications/sample/wifi-iot/app/iothardware:aht20, ] }第5步修改app 下的 BUILD.gnimport(//build/lite/config/component/lite_component.gni) lite_component(app) { features [ aht20_test:aht20_test, ] }
延伸阅读

更多相关文章

2026/10/31 1:31:06

Fiddler中文版高级技巧:自动化测试和脚本编写实战

Fiddler中文版高级技巧:自动化测试和脚本编写实战 【免费下载链接】zh-fiddler Fiddler Web Debugger 中文版 项目地址: https://gitcode.com/gh_mirrors/zh/zh-fiddler Fiddler Web Debugger 中文版是一款功能强大的 Web 调试工具,它不仅能帮助开…

2026/10/29 15:43:48

DSP学习F28004x数据手册:第9章-X-BAR

X-BAR9.1 输入X-BAR9.2 ePWM,CLB,与 GPIO 输出 X-BAR9.2.1 ePWM X-BAR9.2.1.1 ePWM X-BAR 架构9.2.2 CLB X-BAR9.2.2.1 CLB X-BAR 架构9.2.3 GPIO 输出 X-BAR9.2.3.1 GPIO 输出 X-BAR 架构9.2.4 X-BAR 标志位9.3 XBAR 寄存器9.3.1 XBAR 基地址表9.3.2 IN…

2026/10/28 5:17:12

10分钟打造专业音乐播放器:foobox-cn终极美化配置指南

10分钟打造专业音乐播放器:foobox-cn终极美化配置指南 【免费下载链接】foobox-cn DUI 配置 for foobar2000 项目地址: https://gitcode.com/GitHub_Trending/fo/foobox-cn 你是不是还在忍受foobar2000默认界面的简陋外观?想要一款既专业又美观的…

2026/10/31 1:27:51

【详细教程】对拍 0 基础学习小课堂 [内附例题演示]

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/31 1:27:51

JetBrains 开源的 AI 编程工作台,给每轮改动一张收据

JetBrains 开源的 AI 编程工作台,给每轮改动一张收据 【免费下载链接】thinkrail Vibe code with pi in a lightweight, real IDE that customises itself around the way you work — The Vibe You Need 项目地址: https://gitcode.com/GitHub_Trending/th/think…

2026/10/31 1:27:51

作业--程序设计基础-ifswitch作业

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/31 1:22:51

(最新)基于Springboot智慧超市管理系统【附源码+文档】

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/30 20:55:10

全国计算机二级C语言真题PDF高效刷题指南

简介:这份PDF是全国计算机二级C语言考试的试题与答案解析,专为备考二级C语言的考生准备。内容涵盖C语言特点与设计理念、程序基本组成单位、main函数执行流程、函数嵌套调用规则、标识符命名规范、整型实型字符型数据类型、八进制十六进制数合法形式、运…

2026/10/30 20:55:10

requests+BeautifulSoup:爬虫抓取h1标题的入门实战指南

简介:一份以实战为导向的Python爬虫入门资源,面向具备基本编程基础、希望快速掌握网络数据抓取的初学者,可解决从零编写简单爬虫的常见困惑。实例以requests库发送HTTP请求、BeautifulSoup解析HTML文档,完整演示从网页中提取 标题…

2026/10/30 20:55:09

递推最小二乘参数辨识MATLAB编程:二阶系统与渐消记忆实现

简介:这是一篇面向控制系统、信号处理与机器学习等领域学习者的最小二乘参数辨识程序说明文档。资源共包含一个docx格式文档,压缩包大小七十八KB,内容围绕递推最小二乘算法和渐消记忆最小二乘算法展开:先构造一个极点位于单位圆内…

2026/10/31 0:02:41

猫狗目标检测数据集:VOC/COCO/YOLO三格式一体化实战包

简介:本资源是一套面向计算机视觉初学者与YOLO目标检测实践者的猫狗图像数据集及配套开发工具包,专为快速上手目标检测模型训练而设计。资源包含1000张真实场景高清猫狗图片,标注质量高,同时提供VOC(XML)、…

2026/10/31 0:02:41

HDU2017多校标程复现:算法竞赛工程化真题沙盒

简介:本资源为2017年HDU多校联合训练第一场官方配套资料,面向ACM程序设计竞赛备赛学生、算法爱好者及高校编程集训队成员,旨在提供权威解题参考与完整测试验证环境。压缩包共40个文件,含15份C标程(覆盖全部赛题&#x…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑