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

Я новичок в 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;
  }
}
,

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

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