Неожиданное поведение мигающего светодиодного кода
Я новичок в 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);
}
}
@ayerhs7 - Инициализация всех выводов на ВЫХОД необходима, но не достаточна. Если вы хотите, чтобы все светодиоды мигали многократно, а не только один раз при сбросе Arduino, LEDpin должен быть сброшен на 13, чего нет в принятом вами ответе. IMHO, для ясности вам следует либо обновить свой ответ, чтобы отразить тот факт, что вам нужно, чтобы мигал только светодиод на выводе 8, либо прокомментировать, что принятый вами ответ не решает проблему, или, может быть, объяснить, почему вы его приняли., @gbulmer
Как Абишек упомянул в своем ответе, это правильно, но лучший способ — использовать циклы 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? Проблемы с загрузкой скетчей на плату
LEDpin
необходимо назначить12
как в начальном объявлении, так и в оператореelse
(а не13
и8
соответственно). В противном случае первый цикл попытается записать на вывод 13, который не инициализирован какOUTPUT
вsetup()
, и в конечном итоге запишет только на вывод 8, вместо того чтобы продолжить цикл от 12 до 8..., @GreenonlineЯ вижу, что вы (правильно) отредактировали свой ответ для оператора
else
, однако первоначальное объявлениеLEDpin
по-прежнему установлено на 13, хотя должно быть 12. Таким образом, первая строка должна бытьint LEDpin = 12;
Что произойдет при первом выполненииloop()
?, @Greenonline