【ESP32开发 数字量/开关量】读取数字量/开关量传感器通用不堵塞中断程序

本次试验使用Arduino ESP32-S 开发板

传感器模块可以是按钮, 开关等基于高低电平信号的数字量模块

还有基于电阻的传感器也可, 比如光敏电阻传感器

程序使用中断服务来保证实时性, 添加50ms去抖, 记录开关状态

注意事项/前要

我所使用的是三引脚简单封装模块

如果是单纯的开关或按钮, 就连接到VCC或GND, 对应高低电平

测试传感包括但不限于

        轻触开关, 水银开关, 敲击模块, 震动开关, 倾斜开关, 光敏电阻

不同传感器的高低电平设计不同, 要在程序中自行更改, 默认高电平为开

中断程序使用CHANGE模式, 在引脚状态出现变化时触发指定函数

模块与开发板接线

模块引脚Arduino ESP32 引脚
GNDGND
VCC3.3v or 5v
DATAGPIO 14

完整代码

如果电平变化过快会被防抖掉, 会直接改变开关状态

如果需要根据高低电平同步开关状态, 需要自己添加修正代码

// 要注意, 直接读取的是int类型

int switchState = digitalRead(SWITCH_PIN); // 读取数字引脚的状态

const int SWITCH_PIN = 14; // 假设开关连接到了数字引脚14
volatile bool switchState = HIGH; // 使用 volatile 关键字因为变量在中断服务程序中被修改

// 中断服务程序
void switchChanged() {
  // 定义静态变量, 避免短时间内重复执行中断
  static unsigned long last_interrupt_time = 0;
  unsigned long interrupt_time = millis();
  
  // 确保距离上次抖动已经超过50毫秒
  if (interrupt_time - last_interrupt_time > 50) {
    switchState = !switchState; // 变换开关的状态
  }
  last_interrupt_time = interrupt_time;
}

void setup() {
  Serial.begin(115200);
  pinMode(SWITCH_PIN, INPUT_PULLUP);
  // 绑定中断服务程序到引脚,并设置为CHANGE模式(只要引脚状态有变化就触发中断)
  attachInterrupt(digitalPinToInterrupt(SWITCH_PIN), switchChanged, CHANGE);
}

void loop() {
  // 打印开关状态,但不会阻碍程序响应中断
  Serial.println(switchState ? "Switch is OPEN" : "Switch is CLOSED");
  delay(100); // 保持串口输出的可读性,真正的程序可能不需要这行代码
}
  • 12
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值