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

分类: 365be体育app 时间: 2025-11-21 18:18:57 作者: admin 阅读: 5316 点赞: 620
【ESP32开发 数字量/开关量】读取数字量/开关量传感器通用不堵塞中断程序

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

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

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

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

注意事项/前要

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

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

测试传感包括但不限于

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

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

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

模块与开发板接线

模块引脚Arduino ESP32 引脚GNDGNDVCC3.3v or 5vDATAGPIO 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); // 保持串口输出的可读性,真正的程序可能不需要这行代码

}

相关推荐