当我按下按钮时,我想闪烁并按住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
答案 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定义为输出引脚,我已经尝试了您的代码,仅在添加此行代码后,它才能正常工作。