Почему я получаю случайные входные значения в своем Arduino?

Я хочу использовать переключатель для моего Arduino с помощью digitalRead(), но я продолжаю получать случайные входы. Всякий раз, когда я подключаю энергию к этому штифту, она всегда возвращается ВЫСОКОЙ, но в остальном она идет совершенно случайным образом.

Я попробовал использовать резистор для входного контакта, но это, похоже, не помогло. Я использую Elegoo UNO, и входной контакт, который я использую, - это pin 2. Вот мой код на случай, если он вам понадобится:

const int switchPin = 3;

void setup() {
  // put your setup code here, to run once:
  pinMode(switchPin, INPUT);
  Serial.begin(9600);
}

void loop() {
  // put your main code here, to run repeatedly:
  if (digitalRead(switchPin) == HIGH){
    Serial.println("on");
  }

  else{
    Serial.println("off");
  }
}

, 👍4

Обсуждение

Значит, на этом выводе нет выдвижного резистора? .. , @Majenko

Дай угадаю: Вы не используете внешний подтягивающий или оттягивающий резистор (относительно большой резистор от контакта до eiter Vcc или заземления). Когда ничего не подключено к контакту, она плавает (в основном антенна). Резистор pullup/down тянет вывод к фиксированному значению, когда больше ничего не подключено. Вы можете использовать внешний резистор или внутренний подтягивающий резистор, выполнив команду " pinMode(switchPin, INPUT_PULLUP)"., @chrisl

Это ответ на ваш вопрос? [Состояние Цифрового вывода - Некоторые 1, Некоторые 0](https://arduinoprosto.ru/q/24157/digital-pin-state-some-1-some-0), @chrisl

Как вы подключили резистор к входному контакту?, @Peter Mortensen


4 ответа


3

Ваш код упоминает pin 3, в то время как вы описываете использование pin 2. Возможно, это связано с вашей ошибкой.

В противном случае проверьте следующее:

  • используете ли вы длинные кабели или находитесь рядом с сильными магнитными или статическими объектами.
  • что касается вашего кода, так как вы читаете его только в том случае, если он высокий, посмотрите, подключена ли кнопка к 5 В и контакту 2 или 3, какой бы вы ни использовали

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

Еще один тест, который я предпочитаю делать:

Возьмите рабочий соединительный кабель, проверьте его вольтметром или посмотрите, можете ли вы заставить светодиод загораться при подключении к нему (используйте для этого Arduino 5 В, заземление и резистор (резистор, чтобы светодиод не сгорел, как этот цеппелин).

С помощью рабочего соединительного кабеля или макетного кабеля подсоедините один конец к контакту, который вы планируете использовать. Затем запустите программу и подсоедините другой конец к земле, затем 5 В, затем заземление и так далее, чтобы посмотреть, хорошо ли он реагирует.

Это основано на Arduino Uno. Если вы используете другой тип Arduino, обязательно используйте соответствующий вывод напряжения. Вы всегда можете добавить резистор между проводом и Arduino для дополнительной безопасности.

,

24

Вы получаете звукосниматель шума на входном выводе, когда кнопка не нажата. Вам нужен понижающий резистор, примерно 10 Ком на землю, чтобы заглушить шум при разомкнутом выключателе.
Или еще проще: используйте встроенный подтягивающий резистор в Arduino, который составляет от ~10 Ком до +5 В, подключите кнопку к земле вместо +5 В и переверните тесты if, чтобы проверить логику НИЗКОГО уровня вместо ВЫСОКОГО, чтобы обнаружить нажатие кнопки. Вы бы изменили свой оператор pinmode на:

pinMode(switchPin, INPUT_PULLUP);  // включить входной pullup

и ваш тест на то, чтобы:

 if (digitalRead(switchPin) == LOW ){ // Отрицательная логика

Дополнительное (внешнее) оборудование не требуется!

,

3

Вот что вы можете сделать

  1. Проверьте, подключен ли переключатель к определенному входному контакту. Arduino начинается с вывода 0, и иногда мы можем неправильно прочитать его при подключении.

  2. Проверьте, имеет ли последовательный монитор такую же скорость передачи данных, как определено в программе.

  3. Проверьте напряжение вокруг переключателя с помощью мультиметра.

  4. Все еще не находишь решения? Прикрепите опускающийся резистор.

  5. Все еще не находишь решения? Инвертировать логику и текущий поток, как предложил Жробер.

,

0

Мало что можно проверить и использовать.

  1. Если вы используете обычную кнопку, то проверьте правильность соединения, так как два контакта внутренне соединены друг с другом. Так что нам нужны 2 контакта, которые не подключены, поэтому проверьте это с помощью DMM.

  2. К входному штифту прикреплены резисторы подтягивания или опускания.

    Значение резистора зависит от вашего требования, например, если у вас длинные провода или больше шума, вам нужен сильный резистор pullup или pulldown, такой как 1k. И лучший способ-сначала протестировать его с помощью внутреннего подтягивающего резистора, который считается недельным pullup, а Atmega328p имеет значение около 20k. pinMode(switchPin, INPUT_PULLUP);

  3. Поскольку TeD остался, проверьте, что вы используете один и тот же цифровой ПИН в своем аппаратном обеспечении и коде.

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

#define switchPin 2
byte debounce_counter = 150;

void setup() {
  pinMode(switchPin, INPUT_PULLUP);
  Serial.begin(9600);
}

void loop() {
  if (digitalRead(switchPin) == HIGH) {
    debounce_counter++;
  }
  else {
    debounce_counter--;
  }

  if (debounce_counter >= 240)
  {
    debounce_counter = 150;
    Serial.println("OFF");
  }
  else if (debounce_counter <= 60)
  {
    debounce_counter = 150;
    Serial.println("ON");
  }
}

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

,