本次试验使用Arduino ESP32-S 开发板
传感器模块可以是按钮, 开关等基于高低电平信号的数字量模块
还有基于电阻的传感器也可, 比如光敏电阻传感器
程序使用中断服务来保证实时性, 添加50ms去抖, 记录开关状态
注意事项/前要
我所使用的是三引脚简单封装模块
如果是单纯的开关或按钮, 就连接到VCC或GND, 对应高低电平
测试传感包括但不限于
轻触开关, 水银开关, 敲击模块, 震动开关, 倾斜开关, 光敏电阻
不同传感器的高低电平设计不同, 要在程序中自行更改, 默认高电平为开
中断程序使用CHANGE模式, 在引脚状态出现变化时触发指定函数
模块与开发板接线
模块引脚 | Arduino ESP32 引脚 |
---|---|
GND | GND |
VCC | 3.3v or 5v |
DATA | GPIO 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); // 保持串口输出的可读性,真正的程序可能不需要这行代码
}