millis() заменить вопрос задержки()

// каждое «событие» (светодиод) получает свою собственную переменную отслеживания
unsigned long previousMillisLED12=0;
unsigned long previousMillisLED13=0;

unsigned long previousMillisLED3=0;

// разные интервалы для каждого светодиода
int intervalLED12 = 500;
int intervalLED13 = 5000;

int intervalLED3 = 2000;

// каждый светодиод получает переменную состояния
boolean LED13state = false;     // светодиод загорится на первой итерации цикла()
boolean LED12state = false;     // нужно установить свет, чтобы он был выключен

void setup() {
   pinMode(13, OUTPUT);
   pinMode(12, OUTPUT);

   pinMode(3, OUTPUT);

}
void loop() {
   // получаем текущую отметку времени
   // нужен только один для обоих операторов if
   unsigned long currentMillis = millis();

   // пора переключить светодиод на контакте 12?
   if ((unsigned long)(currentMillis - previousMillisLED12) >= intervalLED12) {
      LED12state = !LED12state;
      digitalWrite(12, LED12state);
      // сохраняем текущее время для закрепления предыдущего Миллиса 12
      previousMillisLED12 = currentMillis;
   }

// пора переключить светодиод на контакте 13?
  if ((unsigned long)(currentMillis - previousMillisLED13) >= intervalLED13) {
      LED13state = !LED13state;
      digitalWrite(13, LED13state);
      // сохраняем текущее время для закрепления предыдущего Миллиса 13
      previousMillisLED13 = currentMillis;
  }
}

Мои вопросы:

  1. Не заметил, что у LED12 и LED13 разница в 10 раз, почти одинаковые интервалы, почему?

  2. Как я могу использовать millis() так же просто, как задержку?

  3. Обязательно ли использовать if?

, 👍0

Обсуждение

Светодиоды мигают с разными интервалами. Правильно ли вы подключили светодиоды и резисторы? Функцию миллис можно использовать в качестве задержки, но не таким же образом. Когда скетч с задержкой необходимо преобразовать в миллис, то зачастую большую часть скетча приходится переписывать., @Jot

Обратите внимание, что currentMillis - previousMillisLED12 является unsigned long. Явное приведение его к unsigned long является излишним., @Edgar Bonet

Что вы подразумеваете под 3.?, @chrisl

@Jot Спасибо , я просто удалил задержку (1000) и добавил вместо нее раздел «if»., @laoadam

@Эдгар Боне, я изменю это., @laoadam

@chrisl, я имею в виду, это единственный способ сделать что-то вроде: " ' if' ((unsigned long)(currentMillis - previousMillisLED12) >= интервалLED12) { Состояние LED12 = !Состояние LED12; ", @laoadam

Да, это единственный способ. См. также мигание без задержки: https://www.arduino.cc/en/Tutorial/BlinkWithoutDelay., @Jot


1 ответ


Лучший ответ:

0

Ваша синхронизация работает, вы можете проверить ее с помощью последовательного монитора. Значит, ваша проблема в другом месте. Использование задержки(), с моей точки зрения, не очень хорошее решение, вы сделали это лучше, как уже сделали.

Для тестирования вашего скетча я включил связь для Serial Montior (мне пришлось закомментировать активацию светодиода, поскольку на моей плате он работает по-другому, а также я сделал интервалы короче, чтобы лучше видеть эффект внутри тестовый скетч). Здесь вы найдете необходимые изменения и результаты Serial Monitor.

Я рекомендую использовать простой скетч, если вы можете включать и выключать светодиоды поочередно, не тратя время, чтобы приблизиться к вашей проблеме. Я не думаю, что это связано со временем/использованием millis().

#include <M5Stack.h> // нужно для моей платы


// каждое «событие» (светодиод) получает свою собственную переменную отслеживания
unsigned long previousMillisLED12 = 0;
unsigned long previousMillisLED13 = 0;

unsigned long previousMillisLED3 = 0;

// разные интервалы для каждого светодиода
int intervalLED12 = 50;
int intervalLED13 = 500;

int intervalLED3 = 2000;

// каждый светодиод получает переменную состояния
boolean LED13state = false;     // светодиод загорится на первой итерации цикла()
boolean LED12state = false;     // нужно установить свет, чтобы он был выключен

void setup() {
  Serial.begin(9600);
  // pinMode(13, OUTPUT);
  // pinMode(12, OUTPUT);
  // pinMode(3, OUTPUT);
}
void loop() {
  // получаем текущую отметку времени
  // нужен только один для обоих операторов if
  unsigned long currentMillis = millis();

  // пора переключить светодиод на контакте 12?
  if ((unsigned long)(currentMillis - previousMillisLED12) >= intervalLED12) {
    LED12state = !LED12state;
    // digitalWrite(12, LED12state);
    // сохраняем текущее время для закрепления предыдущего Миллиса 12
    previousMillisLED12 = currentMillis;
  }

  // пора переключить светодиод на контакте 13?
  if ((unsigned long)(currentMillis - previousMillisLED13) >= intervalLED13) {
    LED13state = !LED13state;
    // digitalWrite(13, LED13state);
    // сохраняем текущее время для закрепления предыдущего Миллиса 13
    previousMillisLED13 = currentMillis;
  }
  Serial.print("LED12: ");
  Serial.print(LED12state);
  Serial.print("  LED13: ");
  Serial.println(LED13state);

}

,

Спасибо RJPlog, я проверю., @laoadam