You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 01:36:09