Arduino AttachInterrupt()似乎运行了两次

时间:2015-04-20 18:56:37

标签: 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 ;


}

1 个答案:

答案 0 :(得分:9)

您遇到的问题是因为按钮故障会在每次按下按钮时产生许多中断。您可以使用硬件here找到一个很好的描述和解决方法。

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

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

unsigned long lastInterrupt;

void ngt()
{

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

    state = !state;

    lastInterrupt = millis();

    }
}

这样您就不会处理新的中断,直到10ms过去。

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