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;
}
}
Мои вопросы:
Не заметил, что у LED12 и LED13 разница в 10 раз, почти одинаковые интервалы, почему?
Как я могу использовать
millis()
так же просто, как задержку?Обязательно ли использовать if?
@laoadam, 👍0
Обсуждение1 ответ
Лучший ответ:
Ваша синхронизация работает, вы можете проверить ее с помощью последовательного монитора. Значит, ваша проблема в другом месте. Использование задержки(), с моей точки зрения, не очень хорошее решение, вы сделали это лучше, как уже сделали.
Для тестирования вашего скетча я включил связь для 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
- Есть ли какой-нибудь способ загрузить скетч с ардуино?
- Загрузка Arduino Nano дает ошибку: avrdude: stk500_recv(): programmer is not responding
- Как справиться с rollover millis()?
- Использование millis() и micros() внутри процедуры прерывания
- Асинхронные вызовы функций в скетче ардуино
- Проблема с загрузкой моего скетча на Ардуино
- Что произойдет, если возникнет ошибка времени выполнения?
- Проблема: "stray '#' in program"
Светодиоды мигают с разными интервалами. Правильно ли вы подключили светодиоды и резисторы? Функцию миллис можно использовать в качестве задержки, но не таким же образом. Когда скетч с задержкой необходимо преобразовать в миллис, то зачастую большую часть скетча приходится переписывать., @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