Поиск ошибки в записи переменной

Я пишу этот фрагмент кода для Arduino Uno, который принимает на вход 2 значение датчика PIR. В целях отладки в данный момент я беру сигнал на контакт 2 от источника питания 5В:

int inputPinSensor1 = 2; // входной контакт для датчика 1
int sensor_1_State = LOW; // мы начинаем предполагать, что движение для датчика 1 не обнаружено
int val = 0; // переменная для чтения состояния пина

void setup() {
  pinMode(inputPinSensor1, INPUT); // объявляем пин датчика 1 входом

  Serial.begin(9600);
}

void loop(){
  detectChange(&inputPinSensor1, &sensor_1_State);
}

void detectChange(int* inputPin, int* pirState) {
  // чтение входного значения
  val = digitalRead(*inputPin);
  // проверяем, является ли вход ВЫСОКИМ
  if (val == HIGH) {
    if (*pirState == LOW) {
      // мы только что включили
      Serial.println("Current detected");
      *pirState = HIGH;
    }
  } else {
    if (*pirState == HIGH){
      // мы только что выключили
      Serial.println("Current ended");
      *pirState = LOW;
    }
  }
}

Этот код должен определять переход от НИЗКОГО значения к ВЫСОКОМУ на контакте 2 и наоборот. Таким образом, я ожидаю, что на контакте 2 будет ВЫСОКОЕ значение, когда я подключаю перемычку, и НИЗКОЕ значение, когда я отсоединяю перемычку. Но я получаю два возможных поведения: иногда я получаю «Текущий обнаружен» в начале выполнения, после чего дальнейших сообщений нет, а иногда я получаю быстрое чередование «Текущий обнаружен» и «Текущий завершен».

, 👍0

Обсуждение

Вы отсоединяете провод? Отключено не равно LOW. Отключено означает "Неизвестно". LOW подключен к GND. У вас есть «плавающий ввод»., @Majenko

Кстати, входные контакты определяют напряжение, а не ток., @Edgar Bonet

@Majenko [at]EdgarBonet Спасибо за ваши ответы. Да, я смог получить НИЗКОЕ значение, когда подключил перемычку к земле. Спасибо!, @mark247m


1 ответ


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

1

Как говорит Маженко в своих комментариях, вывод, который ни к чему не подключен, "плавает" и дает непредсказуемые результаты.

Вам нужно либо подключить такой вывод к земле через «подтягивающий» резистор, либо к +5 В через «подтягивающий» резистор. (10 кОм — хорошее значение для начала.)

Если вы подключите контакт к +5 В через подтягивающий резистор, вы заземлите его, чтобы изменить его состояние. В этом случае контакт обычно читается как ВЫСОКИЙ и падает до НИЗКОГО при срабатывании. Обратите внимание, что у Arduino есть специальный режим INPUT_PULLUP, который соединяет контакт с внутренним подтягивающим резистором. В этом случае вам не нужен внешний подтягивающий резистор.

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

,