ESP32重要库示例详解(三):按键之avdweb_Switch库

在Arduino开发中,我们经常需要处理按钮和开关的输入。avdweb_Switch库就是为了简化这一任务,提供了一个优雅且高效的事件处理方式。本文将通过一个实际示例,介绍该库的主要特性和用法。

导入库

在Arduino IDE导入avdweb_Switch库的步骤如下:

Arduino IDE

  1. 打开Arduino IDE。
  2. 在打开的库管理器中,搜索Switch。
  3. 选择最新版本的库,点击Install。 安装完成后,关闭库管理器。

PlatformIO

  1. 如果尚未安装PlatformIO,首先需要安装。可以使用VSCode、Atom或其他支持PlatformIO的IDE。
  2. 创建一个新的PlatformIO项目,或打开现有的项目。
  3. 编辑platformio.ini配置文件,添加avdweb_Switch库依赖。在[dependencies]部分下添加:
lib_deps = 	avandalen/Switch@^1.2.4

硬件及连接方法:

如下图,分别把三个轻触开关以以及一个切换开关和蜂鸣器连到相应的引脚上,具体的引脚可以参照代码部分。
连接方法

avdweb_Switch库概述

avdweb_Switch库由Albert van Dalen开发,为Arduino平台提供了丰富的事件处理功能,包括基本的按下、释放,以及长按、双击、单击等复杂事件。库支持多种类型的开关,并内置防抖动机制,确保输入的稳定性。下面通过代码示例深入理解其功能。

示例代码解析

#include "Arduino.h"
#include "avdweb_Switch.h"const byte pushButtonpin = 32; 
const byte toggleSwitchpin = 33; 
const byte multiresponseButtonpin = 25; 
const byte alleventsButtonpin = 26; 
const byte buzzerPin = 16; // 当按钮被按下时,此引脚用于触发蜂鸣器发出蜂鸣声int i;
Switch pushButton = Switch(pushButtonpin); // button to GND, use internal 20K pullup resistor
Switch toggleSwitch = Switch(toggleSwitchpin);
Switch multiresponseButton = Switch(multiresponseButtonpin);
Switch alleventsButton = Switch(alleventsButtonpin);// 回调函数,用于控制蜂鸣器发出蜂鸣声
void beepCallbackFunction(void* s) // optional
{ledcWrite(0, 128); // 设置50%占空比delay(5); ledcWrite(0, 0); // 关闭输出,0%占空比Serial.print("BeepCallback: "); Serial.println((char*)s);
}void setup()
{Serial.begin(115200);pinMode(buzzerPin, OUTPUT);// 配置PWM输出,用于控制蜂鸣器ledcSetup(0, 2000, 8); // 通道0, 2KHz, 8-bitledcAttachPin(buzzerPin, 0); //将蜂鸣器引脚与LED控制器通道0绑定pushButton.setPushedCallback(&beepCallbackFunction/*, "Beep done"*/); // toggleSwitch.setBeepAllCallback(&beepCallbackFunction/*, "Beep done"*/); // 仅需要设置一个按键,即在所有按键上触发}void loop()
{ // pushButton 的简单事件处理pushButton.poll();if (pushButton.switched()) Serial.print("pushButton switched ");if (pushButton.pushed()) {Serial.print("pushButton pushed ");Serial.print(++i);Serial.println(" times");}if (pushButton.released()) Serial.println("pushButton released");// toggleSwitch 只在状态改变时报告if (toggleSwitch.poll()) {Serial.print("toggleSwitch status changed to ");Serial.println(toggleSwitch.on());}// multiResponseButton 复合事件处理multiresponseButton.poll();if (multiresponseButton.longPress()) Serial.println("multiresponseButton longPress");if (multiresponseButton.doubleClick()) Serial.println("multiresponseButton doubleClick");if (multiresponseButton.singleClick()) Serial.println("multiresponseButton singleClick");// alleventsButton 复合事件处理alleventsButton.poll();if (alleventsButton.switched()) {Serial.println("all_e_B switched.");Serial.print(" all_e_B status to ");Serial.print(alleventsButton.on());Serial.println(".");}if (alleventsButton.pushed()) {Serial.println(" all_e_B pushed.");}if (alleventsButton.released()) Serial.println(" all_e_B released.");if (alleventsButton.longPress()) Serial.println("  ==> all_e_B longPress.");if (alleventsButton.doubleClick()) Serial.println("  ==> all_e_B doubleClick.");if (alleventsButton.singleClick()) Serial.println("  ==> all_e_B singleClick.");
}

在这个例子中,我们创建了四个Switch对象,对应四个不同的按钮或开关。setup()函数初始化串口通信和蜂鸣器,并设置按钮按下时的回调函数。在loop()函数中,我们调用poll()方法检查每个开关的状态,并根据事件执行相应的操作。

注意内容:

setPushedCallback():只在单个按键的按压后回调。要分别设置
setBeepAllCallback():在单个按键设置后,在所有按键上都生效
可以分别注释后看效果。
本文在Wokwi上的模拟器链接如下,可以直接运行
SwitchLab

主要特性

  • 事件驱动:通过poll()方法实时监控开关状态,自动触发关联事件处理逻辑。
  • 回调函数灵活性:为不同事件(如点击、长按)配置独立的回调函数,实现高度定制化的响应逻辑。
  • 内置防抖机制:无需额外编写防抖代码,库内建的防抖功能确保每次事件触发的准确性。
  • 复合事件支持:不仅支持基本的按钮操作,还涵盖了长按、双击、单击等复杂交互模式,丰富了用户界面的互动性。

应用场景

avdweb_Switch库因其全面的功能,在多个领域展现了广泛的应用潜力:

  • 智能家居:实现灯光控制、安防报警等,使家居设备响应更为便捷。
  • 教育与实验:在电子工程和编程教学中,作为实践案例,帮助学习者理解事件驱动编程概念。
  • 游戏制作:为自制游戏控制器增加更多互动元素,提升玩家体验。
  • 艺术装置:在公共艺术项目中,创造与观众互动的动态艺术展示。

结语

总而言之,avdweb_Switch库是Arduino开发者的得力助手,它极大地简化了按钮和开关事件处理的复杂度,赋予项目更加丰富和流畅的用户交互体验。不论您是编程新手还是资深开发者,掌握并应用avdweb_Switch库,都将为您的创意项目增添无限可能。希望本文的介绍能激发您在下一个Arduino项目中尝试使用此库,探索更多创新应用。

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

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

相关文章

Python---NumPy万字总结【此篇文章内容难度较大,线性代数模块】(3)

NumPy的应用(3) 向量 向量(vector)也叫矢量,是一个同时具有大小和方向,且满足平行四边形法则的几何对象。与向量相对的概念叫标量或数量,标量只有大小,绝大多数情况下没有方向。我们…

家居分类的添加、修改、逻辑删除和批量删除

文章目录 1.逻辑删除家居分类1.将之前的docker数据库换成云数据库2.树形控件增加添加和删除按钮1.找到控件2.粘贴四个属性到<el-tree 属性>3.粘贴两个span到<el-tree>标签里4.代码5.效果6.方法区新增两个方法处理添加和删除分类7.输出查看一下信息8.要求节点等级小…

李开复引领的零一万物开源了Yi-1.5模型,推出了6B、9B、34B三个不同规模的版本

零一万物&#xff0c;由李开复博士引领的AI 2.0公司&#xff0c;近期开源了其备受瞩目的Yi-1.5模型&#xff0c;这一举措再次彰显了公司在人工智能领域的创新实力与开放精神。Yi-1.5模型作为零一万物的重要技术成果&#xff0c;不仅代表了公司在大模型技术研发上的新高度&#…

冥想的时候怎么专注自己

冥想的时候怎么专注自己&#xff1f;我国传统的打坐养生功法&#xff0c;实际最早可追溯到五千年前的黄帝时代。   每天投资两个半小时的打坐&#xff0c;有上千年之久的功效。因为当你们打坐进入永恒时&#xff0c;时间停止了。这不只是两个半小时&#xff0c;而是百千万亿年…

为什么3d重制变换模型会变形?---模大狮模型网

3D建模和渲染过程中&#xff0c;设计师经常会遇到一个让人头疼的问题&#xff0c;那就是模型在进行重制变换后出现的意外变形。这种变形不仅影响了模型的外观和质量&#xff0c;也给设计工作带来了额外的麻烦。本文将深入探讨3D模型进行重制变换后出现变形的原因&#xff0c;帮…

回炉重造java----JVM

为什么要使用JVM ①一次编写&#xff0c;到处运行&#xff0c;jvm屏蔽字节码与底层的操作差异 ②自动内存管理&#xff0c;垃圾回收功能 ③数组下边越界检查 ④多态 JDK&#xff0c;JRE&#xff0c;JVM的关系 JVM组成部分 JVM的内存结构 《一》程序计数器(PC Register) 作用…

傻瓜化备份/恢复K8S集群Etcd数据

前言&#xff1a; 备份重要数据&#xff0c;简化重复操作&#xff0c;让一指禅、点点点也能完成运维任务。 脚本呈现界面如下&#xff1a; 1、查看Etcd版本 rootmaster:~# cat /etc/kubernetes/manifests/etcd.yaml | grep image: | awk {print $2} registry.aliyuncs.com/goo…

SpringCloud------Eureka,Ribbon,Nacos

认识微服务 微服务技术栈 微服务概念 微服务结构 微服务技术对比 企业需求 SpringCloud 认识Springcloud 服务拆分及远程调用 每个服务只能查询自己数据库中的表&#xff0c;导致其他服务如果想使用别人的表数据&#xff0c;这就需要进行远程调用&#xff0c;这里使用RestTem…

杨校老师项目之基于51单片机的汽车智能照明系统【嵌入式】

获取全套资料&#xff1a; 有偿获取&#xff1a;mryang511688 技术&#xff1a;C语言、单片机等 摘要&#xff1a; 科技的发展&#xff0c;人们对汽车的安全性也提出了更高要求。照明系统作为汽车组成部分之一&#xff0c;承担着重要职能&#xff0c;传统汽车智能照明系统已无法…

【云计算小知识】云管理的作用是什么?

云计算已经成为推动企业数字化转型&#xff0c;提升运营效率的重要力量。而在这个过程中&#xff0c;云管理作为确保云计算环境稳定、高效运行的关键环节&#xff0c;其作用愈发凸显。今天我们小编就给大家详细介绍一下云管理的作用是什么&#xff1f; 云管理的作用是什么&…

小程序的小组件

进度的组件 文字换行过滤 以及 排序 简单易懂 只为了记录工作 <template><div><ProgressBar :progress"progress" /><button click"increaseProgress">增加进度</button><view class"goods-name">12…

【408精华知识】提高外部排序速度的三种方式

文章目录 一、败者树二、置换-选择排序三、最佳归并树 一、败者树 还没写完… 二、置换-选择排序 三、最佳归并树 写在后面 这个专栏主要是我在学习408真题的过程中总结的一些笔记&#xff0c;因为我学的也很一般&#xff0c;如果有错误和不足之处&#xff0c;还望大家在评…

Wikimedia To Opensearch

概览 Wikimedia ⇒ Kafka ⇒ OpensearchJava Library&#xff1a;OKhttp3和OkHttp EventSource&#xff1b;生产者&#xff1a;Wikimedia&#xff1a;WikimediaChangeHandler和WikimediaChangeProducer&#xff1b;消费者&#xff1a;Opensearch&#xff1a;OpenSearchConsume…

AI智能体|我把Kimi接入了个人微信

大家好&#xff0c;我是无界生长。 最近加入AI学习交流群的小伙伴越来越多&#xff0c;我打算在微信群接入一个聊天机器人&#xff0c;让它协助管理微信群&#xff0c;同时也帮忙给群友解答一些问题。普通的群聊机器人肯定是不能满足需求的&#xff0c;得上AI大模型&#xff0c…

【JVM类加载机制】深度剖析JVM类加载机制

深度剖析JVM类加载机制 前言类加载运行全过程loadClass的类加载过程 类加载器和双亲委派机制类加载器的类型类加载器的初始化过程双亲委派机制为什么要设置双亲委派机制&#xff1f;全盘负责委托机制自定义类加载器实例打破双亲委派机制Tomcat打破双亲委派机制Tomcat自定义加载…

问题解决记录 | kettle中出现中文乱码

spoon.bat的启动文件中进行修改 if "%PENTAHO_DI_JAVA_OPTIONS%""" set PENTAHO_DI_JAVA_OPTIONS"-Xms1024m" "-Xmx2048m" "-Dfile.encodingUTF-8"

spark结课之小小tip

scala常用方法总结&#xff1a; 1.map()方法&#xff1a;用于对集合中的每个元素应用一个函数&#xff0c;并将结果收集到一个新的集合中。 基本结构&#xff1a; def map[B](f: (A) > B): List[B] 实例&#xff1a; val numbers List(1, 2, 3, 4, 5) val doubledNumber…

废品回收小程序,推动回收行业数字化发展

在垃圾分类、资源回收利用的时代背景下&#xff0c;废品回收行业迅速成长&#xff0c;市场规模逐渐扩大&#xff01; 随着“互联网”应用的普及&#xff0c;废品回收行业也进入到了数字化回收领域&#xff0c;各大回收行业开始专注于发展智能回收。此外&#xff0c;线上废品回…

‘vue-cli-service‘ is not recognized as an internal or external command解决方案

vue-cli-service is not recognized as an internal or external command, operable program or batch file.解决方案 先进行 &#xff1a; npm install -g vue/cli 命令安装vue cli 是必须的。 如果 npm run build 还是报错 遇到同样的提示&#xff1a; 这时候先安装依赖 np…

智慧管家物业管理系统(小组项目)

目录 前言 一、项目介绍 1、目的和背景 2、项目主要内容 3、技术介绍 二、功能模块 1、重要文件结构 2、功能实现&#xff08;部分个人负责模块功能&#xff09; 2.1 展示房源信息页面 2.2 房屋详情页面 2.3 房源信息管理 三、功能模块页面 1、前台模块 2、后台…