乐鑫技术交流
直播中

秋风宜人

14年用户 923经验值
擅长:基础元器件
私信 关注
[问答]

AttachedInterrupt如何在NodeMCU上工作?

我正在尝试弄清楚 AttachedInterrupt 如何在 NodeMCU 上工作。
我发现的一切都告诉我这个代码没问题?!

void setup() {
  Serial.begin(9600);
  pinMode(D4, INPUT);
  attachInterrupt(D4, doSth(), CHANGE);
}

void loop() {
  Serial.println(digitalRead(D4));
  delay(100);
}

无效 doSth() {
  Serial.println("Check!");
}



回帖(1)

wufan931111

2024-7-20 16:34:06
首先,让我们逐步分析您的代码,并找出可能的问题。

1. `Serial.begin(9600);`:这行代码初始化串行通信,设置波特率为9600。这是正确的。

2. `pinMode(D4, INPUT);`:这行代码将D4引脚设置为输入模式。这是正确的。

3. `attachInterrupt(D4, doSth(), CHANGE);`:这里有几个问题:
   - `doSth()`函数调用时应该使用`&`符号,表示函数的地址。应该改为`attachInterrupt(D4, &doSth, CHANGE);`
   - NodeMCU使用的是ESP8266芯片,它对中断的支持有限。在某些情况下,中断可能无法正常工作。

4. `void loop()`:这个循环函数每100毫秒读取D4引脚的状态,并将其打印到串行监视器。这是正确的。

5. `void doSth()`:这是一个空的函数,仅打印"Check!"。这是正确的,但您可能需要在其中添加一些逻辑。

根据上述分析,您应该修改代码如下:

```cpp
void setup() {
  Serial.begin(9600);
  pinMode(D4, INPUT);
  attachInterrupt(D4, &doSth, CHANGE);
}

void loop() {
  Serial.println(digitalRead(D4));
  delay(100);
}

void doSth() {
  Serial.println("Check!");
}
```

然而,由于ESP8266对中断的支持有限,即使修改了代码,中断可能仍然无法正常工作。在这种情况下,您可以尝试使用轮询方法代替中断。以下是使用轮询的示例代码:

```cpp
void setup() {
  Serial.begin(9600);
  pinMode(D4, INPUT);
}

void loop() {
  if (digitalRead(D4) == HIGH) {
    Serial.println("Check!");
  }
  delay(100);
}
```

这种方法会降低代码的效率,但它可以在ESP8266上可靠地工作。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分