Сделать установленный график затемнения светодиодов?
Я пытаюсь заставить светодиоды переходить от минимальной яркости к максимальной и обратно за 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);
}
**бонус: следующая часть включает в себя работу каждого светодиода по собственному расписанию, поэтому чем подробнее вы объясните сначала, тем лучше я смогу попробовать следующую часть.
СПАСИБО!
@leojames, 👍-1
Обсуждение2 ответа
Лучший ответ:
Путь следует использовать неблокирующий стиль кодирования, который можно найти в примере BlinkWithoutDelay
, входящем в состав Arduino IDE. Там вы используете millis()
для измерения времени. Вы сохраняете метку времени для каждого светодиода и при каждом выполнении void loop()
проверяете, прошло ли достаточно времени с момента последней метки времени. Вы должны сделать это для каждого светодиода.
Поскольку этот стиль кодирования неоднократно объяснялся в Интернете и на этом сайте, я не буду вдаваться в подробности. Вы можете погуглить остальное, понять, как работает этот стиль, а затем перенести это в свой кейс.
Посмотрите на эти инструкции...
Одним из них является постепенное затухание светодиода (включение и выключение) с помощью ШИМ: Светодиодное освещение на лестнице.
Второй касается бита "есть собственное расписание", который, как я полагаю, означает циклическое включение и выключение независимо друг от друга.: совместная многозадачность.
Отказ от ответственности... это мои посты с инструкциями, но они затрагивают вопрос. Есть также несколько библиотек для запуска «временных задач», если вы предпочитаете альтернативное решение.
Вот практический пример, который должен относиться к обоим аспектам вашего вопроса (надеюсь, это остановит волну негативных отзывов)...
Он должен работать на 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]); // Наконец, установите рабочий цикл для светодиода. } } }
- Несколько условий оператора if
- Светодиоды: разница между общим анодом и общим катодом
- Остановить мигание светодиодов
- Интеграция 2 кнопок для включения и выключения светодиода.
- Управление цифровой адресной светодиодной лентой RGB 12 В с помощью Arduino
- Код Arduino для управления 4 светодиодами с 4 кнопок
- Нужен ли подтягивающий/понижающий резистор для цепи светодиода кнопки?
- Мигните светодиодом 5 раз с помощью цикла for
Вы можете установить задержку и 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