首页 > 解决方案 > NodeMCU中断代码并非每次都执行

问题描述

当我按下按钮时,我想闪烁并点亮 2 秒钟。为此,我使用中断编写了这段代码。但它不会在每次上传代码时执行。欢迎任何建议。甚至serial.println("started")不显示。也没有显示错误。

#define led_pin D1
#define int_pin D8

volatile bool led = false;

void ICACHE_RAM_ATTR ISR_func();

void setup() {
 Serial.begin(9600);
 Serial.println("started");
 pinMode(int_pin, INPUT_PULLUP);
 attachInterrupt(digitalPinToInterrupt(int_pin), ISR_func, RISING);
}

void loop() {
    if(led){
        led_func();
    }
}

void ISR_func(){
    //Serial.println("interrupt detected");
    led = true;
    return;
}

void led_func(){
    Serial.println("led");
    digitalWrite(led_pin, HIGH);
    delay(2000);
    digitalWrite(led_pin, LOW);
    delay(2000);
    led = false;
    return;
}

硬件:我使用按钮连接了 D8 和 GND 引脚,D1 连接到 LED,LED 再次连接到 nodemcu(ESP8266)的 GND。

〜ld

标签: arduinointerruptesp8266nodemcuinterrupt-handling

解决方案


首先,您不能Serial在中断的 ISR 中使用函数,因为它使用了中断。其次,您的代码看起来不错,但我认为您的问题出在接线上。

在 NodeMCU 板中,微控制器的引脚不映射到板的引脚。例如,GPIO15 将映射到电路板的 D8 引脚。您可以在此处查看完整的引脚图。

#define led_pin D1
const byte int_pin = 15;

volatile bool led = false;

void ICACHE_RAM_ATTR ISR_func();

void setup()
{
    Serial.begin(9600);
    Serial.println("started");
    pinMode(int_pin, INPUT_PULLUP);
    attachInterrupt(digitalPinToInterrupt(int_pin), ISR_func, RISING);
}

void loop()
{
    if (led)
    {
        led_func();
        led = false;
    }
}

void ISR_func()
{
    led = true;
}

void led_func()
{
    Serial.println("led");
    digitalWrite(led_pin, HIGH);
    delay(2000);
    digitalWrite(led_pin, LOW);
    delay(2000);
}

推荐阅读