Слишком мало аргументов для нескольких условий оператора if

Я использую Arduino Uno. Я пытаюсь зажечь только красный светодиод, когда горит синий светодиод и нажата кнопка. Однако я продолжаю получать сообщение об ошибке, в котором указано слишком мало аргументов в моем операторе if. Я не знаю, может быть, я просто что-то упускаю из виду в своем коде.

Код выглядит следующим образом:

int redLEDPin=7;
int blueLEDPin=3;
int redLEDOn=2000;
int redLEDOff=1000;
int blueLEDOn=2000;
int blueLEDOff=1000;
int leverR=2;

void setup() {
    pinMode(redLEDPin, OUTPUT);
    pinMode(blueLEDPin, OUTPUT);
    pinMode(leverR, INPUT);
    }

void loop() {  
    digitalWrite(blueLEDPin, HIGH);
    delay(blueLEDOn);
    digitalWrite(blueLEDPin, LOW);
    delay(blueLEDOff);
    }

  if ((digitalWrite(blueLEDPin) == HIGH) && (digitalRead(leverR) == HIGH)) {
    digitalWrite(redLEDPin, HIGH);
    delay(redLEDOn);
    digitalWrite(redLEDPin, LOW);
    delay(redLEDOff);
    }
  else
  {
    digitalWrite(redLEDPin, LOW);
  } 
}

, 👍0


3 ответа


1

Ваш оператор if находится за пределами функции loop().

Удалите } после delay(blueLEDOff);

,

5

Оператор digitalWrite в операторе if требует значения для записи. Похоже, вы имели в виду digitalRead, поскольку вы сравниваете результат с чем-то, а другое условие — digitalRead.

 if ((digitalWrite(blueLEDPin) == HIGH) && (digitalRead(leverR) == HIGH)) {

против

 if ((digitalRead(blueLEDPin) == HIGH)  && (digitalRead(leverR) == HIGH)) {
,

3

Это ваша функция loop():

void loop() {  
    digitalWrite(blueLEDPin, HIGH);
    delay(blueLEDOn);
    digitalWrite(blueLEDPin, LOW);
    delay(blueLEDOff);
    }

Ваш оператор if() находится за пределами вашего цикла. Проверьте ваши скобки. В Arduino IDE, если вы поместите курсор справа от скобки, он выделит, какая скобка ей соответствует.

Большая правка:

Чтобы мигать двумя светодиодами одновременно, нужно избавиться от задержек. Пожалуйста, прочтите об использовании функции millis(): https://learn.adafruit.com/multi-tasking-the-arduino-part-1/using-millis-for-timing

Я не знаю, как объяснить это кратко, поэтому привожу код (обратите внимание, что время включения и выключения светодиодов одинаковое — если вы хотите, чтобы они светились дольше, чем выключены, вы можете поработать над этой частью):

int redLEDPin=7;
int blueLEDPin=3;
int redLEDOn=2000;  //не используется
int redLEDOff=250;
int blueLEDOn=2000;
int blueLEDOff=1000;  //не используется
int leverR=2;

// следующие переменные необходимы для синхронизации и отслеживания состояния светодиода:
long previousMillisBlue = 0;
long previousMillisRed = 0;
bool ledStateBlue = LOW;
bool ledStateRed = LOW;

void setup() {
    pinMode(redLEDPin, OUTPUT);
    pinMode(blueLEDPin, OUTPUT);
    pinMode(leverR, INPUT_PULLUP); //Я использую внутренний подтягивающий резистор
}

void loop() {  
    unsigned long currentMillis = millis();

    if(currentMillis - previousMillisBlue > blueLEDOn) 
    {
      previousMillisBlue = currentMillis;

      if (ledStateBlue == LOW)
        {ledStateBlue = HIGH;}
      else
        {ledStateBlue = LOW;}

      digitalWrite(blueLEDPin, ledStateBlue);
    }

    //так как мы отслеживаем ledStateBlue выше, мы можем ссылаться на него здесь
    if(digitalRead(leverR) == HIGH && ledStateBlue)
    {
      if(currentMillis - previousMillisRed > redLEDOff) 
      {
        previousMillisRed = currentMillis;

        if (ledStateRed == LOW)
          {ledStateRed = HIGH;}
        else
          {ledStateRed = LOW;}

        digitalWrite(redLEDPin, ledStateRed);
      }
    }
    else
    {digitalWrite(redLEDPin, LOW);}

}
,