C++/Arduino 闪烁 LED 不同的间隔

C++/Arduino flash LED different intervals

本文关键字:LED Arduino 闪烁 C++      更新时间:2023-10-16

我在Arduino上有以下代码,我想使用以下规则闪烁LED:

LED 应快速闪烁两次,然后暂停较长时间,以便实现以下节奏:

-开----开-开----开...
打开应持续 125 毫秒,短暂停应持续 75 毫秒,长暂停应持续 500 毫秒。

以下是我到目前为止所做的:

unsigned long flashOn = 125;
unsigned long flashOff = 75; //first pause must be a short one
unsigned long flashCount = 0;
void handleFrontFlash() {
  byte beforeState = digitalRead(LED_Front);
  flashOff = (flashCount % 2 > 0) ? 75 : 500;
  digitalWrite(LED_Front, (millis() % (flashOn + flashOff)) < flashOn);
  byte afterState = digitalRead(LED_Front);
  if(beforeState == LOW and afterState == HIGH)
    flashCount++;
}

我的想法是计算LED打开的次数,并使用模来确定周期是否完成。但是,双闪光灯仅实现LED的每8次闪烁一次,其余时间LED闪烁一次。
有人可以在这里帮助我吗?

你想要的一个例子,我使用了简单的函数来轻松理解程序,我正在使用LED_BUILTIN 是 Arduino UNO 或 Mega 的 LED 13

unsigned long currentMillis;
unsigned long previousMillis = 0;
unsigned long interval;
int Compteur = 1;
int ledState = HIGH;
int state = 0;
void setup(){
  pinMode(LED_BUILTIN, OUTPUT);
  digitalWrite(LED_BUILTIN, HIGH); // i begin with HIGH during 125ms
  interval = 125;
  previousMillis = 0;
}
// Main loop
void loop() {
  currentMillis = millis(); 
  if (currentMillis - previousMillis >= interval) {
    previousMillis = currentMillis;
    switch (state) {
      case 0:
        ledState = LOW;
        interval = 75;
        state = 1;
        break;
      case 1:
        ledState = HIGH;
        interval = 125;
        state = 2; 
        break;
      case 2:
        ledState = LOW;
        interval = 500;
        state = 3; 
        break;
      case 3:
        ledState = HIGH;
        interval = 125;
        state = 0;
        Compteur++; // count the number of beginning new sequence         
        break;            
      default:
      // statements
      break;
    }
    digitalWrite(LED_BUILTIN, ledState);
  }
}

如果你需要做的就是重复同样的模式,你也许可以做得更简单一点......

unsigned long on = 125;
unsigned long shortOff = 75;
unsigned long longOff = 500;
void setup() {
  pinMode(LED_BUILTIN, OUTPUT);
}
void loop() {
  digitalWrite(LED_BUILTIN, HIGH);
  delay(on);   
  digitalWrite(LED_BUILTIN, LOW);
  delay(shortOff);
  digitalWrite(LED_BUILTIN, HIGH);
  delay(on);
  digitalWrite(LED_BUILTIN, LOW);
  delay(longOff);
}

如果您需要"同时"做其他事情,那么Frenchy的答案会更好。