Как можно иметь два мигающих светодиода и один гаснущий?
Я пытаюсь подать сигнал тревоги, и у меня мигают два светодиода (красный и синий). Они работают нормально, но мне нужны еще два, которые постепенно появляются и исчезают.
У меня тоже есть зуммер.
Я новичок в программировании. Кстати, приведенный ниже код выполняется без ошибок; просто не делает того, для чего предназначен.
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 кнопок для включения и выключения светодиода.
- Управление цифровой адресной светодиодной лентой RGB 12 В с помощью Arduino
- Код Arduino для управления 4 светодиодами с 4 кнопок
см. пример BlinkWithoutDelay в IDE, @Juraj
Я сделал это, но не могу найти ничего неправильного в своем коде., @jace
ваш код имеет задержки, @Juraj
Задержка = Выполнение программы ОСТАНАВЛИВАЕТСЯ во время задержки! Поэтому для продолжения выполнения рекомендуется использовать 'millis();', как описано в BlinkWithoutDelay!, @MatsK