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

Всем добрый день! Для домашней поделки скопировал не большой скетч мигание двумя светодиодами, подобрал нужную частоту мигания, решил добавить еще пару светодиодов, в другом скетче подобрал нужную частоту мигания для новой пары светодиодов. Решил соединить их в месте в одном скетче, чтобы одна пара светодиодов моргала быстрей другой пары светодиодов. Назначил выводы, а далее загвоздка, как сделать одновременное выполнение команды на мигание с разной частотой? Контроллер тини13а, программирую программатором usbasp через среду arduino ide.

#define F_CPU 12000000   // 
#define LED_PIN_A PB0
#define LED_PIN_B PB1
#define LED_PIN_C PB2
#define LED_PIN_D PB3
#include <avr/io.h>     // Подключаем определения ввода/вывода
#include <util/delay.h> // Подключаем библиотеку функций задержки
void setup() {
  pinMode(LED_PIN_A, OUTPUT);
  pinMode(LED_PIN_B, OUTPUT);
  pinMode(LED_PIN_C, OUTPUT);
  pinMode(LED_PIN_D, OUTPUT);
}
void loop() {
  analogWrite(LED_PIN_A, 255);
  analogWrite(LED_PIN_B, 0);
  analogWrite(LED_PIN_C, 0);
  analogWrite(LED_PIN_D, 255);
  delay(500);
  analogWrite(LED_PIN_A, 0);
  analogWrite(LED_PIN_B, 255);
  analogWrite(LED_PIN_C, 255);
  analogWrite(LED_PIN_D, 0);
  delay(500);
 }
 

Так у тебя ж наверняка ещё что то, кроме светодиодов, будет крутиться?
Ищи “блинк без delay”.

только диоды

Насколько быстрей?

пока в коде есть delay() - никак

Надо переписывать программу в соответвии с примером ИДЕ “блинк без делей”

У одной пары задержка 500, у другой 250

значит у первой пары ребенок будет раньше…

3 лайка

Понял, буду изучать дальше

500 - это два раза по 250. исходя из этого можно переделать ваш код

Да, делай тут самое то.
включил все;
delay(250);
выключил одни;
delay(250);
включил одни;
выключил другие;
и т.п.

У них ведь есть “общее кратное”? Т.е. такой период времени в который укладывается целой число периодом мигания одной пары и целое же число периодов мигания другой? Вот и распишите этот период своими делэями, а потом зациклите и не надо никаких миллисов.

Одна беда. Завтра захочется одним мигать в 3 раза быстрее… Или ещё чего нибудь добавить к миганию… И усё. Сливай воду.

Как раз на примере четырех светодиодов

1 лайк

Так не получается, все равно с одинаковым периодом мигают все, программа выполняется с верху в низ.

показывайте

#define F_CPU 12000000   // 
#define LED_PIN_A PB0
#define LED_PIN_B PB1
#define LED_PIN_C PB2
#define LED_PIN_D PB3
#include <avr/io.h>     // Подключаем определения ввода/вывода
#include <util/delay.h> // Подключаем библиотеку функций задержки
void setup() {
  pinMode(LED_PIN_A, OUTPUT);
  pinMode(LED_PIN_B, OUTPUT);
  pinMode(LED_PIN_C, OUTPUT);
  pinMode(LED_PIN_D, OUTPUT);
}
void loop() {
  analogWrite(LED_PIN_A, 255);
  analogWrite(LED_PIN_B, 255);
  analogWrite(LED_PIN_C, 255);
  analogWrite(LED_PIN_D, 255);
  delay(250);
  analogWrite(LED_PIN_A, 0);
  analogWrite(LED_PIN_D, 0);
  delay(250);
  analogWrite(LED_PIN_A, 255);
  analogWrite(LED_PIN_D, 255);
  analogWrite(LED_PIN_B, 0);
  analogWrite(LED_PIN_C, 0);
  delay(250);
 }

Не беда. Завтра он переделает свои делэи, послезавтра – ещё раз, а на пятый раз, наконец, почитает про миллис. Это именно так работает.

2 лайка

Да. Пока сам лоб не набьёшь - не дойдёт.)

ну видимо в конец надо добавит еще один блок
где погасить A и D
и подождать 250 млсек

@soundextrim
Для светиков с периодом 250 вам надо не явно включать их и выключать - а инвертировать состояние.
То есть если они включены - выключить, и наоборот.
Тогда получится