0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看威廉希尔官方网站 视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

【HarmonyOS HiSpark Wi-Fi IoT 套件试用连载】一个ADC实现多个按键检测

开发板试用精选 来源:开发板试用 作者:电子发烧友论坛 2022-11-07 14:01 次阅读
本文来源电子发烧友社区,作者:juby, 帖子地址:https://bbs.elecfans.com/jishu_2008496_1_1.html

获取按键值的方式
按键作为常用的输入系统,如何准确并高效的获取按键值,是一个经常要面对的问题,常用的按键检测方式有如下几种方式:
1. 独立按键
每个按键的检测占用单片机的一个GPIO引脚,原理图如下图所示:

图片来源程序员小哈自制核心板原理图
我们以BTN1按键为例,当按键没有按下的时候,网络标号KEY1处的电压被10K的上拉电阻拉至3.3V,PB14(KEY1)引脚设为输入引脚后,程序中读取该引脚的值将为1,当按键按下之后,网络标号KEY1处接地,读取该输入引脚的值将为0,进而通过此电路实现的独立按键,可以区分按键弹起和按下两种不同的状态。
独立按键的每个按键的工作不会影响其他I/O的状态。独立按键缺点是浪费MCU管脚,优点是编程比较简单。
独立按键的实现原理详见我们之前分享的网文:基于鸿蒙OS的按键驱动
2. 矩阵按键
矩阵按键又称为矩阵键盘或称行列键盘,其实现的原理我们之前分享过如下网文:
矩阵键盘的行列扫描原理详解
这种行列式键盘结构能有效地提高单片机系统中I/O口的利用率。在MCU管脚有限的情况下,矩阵按键大大的节省了I/O资源。
3. ADC分压键盘
利用电阻串联分压的原理实现一个ADC管脚去检测多个按键。
按键被按下之后,与ADC引脚相连的点的电压会随着参与分压的电阻变化而变化,我们只要让每个按键按下之后的电压处于不同的区间,我们理论上就能够将各个按键区分开。
为了避免由于ADC精度、电阻的误差或者温漂等因素造成的按键检测失效,提高按键检测的可靠性,我们可以减少按键数量,适当放宽各个按键检测的电压范围。
经过上面的分析,独立按键的方式是最浪费GPIO口,矩阵按键的效率适中,而ADC分压实现的键盘使用的GPIO引脚最少。
ADC检测按键原理
如果Vcc = 3.3V ,那么没有按键被按下时,ADC为3.3V,如果有按键被按下:
[td]
被按下的按键 ADC值
Key1 0 V
Key2 1.65 V
Key3 2.2 V
Key4 2.475 V
Key5 2.64 V
Key6 2.75 V
我们由上可以看到,一串相同电阻(10K)组成的多个按键,相连按键之间的电压差越来越小,不利于继续进行扩展。
如果 +5V 换成 3.3V ,那么没有按键被按下时,ADC为3.3V,如果有按键被按下:
[td]
被按下的按键 ADC值
sw1 0 V
sw2 0.163 V
sw3 0.503 V
sw4 0.819 V
sw5 1.157 V
sw6 1.487 V
由上我们看出,这组电阻组成的多个按键检测电路,相连按键之间的电压差值基本在0.3V左右,可以在此电路基础上继续进行扩展,设计成更多的按键扫描电路。
有了上面的经验,大家算一下下图中,不同按键按下的话,ADC的值应该为多少呢?

按键原理图
核心板左下角的按键S2的原理图:
OLED板上的按键1和按键2的原理图:
由上面两个原理图可知,三个按键都是与GPIO05这个引脚相连,根据上面ADC分压的原理我们可知,当三个按键按下时,GPIO05处的理论电压如下:
[td]
被按下的按键 理论电压
常态(没有按键按下时) 3.3 V
S2(核心板) 0V
S1(OLED) (1/(4.7+1))*3.3=0.579 V
S2(OLED) (2/(4.7+1+1))*3.3=0.985 V
获取ADC值
官方手册ADC功能描述如下:

1. 引脚初始化
由于GPIO5默认被复用为串口引脚,我们这里要想使用ADC功能,而上图表格中没有对应的ADC复用信号,所以我们只需要将GPIO_05设为普通GPIO输入引脚即可。初始化代码如下:
(hi_void)hi_gpio_init();

hi_io_set_func(HI_IO_NAME_GPIO_5, HI_IO_FUNC_GPIO_5_GPIO);
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:%drn", ret);
return;
}
2. 获取ADC值
这里使用hi_adc_read函数获取adc的值,为了使得到的数据相对准确,我们对数据进行多次采集,然后将得到的数据缓存到数组中,然后再对数组中的数据进行集中处理。
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 Failn");
return;
}
g_adc_buf= data;
}

其中函数hi_adc_read在如下文件中实现:
vendorhisihi3861hi3861platformdriversadchi_adc.c

3. 对数组中的ADC值进行数据处理,计算方法为取这些数据的和,然后减去其中的最大值和最小值,然后再取平均值。hi_u32 i;
float vlt_max = 0;
float vlt_min = VLT_MIN;
float vlt_sum = 0;
float vlt_val = 0;

hi_u16 vlt;
for (i = 0; i < data_len; i++) {
vlt = g_adc_buf;
float voltage = hi_adc_convert_to_voltage(vlt);
vlt_max = (voltage > vlt_max) ? voltage : vlt_max;
vlt_min = (voltage < vlt_min) ? voltage : vlt_min;
vlt_sum += voltage;
}

vlt_val = (vlt_sum - vlt_min - vlt_max) / (data_len - 2.0);

其中函数hi_adc_convert_to_voltage的实现位于:vendorhisihi3861hi3861platformdriversadchi_adc.c

串口打印输出
为了按键能够准确识别,我们首先要知道各个按键被按下时,ADC的值的范围,我们在程序中获取GPIO5 引脚处的ADC值,利用下面的函数进行打印输出,进而观察各种状态下,ADC的值是多少:
printf("KEY adc value is %f rn",key_adc_value);
具体打印输出如下:
1. 常态没有按键按下时,ADC值的范围在 3.262 ~ 3.266之间,串口打印输出如下:

2. 当按下按键S2(核心板)时,ADC值的范围在 0.214 ~ 0.218之间,串口打印输出如下:

3. 当按下按键S1(OLED)时,ADC值的范围在 0.569 ~ 0.573之间,串口打印输出如下:

4. 当按下按键S2(OLED)时,ADC值的范围在 0.970 ~ 0.974之间,串口打印输出如下:

5. 结果汇总[td]
被按下的按键 理论电压 实际电压
常态(没有按键按下时) 3.3 V 3.266 V
S2(核心板) 0V 0.214 V
S1(OLED) (1/(4.7+1))*3.3=0.579 V 0.573 V
S2(OLED) (2/(4.7+1+1))*3.3=0.985 V 0.973 V
由上可以看出,理论值跟实际值偏差不是很大,而且值相对稳定,我们只需要在实际值基础上增加一个偏差,比如0.15 V,即可区分出板子上的三个按键。
[td]
被按下的按键 理论电压 实际电压 判断区间
常态(没有按键按下时) 3.3 V 3.266 V vlt_val > 3 V
S2(核心板) 0V 0.214 V vlt_val < 0.3 V
S1(OLED) 0.579 V 0.573 V 0.4 V < vlt_val < 0.7 V
S2(OLED) 0.985 V 0.973 V 0.8 V < vlt_val < 1.1 V
6. 按adc值的范围区间,判断按键值
具体判断的实现如下:
if(vlt_val < 0.3))
{
if(key_flag == 0)
{
key_flag = 1;
key_status = KEY_EVENT_S2_CORE;
}
}

if((vlt_val > 0.4) && (vlt_val < 0.7))
{
if(key_flag == 0)
{
key_flag = 1;
key_status = KEY_EVENT_S1_OLED;
}
}

if((vlt_val > 0.8) && (vlt_val < 1.1))
{
if(key_flag == 0)
{
key_flag = 1;
key_status = KEY_EVENT_S2_OLED;
}
}

if(vlt_val > 3.0)
{
key_flag = 0;
key_status = KEY_EVENT_NONE;
}
7. 编译脚本文件BUILD.gn
工程中两个编译使用的BUILD.gn脚本文件具体实现如下图所示:

获得HiBurn软件1. 解压DevEcoDeviceTool-1.0.0.zip
此文件,在下面网文中分享过,可以自提:HarmonyOS智能设备开发工具—DevEco Device Tool 安装配置
2. 将解压后生成的.vsix文件重命名为.zip结尾的任意名称,比如:DevEcoDeviceTool-1.0.0-temp.zip , 然后解压此文件。

3. 在 devicetool-device-1.0.0.0extensiondevecotools 文件夹下即有HiBurn.exe 文件。

使用HiBurn烧写.bin文件至Hi3861
  • 双击HiBurn.exe文件,在弹出界面中,选择菜单:Setting-->Com settings ,在弹出窗口中,Baud选择一个稍微高点的波特率,加快文件传输速度;
  • 选择Hi3861核心板对应的串口,点击“Select file”按钮,选择要下载的固件文件:Hi3861_wifiiot_app_allinone.bin,我们打开此文件之后,会发现下面列表中出现了三个文件,实际上这个.bin文件由列表中的三个文件组成。勾选“Auto burn”复选框,然后选择“Connect”按钮,进入如下待下载界面:
  • 复位核心板模块,进入下载模式,下载完成后点击“Disconnect”按钮断开连接。
和DevEco Device Tool方式对比
使用HiBurn烧录相对于VSCode中使用DevEco Device Tool烧录而言,好处主要有以下几点:
1. 不依赖VSCode,所以下面网文的配置过程可以省略了;
HarmonyOS智能设备开发工具—DevEco Device Tool 安装配置
2. 下载速度更快,HiBurn.exe最大波特率可以设置到4000000,而DevEco Device Tool最大只能为921600,是它的4.34倍;
HiBurn方式烧录的缺点主要是:
1. 烧录完成标志不是很明显,需要认真观察;2. 烧录完成之后需要手动点Disconnect,主动断开连接,否则将一直占用此串口;如果再未断开的情况下,再次按了一下RESET按键,HiBurn软件将会再一次对固件进行烧录。结果展示
依次按三次Hi3861开发套件上的三个按键S2(CORE)、S1(OLED)、S2(OLED),串口打印输出如下:
ADC获取的电压波动在我们设定的范围内,所以我们看到能够正确的识别对应的按键。
小结
学习实现的思想,自己可以使用自己的板子实现一下,无论51单片机还是STM32作为主控,实现的原理都是一样的,文中提供的代码,除了获取ADC值的方式不一样外,其他代码都是可以通用参考的。
参考网文
https://bbs.elecfans.com/jishu_2000829_1_1.html
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • wi-fi
    +关注

    关注

    14

    文章

    2144

    浏览量

    124522
  • HarmonyOS
    +关注

    关注

    79

    文章

    1975

    浏览量

    30213
  • HiSpark
    +关注

    关注

    1

    文章

    156

    浏览量

    6928
收藏 人收藏

    评论

    相关推荐

    Wi-Fi 8要来了!未来Wi-Fi威廉希尔官方网站 演进方向揭秘

    产品销售中,虽然Wi-Fi 7产品的销量份额快速从年初的个位数百分比增长至14%,但Wi-Fi 6产品的销量份额依然稳定在60%左右。如果从存量设备来看,那么Wi-Fi 7路由器的占比将远远小于这个数。   智能手机等终端设备已
    的头像 发表于 11-24 03:14 1634次阅读
    <b class='flag-5'>Wi-Fi</b> 8要来了!未来<b class='flag-5'>Wi-Fi</b>威廉希尔官方网站
演进方向揭秘

    华为海思正式进入Wi-Fi FEM赛道?

    三伍微来说,这是新的机遇。 也许很多人会很惊讶,海思怎么会进入Wi-Fi FEM赛道?其实,海思进入Wi-Fi FEM赛道可以追溯到10多年前,最早在新加坡设立了
    发表于 12-11 17:42

    Wi-Fi 4到Wi-Fi 7:网速飙升40倍的无线革命

    1 Wi-Fi威廉希尔官方网站 的快速发展 每代新的Wi-Fi协议发布,都会带来更高的无线速率。   从Wi-Fi 4到Wi-Fi 7:无线网络威廉希尔官方网站 显著
    的头像 发表于 12-09 10:10 252次阅读
    从<b class='flag-5'>Wi-Fi</b> 4到<b class='flag-5'>Wi-Fi</b> 7:网速飙升40倍的无线革命

    Wi-Fi 7有哪些底层威廉希尔官方网站 优势

    您在多个Wi-Fi行业活动中代表LitePoint。Wi-Fi 7带来了哪些新颖且有趣的特点?
    的头像 发表于 11-15 15:27 434次阅读

    Wi-Fi 7与Wi-Fi 6E有什么区别

    也许很多人还在考虑是否要将使用的Wi-Fi设备升级到Wi-Fi 6或Wi-Fi 6E,而这些标准的继任者却已经开始“登堂入室”了。Wi-Fi 7是新
    的头像 发表于 11-07 11:38 778次阅读

    为什么ESP8266没有检测Wi-Fi的SSID?

    你好,我的ESP8266没有检测到我家Wi-Fi的SSID。我尝试打开我的 iPhone 热点,我可以正常查看和连接(我也成功连接到 MQTT)。相反,没有办法看到我家的Wi-Fi。 我有
    发表于 07-09 06:44

    ESP32 D0WDQ6设计的板子,ADC2与Wi-Fi驱动程序可以同时工作吗?

    硬件改版复杂点,所以请教下大家,可以操作下软件(但是不关闭Wi-Fi),把ADC2用起来吗,ADC2好几个通道,Wi-Fi都使用到了吗?烦
    发表于 06-20 08:17

    华为获得全球首个国际Wi-Fi联盟WFA企业级Wi-Fi 7认证!

    Wi-Fi联盟已发布Wi-Fi 7认证标准,华为是第批送测厂商,获得业界首个企业级Wi-Fi 7 的Wi-Fi联盟官方认证。
    的头像 发表于 04-28 10:17 738次阅读
    华为获得全球首个国际<b class='flag-5'>Wi-Fi</b>联盟WFA企业级<b class='flag-5'>Wi-Fi</b> 7认证!

    验证物联网Wi-Fi HaLow用例的MM6108-EKH08开发套件来啦

    验证物联网Wi-Fi HaLow用例的MM6108-EKH08开发套件来啦 MM6108-EKH08开发套件专为验证物联网Wi-Fi HaLow用例而设计。该
    的头像 发表于 04-11 12:01 1737次阅读
    验证物联网<b class='flag-5'>Wi-Fi</b> HaLow用例的MM6108-EKH08开发<b class='flag-5'>套件</b>来啦

    Wi-Fi 7与Wi-Fi 6的相关知识科普

    科普:Wi-Fi 7 vs. Wi-Fi 6,青出于蓝
    的头像 发表于 03-12 10:59 761次阅读
    <b class='flag-5'>Wi-Fi</b> 7与<b class='flag-5'>Wi-Fi</b> 6的相关知识科普

    Wi-Fi的诞生与发展

    和5GHz两频段,承载着不断增长的网络需求。ABIResearch显示,2022年Wi-Fi上传流量激增80%,Wi-Fi数据流量已超过蜂窝流量,且成为流量增量贡
    的头像 发表于 03-07 08:26 1257次阅读
    <b class='flag-5'>Wi-Fi</b>的诞生与发展

    Wi-Fi HaLow和传统Wi-Fi的区别

    Wi-Fi HaLow和传统Wi-Fi的区别  Wi-Fi种无线网络威廉希尔官方网站 ,可以连接到互联网或局域网,为用户提供无线上网的便利。随着科技的发展和互联网的普及,
    的头像 发表于 02-02 15:28 1281次阅读

    康普携手Wi-Fi联盟,RUCKUS Wi-Fi 7系列接入点成Wi-Fi

     康普高级副总裁兼网络、智能蜂窝和安全解决方案总裁Bart Giordano对此表示: “我们非常荣幸能与Wi-Fi Alliance形成长期合作伙伴关系,将我们的RUCKUS Wi-Fi 7 接入点平台作为Wi-Fi CERT
    的头像 发表于 01-23 14:10 768次阅读

    BT Wi-Fi模式是否可以通过ModustoolBox对套件进行编程来实现

    尝试在 ModustoolBox 中使用示例项目对套件进行编程时,我遇到了问题,因为 &quot; 错误:找不到匹配的 CMSIS-DAP 设备 &quot;。 BT Wi-Fi 模式是否可以通过 ModustoolBox 对
    发表于 01-22 06:19

    只要有Wi-Fi信号就能定位?

    Wi-Fi雷达威廉希尔官方网站 是种利用现有的无线通信网络来实现物体探测和跟踪的创新方法。通过分析Wi-Fi信号的传播特性,如信号强度、相位变化和时间延迟,Wi
    的头像 发表于 01-12 08:20 949次阅读
    只要有<b class='flag-5'>Wi-Fi</b>信号就能定位?