OpenHarmony轻量系统开发【6】驱动之ADC按键

摘要:本文简单介绍如何操作ADC去读取电压,并且实现开发板上3个ADC按键检测的功能

适合群体:适用于润和Hi3861开发板,L0轻量系统驱动开发

文中所有代码仓库:https://gitee.com/qidiyun/hihope-3861-smart-home-kit

6.1实验效果

查看开发板,可以看到除了复位按键之外,还有3个按键。而查看原理,我们可以看到这个3个按键其实都是接的GPIO5 引脚,而GPIO5引脚又可复用为ADC2引脚。

故而,我们可以猜测出来我们可以使用ADC检测电压,判断出来是哪个引脚被按下了。

看下效果:

当我按下 按键1的时候,串口会打印:

当我按下按键2的时候串口会打印:

当我按下 USER按键的时候串口会打印

其中 vlt_min 表示读取到ADC值的最小值,

vlt_max 表示读取到ADC值的最大值。

由此我们可以看到,按键1被按下的时候,ADC值得范围在 0.563 ~ 0.577

按键2按下后,ADC值在 0.963 ~ 0.970

USER按键按下后 ADC值 在 0.197 ~ 0.204

如果没有按键按下,则ADC值在 3.227 ~ 3.241

vlt_min:3.227, vlt_max:3.241

6.2代码实现

代码实现其实很简单。

(1)引脚初始化

这里由于GPIO5默认被复用为串口引脚,这里我们重新修改为普通GPIO引脚。初始化代码如下:

    (hi_void)hi_gpio_init();hi_io_set_func(HI_IO_NAME_GPIO_5, HI_IO_FUNC_GPIO_5_GPIO); /* uart1 rx */ret = hi_gpio_set_dir(HI_GPIO_IDX_5, HI_GPIO_DIR_IN);if (ret != HI_ERR_SUCCESS) {printf("===== ERROR ======gpio -> hi_gpio_set_dir1 ret:%d\r\n", ret);return;}

(2)读取ADC值

读取ADC值的代码页相对简单,这里,我是重复读取64次,减少误判。

    memset_s(g_adc_buf, sizeof(g_adc_buf), 0x0, sizeof(g_adc_buf));for (i = 0; i < ADC_TEST_LENGTH; i++) {ret = hi_adc_read((hi_adc_channel_index)HI_ADC_CHANNEL_2, &data, HI_ADC_EQU_MODEL_1, HI_ADC_CUR_BAIS_DEFAULT, 0);if (ret != HI_ERR_SUCCESS) {printf("ADC Read Fail\n");return;}g_adc_buf[i] = data;}

(3)对读出来的ADC值进行判断处理

S1对应的是按键1 、 S2对应的是按键2 、 S3对应的是 USER按键

    for (i = 0; i < data_len; i++) {vlt = g_adc_buf[i];float voltage = (float)vlt * 1.8 * 4 / 4096.0;  /* vlt * 1.8 * 4 / 4096.0: Convert code into voltage */vlt_max = (voltage > vlt_max) ? voltage : vlt_max;vlt_min = (voltage < vlt_min) ? voltage : vlt_min;}//printf("vlt_min:%.3f, vlt_max:%.3f \n", vlt_min, vlt_max);vlt_val = (vlt_min + vlt_max)/2.0;if((vlt_val > 0.4) && (vlt_val < 0.6)){if(key_flg == 0){key_flg = 1;key_status = KEY_EVENT_S1;}}if((vlt_val > 0.8) && (vlt_val < 1.1)){if(key_flg == 0){key_flg = 1;key_status = KEY_EVENT_S2;}}if((vlt_val > 0.01) && (vlt_val < 0.3)){if(key_flg == 0){key_flg = 1;key_status = KEY_EVENT_S3;}}if(vlt_val > 3.0){key_flg = 0;key_status = KEY_EVENT_NONE;}

(4)使用

编写好上面代码后,就可以直接在while循环中判断按键值了:

    while(1){//读取ADC值app_demo_adc_test();switch(get_key_event()){case KEY_EVENT_NONE:{}break;case KEY_EVENT_S1:{printf("KEY_EVENT_S1 \r\n");}break;case KEY_EVENT_S2:{printf("KEY_EVENT_S2 \r\n");}break;case KEY_EVENT_S3:{printf("KEY_EVENT_S3 \r\n");}break;}usleep(30000);}

为了能让大家更好的学习鸿蒙(HarmonyOS NEXT)开发技术,这边特意整理了《鸿蒙开发学习手册》(共计890页),希望对大家有所帮助:https://qr21.cn/FV7h05

《鸿蒙开发学习手册》:

如何快速入门:https://qr21.cn/FV7h05

  1. 基本概念
  2. 构建第一个ArkTS应用
  3. ……

开发基础知识:https://qr21.cn/FV7h05

  1. 应用基础知识
  2. 配置文件
  3. 应用数据管理
  4. 应用安全管理
  5. 应用隐私保护
  6. 三方应用调用管控机制
  7. 资源分类与访问
  8. 学习ArkTS语言
  9. ……

基于ArkTS 开发:https://qr21.cn/FV7h05

  1. Ability开发
  2. UI开发
  3. 公共事件与通知
  4. 窗口管理
  5. 媒体
  6. 安全
  7. 网络与链接
  8. 电话服务
  9. 数据管理
  10. 后台任务(Background Task)管理
  11. 设备管理
  12. 设备使用信息统计
  13. DFX
  14. 国际化开发
  15. 折叠屏系列
  16. ……

鸿蒙开发面试真题(含参考答案):https://qr18.cn/F781PH

鸿蒙开发面试大盘集篇(共计319页):https://qr18.cn/F781PH

1.项目开发必备面试题
2.性能优化方向
3.架构方向
4.鸿蒙开发系统底层方向
5.鸿蒙音视频开发方向
6.鸿蒙车载开发方向
7.鸿蒙南向开发方向

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/520.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何识别伪装IP的网络攻击

伪装IP的网络攻击是一种通过篡改或伪造IP地址&#xff0c;冒充合法用户或服务器&#xff0c;发起恶意网络请求的攻击方式。这种攻击具有极强的隐蔽性&#xff0c;使得受害者在遭受攻击后难以找到真实的攻击者。为了识别伪装IP的网络攻击&#xff0c;我们可以采取以下几种方法&a…

yolov8调用zed实现三维跟踪测速

YOLOV8 + 双目实现三维跟踪测速 1. 相关工作2. 测速流程和原理(必读)3. 代码部分解析3.1 测距部分3.2 测速部分3.3 绘制轨迹3.4 主代码4. 实验结果5. 源码下载源码下载链接见文章末尾 1. 相关工作 本代码是在双目测距的基础上完成的,具体内容可见: yolov8直接调用zed相机…

代码随想录-哈希表 | 349 两个数组的交集

代码随想录-哈希表 | 349 两个数组的交集 LeetCode 349-两个数组的交集解题思路代码复杂度难点总结 LeetCode 349-两个数组的交集 题目链接 题目描述 给定两个数组 nums1 和 nums2 &#xff0c;返回它们的交集。输出结果中的每个元素一定是唯一的。我们可以不考虑输出结果的…

C语言处理流程

C语言对源代码处理的四个步骤: 预处理 -> 编译 -> 汇编 -> 链接 预处理 (gcc -E hello.c -o hello.i) 宏定义展开、头文件展开、条件编译&#xff0c;(这里并不会检查语法) 编译 (gcc -S hello.i -o hello.s) 检查语法&#xff0c;将预处理后文件编译生成汇编文件…

SpringBoot中使用Jackson序列化返回

SpringBoot中使用Jackson序列化返回 在Spring Boot应用中&#xff0c;使用Jackson库来处理JSON的序列化和反序列化是一种常见的做法。Jackson是一个高效的JSON处理器&#xff0c;广泛用于Java环境中&#xff0c;尤其是在与Spring框架集成时。本文将详细介绍如何在Spring Boot中…

ubuntu18.04安装F4PGA教程

环境搭建教程&#xff1a; f4pga-arch-defs/xilinx/xc7 at main f4pga/f4pga-arch-defs GitHub git clone https://github.com/SymbiFlow/f4pga-arch-defs.git cd f4pga-arch-defs make env cd build 主要是make env&#xff0c;会下载很多东西&#xff0c;然后生成很多描…

数据结构·一篇搞定顺序表!

大家好啊&#xff0c;几日不见&#xff0c;甚是想念&#xff0c;从这一篇文章开始&#xff0c;我们就要进入数据结构了哦&#xff0c;那么我们废话不多说&#xff0c;今天我们一起来搞定顺序表&#xff01;&#xff01;&#xff01; 1. 顺序表概念及结构 顺序表是一种线性结…

VBA脚本终章编译器崩溃

一、介绍 本篇文章为VBA脚本隐藏技术的最后一篇&#xff0c;将介绍如何在保证VBA脚本正常执行的情况下&#xff0c;使分析人员无法打开编译器。 那么为什么需要分析人员无法打开编译器呢&#xff1f; 首先&#xff0c;我们需要引入一个知识点。 在上篇《VBA隐藏技术stompin…

系统思考—战略

“有策略而无战术&#xff0c;是取胜之最慢之道。有战术而无策略&#xff0c;是败亡之前的嘈杂。”—孙子 最近接触的中小企业&#xff0c;充分能感受到在经济下行的情况下&#xff0c;组织与战略是不可分割的两个方面。有时候公司组织出现了问题&#xff0c;可能是因为战略不…

maven3.9的settings.xml 内容学习

settings.xml 文件介绍 settings.xml 是 Maven 的配置文件&#xff0c;它允许你自定义 Maven 的行为&#xff0c;比如设置仓库、代理、认证信息等。在 Maven 3.9 中&#xff0c;settings.xml 的结构和内容可能与之前的版本相似&#xff0c;但可能会有一些小的改进或变化。下面…

单分支:if语句

示例&#xff1a; /*** brief how about if? show you here.* author wenxuanpei* email 15873152445163.com(query for any question here)*/ #define _CRT_SECURE_NO_WARNINGS//support c-library in Microsoft-Visual-Studio #include <stdio.h>#define if_state…

MoJoCo 入门教程(七)XML 参考

系列文章目录 前言 表格第二列中的符号含义如下&#xff1a; ! 必填元素&#xff0c;只能出现一次 ? 可选元素&#xff0c;只能出现一次 * 可选元素&#xff0c;可多次出现 R 可选元素&#xff0c;可递归出现多次 一、简介 本章是 MuJoCo 中使用的 MJCF 建模语言的参考手册。…

Scala---集合(list,set)详解

一、List list集合有顺序&#xff0c;有索引&#xff0c;元素可重复 1、Nil 空列表 val lstNilprintln(Nil)//List()//向左侧添加一个元素,::起到右连接的作用。val lst18::(4::(0::Nil))println(lst1)//List(8, 4, 0)2、创建集合 //调用apply方法进行创建val list List(1,…

【投稿优惠|稳定检索】2024年低碳发展与地球科学国际会议 (LCDES 2024)

2024年低碳发展与地球科学国际会议 (LCDES 2024) 2024 International Conference on Low Carbon Development and Earth Science 【会议简介】 2024年低碳发展与地球科学国际会议即将在长沙盛大召开。本次会议将汇聚全球低碳发展与地球科学领域的专家学者&#xff0c;共同探讨…

如何快速成为顶尖项目经理?新手必看!

当今社会&#xff0c;万事皆项目&#xff0c;企业也面临着各种变化&#xff0c;企业项目管理的能力和水平对组织和个人的核心竞争力有着重要影响。 作为项目经理&#xff0c;需要养成持续学习的习惯和能力&#xff0c;具备顶级项目经理的专业水平和素养&#xff0c;才能使自己…

登录解析(前端)

登录代码 1、登录之后做了什么&#xff1f; 执行登陆方法&#xff0c;成功之后&#xff0c;路由跳转到指定路径或者根目录 2、this.$store.dispatch是什么意思&#xff1f; this.$store.dispatch(‘Login’, this.loginForm) 来调取store里的user.js的login方法3、this.$r…

Hive:transform和udf

工作中发现有时候会用到python脚本进行数据计算&#xff0c;但是现在貌似已经不这样再处理&#xff0c;一般使用封装好的udf函数。 transform的基本用法为&#xff1a; transform中的值作为输入&#xff0c; 然后传递给python脚本&#xff0c;最后经过python的处理后&#xf…

将MySQL数据库导入到EA模型的教程

将MySQL数据库导入到EA 1.下载安装mysql-connector-odbc2.在管理工具中新增ODBC数据源3.在EA中新建项目4.链接MYSQL数据源4.1 安装64位的ODBC驱动可能出现”在连接ODBC 时发生错误&#xff0c;请相关检查设置“的提示&#xff0c;卸载后重新安装32位ODBC驱动后可以正常执行 5.导…

vue纯前端实现表格分页及条件查询功能

由于接口返回数据过慢&#xff0c;故而采用前端对数据进行处理分页的方法实现表格分页及条件查询。 一、表格 表格采用elementUI的el-table&#xff0c;只需要对数据data进行处理赋值即可。 <el-table:data"tableData"style"width: 100%"><el-t…

智慧园区引领产业智能化升级:科技创新驱动打造智慧化、高效化产业新未来

随着全球科技革命的深入推进&#xff0c;以大数据、云计算、物联网、人工智能等为代表的新一代信息技术正深刻改变着传统产业的发展模式。在这一背景下&#xff0c;智慧园区作为产业智能化升级的重要载体和平台&#xff0c;正以其前瞻性的规划、创新的科技和卓越的实践&#xf…