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

ESP8266 NodeMCU自锁开关读取重复触发问题求助

问题原因

你当前遇到的重复打印问题和break语句无关,Arduino的loop()函数本身是无限循环执行的,你两段代码的逻辑都是每次进入loop就直接读取引脚状态、执行对应打印操作,只要开关状态不变,每轮loop都会重复执行相同的打印逻辑,自然会持续输出内容。

解决方案

核心思路是新增全局变量存储开关的上一次稳定状态,每次读取引脚状态后和历史状态比对,仅当状态发生变化时才执行对应指令,同时增加防抖逻辑规避开关机械抖动带来的误触发。
修改后的完整代码如下:

#include<BitsAndDroidsFlightConnector.h>

BitsAndDroidsFlightConnector connector = BitsAndDroidsFlightConnector();

const byte exampleButtonA = 0;
// 存储开关上一次的稳定状态,初始为上拉电阻默认的高电平
byte lastButtonState = HIGH;

void setup() {
  Serial.begin(115200);
  pinMode(exampleButtonA, INPUT_PULLUP);
}

void loop() {
  byte currentState = digitalRead(exampleButtonA);
  // 仅当当前状态和历史状态不一致时,进入状态变更判断逻辑
  if (currentState != lastButtonState) {
    // 10ms防抖,跳过开关切换时的机械抖动区间
    delay(10);
    // 防抖后二次读取确认状态有效
    currentState = digitalRead(exampleButtonA);
    if (currentState != lastButtonState) {
      switch(currentState) {
        case LOW:
          Serial.println("ON IT IS");
          // 此处添加开关切换为开启时需要执行的其他指令
          break;
        case HIGH:
          Serial.println("OFF IT IS");
          // 此处添加开关切换为关闭时需要执行的其他指令
          break;
        default:
          Serial.println("error!");
          break;
      }
      // 更新历史状态为当前状态,避免后续循环重复触发
      lastButtonState = currentState;
    }
  }
}
补充说明

如果你的项目需要同时运行其他实时性要求高的逻辑,可以将delay(10)的阻塞防抖替换为millis()实现的非阻塞防抖,避免延时影响其他代码执行。

内容的提问来源于stack exchange,提问作者Simon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 06:54:03