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

发布时间:2026/9/10 15:18:19

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/8 6:35:37

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

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

2026/9/4 23:58:02

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/10 7:34:53

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

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

2026/9/10 15:13:30

yuzu Switch模拟器完整上手指南:从安装到调优一步到位

yuzu Switch模拟器完整上手指南:从安装到调优一步到位 【免费下载链接】yuzu 任天堂 Switch 模拟器 项目地址: https://gitcode.com/GitHub_Trending/yu/yuzu yuzu 是一款用 C 编写的开源任天堂 Switch 模拟器,能把你的 Switch 游戏跑在 Windows、…

2026/9/10 15:13:30

LatticeMesh军事通信系统:去中心化网络与量子加密技术解析

1. 美军LatticeMesh系统概述LatticeMesh系统是近年来军事通信领域最具突破性的技术架构之一。这套分布式网络系统采用了类似生物神经网络的拓扑结构,通过大量可动态组网的智能节点构建起具备自我修复能力的战场数据链路。与传统军事通信系统相比,其最显著…

2026/9/10 15:13:30

风储VSG并网Simulink仿真模型搭建与参数整定全解析

这几年做新能源并网仿真,VSG(虚拟同步发电机)基本是绕不开的一个方向。风电、光伏这类电源和传统同步机组最大的区别,就是电力电子接口几乎没有旋转惯量和阻尼,电网频率波动一来,它们既不会“顶一下”&…

2026/9/10 15:13:30

店铺运营数据分析是什么?2026商家必懂的核心指标体系

摘要:店铺运营数据分析是什么?2026年,它早已不是打开后台看数字,而是把访客、转化、复购、毛利这些指标串成一条因果链,找到生意的增长点和漏水点。本文用一套核心指标体系,帮你把这个概念落到地上。 店铺…

2026/9/9 13:11:35

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

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

2026/9/10 11:16:38

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

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

2026/9/9 16:31:09

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

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

2026/9/10 0:00:55

目录对比去重实战:用哈希算法精准清理重复文件

我电脑里现在还有一块换了三次机的“数据墓地”硬盘,里面存着2016年以前所有旧笔记本的完整备份。平时不觉得有什么,直到前阵子想把它整理归档,发现同一个安装包、同一批照片、同一份论文草稿,在几个不同的备份目录里反复出现。更…

2026/9/10 0:00:55

Leaflet离线地图完整Demo合集:内网部署与坐标纠偏实战

简介:这是一份面向Web GIS开发者的LeafLet离线地图示例合集,帮助开发者快速掌握离线地图从搭建到交互的完整流程。压缩包共723个文件,大小14.06MB,以319个js脚本、175个html页面和29个css样式文件为主体,配合png/svg图…

2026/9/10 0:00:55

MATLAB读取Rinex 3.02观测文件:多系统GNSS数据解析实战

简介:基于MATLAB开发的Rinex3.02版观测文件(o文件)读取代码包,面向卫星定位导航方向的学习者与研究人员,用于解决新版观测文件的数据解析、历元提取与时间转换问题。压缩包共4个文件,包含两个m脚本、一个19…

2026/9/10 12:32:02

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

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

2026/9/7 22:46:00

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

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

2026/9/9 10:21:54

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

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

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

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

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