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]部分下添加:
bash 复制代码
lib_deps = 	
	avandalen/Switch@^1.2.4

硬件及连接方法:

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

avdweb_Switch库概述

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

示例代码解析

cpp 复制代码
#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-bit
  ledcAttachPin(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项目中尝试使用此库,探索更多创新应用。

相关推荐
CV金科4 小时前
蓝桥杯—STM32G431RBT6(IIC通信--EEPROM(AT24C02)存储器进行通信)
stm32·单片机·嵌入式硬件·算法·蓝桥杯
嵌入式详谈6 小时前
基于STM32的智能风扇控制系统设计
stm32·单片机·嵌入式硬件
小小怪大梦想6 小时前
RTC实时时钟
stm32·单片机·嵌入式硬件
水饺编程10 小时前
【英特尔IA-32架构软件开发者开发手册第3卷:系统编程指南】2001年版翻译,1-2
linux·嵌入式硬件·fpga开发
电子科技圈10 小时前
IAR全面支持国科环宇AS32X系列RISC-V车规MCU
人工智能·嵌入式硬件·mcu·编辑器
SZPU领跑11 小时前
第十二届蓝桥杯嵌入式省赛程序设计题解析(基于HAL库)(第一套)
stm32·单片机·算法·职场和发展·蓝桥杯
逢生博客11 小时前
Rust 语言开发 ESP32C3 并在 Wokwi 电子模拟器上运行(esp-hal 非标准库、LCD1602、I2C)
开发语言·后端·嵌入式硬件·rust
Tlog嵌入式13 小时前
蓝桥杯【物联网】零基础到国奖之路:十六. 扩展模块之矩阵按键
arm开发·stm32·单片机·mcu·物联网·蓝桥杯·iot
打地基的小白14 小时前
UART通信—基于江科大源码基础进行的改进和解析
单片机·嵌入式硬件·uart通信·代码详解
黄小美32115 小时前
STM32(五)GPIO输入硬件电路及C语言知识复习
stm32·单片机·嵌入式硬件