Неожиданное поведение мигающего светодиодного кода
Я новичок в 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
?
@ayerhs7, 👍3
3 ответа
Лучший ответ:
Проблема с вашим кодом заключается в следующем:
Вы не инициализировали все выводы светодиода как выход. Только вывод 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;
}
}
Как объяснил Абишек Джайн, контакты необходимо инициализировать для ВЫХОДА.
Однако есть еще одна ошибка.
Код в 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);
}
}
Как Абишек упомянул в своем ответе, это правильно, но лучший способ — использовать циклы 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);
}
}
- Как использовать SPI на Arduino?
- Как решить проблему «avrdude: stk500_recv(): programmer is not responding»?
- Как создать несколько запущенных потоков?
- Как подключиться к Arduino с помощью WiFi?
- avrdude ser_open() can't set com-state
- Как узнать частоту дискретизации?
- Что такое Serial.begin(9600)?
- Я закирпичил свой Arduino Uno? Проблемы с загрузкой скетчей на плату