Мигание светодиодами

Вот что и хотел

#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, 230, 0}; // задача активна, интервал срабатывания - 230 милисекунд
taskData led4 = (taskData){true, 230, 0};  // задача активна, интервал срабатывания - 230 милисекунд

// ==============================================
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 = true; // флаг состояния светодиода

  led_state = !led_state;            // меняем флаг состояния светодиода на противоположный
  digitalWrite(LED3_PIN, led_state); // выполняем работу - включаем или выключаем светодиод
}

// ==== четвертый светодиод =====================
void setLed4()
{
  static bool led_state = false; // флаг состояния светодиода

  led_state = !led_state;            // меняем флаг состояния светодиода на противоположный
  digitalWrite(LED4_PIN, led_state); // выполняем работу - включаем или выключаем светодиод
}

// ==============================================
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();
}

Чё-нить понял? А если захочу светодиоды на 7,8,А0, А1 подключить?
Кстати, сейчас светодиоды к каким пинам подключены?
Ой, вижу что Тини13.(

Как указано в скетче, контролер тинька 13

Добавил еще 2 светодиода и память закончилась, есть возможность укоротить код

#define LED1_PIN PB0
#define LED2_PIN PB1
#define LED3_PIN PB2
#define LED4_PIN PB3
#define LED5_PIN PB4
#define LED6_PIN PB5

// свойства задачи
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, 230, 0}; // задача активна, интервал срабатывания - 230 милисекунд
taskData led4 = (taskData){true, 230, 0};  // задача активна, интервал срабатывания - 230 милисекунд
taskData led5 = (taskData){true, 230, 0};  // задача активна, интервал срабатывания - 230 милисекунд
taskData led6 = (taskData){true, 230, 0};  // задача активна, интервал срабатывания - 230 милисекунд

// ==============================================
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 = true; // флаг состояния светодиода

  led_state = !led_state;            // меняем флаг состояния светодиода на противоположный
  digitalWrite(LED3_PIN, led_state); // выполняем работу - включаем или выключаем светодиод
}

// ==== четвертый светодиод =====================
void setLed4()
{
  static bool led_state = false; // флаг состояния светодиода

  led_state = !led_state;            // меняем флаг состояния светодиода на противоположный
  digitalWrite(LED4_PIN, led_state); // выполняем работу - включаем или выключаем светодиод
}

// ==== пятый светодиод ========================
void setLed5()
{
  static bool led_state = true; // флаг состояния светодиода

  led_state = !led_state;            // меняем флаг состояния светодиода на противоположный
  digitalWrite(LED5_PIN, led_state); // выполняем работу - включаем или выключаем светодиод
}

// ==== пятый светодиод ========================
void setLed6()
{
  static bool led_state = false; // флаг состояния светодиода

  led_state = !led_state;            // меняем флаг состояния светодиода на противоположный
  digitalWrite(LED6_PIN, led_state); // выполняем работу - включаем или выключаем светодиод
}

// ==============================================
void tick()
{
  if (checkTask(led1))
  {
    setLed1();
  }
  if (checkTask(led2))
  {
    setLed2();
  }
  if (checkTask(led3))
  {
    setLed3();
  }
  if (checkTask(led4))
  {
    setLed4();
  }
  if (checkTask(led5))
  {
    setLed5();
  }
  if (checkTask(led6))
  {
    setLed6();
  }
}

void setup()
{
  pinMode(LED1_PIN, OUTPUT);
  pinMode(LED2_PIN, OUTPUT);
  pinMode(LED3_PIN, OUTPUT);
  pinMode(LED4_PIN, OUTPUT);
  pinMode(LED5_PIN, OUTPUT);
  pinMode(LED6_PIN, OUTPUT);
}

void loop()
{
  tick();
}

Увидел. Но, если по уму, то должно быть без разницы какой у тебя МК. Это же Ардуино!

Память какая закончилась?
Меняй типы, отказывайся от миллис и от фреймоворка.)

Хватит, поиграл, детство кончилось.
Теперь переходи на взрослые контроллеры :slight_smile:

Со взрослыми и дурак сможет.

Вот эта мега-программа! должна работать ахаха

uint32_t Time[4],Period[4] = {50,100,150,200}; //периоды моргания в мС
  // подставить свои ноги:
  #define LED1 1
  #define LED2 2
  #define LED3 3
  #define LED4 4
  
void setup() {
  pinMode(LED1, OUTPUT);
  pinMode(LED2, OUTPUT);
  pinMode(LED3, OUTPUT);
  pinMode(LED4, OUTPUT);
  Time[0]=Time[1]=Time[2]=Time[3]=millis();
}

void loop() {
  if(millis()-Time[0]>Period[0]){Time[0]=millis(); digitalWrite(LED1, !digitalRead(LED1));}
  if(millis()-Time[1]>Period[1]){Time[1]=millis(); digitalWrite(LED2, !digitalRead(LED2));}
  if(millis()-Time[2]>Period[2]){Time[2]=millis(); digitalWrite(LED3, !digitalRead(LED3));}
  if(millis()-Time[3]>Period[3]){Time[3]=millis(); digitalWrite(LED4, !digitalRead(LED4));}
}

для 168, самого дохлого Нано:

Скетч использует 1282 байт (8%) памяти устройства. Всего доступно 14336 байт.
Глобальные переменные используют 25 байт (2%) динамической памяти, оставляя 999 байт для локальных переменных. Максимум: 1024 байт.

Пока убрал одну пару светодиодов, осталось 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();
}

или вот так:

  uint32_t Time[4],Period[4] = {50,107,163,219}; //свои периоды подставить
  uint8_t Led[4]={1,2,3,4}; // подставить свои ноги

void setup() {
  for(int i=0;i<4;i++){pinMode(Led[i], OUTPUT); Time[i]=millis();}
}

void loop() {
  for(int i=0;i<4;i++){ if(millis()-Time[i]>Period[i]){Time[i]=millis(); digitalWrite(Led[i], !digitalRead(Led[i]));} }
}

не проверял ))
Можно поставить тут кучу светодиодов.

Работает, светодиоды включаются одновременно, надо чтобы каждая пара работала с инверсией друг от друга.

поменяйте периоды, будут мигать каждый со своей частотой.
Какие-нибудь несовпадающие, типа 50 73 124 … и тп, не-кратные.
Я там выше поменял наобум в программке.

Если строго с инверсией (один горит - другой погас) то проще это в программе сделать при каждой сработке.

Не в коня корм.

Пойду в коммерческую ветку :grinning:

Да причём здесь это. Понимать должен, прислушиваться, интересоваться, экспериментировать. А не ожидать готового. Готовый да, можно за деньги, только поймёшь ли? Так и будешь платить.

Я уже второй день сам пытался разобраться, по-отдельности все настроил, в месте не получилось, написал тут, появились разные варианты кодов (маленькие-большие), в голове каша :crazy_face:, на каком коде остановиться и модифицировать :sweat_smile:
Устройство собранно, кода нет, хочется уже залить готовый и играться :rofl:
А там заодно и посмотрю как должно это было быть :grin:

Если бы Вы сказали “второй месяц”, я бы сказал “мало – работайте ещё”, а “второй день” – Вы вообще не пытались :frowning:

2 лайка

Нет, ну вундеркинды ведь тоже случаются. Но редко.(

и что это? если не секрет?