Как можно иметь два мигающих светодиода и один гаснущий?

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

У меня тоже есть зуммер.

Я новичок в программировании. Кстати, приведенный ниже код выполняется без ошибок; просто не делает того, для чего предназначен.

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);
}

, 👍1

Обсуждение

см. пример BlinkWithoutDelay в IDE, @Juraj

Я сделал это, но не могу найти ничего неправильного в своем коде., @jace

ваш код имеет задержки, @Juraj

Задержка = Выполнение программы ОСТАНАВЛИВАЕТСЯ во время задержки! Поэтому для продолжения выполнения рекомендуется использовать 'millis();', как описано в BlinkWithoutDelay!, @MatsK


2 ответа


0

У вас две проблемы:

  1. Вы используете digitalWrite() с аналоговым значением. digitalWrite() интерпретирует значение 0 как НИЗКОЕ, а любое другое значение — как ВЫСОКОЕ. Таким образом, светодиод будет в основном включен и выключен только в то время, когда значение яркости станет равным нулю. Вам придется использовать analogWrite(), чтобы получить эффект затухания.

  2. В настоящее время эффект затухания будет очень медленным, поскольку значение обновляется только один раз каждые 830 мс. Вам следует отказаться от всех вызовов delay() и вместо этого использовать принцип, показанный в примере BlinkWithoutDelay в Arduino IDE. Думайте о моргании как о выпечке пиццы. Если вы хотите испечь пиццу в духовке, вам не захочется сидеть перед духовкой, глядя на пиццу и ожидая, пока она будет готова. По сути, это то, что вы делаете с миганием светодиода в своем эскизе. Когда вы кладете пиццу, вы смотрите на часы. Затем вы уходите, занимаясь другими делами, и регулярно проверяете часы, сколько времени прошло. А потом, когда, наконец, придет время вынимать пиццу, вы вернетесь в духовку. В сети полно объяснений и уроков, что именно там делается.

Здесь, в документации Arduino, вы можете найти пример с поясняющим текстом.

,

2

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

  • Самым важным было использование 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