NodeMCU中断代码并非每次都执行

时间:2019-07-23 05:26:18

标签: arduino interrupt esp8266 nodemcu interrupt-handling

当我按下按钮时,我想闪烁并按住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,后者又连接到nodemcu(ESP8266)的GND。

〜ld

2 个答案:

答案 0 :(得分:1)

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

在NodeMCU板上,微控制器的引脚未映射到板上的引脚。例如,GPIO15将映射到板的D8引脚。您可以看到完整的引脚图here

#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);
}

答案 1 :(得分:0)

pinMode(led_pin,OUTPUT); 您必须将led_pin定义为输出引脚,我已经尝试了您的代码,仅在添加此行代码后,它才能正常工作。