Не удается получить фактический выход, когда обе входные логики высоки

input

Я хочу Когда,

  • свет=0, ик=0, затем на выходе будет вывод 8 высокий и вывод 12 низкий.

  • свет=0, ик=1, затем на выходе будет вывод 8 высокий и вывод 12 высокий.

  • свет=1, ик=0, затем на выходе будет вывод 8 низкий и вывод 12 низкий.

  • light=1, ir=1, затем на выходе будет вывод 8 low и вывод 12 low (это утверждение не работает).

Пожалуйста, найдите код и предложите мне, если потребуются какие-либо изменения.

void setup() {

    pinMode(8,OUTPUT); //логический выход.
    pinMode(12,OUTPUT); //логический выход.
    pinMode(2, INPUT); //ввод значения.
    pinMode(4, INPUT); //ввод значения.

    Serial.begin(9600);   
}


void loop() {

    int light = digitalRead(2); //ввод значения.
    int ir = digitalRead(4); //ввод значения.

    if (light == LOW && ir == LOW)
    {

      digitalWrite(8, HIGH);
      digitalWrite(12, LOW);
      delay(2000);

    }

    if (light == LOW && ir == HIGH)
    {

      digitalWrite(8, HIGH);
      digitalWrite(12, HIGH);
      delay(2000);

    }

    if (light == HIGH && ir == LOW)
    {

      digitalWrite(8, LOW);
      digitalWrite(12, LOW);
      delay(2000);

    }

    if (light == HIGH && ir == HIGH) //Это условие не работает.
    {

      digitalWrite(8, LOW);
      digitalWrite(12, LOW);
      delay(2000);

    }

    digitalWrite(8, LOW);
    digitalWrite(12, LOW);   
    delay(2000);

}

, 👍-1

Обсуждение

Пожалуйста, отформатируйте свой код с помощью блока кода (см. https://meta.stackexchange.com/questions/22186/how-do-i-format-my-code-blocks). Я не знаю, почему ваш код работает не так, как вы предполагали, но последние два оператора IF (включая тот,который не работает) одинаковы для низкого или ВЫСОКОГО ИК-диапазона,поэтому вы можете также объединить их в один, например: "if (light == ВЫСОКИЙ) { digitalWrite(8, НИЗКИЙ); digitalWrite(12, НИЗКИЙ); задержка (2000);}". Или, может быть, это не то, что вы хотели, и именно в этом заключается ошибка в вашем коде., @StarCat

Кроме того, было бы полезно объяснить, что должен делать ваш код и к какому оборудованию он подключен., @StarCat

Вот два входа и два выхода. Я хочу, чтобы, если light=0, ir=0, то вывод будет высоким 8 и низким 12. если light=0, ir=1, то вывод будет высоким 8 и высоким 12. В противном случае вывод будет, вывод 8 низкий и вывод 12 низкий., @Shahin Kadir

распечатайте некоторые отладочные сообщения, чтобы вы могли видеть, что происходит., @Sim Son

поставьте " задержка(2000)"; после всех утверждений " если` , @jsotola

Цифровая запись(8,НИЗКАЯ); Цифровая запись(12,НИЗКАЯ);, @Adem KIRMIZIYÜZ


2 ответа


1

Вы можете несколько упростить свои требования, разделив входные данные.

свет=0, ик=0, затем вывод будет выводить 8 высоких и 12 низких.

свет=0, ик=1, тогда вывод будет высоким 8 и высоким 12.

Если свет равен 0, то контакт 8 высокий. И ик-сигнал отражается на выводе 12.

свет=1, ик=0, затем на выходе будет вывод 8 низкий и вывод 12 низкий.

свет=1, ик=1, тогда вывод будет низким 8 и низким 12

Если свет равен 1, то оба вывода 8 и 12 находятся на низком уровне, и вам все равно, что делает ик, так как он не влияет на выходы.

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

if (light == 0) {
    digitalWrite(8, HIGH); // 8 всегда будет высоким при освещении == 0
    digitalWrite(12, ir); // отобразите значение ик на выводе 12
} else {
    digitalWrite(8, LOW); // если свет равен 1, то все
    digitalWrite(12, LOW);// низкий, независимо от ик.
}
,

0

Обратите внимание, что это не ответ на вопрос (изначально я не вижу никаких проблем), но для очистки кода это может помочь отладить его (используя инструкции печати, как предлагает сын Sim).

Вместо всех инструкций if проверьте, когда контакт 8 и контакт 12 должны быть ВЫСОКИМИ:

 pin 8:  (light == LOW && ir == LOW) 
 pin 12: (light == LOW && ir == LOW)  or (light == LOW && ir == HIGH)

Для контакта 12 условие может быть переписано как

 pin 12: (light == LOW) || (ir == LOW or ir == HIGH)

что равно

 pin 12: light == LOW

Поэтому теперь вы можете изменить код с функции цикла на:

void loop()
{
   digitalWrite(8 , (light == LOW && ir == LOW) ? HIGH : LOW);
   digitalWrite(12, (light == LOW             ) ? HIGH : LOW);
   delay(2000);

   digitalWrite(8, LOW);
   digitalWrite(12, LOW);   
   delay(2000);

}

тот самый икс ? : утверждения z означают: если x истинно, сделайте y, иначе z.

Последние три утверждения исправлены (скопированы из вашего кода).

Теперь мы можем еще больше сократить его, удалив дублированный код

void loop()
{
   processLeds((light == LOW && ir == LOW), (light == LOW));
   processLeds(False                      , False         );
}

void processLeds(int conditionLed8, int conditionLed12)
{
    digitalWrite( 8, conditionLed8  ? HIGH : LOW);
    digitalWrite(12, conditionLed12 ? HIGH : LOW);
    delay(2000);
}

Вы передаете условие, когда светодиоды 8 и 12 должны быть высокими или войти в функцию, которая устанавливает светодиоды.

Теперь вы также можете использовать гораздо меньше инструкций печати для поиска вашей проблемы.

,