Несколько условий оператора if

Я хотел бы сделать этот код с помощью Arduino Uno. Я использую три переключателя включения / выключения и, основываясь на таблице истинности, хотел бы включить один из 8 светодиодов. Когда я использую digitalWrite(), я получаю код ошибки, говорящий о том, что аргументов слишком мало.

Вот код

int x = A3;    // выбираем входной пин для переключателя
int y = A4;
int z = A5;

int ledPin1 = 2;      // выбираем пин для светодиода
int ledPin2 = 3;
int ledPin3 = 4;
int ledPin4 = 7;
int ledPin5 = 8;
int ledPin6 = 9;
int ledPin7 = 12;
int ledPin8 = 13;

void setup(){

  // объявляем ledPin как ВЫХОД:
  pinMode(ledPin1, OUTPUT);
  pinMode(ledPin2, OUTPUT);
  pinMode(ledPin3, OUTPUT);
  pinMode(ledPin4, OUTPUT);
  pinMode(ledPin5, OUTPUT);
  pinMode(ledPin6, OUTPUT);
  pinMode(ledPin7, OUTPUT);
  pinMode(ledPin8, OUTPUT);

  pinMode(x, INPUT);
  pinMode(y, INPUT);
  pinMode(z, INPUT);
}

void loop() {

  if ( (x = LOW) && (y = LOW) && (z = LOW))              // условие 1
  {
    digitalWrite (ledPin1 = HIGH); 
    digitalWrite (ledPin2 = LOW); 
    digitalWrite (ledPin3 = LOW); 
    digitalWrite (ledPin4 = LOW); 
    digitalWrite (ledPin5 = LOW); 
    digitalWrite (ledPin6 = LOW); 
    digitalWrite (ledPin7 = LOW); 
    digitalWrite (ledPin8 = LOW); 
  }

  if ( (x = LOW) && (y = LOW) && (z = HIGH))             //условие 2
  {
    ledPin1 = LOW; 
    ledPin2 = HIGH; 
    ledPin3 = LOW; 
    ledPin4 = LOW; 
    ledPin5 = LOW; 
    ledPin6 = LOW; 
    ledPin7 = LOW; 
    ledPin8 = LOW; 
  }

  if ( (x = LOW) && (y = HIGH) && (z = LOW))             //условие 3
  {
    ledPin1 = LOW; 
    ledPin2 = LOW; 
    ledPin3 = HIGH; 
    ledPin4 = LOW; 
    ledPin5 = LOW; 
    ledPin6 = LOW; 
    ledPin7 = LOW; 
    ledPin8 = LOW;
  }

  if ( (x = LOW) && (y = HIGH) && (z = HIGH))              //условие 4
  {
    ledPin1 = LOW; 
    ledPin2 = LOW; 
    ledPin3 = LOW; 
    ledPin4 = HIGH; 
    ledPin5 = LOW; 
    ledPin6 = LOW; 
    ledPin7 = LOW; 
    ledPin8 = LOW;
  }

  if ( (x = HIGH) && (y = LOW) && (z = LOW))               //условие 5
  {
    ledPin1 = LOW; 
    ledPin2 = LOW; 
    ledPin3 = LOW; 
    ledPin4 = LOW; 
    ledPin5 = HIGH; 
    ledPin6 = LOW; 
    ledPin7 = LOW; 
    ledPin8 = LOW;
  }

  if ( (x = HIGH) && (y = LOW) && (z = HIGH))               //условие 6
  {
    ledPin1 = LOW; 
    ledPin2 = LOW; 
    ledPin3 = LOW; 
    ledPin4 = LOW; 
    ledPin5 = LOW; 
    ledPin6 = HIGH; 
    ledPin7 = LOW; 
    ledPin8 = LOW;
  }

  if ( (x = HIGH) && (y = HIGH) && (z = LOW))                //условие 7
  {
    ledPin1 = LOW; 
    ledPin2 = LOW; 
    ledPin3 = LOW; 
    ledPin4 = LOW; 
    ledPin5 = LOW; 
    ledPin6 = LOW; 
    ledPin7 = HIGH; 
    ledPin8 = LOW;
  }

  if ( (x = HIGH) && (y = HIGH) && (z = HIGH))                //условие 8
  {
    ledPin1 = LOW; 
    ledPin2 = LOW; 
    ledPin3 = LOW; 
    ledPin4 = LOW; 
    ledPin5 = LOW; 
    ledPin6 = LOW; 
    ledPin7 = LOW; 
    ledPin8 = HIGH;
  }
}

Диаграмма Фрицинга

, 👍3

Обсуждение

Я использовал ваш код в качестве ссылки, но когда я его загрузил, он дает мне «слишком мало аргументов для работы». Любые решения?, @khan


5 ответов


4

digitalWrite (ledPin1 = HIGH); должно быть digitalWrite (ledPin1, HIGH);

PS if ( (x = LOW) && (y = LOW) && (z = LOW)) должен быть if ( (x == LOW) && (y == LOW) && (z == LOW)). = для присвоения, == для сравнения.

,

Спасибо, я изменил все это в коде. Я просто не знаю, почему программа моделирования до сих пор не зажигает светодиод., @richard

вы должны просто написать код для вычисления состояния, необходимого для каждого светодиода, на основе таблицы истинности, и записать это состояние на конкретный цифровой вывод только один раз; вам не потребуется так много условий if/else и так много вызовов функции digitalWrite; **кстати, ваш код также будет работать нормально, если вы обновите свои назначения для операторов digitalWrite в своем коде во всех блоках if/else;**, @techniche


4

пустой цикл() {

 if ( (x = LOW) && (y = LOW) && (z = LOW))              //условие 1
 {

Помимо проблемы с необходимостью == вместо =, вы никогда не читаете эти контакты. На самом деле вы сравниваете номера выводов (которые никогда не изменятся), а не данные об этих выводах.

Вам нужно:

пустой цикл() {

  if ( (digitalRead (x) == LOW) && 
       (digitalRead (y) == LOW) && 
       (digitalRead (z) == LOW))              // условие 1
    {

... и так далее.


Это тоже неправильно, я удивлен, что оно скомпилировано:

   digitalWrite (ledPin1 = HIGH); 
   digitalWrite (ledPin2 = LOW); 
   digitalWrite (ledPin3 = LOW); 
   digitalWrite (ledPin4 = LOW); 
   digitalWrite (ledPin5 = LOW); 
   digitalWrite (ledPin6 = LOW); 
   digitalWrite (ledPin7 = LOW); 
   digitalWrite (ledPin8 = LOW); 

Должно быть:

  digitalWrite (ledPin1, HIGH); 
  digitalWrite (ledPin2, LOW); 
  digitalWrite (ledPin3, LOW); 
  digitalWrite (ledPin4, LOW); 
  digitalWrite (ledPin5, LOW); 
  digitalWrite (ledPin6, LOW); 
  digitalWrite (ledPin7, LOW); 
  digitalWrite (ledPin8, LOW); 

когда я использую цифровую запись, я получаю код ошибки, говорящий о том, что аргументов слишком мало. ... Я просто не знаю, почему программа моделирования до сих пор не зажигает светодиод

О, я вижу, он не скомпилировался. Неудивительно, что светодиоды не загорелись.

,

2

Вот вам небольшой совет (он не имеет ничего общего с вашей проблемой, это просто хороший метод программирования). Это значительно уменьшит размер вашей программы.

У вас есть три логических переменных состояния, и вы сравниваете состояние всех комбинаций — это 8 комбинаций. Если вы принимаете каждое логическое значение как 1 бит значения от 0 до 7, то есть значения (в двоичном виде) 000, 001, 010, 011, 100, 101, 110 и 111, то вы можете использовать гораздо более простые методы для управления ваши светодиоды.

Например, этот (непроверенный) код преобразует три цифровых чтения в одно число от 0 до 7:

uint8_t value = digitalRead(x) | (digitalRead(y) << 1) | (digitalRead(z) << 2);

x — младший бит, а z — старший. Таким образом, value теперь будет значением от 0 до 7, представляющим состояние этих трех контактов.

Теперь вы можете использовать эту переменную value, чтобы решить, какой вывод включить. Вот еще одна хитрость: храните контакты светодиодов в виде массива. Это означает, что вместо ledPin1, ledPin2 и т. д. у вас есть просто список номеров выводов, известный как ledPin[x]:

const uint8_t ledPin[8] = { 2, 3, 4, 7, 8, 9, 12, 13 };

Теперь вы можете использовать цикл for для прохода по этому списку и включения нужного светодиода:

for (uint8_t i = 0; i < 8; i++) {
    if (i == value) {
        digitalWrite(ledPin[i], HIGH);
    } else {
        digitalWrite(ledPin[i], LOW);
    }
}

На самом деле, это можно еще больше сжать, так как ВЫСОКОЕ и НИЗКОЕ значения в основном являются истинными значениями (ВЫСОКОЕ равно 1 или верно, а НИЗКОЕ равно 0 или ложно):

for (uint8_t i = 0; i < 8; i++) {
    digitalWrite(ledPin[i], i == value);
}

Таким образом, вся ваша программа может выглядеть так:

const uint8_t x = A3;    // выбираем входной пин для переключателя
const uint8_t y = A4;
const uint8_t z = A5;

const uint8_t ledPin[8] = { 2, 3, 4, 7, 8, 9, 12, 13 };

void setup() {
    for (uint8_t i = 0; i < 8; i++) {
        pinMode(ledPin[i], OUTPUT);
    }
    pinMode(x, INPUT);
    pinMode(y, INPUT);
    pinMode(z, INPUT);
}

void loop() {
    uint8_t value = digitalRead(x) | (digitalRead(y) << 1) | (digitalRead(z) << 2);
    for (uint8_t i = 0; i < 8; i++) {
        digitalWrite(ledPin[i], i == value);
    }
}

Экономит огромное количество времени при наборе текста, а также в конечном итоге использует значительно меньше флэш-памяти.

,

Спасибо, я все еще изучаю программирование Arduino. это определенно более простой способ сделать это. еще раз спасибо, что научили меня этому!, @richard

Отличный способ заинтересовать новичков массивами и логическими значениями, показав их полезность. Хороший., @Systembolaget


0

Единственная ошибка в digitalWrites заключается в том, что digitalWrite (ledPin1 = HIGH); должно быть digitalWrite (ledPin1, HIGH); то же самое для других вызовов digitalWrite;

"слишком мало аргументов для функции" явно подразумевает, что количество аргументов, которые вы передаете, меньше ожидаемого функцией;

кстати, ваш код также будет работать нормально, если вы обновите свои назначения на операторы digitalWrite в своем коде во всех блоках if/else;

подробнее о функции digitalWrite можно прочитать по ссылке ниже https://www.arduino.cc/en/Reference/DigitalWrite

,

1

Поскольку вы упомянули, что новичок в программировании, я публикую ваше собственное решение, модифицированное для работы с правильными вещами; этот код можно в значительной степени оптимизировать, если вы хорошо разбираетесь в программировании; Для вашего удобства я опубликую как ваш подход, так и немного лучший подход

Ваш подход:

int x = A3;    // выбираем входной пин для переключателя
int y = A4;
int z = A5;

int ledPin1 = 2;      // выбираем пин для светодиода
int ledPin2 = 3;
int ledPin3 = 4;
int ledPin4 = 7;
int ledPin5 = 8;
int ledPin6 = 9;
int ledPin7 = 12;
int ledPin8 = 13;

void setup(){

    // объявляем ledPin как ВЫХОД:
    pinMode(ledPin1, OUTPUT);
    pinMode(ledPin2, OUTPUT);
    pinMode(ledPin3, OUTPUT);
    pinMode(ledPin4, OUTPUT);
    pinMode(ledPin5, OUTPUT);
    pinMode(ledPin6, OUTPUT);
    pinMode(ledPin7, OUTPUT);
    pinMode(ledPin8, OUTPUT);

    pinMode(x, INPUT);
    pinMode(y, INPUT);
    pinMode(z, INPUT);
}

void loop() {

    if ( (x = LOW) && (y = LOW) && (z = LOW))              // условие 1
    {
        digitalWrite (ledPin1, HIGH); 
        digitalWrite (ledPin2, LOW); 
        digitalWrite (ledPin3, LOW); 
        digitalWrite (ledPin4, LOW); 
        digitalWrite (ledPin5, LOW); 
        digitalWrite (ledPin6, LOW); 
        digitalWrite (ledPin7, LOW); 
        digitalWrite (ledPin8, LOW); 
    }

    if ( (x = LOW) && (y = LOW) && (z = HIGH))             //условие 2
    {
        digitalWrite(ledPin1, LOW);  
        digitalWrite(ledPin2, HIGH); 
        digitalWrite(ledPin3, LOW);  
        digitalWrite(ledPin4, LOW);  
        digitalWrite(ledPin5, LOW);  
        digitalWrite(ledPin6, LOW);  
        digitalWrite(ledPin7, LOW);  
        digitalWrite(ledPin8, LOW);  
    }

    if ( (x = LOW) && (y = HIGH) && (z = LOW))             //условие 3
    {
        digitalWrite(ledPin1, LOW);  
        digitalWrite(ledPin2, LOW);  
        digitalWrite(ledPin3, HIGH); 
        digitalWrite(ledPin4, LOW);  
        digitalWrite(ledPin5, LOW);  
        digitalWrite(ledPin6, LOW);  
        digitalWrite(ledPin7, LOW);  
        digitalWrite(ledPin8, LOW); 
    }

    if ( (x = LOW) && (y = HIGH) && (z = HIGH))              //условие 4
    {
        digitalWrite(ledPin1, LOW);  
        digitalWrite(ledPin2, LOW);  
        digitalWrite(ledPin3, LOW);  
        digitalWrite(ledPin4, HIGH); 
        digitalWrite(ledPin5, LOW);  
        digitalWrite(ledPin6, LOW);  
        digitalWrite(ledPin7, LOW);  
        digitalWrite(ledPin8, LOW); 
    }

    if ( (x = HIGH) && (y = LOW) && (z = LOW))               //условие 5
    {
        digitalWrite(ledPin1, LOW);  
        digitalWrite(ledPin2, LOW);  
        digitalWrite(ledPin3, LOW);  
        digitalWrite(ledPin4, LOW);  
        digitalWrite(ledPin5, HIGH); 
        digitalWrite(ledPin6, LOW);  
        digitalWrite(ledPin7, LOW);  
        digitalWrite(ledPin8, LOW); 
    }

    if ( (x = HIGH) && (y = LOW) && (z = HIGH))               //условие 6
    {
        digitalWrite(ledPin1, LOW);  
        digitalWrite(ledPin2, LOW);  
        digitalWrite(ledPin3, LOW);  
        digitalWrite(ledPin4, LOW);  
        digitalWrite(ledPin5, LOW);  
        digitalWrite(ledPin6, HIGH); 
        digitalWrite(ledPin7, LOW);  
        digitalWrite(ledPin8, LOW); 
    }

    if ( (x = HIGH) && (y = HIGH) && (z = LOW))                //условие 7
    {
        digitalWrite(ledPin1, LOW);  
        digitalWrite(ledPin2, LOW);  
        digitalWrite(ledPin3, LOW);  
        digitalWrite(ledPin4, LOW);  
        digitalWrite(ledPin5, LOW);  
        digitalWrite(ledPin6, LOW);  
        digitalWrite(ledPin7, HIGH); 
        digitalWrite(ledPin8, LOW); 
    }

    if ( (x = HIGH) && (y = HIGH) && (z = HIGH))                //условие 8
    {
        digitalWrite(ledPin1, LOW);  
        digitalWrite(ledPin2, LOW);  
        digitalWrite(ledPin3, LOW);  
        digitalWrite(ledPin4, LOW);  
        digitalWrite(ledPin5, LOW);  
        digitalWrite(ledPin6, LOW);  
        digitalWrite(ledPin7, LOW);  
        digitalWrite(ledPin8, HIGH);
    }
}

Немного лучший подход:(лучшие программисты могут писать еще более оптимизированный код)

int x = A3;    // выбираем входной пин для переключателя
int y = A4;
int z = A5;

int ledPin1 = 2;      // выбираем пин для светодиода
int ledPin2 = 3;
int ledPin3 = 4;
int ledPin4 = 7;
int ledPin5 = 8;
int ledPin6 = 9;
int ledPin7 = 12;
int ledPin8 = 13;

void setup(){

  // объявляем ledPin как ВЫХОД:
  pinMode(ledPin1, OUTPUT);
  pinMode(ledPin2, OUTPUT);
  pinMode(ledPin3, OUTPUT);
  pinMode(ledPin4, OUTPUT);
  pinMode(ledPin5, OUTPUT);
  pinMode(ledPin6, OUTPUT);
  pinMode(ledPin7, OUTPUT);
  pinMode(ledPin8, OUTPUT);

  pinMode(x, INPUT);
  pinMode(y, INPUT);
  pinMode(z, INPUT);
}

void loop() {
  int pinToTurnHigh = 2; // просто убедимся, что это правильный пин
  if ( (x = LOW) && (y = LOW) && (z = LOW))              // условие 1
  {
    pinToTurnHigh = ledPin1;
  }

  if ( (x = LOW) && (y = LOW) && (z = HIGH))             //условие 2
  {
    pinToTurnHigh = ledPin2;
  }

  if ( (x = LOW) && (y = HIGH) && (z = LOW))             // условие 3
  {
    pinToTurnHigh = ledPin3;
  }

  if ( (x = LOW) && (y = HIGH) && (z = HIGH))              //условие 4
  {
    pinToTurnHigh = ledPin4;
  }

  if ( (x = HIGH) && (y = LOW) && (z = LOW))               //условие 5
  {
    pinToTurnHigh = ledPin5;
  }

  if ( (x = HIGH) && (y = LOW) && (z = HIGH))               //условие 6
  {
    pinToTurnHigh = ledPin6;
  }

  if ( (x = HIGH) && (y = HIGH) && (z = LOW))                //условие 7
  {
    pinToTurnHigh = ledPin7;
  }

  if ( (x = HIGH) && (y = HIGH) && (z = HIGH))                //условие 8
  {
    pinToTurnHigh = ledPin8;
  }
  resetAllLEDs();
  digitalWrite(pinToTurnHigh, HIGH);
}

void resetAllLEDs()
{  
  digitalWrite(ledPin1, LOW);  
  digitalWrite(ledPin2, LOW);  
  digitalWrite(ledPin3, LOW);  
  digitalWrite(ledPin4, LOW);  
  digitalWrite(ledPin5, LOW);  
  digitalWrite(ledPin6, LOW);  
  digitalWrite(ledPin7, LOW);  
  digitalWrite(ledPin8, LOW);
}
,