C ++ / Arduino мигает светодиодными разными интервалами - PullRequest
0 голосов
/ 30 декабря 2018

У меня есть следующий код на Arduino, где я хочу мигать светодиодом со следующими правилами:

Светодиод мигает два раза быстро, а затем останавливается на более длительное время, так что следующий ритмдостигнуто:

ON-ON ---- ON-ON ---- ON-ON ...
Вкл должен длиться 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++;
}

Моя идея состояла в том, чтобы посчитать, сколько раз светодиод включается, и использовать модуль по модулю, чтобы определить, является ли циклзавершено.Однако двойная вспышка достигается только при каждой восьмой вспышке светодиода, в остальное время светодиод мигает один раз.
Кто-нибудь может мне помочь?

Ответы [ 2 ]

0 голосов
/ 30 декабря 2018

Если все, что вам нужно сделать, это повторить тот же самый шаблон, вы можете сделать это немного проще ...

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 будет лучше.

0 голосов
/ 30 декабря 2018

пример того, что вы хотите, я использовал простые функции, чтобы легко понять программу, я использую LED_BUILTIN, который является светодиодом 13 Arduino Uno или Mega

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);
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...