首先,让我们逐步分析您的代码,并找出可能的问题。
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上可靠地工作。
首先,让我们逐步分析您的代码,并找出可能的问题。
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上可靠地工作。
举报