Arduino AttachInterrupt() 似乎 运行 两次
Arduino AttachInterrupt() seems to run twice
我从一个最近开始使用 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 ;
}
您遇到的问题是因为按钮故障会在每次按下按钮时产生许多中断。您可以找到一个很好的描述和使用硬件解决它的方法here。
我解释一下,当你按下按钮时,机械触点会有一个短暂的ON-OFF波动的瞬态。释放按钮时可能会发生相同的效果。
解决此问题的一种方法是使用与负载并联的电容器。另一种 "easier" 方式将由软件完成。这个想法是设置一个固定的任意时间,您不允许新的中断。您可以使用 millis() or micros() 库来设置这个时间。代码看起来像这样。
unsigned long lastInterrupt;
void ngt()
{
if(millis() - lastInterrupt > 10) // we set a 10ms no-interrupts window
{
state = !state;
lastInterrupt = millis();
}
}
这样你就不会处理新的中断,直到 10 毫秒过去。
注意:根据您的要求调整时间。
我从一个最近开始使用 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 ;
}
您遇到的问题是因为按钮故障会在每次按下按钮时产生许多中断。您可以找到一个很好的描述和使用硬件解决它的方法here。
我解释一下,当你按下按钮时,机械触点会有一个短暂的ON-OFF波动的瞬态。释放按钮时可能会发生相同的效果。
解决此问题的一种方法是使用与负载并联的电容器。另一种 "easier" 方式将由软件完成。这个想法是设置一个固定的任意时间,您不允许新的中断。您可以使用 millis() or micros() 库来设置这个时间。代码看起来像这样。
unsigned long lastInterrupt;
void ngt()
{
if(millis() - lastInterrupt > 10) // we set a 10ms no-interrupts window
{
state = !state;
lastInterrupt = millis();
}
}
这样你就不会处理新的中断,直到 10 毫秒过去。
注意:根据您的要求调整时间。