Неожиданное поведение мигающего светодиодного кода

Я новичок в Arduino, так что это может быть действительно глупым сомнением, но я не нашел объяснения этому нигде в Интернете. Сначала я загрузил этот код (для мигания 5 светодиодов) на свой Arduino Uno:

 void setup(){
 pinMode(12, OUTPUT);
 pinMode(11, OUTPUT);
 pinMode(10, OUTPUT);
 pinMode(9, OUTPUT);
 pinMode(8, OUTPUT);
}

void loop(){
digitalWrite(12, HIGH);
delay(1000);
digitalWrite(12, LOW);
delay(1000);
digitalWrite(11, HIGH);
delay(1000);
digitalWrite(11, LOW);
delay(1000);
digitalWrite(10, HIGH);
delay(1000);
digitalWrite(10, LOW);
delay(1000);
digitalWrite(9, HIGH);
delay(1000);
digitalWrite(9, LOW);
delay(1000);
digitalWrite(8, HIGH);
delay(1000);
digitalWrite(8, LOW);
delay(1000);
}

5 светодиодов светились ярко. Но когда я загрузил следующий код (используя оператор if для уменьшения размера предыдущего), светодиоды светились тускло.

int LEDpin = 13;
void setup(){
pinMode(LEDpin, OUTPUT);
}

void loop(){
digitalWrite(LEDpin, HIGH);
delay(1000);
digitalWrite(LEDpin,LOW);
delay(1000);
if(LEDpin >= 8){
LEDpin--;
} else {
  LEDpin = 8;
  }
}

Кроме того, когда я просто ввел оператор if без части else, ничего не произошло после того, как светодиод на выводе 8 загорелся и погас. Может кто-нибудь объяснить, почему светодиоды светились тускло во втором случае и почему ничего не светилось после светодиода 8, когда я пропустил часть else?

, 👍3


3 ответа


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

0

Проблема с вашим кодом заключается в следующем:

Вы не инициализировали все выводы светодиода как выход. Только вывод 13 инициализирован как выход.

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

int LEDpin = 13;
void setup(){
pinMode(8, OUTPUT);
pinMode(9, OUTPUT);
pinMode(10, OUTPUT);
pinMode(11, OUTPUT);
pinMode(12, OUTPUT);
}

void loop(){
digitalWrite(LEDpin, HIGH);
delay(1000);
digitalWrite(LEDpin,LOW);
delay(1000);
if(LEDpin >= 8){
LEDpin--;
} else {
  LEDpin = 12;
  }
}
,

LEDpin необходимо назначить 12 как в начальном объявлении, так и в операторе else (а не 13 и 8 соответственно). В противном случае первый цикл попытается записать на вывод 13, который не инициализирован как OUTPUT в setup(), и в конечном итоге запишет только на вывод 8, вместо того чтобы продолжить цикл от 12 до 8..., @Greenonline

Я вижу, что вы (правильно) отредактировали свой ответ для оператора else, однако первоначальное объявление LEDpin по-прежнему установлено на 13, хотя должно быть 12. Таким образом, первая строка должна быть int LEDpin = 12; Что произойдет при первом выполнении loop()?, @Greenonline


1

Как объяснил Абишек Джайн, контакты необходимо инициализировать для ВЫХОДА.

Однако есть еще одна ошибка.

Код в loop() считает до 8 один раз, мигая светодиодами, но затем зажигает только светодиод на выводе 8, потому что он всегда проходит через else, который сохраняет значение LEDpin равным 8. LEDpin необходимо сбросить до 12 после того, как он пройдет 8.

Может быть, код получше

int LEDpin = 12;
void setup(){
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(11, OUTPUT);
  pinMode(12, OUTPUT);
}

void loop(){
  digitalWrite(LEDpin, HIGH);
  delay(1000);
  digitalWrite(LEDpin,LOW);
  delay(1000);
  if(LEDpin >= 8){
    LEDpin--;
  } else {
    LEDpin = 12;   // <---- снова начинаем с первого светодиода
  }
}

Как бы там ни было, я бы не стал делать код таким образом. Я бы написал что-то с использованием циклов for, например:

const int firstLED = 8;
const int lastLED = 12;
int LEDpin;

void setup() {
  for (LEDpin = firstLED; LEDpin <= lastLED; ++LEDpin) {
     pinMode(LEDpin, OUTPUT);
  }
}

void loop() {
  for (LEDpin = firstLED; LEDpin <= lastLED; ++LEDpin) {
    digitalWrite(LEDpin, HIGH);
    delay(1000);
    digitalWrite(LEDpin,LOW);
    delay(1000);
  }
}
,

@ayerhs7 - Инициализация всех выводов на ВЫХОД необходима, но не достаточна. Если вы хотите, чтобы все светодиоды мигали многократно, а не только один раз при сбросе Arduino, LEDpin должен быть сброшен на 13, чего нет в принятом вами ответе. IMHO, для ясности вам следует либо обновить свой ответ, чтобы отразить тот факт, что вам нужно, чтобы мигал только светодиод на выводе 8, либо прокомментировать, что принятый вами ответ не решает проблему, или, может быть, объяснить, почему вы его приняли., @gbulmer


5

Как Абишек упомянул в своем ответе, это правильно, но лучший способ — использовать циклы for при работе со многими светодиодами.

Допустим, у вас есть светодиоды, подключенные от контакта 2 до контакта 8.

int pin = 2;
void setup() 
{
   for (Pin = 2; Pin < 8; Pin++) 
   {
     pinMode(Pin, OUTPUT);
   } 
}
void loop() 
{
   for (int Pin = 2; Pin < 8; Pin++) 
   {
     digitalWrite(Pin, HIGH);
     delay(1000);
     digitalWrite(Pin, LOW);
     delay(1000);
    }
}
,