首页 > 解决方案 > C++/Arduino flash LED 不同的间隔

问题描述

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

LED 应快速闪烁两次,然后暂停更长的时间,从而达到以下节奏:

ON-ON----ON-ON----ON-ON ...
On 应持续 125 ms,短暂停应持续 75 ms,长暂停应持续 500 ms。

这是我到目前为止所做的:

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 闪烁一次。
有人可以在这里帮助我吗?

标签: c++arduino

解决方案


一个你想要的例子,我使用简单的函数来轻松理解程序,我使用的是 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);
  }
}

推荐阅读