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.rhkb.cn/news/326761.html

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

相关文章

黑盒测试中的边界值分析

黑盒测试是一种基于需求和规格的测试方法,它主要关注软件系统输出的正确性和完整性,而不考虑内部代码的实现方式。在黑盒测试中,边界值分析是一种重要的测试技术,它可以帮助测试人员有效地发现输入和输出的问题。本文将从什么是边…

AI翻唱+视频剪辑全流程实战

目录 一、AI翻唱之模型训练 (1)模型部署 (2)数据集制作——搜集素材 (3)数据集制作——提升音频质量 方法一:使用RVC提供的音频处理功能。 方法二:可以使用音频剪辑工具Ad…

AI时代的网络安全战:以智取胜,守护数字安宁

在数字化浪潮的推动下,我们的生活和工作日益离不开互联网。然而,随着人工智能(AI)技术的飞速发展,网络安全问题也日益凸显。美国联邦调查局(FBI)的一则警报如同一记重锤,敲响了我们对…

大米自动化生产线揭秘:包装设备选择与维护之道

在现代化的大米生产过程中,自动化生产线的应用已经越来越广泛。其中,包装设备作为生产线上的重要一环,其选择与维护直接关系到产品的质量和生产效率。与星派一起探讨大米自动化生产线中包装设备的选择与维护之道。 一、包装设备的选择 在选择…

工厂模式应用实例

引言 设计模式概念 设计模式(Design Pattern)的官方概念可以表述为:在软件设计中,设计模式是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。它是针对特定问题或特定场景的解决方案,是一种经过…

单元测试之TestNG知识点总结及代码示例

TestNG 是一个测试框架,用于自动化测试 Java 和 Scala 应用程序,它是 JUnit 和 NUnit 的一个强大替代品。TestNG 支持数据驱动测试、参数化测试、测试套件、依赖管理、多线程测试等特性。TestNG官网:TestNG Documentation 目录 1.TestNG 基…

虹科Pico汽车示波器 | 免拆诊断案例 | 2010款凯迪拉克SRX车发动机无法起动

故障现象 一辆2010款凯迪拉克SRX车,搭载LF1发动机,累计行驶里程约为14.3万km。该车因正时链条断裂导致气门顶弯,大修发动机后试车,起动机运转有力,但发动机没有着机迹象;多起动几次,火花塞会变…

网络编程:服务器模型-并发服务器-多进程

并发服务器概念: 并发服务器同一时刻可以处理多个客户机的请求 设计思路: 并发服务器是在循环服务器基础上优化过来的 (1)每连接一个客户机,服务器立马创建子进程或者子线程来跟新的客户机通信 (accept之后…

QT--4

QT 使用定时器完成闹钟 #include "widget.h" #include "ui_widget.h"void Widget::timestart() {timer.start(1000); }void Widget::timeend() {timer.stop(); }Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(t…

分类预测 | Matlab实现DBO-CNN-SVM蜣螂算法优化卷积神经网络结合支持向量机多特征分类预测

分类预测 | Matlab实现DBO-CNN-SVM蜣螂算法优化卷积神经网络结合支持向量机多特征分类预测 目录 分类预测 | Matlab实现DBO-CNN-SVM蜣螂算法优化卷积神经网络结合支持向量机多特征分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 1.Matlab实现DBO-CNN-SVM蜣螂算法…

【卫星影像三维重建-全流程代码实现】点云Mesh重构

点云—>Mesh模型 1.介绍1.1 背景1.2 效果示意 2 算法实现2.1 依赖库2.2 实验数据2.3 代码实现2.4 实验效果 3.总结 1.介绍 1.1 背景 (1)本文主要内容是将三维点云(离散的三维点)进行表面重建生成Mesh网格,之前有篇…

Middle for Mac:简洁高效的文本编辑软件

追求简洁与高效?Middle for Mac将是您文本编辑的最佳选择。这款Mac平台上的文本编辑器,以其独特的魅力和实用的功能,赢得了众多用户的喜爱。 Middle注重用户体验,采用简洁直观的界面设计,让您能够迅速上手并享受高效的…

巩固学习6

正则表达式 又称规则表达式,Regular Expression,在代码中常简写为regex、regexp或RE),是一种文本模式,包括普通字符(例如,a到z之间的字母)和特殊字符(称为“元字符”&…

今天开发了一款软件,我竟然只用敲了一个字母(文末揭晓)

软件课题:Python实现打印100内数学试题软件及开发过程 一、需求管理: 1.实现语言:Python 2.打印纸张:A4 3.铺满整张纸 4.打包成exe 先看效果: 1. 2.电脑打印预览 3.打印到A4纸效果(晚上拍的&#x…

【实践】使用vscode来debug go程序的尝鲜

配置 首先,当然得配置好vscode 的go环境, 装个go插件就基本满足了 配置 launch.json, 可以配置多个环境的程序启动参数(很友好) {"version": "0.2.0","configurations": [{"name": &…

享元模式详解

享元模式 1 概述 定义: ​ 运用共享技术来有效地支持大量细粒度对象的复用。它通过共享已经存在的对象来大幅度减少需要创建的对象数量、避免大量相似对象的开销,从而提高系统资源的利用率。 2 结构 享元(Flyweight )模式中存…

linux学习:视频输入+V4L2

目录 V4L2 视频采集流程 代码例子 核心命令字和结构体 VIDIOC_ENUM_FMT VIDIOC_G_FMT / VIDIOC_S_FMT / VIDIOC_TRY_FM VIDIOC_REQBUFS VIDIOC_QUERYBUF VIDIOC_QBUF /VIDIOC_DQBUF VIDIOC_STREAMON / VIDIOC_STREAMOFF V4L2 是 Linux 处理视频的最新标准代码模块&…

力扣HOT100 - 45. 跳跃游戏 II

解题思路&#xff1a; 贪心 class Solution {public int jump(int[] nums) {int end 0;int maxPosition 0;int steps 0;for (int i 0; i < nums.length - 1; i) {maxPosition Math.max(maxPosition, i nums[i]);if (i end) {end maxPosition;steps;}}return steps;…

Java | Leetcode Java题解之第86题分隔链表

题目&#xff1a; 题解&#xff1a; class Solution {public ListNode partition(ListNode head, int x) {ListNode small new ListNode(0);ListNode smallHead small;ListNode large new ListNode(0);ListNode largeHead large;while (head ! null) {if (head.val < x…

java sql中 大于 小于 大于等于 小于等于 代替符号

在写java时sql会经常会忘记大于小于号的表示方法导致无法运行&#xff0c;总结一下 第一种方法&#xff1a; < &#xff1a;< < &#xff1a; < &#xff1a;> &#xff1a; > sql如下&#xff1a; create_at > #{startTime} and create_at < #{end…