Всегда определяет тот же вывод, что и HIGH, даже если он не подключен

Я тренируюсь с платой arduino UNO (я новичок), и я пытаюсь включить некоторые светодиоды в зависимости от того, какой аналоговый вывод подключен к 5V. Вот мой код:

int statusLed = 11;
int out1 = 2;
int out2 = 3;
int out3 = 4;
int out4 = 5;
int in1 = A0;
int in2 = A1;
int in3 = A2;
int in4 = A3;
int statusLedBrightness = 3;
int incBrillo = 3;
int fadeDelay = 5;

void blinkFade(int pin){
  analogWrite(pin, statusLedBrightness);
  statusLedBrightness = statusLedBrightness + incBrillo;
  if (statusLedBrightness <= 0 || statusLedBrightness >= 255){
    incBrillo = -incBrillo;   
  } 
  delay(fadeDelay);
  }

void wait(){  
  digitalWrite(out1, LOW);
  digitalWrite(out2, LOW);
  digitalWrite(out3, LOW);
  digitalWrite(out4, LOW);
  blinkFade(statusLed);
}



void setup() {
  // поместите сюда свой установочный код, чтобы запустить его один раз:
  pinMode(out1,OUTPUT);
  pinMode(out2,OUTPUT);
  pinMode(out3,OUTPUT);
  pinMode(out4,OUTPUT);
  pinMode(in1, INPUT);
  pinMode(in2, INPUT);
  pinMode(in3, INPUT);
  pinMode(in4, INPUT);
  Serial.begin(115200);
}

void loop() {
  // поместите сюда свой основной код для повторного запуска:
  if (analogRead(in1)>=500){
    Serial.println("1: ");
    Serial.println(analogRead(in1)); //Выведите "1" и считайте вывод A0
    turnOff();
    digitalWrite(out1,HIGH);
  }
  else if (analogRead(in2)>=500){
    Serial.println("2: ");
    Serial.println(analogRead(in2));//Выведите "2" и считайте вывод A1
    turnOff();
    digitalWrite(out2,HIGH);
  }
  else if (analogRead(in3)>=500){
    Serial.println("3: ");
    Serial.println(analogRead(in3));//Выведите "3" и считайте вывод A2
    turnOff();
    digitalWrite(out3,HIGH);
  }
  else if (analogRead(in4)>=500){
    Serial.println("4: ");
    Serial.println(analogRead(in4));//Выведите "4" и считайте вывод A3
    turnOff();
    digitalWrite(out4,HIGH);
  }
  else{
    Serial.println("Stand By");
    wait();
  }

}

Проблема, с которой я сталкиваюсь, заключается в том, что когда я подключаю провод от 5 В к любому аналоговому контакту (от A0 до A3), он всегда запускает этот сегмент кода:

Serial.println("1: ");
Serial.println(analogRead(in1));
turnOff();
digitalWrite(out1,HIGH);

Насколько я понимаю, он обнаруживает, как если бы он всегда был A0, который подключен к 5V, но я не понимаю, почему это происходит или как это решить.

Это снимок экрана последовательного монитора, когда 5 В подключено к контакту A2. В нем должно быть напечатано "3:" и надпись [] 1

, 👍1


1 ответ


Лучший ответ:

1

Вы не показываете свою схему, но я уверен, что вы просто оставляете контакты Ax ОТКРЫТЫМИ, когда не подключаете их к своей линии +V. В этом случае они "плавают" и как таковые могут плавать ВЫСОКО или НИЗКО или практически где угодно. Что происходит, так это то, что когда вы подключаете +V к любому из них, это приводит к побочному эффекту вытягивания по крайней мере A0 вместе с ним, поскольку вы позволили ему плавать.

Здесь нужно сделать две вещи:

  1. Не допускайте перемещения строк и ожидайте детерминированного поведения. Привяжите их к +V или к ЗЕМЛЕ, когда вы ими не пользуетесь.
  2. Потяните линии Ax к + V или GND через резистор, например, 10 Ком. Это предотвратит их плавучесть и даст вам предсказуемые результаты.
,

вот и все, добавление резисторов для подключения линий Ax к GND сделало это. Спасибо!, @Lucas Fernandez