Как можно иметь два мигающих светодиода и один гаснущий?
Я пытаюсь подать сигнал тревоги, и у меня мигают два светодиода (красный и синий). Они работают нормально, но мне нужны еще два, которые постепенно появляются и исчезают.
У меня тоже есть зуммер.
Я новичок в программировании. Кстати, приведенный ниже код выполняется без ошибок; просто не делает того, для чего предназначен.
int led = 9;
int brightness = 0;
int fadeAmount = 5;
void setup() {
pinMode(11,OUTPUT);
pinMode(12,OUTPUT);
pinMode(led, OUTPUT);
}
void loop() {
digitalWrite(11, HIGH);
delay(200);
digitalWrite(11, LOW);
delay(200);
digitalWrite(12, HIGH);
delay(200);
digitalWrite(12, LOW);
delay(200);
digitalWrite(led, brightness);
brightness = brightness + fadeAmount;
if (brightness <= 0 || brightness >= 255) {
fadeAmount = -fadeAmount;
}
delay(30);
}
@jace, 👍1
Обсуждение2 ответа
У вас две проблемы:
Вы используете
digitalWrite()с аналоговым значением.digitalWrite()интерпретирует значение0как НИЗКОЕ, а любое другое значение — как ВЫСОКОЕ. Таким образом, светодиод будет в основном включен и выключен только в то время, когда значение яркости станет равным нулю. Вам придется использоватьanalogWrite(), чтобы получить эффект затухания.В настоящее время эффект затухания будет очень медленным, поскольку значение обновляется только один раз каждые 830 мс. Вам следует отказаться от всех вызовов
delay()и вместо этого использовать принцип, показанный в примереBlinkWithoutDelayв Arduino IDE. Думайте о моргании как о выпечке пиццы. Если вы хотите испечь пиццу в духовке, вам не захочется сидеть перед духовкой, глядя на пиццу и ожидая, пока она будет готова. По сути, это то, что вы делаете с миганием светодиода в своем скетче. Когда вы кладете пиццу, вы смотрите на часы. Затем вы уходите, занимаясь другими делами, и регулярно проверяете часы, сколько времени прошло. А потом, когда, наконец, придет время вынимать пиццу, вы вернетесь в духовку. В сети полно объяснений и уроков, что именно там делается.
Здесь, в документации Arduino, вы можете найти пример с поясняющим текстом.
Хотя, как отмечают другие авторы, есть более эффективные способы сделать это, для того, что вы пытаетесь изучить прямо сейчас, ваша программа (почти!) работает отлично. По мере перехода к более сложным программам вам понадобятся более продвинутые методы. Но сейчас я внес пару изменений в вашу программу, чтобы вы могли начать работу:
- Самым важным было использование
analogWrite()для светодиода ШИМ (светодиод 9). Из-за этого он появляется и гаснет, а не включается и выключается (с длительным периодом времени). - Я одновременно включил и выключил один светодиод, избавившись от периодов затемнения и общей задержки в 400 мс.
- Я удвоил значение FadeAmount, чтобы постепенное появление и исчезновение происходило немного быстрее; с шагом 5 это было не очень заметно.
Вот они с этими изменениями:
int led = 9;
int brightness = 0;
int fadeAmount = 10;
void setup() {
pinMode(11,OUTPUT);
pinMode(12,OUTPUT);
pinMode(led, OUTPUT);
}
void loop() {
digitalWrite(11, HIGH);
digitalWrite(12, LOW);
delay(200);
digitalWrite(11, LOW);
digitalWrite(12, HIGH);
delay(200);
analogWrite(led, brightness);
brightness = brightness + fadeAmount;
if (brightness <= 0 || brightness >= 255) {
fadeAmount = -fadeAmount;
}
delay(30);
Обновление:
что, если я захочу добавить второй светодиод
Я предполагаю, что вы имеете в виду гаснущий светодиод, и совершенно ясно, где мигающий светодиод?
Мигать синфазно легко — пропишите для обоих одинаковую яркость. Чтобы выключить их по фазе, вам понадобится вторая переменная яркости (и, возможно, вторая величина затухания), а также проверка увеличения/уменьшения и ограничения для каждого светодиода.
Но обратите внимание, как ваш код становится более сложным, когда вы добавляете компоненты и пытаетесь управлять ими в одном цикле с помощью delay()? Именно тогда вам захочется попробовать пример «Моргание без задержки» и сравнить добавление новых светодиодов таким образом с добавлением новых светодиодов в вашу текущую программу.
так что если я просто удалю свою старую программу и скопирую эту, то теоретически она должна работать или просто изменю другие значения, @jace
На моей доске это было так. Хотя, возможно, вы захотите запустить мой код в новом скетче и сохранить свой, чтобы сравнить их., @JRobert
что если я захочу добавить второй светодиод, @jace
- Возникла проблема с входом Dreading, он должен воспроизводить зуммер, но не
- Несколько условий оператора if
- Светодиоды: разница между общим анодом и общим катодом
- Цепь с зуммером не работает
- Остановить мигание светодиодов
- Интеграция 2 кнопок для включения и выключения светодиода.
- Код Arduino для управления 4 светодиодами с 4 кнопок
- Управление цифровой адресной светодиодной лентой RGB 12 В с помощью Arduino
см. пример BlinkWithoutDelay в IDE, @Juraj
Я сделал это, но не могу найти ничего неправильного в своем коде., @jace
ваш код имеет задержки, @Juraj
Задержка = Выполнение программы ОСТАНАВЛИВАЕТСЯ во время задержки! Поэтому для продолжения выполнения рекомендуется использовать 'millis();', как описано в BlinkWithoutDelay!, @MatsK