Поиск ошибки в записи переменной
Я пишу этот фрагмент кода для 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 будет ВЫСОКОЕ значение, когда я подключаю перемычку, и НИЗКОЕ значение, когда я отсоединяю перемычку. Но я получаю два возможных поведения: иногда я получаю «Текущий обнаружен» в начале выполнения, после чего дальнейших сообщений нет, а иногда я получаю быстрое чередование «Текущий обнаружен» и «Текущий завершен».
@mark247m, 👍0
Обсуждение1 ответ
Лучший ответ:
Как говорит Маженко в своих комментариях, вывод, который ни к чему не подключен, "плавает" и дает непредсказуемые результаты.
Вам нужно либо подключить такой вывод к земле через «подтягивающий» резистор, либо к +5 В через «подтягивающий» резистор. (10 кОм — хорошее значение для начала.)
Если вы подключите контакт к +5 В через подтягивающий резистор, вы заземлите его, чтобы изменить его состояние. В этом случае контакт обычно читается как ВЫСОКИЙ и падает до НИЗКОГО при срабатывании. Обратите внимание, что у Arduino есть специальный режим INPUT_PULLUP, который соединяет контакт с внутренним подтягивающим резистором. В этом случае вам не нужен внешний подтягивающий резистор.
В вашем случае соедините контакт с землей с помощью резистора 10 кОм. Затем, когда вы хотите, чтобы контакт был высоким, подключите контакт к + 5 В. Это заглушит соединение с землей и поднимет напряжение чуть ниже 5 В.
- avrdude ser_open() can't set com-state
- Float печатается только 2 десятичных знака после запятой
- ошибка: espcomm_upload_mem failed при загрузке скетча
- Печать массива байтов на экране последовательного монитора Arduino IDE
- Разные и самые быстрые способы вычисления синусов и косинусов в Arduino
- Arduino IDE Отказано В Разрешении На Загрузку, Ubuntu
- Нет заголовочных файлов (.h) в Documents\Arduino\libraries\arduino_144469 с демонстрационным кодом
- Связь Arduino master/slave с использованием RS485
Вы отсоединяете провод? Отключено не равно LOW. Отключено означает "Неизвестно". LOW подключен к GND. У вас есть «плавающий ввод»., @Majenko
Кстати, входные контакты определяют напряжение, а не ток., @Edgar Bonet
@Majenko [at]EdgarBonet Спасибо за ваши ответы. Да, я смог получить НИЗКОЕ значение, когда подключил перемычку к земле. Спасибо!, @mark247m