【问题标题】:Interrupt function in ArduinoArduino中的中断功能
【发布时间】:2018-03-06 18:09:12
【问题描述】:

我目前正在研究将按钮作为输入的项目,当我们从第一个 LED 开始单击按钮时,它会移动,并且每 0.5 秒后 LED 会相互跟随。中断功能完美运行,但问题是循环完成时中断工作。单击按钮时,我想关闭 LED。如何解决这个问题?

int button;
void setup() {

 DDRD = B11110000;

 attachInterrupt(digitalPinToInterrupt(2), buttonPressed, RISING);
}
void loop() {

  if(button) {

    PORTD = B00010000;
    delay(500);
    PORTD = PORTD <<1;
    delay(500);
    PORTD = PORTD <<1;
    delay(500);
    PORTD = PORTD <<1;
    delay(500);

  }
  else {

    PORTD = B00000000;

  }
}

void buttonPressed() {


  if(button == 0) {
    button = 1;
  }else {
    button = 0;
  }


}

【问题讨论】:

  • 庞大的社区,没人知道。
  • 你能澄清一下吗?第一次按下按钮时,您想打开一盏灯,每 0.5 秒切换一次打开哪个灯?当再次按下按钮时立即关闭所有灯?
  • 当我按下按钮时,第一个 LED 应该打开,每 0.5 秒后它应该切换到下一个 LED,前一个应该关闭。 LED 序列。一切正常,但是当我按下按钮关闭 LED 时,它会等到循环结束,然后所有 LED 都会关闭。

标签: arduino sequence led


【解决方案1】:

您可以重写代码来检查每个 LED 的按钮状态,而不是执行整个循环。这意味着 LED 在 0.5 秒内仍将始终保持点亮状态。

int button;
void setup() {    
 DDRD = B11110000;    
 attachInterrupt(digitalPinToInterrupt(2), buttonPressed, RISING);
}

void loop() {    
  if(button) {
    PORTD = PORTD <<1;
    if (PORTD == 0) {
        PORTD = B00010000;
    }
    delay(500);
  } else {    
    PORTD = B00000000;
  }
}

void buttonPressed() {    
  button = !button;
}

要使 LED 立即变暗,您不应使用延迟,而是最多循环 0.5 秒并检查按钮状态;

unsigned long timeout = millis() + 500;
while (button && millis() < timeout);

或者更多的上下文

void loop() {    
  if(button) {
    next_light();
    sleep(500);
  } else {    
    PORTD = B00000000;
  }
}

void next_light() {
  PORTD = PORTD <<1;
  if (PORTD == 0) {
    PORTD = B00010000;
  }
}

void sleep(unsigned long timeout) {
  unsigned long end = millis() + timeout;
  while (button && millis() < end);
}

void buttonPressed() {    
  button = !button;
}

【讨论】:

  • 感谢您的 cmets,但我应该在哪里使用 while 循环?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-12-02
  • 1970-01-01
  • 2021-12-27
  • 2011-07-03
  • 2012-04-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多