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-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项目中尝试使用此库,探索更多创新应用。

  • 13
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: esp-tls: create_ssl_handle failed是ESP32芯片在进行TLS连接时出现的一种错误,可能由于几种原因导致:网络配置错误、证书验证失败或者TLS版本不匹配等。 网络配置错误可能会导致芯片无法访问远端服务器,因此需要确保设备和服务器的网络配置正确,并且ESP32能够连接到服务器。如果无法连接,请检查网络配置并确认服务器是否正常运行。 证书验证失败可能会导致芯片拒绝连接到服务器,并出现create_ssl_handle失败的错误。有时候我们需要对服务器的证书进行验证,但是芯片没能通过验证。去掉证书验证或者找到正确的证书进行验证可能解决问题。 TLS版本不匹配可能会导致芯片无法成功建立TLS连接。在进行TLS连接时需要确保芯片和服务器的TLS版本相同。如果服务器只使用TLS1.2,而芯片只支持TLS1.0,那么连接就会失败。调整芯片或服务器的TLS版本,或者使用相同的版本可能解决问题。 因此,我们需要仔细查看代码和日志,找出具体问题所在,并采取相应的措施。 ### 回答2: esp-tls: create_ssl_handle failed是一个错误信息,用于描述在ESP-TLS创建SSL句柄失败的情况。 ESP-TLS是一个为ESP32芯片设计的安全传输层协议,用于实现SSL/TLS协议。该提供了安全的网络通信功能,用于保护数据的机密性和完整性。 在使用ESP-TLS时,create_ssl_handle是一个用于创建SSL句柄的函数。SSL句柄是用于管理和处理SSL/TLS连接的数据结构。 当出现"esp-tls: create_ssl_handle failed"错误时,意味着在创建SSL句柄时发生了错误。可能的原因包括: 1. 内存不足:创建SSL句柄需要分配内存空间,如果系统内存不足,则会导致创建失败。 2. 参数错误:在调用create_ssl_handle函数时,传递的参数可能存在问题,导致创建失败。这可能包括无效的证书、密钥或配置问题。 3. 与底层硬件或驱动的兼容性问题:ESP32芯片的硬件或驱动可能存在与ESP-TLS不兼容的问题,导致创建SSL句柄失败。 如果遇到"esp-tls: create_ssl_handle failed"错误,可以尝试以下解决方法: 1. 检查系统内存:确保系统有足够的内存可用。可以尝试关闭其他应用程序或释放不必要的内存占用,以解决内存不足的问题。 2. 检查参数配置:仔细检查传递给create_ssl_handle函数的参数配置,确保证书、密钥和其他参数的正确性。 3. 更新ESP-TLS版本:尝试更新使用的ESP-TLS版本,以获得最新的修复程序和改进。 4. 联系技术支持:如果上述方法无法解决问题,可以联系ESP-TLS的技术支持,获取更详细的帮助和指导。 总之,“esp-tls: create_ssl_handle failed”错误是ESP-TLS创建SSL句柄失败的错误消息,可能的原因包括内存不足、参数错误或与底层硬件或驱动的兼容性问题。可以通过检查系统内存、参数配置、更新版本或联系技术支持来解决该问题。 ### 回答3: esp-tls: create_ssl_handle failed 是一个错误信息,意思是 esp-tls 无法创建 SSL 句柄。此错误通常出现在使用 ESP32 开发板进行 TLS 加密通信时。 出现此错误的可能原因有以下几种: 1. 内存不足:ESP32 开发板的内存资源有限,如果系统内存不足以支持创建 SSL 句柄,就会出现此错误。可以通过减少系统内存的占用或者增加内存来解决这个问题。 2. 无法连接到服务器:在建立 TLS 连接之前,确保 ESP32 开发板与目标服务器之间的网络连接是可用的。检查网络配置和硬件连接,以确保没有网络故障。 3. 证书问题:TLS 通信需要服务器提供有效的 SSL 证书。如果服务器证书无效、过期或者与 ESP32 开发板不匹配,都会导致 SSL 句柄创建失败。检查服务器证书是否正确,并确保与 ESP32 配置相匹配。 4. 代码逻辑错误:检查代码是否存在语法错误、逻辑错误或者问题函数调用。确保正确地调用了 esp-tls 的相关函数,并按照正确的顺序初始化和使用 SSL 句柄。 解决此问题的方法包括: 1. 检查内存使用情况并优化代码,如使用更少的内存或者开启内存优化选项。 2. 确认网络连接正常,可以尝试重新连接网络或者更换网络环境。 3. 检查服务器证书是否正确并与 ESP32 的配置相匹配,可以尝试使用其他可靠的证书。 4. 仔细检查代码逻辑,确保使用 esp-tls 的函数正确调用和使用。 如果尝试了以上方法仍然无法解决问题,可以查阅 esp-tls 的官方文档、参考示例代码或者向开发社区提问寻求进一步的帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值