Arduino показывает странное поведение со светодиодным выходом в цикле - PullRequest
0 голосов
/ 03 ноября 2019

Привет У меня возникли небольшие проблемы с пониманием поведения, которое может показаться очень простым вопросом.

У меня есть 4 светодиода и резистора, связанных с кнопкой. Идея состоит в том, что я нажимаю кнопку, и светодиоды загораются последовательно, выключая предыдущий.

Это работает нормально, пока не настало время перезапустить петлю с самого начала, когда на последовательном мониторе все в порядке, но светодиоды почти не горят, кроме номера 4, который светится нормально.

Вот мой код:

const int buttonPin = 6;
const int ledPin1 =  2;
const int ledPin2 =  3;
const int ledPin3 =  4;
const int ledPin4 =  5;

int buttonState = 0;
int pressed = 0;

void setup() {
    {
  Serial.begin (115200);
  Serial.println ();
  Serial.println ("Starting up");
  }
  pinMode(ledPin1, OUTPUT);
  pinMode(ledPin2, OUTPUT);
  pinMode(ledPin3, OUTPUT);
  pinMode(ledPin4, OUTPUT);
  pinMode(buttonPin, INPUT_PULLUP);
}

void loop()
  {
  if(digitalRead(buttonPin)==HIGH)     
    {
    if(pressed==0)
      {
      pressed=1; 
      switch(buttonState)
        {
      case 0:
        digitalWrite(ledPin1, LOW);
        buttonState++;
      break; 
      case 1:
        digitalWrite(ledPin1, HIGH);
        Serial.println ("1");
        buttonState++;
      break; 
      case 2:
        digitalWrite(ledPin2, HIGH);
        pinMode(ledPin1, LOW);
        Serial.println ("2");
        buttonState++;
      break; 
       case 3:
        digitalWrite(ledPin3, HIGH);
        pinMode(ledPin2, LOW);
        Serial.println ("3");
        buttonState++;
      break; 
      case 4:
        digitalWrite(ledPin4, HIGH);
        pinMode(ledPin3, LOW);
        Serial.println ("4");
        buttonState++;
      break; 
      case 5:
        digitalWrite(ledPin4, LOW);
        Serial.println ("off");
        buttonState=0;
        return;
        }
      }
    }
  else
    {
    pressed=0;
    }
}

Надеюсь, некоторые из вас, более умные люди, смогут пролить свет на это необычное поведение.

Кстати, я ОЧЕНЬ новичок в программировании на Arduino, поэтому, пожалуйста, успокойтесь.

1 Ответ

2 голосов
/ 03 ноября 2019

Вы хотите понять разницу между функциями pinMode() и digitalWrite().

pinMode(pin, mode) конфигурирует указанный вывод для работы либо как вход, либо как выход. (doc) digitalWrite(pin, value) записывает значение HIGH или LOW на цифровой вывод. (doc)

В вашем операторе переключения вы меняете pinMode с OUTPUT на INPUT.

pinMode(ledPin1, LOW)

совпадает с

pinMode(ledPin1, INPUT)

, поскольку LOW и INPUT оба определены как 0x00.

Когда вы меняете режим вывода на INPUT, вы больше не можете включать свой светодиод, вызываяdigitalWrite(ledPin1, HIGH).

Светодиод 4 работает, потому что вы нигде не звоните pinMode(ledPin4, LOW).

Я думаю, что вы хотели бы вызвать digitalWrite(ledPin1, LOW) вместо pinMode(ledPin1, LOW) в операторе switch.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...