如何修改Arduino代码实现3个触摸/开关任意触发继电器控制灯
Arduino继电器多传感器控制修复方案
现有代码核心问题
- 输入读取逻辑失效:代码中连续三次给
val变量赋值,前两个传感器的读数会被最后一个传感器的读数完全覆盖,实际只有接在7号引脚的传感器能生效,完全没有实现任意传感器触发的需求 - 状态切换逻辑错误:
lightON直接赋值为传感器读数,和触发翻转状态的需求不匹配,原逻辑无法实现按一次切换一次状态的效果 - 代码存在HTML转义字符残留:
&&、"是HTML场景下的转义内容,Arduino编译环境无法识别,需要还原为正常符号
修复后可运行代码
int touchPin = 4; int touchPin2 = 6; // 第二个触摸传感器引脚 int touchPin3 = 7; // 第三个开关引脚 int relayPin = 9; int touched = 0; int lastTriggerState = LOW; // 存储上一次的触发状态,用于防抖 void setup() { Serial.begin(9600); pinMode(touchPin, INPUT); pinMode(touchPin2, INPUT); pinMode(touchPin3, INPUT); pinMode(relayPin, OUTPUT); // 初始状态关灯,根据继电器电平逻辑调整,默认高电平断开 digitalWrite(relayPin, HIGH); } void loop() { // 读取三个传感器状态,任意一个为高则判定为触发 int currentState = digitalRead(touchPin) || digitalRead(touchPin2) || digitalRead(touchPin3); // 检测触发上升沿(从未触发变为触发),防抖处理 if(currentState == HIGH && lastTriggerState == LOW){ touched = 1 - touched; // 翻转状态 // 切换继电器状态 if(touched == HIGH){ Serial.println("Light ON"); digitalWrite(relayPin, LOW); }else{ Serial.println("Light OFF"); digitalWrite(relayPin, HIGH); } delay(100); // 消抖延时,避免单次触摸触发多次 } lastTriggerState = currentState; delay(50); }
修改说明
- 输入读取改为三个传感器值做或运算,实现任意一个触发就生效的需求
- 增加上升沿触发判断,只有当传感器从未触发变为触发状态时才翻转灯的状态,避免传感器持续被触摸时反复切换状态
- 优化了消抖逻辑,适配触摸传感器和普通开关的触发特性
- 修正了原代码中的转义字符错误,可直接编译运行
内容的提问来源于stack exchange,提问作者Filip GG
相关产品推荐
相关产品推荐

