Почему цифровой вывод не читает ON от кнопочных переключателей, подключенных к 5 В и понижающему резистору 10 кОм?

Вот моя схема:

И код:

//контакты
const int control1 = 2;
const int control2 = 3; 
const int enable = 9; 
const int pinDirection = 4; 
const int pinOnOff = 5;
const int pot = A0; 
//состояния
int stateOnOff = 0;
int stateOnOffPrev = 0;
int stateDirection = 0;
int stateDirectionPrev = 0;

int motorEnabled = 0;
int motorSpeed = 0;
int motorDirection = 1;

void setup(){
  pinMode(pinDirection, INPUT);
  pinMode(pinOnOff, INPUT);
  pinMode(control1, OUTPUT);
  pinMode(control2, OUTPUT);
  pinMode(enable, OUTPUT);

  digitalWrite(enable, LOW);
  Serial.begin(9600);
}

void loop(){
  stateOnOff = digitalRead(pinOnOff); 
  delay(10);
  stateDirection = digitalRead(pinDirection);
  motorSpeed = analogRead(pot)/4;

  if(stateOnOff != stateOnOffPrev){
    if(stateOnOff == HIGH){
      motorEnabled = !motorEnabled;
    }
  }

  if(stateDirection != stateDirectionPrev){
    if(stateDirection == HIGH){
      motorDirection = !motorDirection;
    }
  }
Serial.println(stateDirection);  
  if(motorDirection == 1){
    digitalWrite(control1, HIGH);
    digitalWrite(control2, LOW);
  }else{
    digitalWrite(control1, LOW);
    digitalWrite(control2, HIGH);
  }

  if(motorEnabled == 1){
    analogWrite(enable, motorSpeed);
  }else{
    analogWrite(enable, 0);
  }

  stateDirectionPrev = stateDirection;
  stateOnOffPrev = stateOnOff;

}

Как видите, переключатель на контакте 5 контролирует включение двигателя, а потенциометр контролирует скорость двигателя. Оба работают.

Однако, когда переключатель на контакте 4 замкнут, переменная stateDirection по-прежнему имеет значение 0 или цепь разомкнута. При его нажатии должно измениться направление вращения двигателя через Н-мост. Я перепробовал все, что мог: новые переключатели, более высокое сопротивление. Единственный раз, когда он читал ВЫСОКИЙ, это когда я буквально подключил переключатель к GND.

Последовательный номер отображает stateDirection как бесконечную цепочку нулей.

И, наконец, схемы из оригинального проекта. schematics

Спасибо.

**PS: Простите за отсутствие комментариев! Но я думаю, что хороший Arduino-программист в комментариях не нуждается. **

, 👍5

Обсуждение

Комментарии не предназначены для расширенного обсуждения; этот разговор был [перенесен в чат](http://chat.stackexchange.com/rooms/57189/discussion-on-question-by-roman-why-digital-pin-not-reading-on-from-push- кнопка)., @Nick Gammon

Что, если вы используете пустой макет и вставляете только кнопку и резистор? И заставить ваш код снова и снова печатать состояние кнопки?, @Paul


2 ответа


1

когда переключатель на контакте 4 замкнут, переменная stateDirection все еще имеет значение 0 или цепь разомкнута.

Вы могли бы включить подтягивание на этом выводе: при номинальном значении 50 кОм, понижение на 10 кОм находится на пороге перехода на низкий логический уровень.

решение?

1) отключить подтягивание; 2) используйте более сильное понижение; 3) избавиться от тяги вниз и полагаться только на подтягивания. ...

,

1

Если при обходе переключателя и замыкании на землю он показывает низкий уровень... Значит, либо неисправен переключатель, либо, возможно, просто неправильная ориентация переключателя.

Изменить: если GND по логике устанавливает высокий уровень на контакте 5, тогда ваша кнопка должна перейти на GND и включить резистор на 5 В. На данный момент по вашей схеме все наоборот.

,