完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
我正在尝试弄清楚 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个回答
|
|
首先,让我们逐步分析您的代码,并找出可能的问题。
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上可靠地工作。 |
|
|
|
只有小组成员才能发言,加入小组>>
545浏览 6评论
457浏览 5评论
有没有办法在不使用混杂模式的情况下实现Wifi驱动程序接收缓冲区访问中断呢?
437浏览 5评论
441浏览 4评论
411浏览 4评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-21 22:03 , Processed in 0.958316 second(s), Total 81, Slave 63 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号