FastLED EVERY_N_MILLISECONDS со смещением?

led-strip ws2812

Что, если вы хотите что-то вроде этого:

void loop(void) {
EVERY_N_MILLISECONDS(1000) {
   do_this();
}

EVERY_N_MILLISECONDS(1000) {
   do_that();
}
}

Я хочу, чтобы do_this() и do_that() выполнялись отдельно (через 500 миллисекунд), но я не хочу устанавливать задержку (500) между ними, так как это блокирует.


Да, я думаю, что любой данный пример можно изменить для поддержки этого варианта использования, но я искал подход на уровне фреймворка, простой способ изменить семейство EVERY_N_xxx для поддержки дополнительного параметра, смещения. Вот гипотетический пример псевдокода — предположим, у меня есть двое часов на стене, и я хочу, чтобы каждый из них звонил один раз в час — часы № 1 должны отбивать час, а часы № 2 — половину. час. Таким образом, часы один находятся в цикле КАЖДЫЕ_N_МИНУТЫ (60), как и часы 2, но без модификации они будут звонить примерно в одно и то же время. Таким образом, с параметром смещения у меня будет что-то вроде EVERY_N_MINUTES(60,0) для первых часов и EVERY_N_MINUTES(60,30) для вторых часов.

, 👍-1

Обсуждение

Думаю, я мог бы сделать что-то вроде этого: КАЖДЫЕ_N_МИЛЛИСЕКУНДЫ(500) { сделать_это_или_то(); } и напишите do_this_or_that(), чтобы чередовать то и это. И это легко в этом конкретном случае, но с несколькими циклами это может запутаться!, @PaulM

заголовок вашего сообщения не соответствует остальной части сообщения ... вы спрашиваете «как сделать неблокирующую задержку?» ... этот вопрос задавали несколько раз ... пожалуйста, изучите вопрос, прежде чем публиковать вопрос здесь, @jsotola

см. пример скетча blink_without_delay в IDE arduino, @jsotola


1 ответ


0

Просто краткий ответ, так как это слишком простая задача для длинной информации.

Я. Разделение millis() на глобальную переменную для чтения. Это работает, потому что целочисленное деление дает целые числа только при достижении всего периода

#define time_between_blinks 20
uint32_t roundNum=0; //вам понадобится отдельный один из них для каждого устройства, которым вы управляете, или их массив

uint32_t lastTime=0; // понадобится для управления переполнением времени

недействительный цикл () {
...
// Здесь проверяем, нет ли переполнения по времени, и если оно происходит, то устраняем его
lastTime=millis();
if(lastTime/time_between_blinks>roundNum) Blink()
...
}

II. То же, что и первое, с использованием библиотеки времени. Она работает с секундами, а не с миллисекундами, но не будет переполнена в ближайшие несколько лет.

III. разработка класса и сохранение каждого члена в последний раз, при разработке логических методов, где вы можете проверить, запускать ли их —> это сохранит ваш код чище, но может быть излишним в небольшом проекте. В зависимости от того, применяете ли вы подход NO:1 или No.2, вам может понадобиться или не понадобиться контроль переполнения. Это тяжело для оперативной памяти

class ledTimers(){
public:
  ledTimers(isNow=millis())
  bool isTurn(uint32_t isNow=millis());
  ...
  uint32_t _lastRun;
}

Фактические методы будут просто измененной версией ответов на 1 и 2

IV. Библиотеки Cron: в основном не на уровне millis(), но я видел некоторые из них.

Есть много других возможностей и комбинаций вышеперечисленного.

,

Я надеялся на подход на уровне фреймворка, чтобы изменить семейство макросов EVERY_N_xxx для поддержки дополнительного параметра, смещения. Вот сумасшедший пример: у меня на стене висят двое часов, и я хочу, чтобы каждый из них звонил раз в час: часы №1 должны бить в начале часа, а часы №2 должны бить через 30 минут. . Оба часа находятся в цикле КАЖДЫЕ_N_МИНУТЫ (60) - но они будут звонить в одно и то же время. С параметром смещения у меня было бы КАЖДЫЕ_N_МИНУТЫ (60,0) для первых часов и КАЖДЫЕ_N_МИНУТЫ (60,30) для вторых часов., @PaulM

Ваш сумасшедший пример будет блестяще работать с вариантом 4. Это то, для чего нужны CRON... но библиотеки cron обычно строятся поверх библиотеки времени, которая работает с секундами или миллисекундами. Вы можете думать о cron как о каком-то макросе (это определенно не макрос), который переключает определенные функции или операции в определенное время, либо определенное в периоде времени, либо в значениях времени., @Tomas

это вопрос масштаба. одно в секундах/минутах/часах, а другое в миллисекундах. Вплоть до простого использования AnalogWrite(), @Tomas