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

发布时间:2026/9/12 20:17:44

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/9/10 16:10:15

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

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

2026/9/10 16:12:06

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/9/12 11:24:47

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

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

2026/9/12 20:16:01

基于Django的智能控糖食物推荐系统设计与实现

1. 项目背景与核心价值糖尿病已经成为全球性的健康挑战,根据国际糖尿病联盟最新数据,我国糖尿病患者人数已突破1.4亿。在这样的背景下,控糖饮食管理成为刚需,但普通用户往往面临三大痛点:食物GI值难以获取、个性化推荐…

2026/9/12 20:16:01

Java构建物联网平台的优势与架构解析

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

2026/9/12 20:16:01

Unity 教程跟完后怎么练:一次只改一个可验收目标

摘要:跟完一个 Unity 案例后,想加背包、换操作、改关卡,却越改越乱?先选一个能看见结果的小改动,写清不改什么,再用正常情况、重复触发和原功能检查判断是否完成。本文给出目标筛选表与假想拾取练习&#x…

2026/9/12 20:16:01

国产AI短剧平台选型三原则:分镜可控、审核可配、分发同步

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

2026/9/12 20:16:01

Python开发十大常见错误与解决方案详解

1. Python十大常见错误及其解决方法概述作为一门简洁优雅的编程语言,Python凭借其易读性和丰富的生态系统吸引了大量开发者。但在实际开发中,无论是初学者还是资深工程师,都难免会遇到各种"坑"。这些错误轻则导致程序异常&#xff…

2026/9/12 20:11:01

MySQL-存储过程与函数

1.存储过程概述1.1理解含义:存储过程的英文是Stored Procedure.他的思想很简单,就是一组经过预先编译的SQL语句的封装.执行过程:存储过程预先存储在MySQL服务器上,需要执行的时候,客户端只需要向服务器端发出调用存储过程的命令,服务器端就可以把预先存储好的这一系列SQL语句全…

2026/9/12 2:05:33

超人会飞不算本事:系统稳定依赖清晰规则与边界设计

开头先不绕弯子。“#斯坦李吐槽dc 所以超人是无缘无故会飞的嘛哈哈哈哈哈哈哈锤哥真是技术人才啊!#雷神 #复联”这类调侃式短标题,第一波冲击力在于它把两个宇宙的角色塞进同一个吐槽箱里,但细想一下就能发现,它真正碰到的根本不是…

2026/9/12 3:55:12

超人VS蜘蛛侠:拆解超级IP的影响力与传播方法论

把“蜘蛛侠 vs 超人”放在 CSDN 上聊,可能很多人第一反应是走错片场了。但如果把这两个角色看成“两个持续运营了 80 多年的文化产品”,你会发现,这场比较本质上是两个不同 IP 策略的长期结果对比:超人赢在定义了整个超级英雄题材…

2026/9/12 10:09:03

基于CNN的调制信号识别:MATLAB实现时频图分类实战

简介:本资源是一套面向通信工程与信号处理方向学习者、研究者的深度学习实践方案,聚焦调制信号自动检测与识别这一典型无线通信任务,解决传统方法依赖人工特征、低信噪比下性能下降等痛点。压缩包共12个文件(10.73MB)&…

2026/9/12 0:04:17

MATLAB仿生优化框架:长鼻浣熊算法多策略融合实现

简介:本资源是一份面向智能优化算法研究者与MATLAB初学者的仿生智能算法实践代码包,聚焦于长鼻浣熊优化算法(COA)的多策略改进与性能验证。针对传统COA易陷局部最优、收敛精度不足等问题,作者融合Circle映射初始化提升…

2026/9/12 0:04:17

【JAVA毕设源码分享】基于 JavaWeb 的校园一卡通管理系统的设计与实现 基于 JavaWeb 的校园卡业务管理系统(程序+文档+代码讲解+一条龙定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/9/12 0:04:17

【JAVA毕设源码分享】基于 Java 的图书馆借阅管理平台的搭建与实现 基于 Java 的图书馆综合管理系统(程序+文档+代码讲解+一条龙定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/9/12 6:29:36

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/12 14:32:17

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/12 6:37:43

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

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

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

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