Пока убрал одну пару светодиодов, осталось 2 пары, одна пара перемигивается между собой по одному включению, вторая пара перемигивается по 5 раз каждый(подобию стробоскопа), как зациклить работу 4 и 5 led? в данный момент отрабатывают только один цикл и потом перемигиваются между собой по одному разу постоянно.
#define LED1_PIN PB0
#define LED2_PIN PB1
#define LED3_PIN PB2
#define LED4_PIN PB3
// свойства задачи
struct taskData
{
bool state; // текущий статус задачи - активна/неактивна
uint32_t interval; // интервал выполнения задачи в милисекундах
uint32_t timer; // таймер задачи
};
// методы задачи
void setTaskInterval(taskData &task, uint32_t _interval);
void stopTask(taskData &task);
void startTask(taskData &task);
bool checkTask(taskData &task);
// ==== список задач ============================
taskData led1 = (taskData){true, 500, 0}; // задача активна, интервал срабатывания - 500 милисекунд
taskData led2 = (taskData){true, 500, 0}; // задача активна, интервал срабатывания - 500 милисекунд
taskData led3 = (taskData){true, 100, 0}; // задача активна, интервал срабатывания - 500 милисекунд
taskData led4 = (taskData){false, 100, 0}; // задача активна, интервал срабатывания - 100 милисекунд
// ==============================================
void setTaskInterval(taskData &task, uint32_t _interval)
{
task.interval = _interval;
}
void stopTask(taskData &task)
{
task.state = false;
}
void startTask(taskData &task)
{
task.state = true;
task.timer = millis();
}
bool checkTask(taskData &task)
{
bool result = false;
if (task.state && (millis() - task.timer >= task.interval))
{
result = true; // если задача активна и момент ее срабатывания наступил
task.timer = millis(); // сохраняем таймер для следующей сработки
}
return (result); // возвращаем полученный результат
}
// ==== первый светодиод ========================
void setLed1()
{
static bool led_state = true; // флаг состояния светодиода
led_state = !led_state; // меняем флаг состояния светодиода на противоположный
digitalWrite(LED1_PIN, led_state); // выполняем работу - включаем или выключаем светодиод
}
// ==== второй светодиод ========================
void setLed2()
{
static bool led_state = false; // флаг состояния светодиода
led_state = !led_state; // меняем флаг состояния светодиода на противоположный
digitalWrite(LED2_PIN, led_state); // выполняем работу - включаем или выключаем светодиод
}
// ==== третий светодиод =====================
void setLed3()
{
static bool led_state = false; // флаг состояния светодиода
static byte flash_count = 0; // счетчик срабатываний
led_state = !led_state; // меняем флаг состояния светодиода на противоположный
digitalWrite(LED3_PIN, led_state); // выполняем работу - включаем или выключаем светодиод
if (++flash_count >= 10) // если задача сработала 10 раз (светодиод 5 раз включился и 5 раз выключился)
{
startTask(led4); // запускаем задачу - начинает мигать третий светодиод
stopTask(led3); // останавливаем задачу - больше четвертый светодиод включаться не будет
}
}
// ==== четвертый светодиод =====================
void setLed4()
{
static bool led_state = true; // флаг состояния светодиода
static byte flash_count = 0; // счетчик срабатываний
led_state = !led_state; // меняем флаг состояния светодиода на противоположный
digitalWrite(LED4_PIN, led_state); // выполняем работу - включаем или выключаем светодиод
if (++flash_count >= 10) // если задача сработала 10 раз (светодиод 5 раз включился и 5 раз выключился)
{
startTask(led3); // запускаем задачу - начинает мигать третий светодиод
stopTask(led4); // останавливаем задачу - больше четвертый светодиод включаться не будет
}
}
// ==============================================
void tick()
{
if (checkTask(led1))
{
setLed1();
}
if (checkTask(led2))
{
setLed2();
}
if (checkTask(led3))
{
setLed3();
}
if (checkTask(led4))
{
setLed4();
}
}
void setup()
{
pinMode(LED1_PIN, OUTPUT);
pinMode(LED2_PIN, OUTPUT);
pinMode(LED3_PIN, OUTPUT);
pinMode(LED4_PIN, OUTPUT);
}
void loop()
{
tick();
}
поменяйте периоды, будут мигать каждый со своей частотой.
Какие-нибудь несовпадающие, типа 50 73 124 … и тп, не-кратные.
Я там выше поменял наобум в программке.
Если строго с инверсией (один горит - другой погас) то проще это в программе сделать при каждой сработке.
Да причём здесь это. Понимать должен, прислушиваться, интересоваться, экспериментировать. А не ожидать готового. Готовый да, можно за деньги, только поймёшь ли? Так и будешь платить.
Я уже второй день сам пытался разобраться, по-отдельности все настроил, в месте не получилось, написал тут, появились разные варианты кодов (маленькие-большие), в голове каша , на каком коде остановиться и модифицировать
Устройство собранно, кода нет, хочется уже залить готовый и играться
А там заодно и посмотрю как должно это было быть