Arduino AttachInterrupt()似乎运行了两次

Vic*_*olm 5 arduino interrupt

我从最近刚开始使用arduino的我的学生那里得到了一些代码.

他试图做一个中断,它有点工作.事情是它跑了两次(他调用的功能)所以布尔值被重置了.

我试图找到答案,但我找不到任何答案,所以我在这里.

请帮我.

boolean state = 1 ;
void setup()

{
pinMode (2 , INPUT);
pinMode (8 , OUTPUT);
Serial.begin(38400);        
attachInterrupt( 0 , ngt, RISING);


}


void loop()

{

Serial.println (digitalRead(2));
digitalWrite ( 8 , state );
delay(50);

}

void ngt()
{

state = !state ;


}
Run Code Online (Sandbox Code Playgroud)

eve*_*ler 10

您遇到的问题是因为按钮故障会在每次按下按钮时产生许多中断.你可以找到一个很好的说明,并使用硬件解决它的方法在这里.

让我解释一下,当你按下按钮时,机械触点将具有一种瞬态状态,在该状态下它将在短时间内波动.释放按钮时可能会发生相同的效果.

解决该问题的一种方法是使用与负载并联的电容器.另一种"更容易"的方式是由软件完成的.我们的想法是设置一个固定的任意时间,在此时间内不允许新的中断.您可以使用millis()micros()库来设置此时间.代码看起来像这样.

unsigned long lastInterrupt;

void ngt()
{

  if(millis() - lastInterrupt > 10) // we set a 10ms no-interrupts window
    {    

    state = !state;

    lastInterrupt = millis();

    }
}
Run Code Online (Sandbox Code Playgroud)

这样,在10ms过去之前,您不会处理新的中断.

注意:根据您的要求调整时间.

  • 这个答案实际上比它给出的答案更有价值。虽然看似微不足道,有经验的人都知道,但实际上,第一次面对它时,并没有那么容易弄清楚。特别是如果您已经有电路和 Arduino 方面的经验,但从未尝试使用具有快速响应(如中断)的开关。 (2认同)