Несколько условий оператора 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;
}
}
@richard, 👍3
Обсуждение5 ответов
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
void loop() {
if ( (x = LOW) && (y = LOW) && (z = LOW)) //условие 1 {
Помимо проблемы с необходимостью ==
вместо =
, вы никогда не читаете эти контакты. На самом деле вы сравниваете номера выводов (которые никогда не изменятся), а не данные об этих выводах.
Вам нужно:
void loop() {
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);
когда я использую цифровую запись, я получаю код ошибки, говорящий о том, что аргументов слишком мало. ... Я просто не знаю, почему программа моделирования до сих пор не зажигает светодиод
О, я вижу, он не скомпилировался. Неудивительно, что светодиоды не загорелись.
Вот вам небольшой совет (он не имеет ничего общего с вашей проблемой, это просто хороший метод программирования). Это значительно уменьшит размер вашей программы.
У вас есть три логических переменных состояния, и вы сравниваете состояние всех комбинаций — это 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
Единственная ошибка в digitalWrites заключается в том, что digitalWrite (ledPin1 = HIGH); должно быть digitalWrite (ledPin1, HIGH); то же самое для других вызовов digitalWrite;
"слишком мало аргументов для функции" явно подразумевает, что количество аргументов, которые вы передаете, меньше ожидаемого функцией;
кстати, ваш код также будет работать нормально, если вы обновите свои назначения на операторы digitalWrite в своем коде во всех блоках if/else;
подробнее о функции digitalWrite можно прочитать по ссылке ниже https://www.arduino.cc/en/Reference/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
{
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);
}
- Светодиоды: разница между общим анодом и общим катодом
- Остановить мигание светодиодов
- Интеграция 2 кнопок для включения и выключения светодиода.
- Управление цифровой адресной светодиодной лентой RGB 12 В с помощью Arduino
- Код Arduino для управления 4 светодиодами с 4 кнопок
- Нужен ли подтягивающий/понижающий резистор для цепи светодиода кнопки?
- Мигните светодиодом 5 раз с помощью цикла for
- Какое назначение разных светодиодных индикаторов на плате Arduino UNO?
Я использовал ваш код в качестве ссылки, но когда я его загрузил, он дает мне «слишком мало аргументов для работы». Любые решения?, @khan