Не удается получить фактический выход, когда обе входные логики высоки
Я хочу Когда,
свет=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);
}
@Shahin Kadir, 👍-1
Обсуждение2 ответа
Вы можете несколько упростить свои требования, разделив входные данные.
свет=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);// низкий, независимо от ик.
}
Обратите внимание, что это не ответ на вопрос (изначально я не вижу никаких проблем), но для очистки кода это может помочь отладить его (используя инструкции печати, как предлагает сын 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 должны быть высокими или войти в функцию, которая устанавливает светодиоды.
Теперь вы также можете использовать гораздо меньше инструкций печати для поиска вашей проблемы.
- Чтение из Serial
- Как узнать сопротивление внутреннего подтягивающего резистора?
- Как подключить трехконтактный переключатель включения-выключения для считывания входных данных?
- Индустриализация Arduino - 24V io? (Электроника)
- Измерить время между 2 входами
- Как избежать электромагнитных помех на входе ESP32
- digitalRead продолжает давать 1
- Использовать выводы PWM в качестве обычных цифровых входов/выходов?
Пожалуйста, отформатируйте свой код с помощью блока кода (см. 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