Сделать установленный график затемнения светодиодов?

Я пытаюсь заставить светодиоды переходить от минимальной яркости к максимальной и обратно за 2,55 секунды.

Я действительно не знаю, с чего начать. У меня есть следующий базовый код для одновременного мигания, но как заставить его циклически повторяться в нужное мне время:

int led = 10;           // контакт ШИМ (тильда), к которому подключен светодиод

int led2 = 9;

int led3 = 11;

int brightness = 0;    //насколько яркий светодиод

int delaytime = 25;

int fadeAmount = 5;    //на сколько точек затухать светодиод


// процедура установки запускается, как только вы нажмете кнопку сброса:

void setup() {

  // объявляем пины выходом:

  pinMode (led, OUTPUT);

  pinMode (led2, OUTPUT);

  pinMode (led3, OUTPUT);


}

//подпрограмма цикла выполняется снова и снова навсегда:

void loop() {

  // установить яркость вывода 10:

  analogWrite (led, brightness);

  analogWrite (led2, brightness);

  analogWrite (led3, brightness);


  // изменяем яркость в следующий раз через цикл:

  brightness = brightness + fadeAmount;


  // меняем направление затухания на концах затухания:

  if (brightness <= 0 || brightness >= 255) {

    fadeAmount = -fadeAmount;

  }

//подождите установленное количество миллисекунд, чтобы увидеть эффект затемнения

delay (delaytime);

}

**бонус: следующая часть включает в себя работу каждого светодиода по собственному расписанию, поэтому чем подробнее вы объясните сначала, тем лучше я смогу попробовать следующую часть.

СПАСИБО!

, 👍-1

Обсуждение

Вы можете установить задержку и fadeAmount для прохождения через 2,55 с. И что вы подразумеваете под "по своему графику"?, @chrisl

Таким образом, я как бы получаю начальные значения delaytime и fadeAmount, основываясь на следующем рассуждении: вы устанавливаете величину затухания и задержку на определенные значения или, по крайней мере, сохраняете то же соотношение. FadeAmount/510 = время задержки/общее время 5/510=25/2550 510 — это общее изменение яркости от низкого к высокому и снова к низкому., @leojames

Но мне нужно, чтобы мой первый светодиод переходил от минимальной к максимальной и минимальной яркости за 2,55 секунды, второй — за 5,1 секунды, а третий — за 10,2. Как бы я мог установить каждый из них по своему собственному расписанию, например, сделать так, чтобы каждый светодиод имел свое собственное значение fadeAmount, если бы я оставил время задержки постоянным на уровне 25? Имеет ли это смысл?, @leojames

это школьное задание? ... слово "бонус" говорит о том, что он один, @jsotola

Это школьное задание, хотя я не получаю бонусных баллов за вторую часть... Я просто должен это сделать. К счастью, вы объяснили это достаточно хорошо, чтобы я мог сделать это самостоятельно. Спасибо!, @leojames


2 ответа


Лучший ответ:

0

Путь следует использовать неблокирующий стиль кодирования, который можно найти в примере BlinkWithoutDelay, входящем в состав Arduino IDE. Там вы используете millis() для измерения времени. Вы сохраняете метку времени для каждого светодиода и при каждом выполнении void loop() проверяете, прошло ли достаточно времени с момента последней метки времени. Вы должны сделать это для каждого светодиода.

Поскольку этот стиль кодирования неоднократно объяснялся в Интернете и на этом сайте, я не буду вдаваться в подробности. Вы можете погуглить остальное, понять, как работает этот стиль, а затем перенести это в свой кейс.

,

1

Посмотрите на эти инструкции...

Одним из них является постепенное затухание светодиода (включение и выключение) с помощью ШИМ: Светодиодное освещение на лестнице.

Второй касается бита "есть собственное расписание", который, как я полагаю, означает циклическое включение и выключение независимо друг от друга.: совместная многозадачность.

Отказ от ответственности... это мои посты с инструкциями, но они затрагивают вопрос. Есть также несколько библиотек для запуска «временных задач», если вы предпочитаете альтернативное решение.

Вот практический пример, который должен относиться к обоим аспектам вашего вопроса (надеюсь, это остановит волну негативных отзывов)...

Он должен работать на UNO или любом другом Arduino с ШИМ на контактах 3, 5 и 6. Конечно, вы можете настроить контакты в соответствии со своими потребностями (включая добавление или удаление некоторых).

intpwmPin[] = {3, 5, 6}; // Выводы, которые используются для ШИМ.
int pwmValue [] = {0, 0, 0}; // Начальное значение рабочего цикла ШИМ в диапазоне от 0 до 255.
интервал pwmIncrement[] = {1, 1, 1}; // Значение, на которое ШИМ будет увеличиваться на каждом шаге.
// Обратите внимание, это не может быть ноль, но вы можете начать с отрицательных чисел, если хотите.
беззнаковое целое pwmDelay[] = {20, 30, 70}; // Задержка между шагами для каждого ШИМ.

// Чтобы получить хороший эффект, выберите хорошие начальные значения для задержки, значения и приращения.
// большие задержки означают менее частые изменения рабочего цикла ШИМ.
// большие приращения означают, что каждая корректировка рабочего цикла ШИМ больше.
// Установите значение в начальной точке, например, 0 для выключения, 127 для яркости 50% или 255 для 100%.

#define PINS sizeof(pwmValue)
беззнаковый длинный pwmNextStepTime[PINS]; // Момент времени, когда ШИМ будет отрегулирован в следующий раз.

недействительная установка () {
for (int i = 0; i < PINS; i++) { // Инициализировать каждый вывод как:
pinMode(pwmPin[i], ВЫХОД); // вывод.
pwmNextStepTime[i] = millis() + pwmDelay[i]; // Время следующей корректировки рабочего цикла.
AnalogWrite(pwmPin[i], pwmValue[i]); // Установить рабочий цикл ШИМ.
}
}

недействительный цикл () {
// поместите сюда ваш основной код для многократного запуска:
for (int i = 0; i < PINS; i++) { // В каждом цикле проверяем вывод ШИМ, чтобы узнать, нужно ли нам что-то делать.
unsigned long now = millis(); // Какое сейчас "время"?
if (now > pwmNextStepTime[i]) { // Превышено ли время настройки для вывода ШИМ i?
pwmNextStepTime[i] = сейчас + pwmDelay[i]; // Да, вычислить время следующей корректировки.
pwmValue[i] += pwmIncrement[i]; // Отрегулируйте рабочий цикл в соответствии с приращением вывода.
if (pwmValue [i] >= 255) { // Мы зашли слишком далеко?
pwmValue[i] = 255; // Да, установить максимальное значение.
pwmIncrement[i] = -pwmIncrement[i]; // Обратное приращение (теперь мы отсчитываем в обратном порядке)
} else if (pwmValue[i] <= 0) { // Мы зашли слишком далеко?
pwmValue[i] = 0; // Да, установить минимальное значение.
pwmIncrement[i] = -pwmIncrement[i]; // Обратное приращение (теперь мы считаем вверх)
}
AnalogWrite(pwmPin[i], pwmValue[i]); // Наконец, установите рабочий цикл для светодиода.
}
}
}

,