Странная работа кнопок на аналоговых входах и условий

vit177
Offline
Зарегистрирован: 08.04.2017

Доброго дня.

Вчера пытался разобраться с условиями и запуска шагового в зависимости от кнопок на аналоговых входах (земля притянута резисторами 10к), но что-то наткнулся на непонятные вещи, может есть у кого мысли почему так происходит. Проблема в следующем: при добавлении чтения аналогового входа, его мапирования и создания условий if по нему, все работает как и задумывалось:

#include <AccelStepper.h>

AccelStepper Stepper1(1,13,12); //использует пин 13 и 12 для dir и step, 1 — режим «external driver» (A4988)

int pinopen1 = A0; 
int pinclose1 = A1;
int manualpin1 = A3;
int enablepin = 5;
int open,close,manualpin;

void setup() {

pinMode(enablepin, OUTPUT);  // инициализируем пин, подключенный к светодиоду, как выход

digitalWrite(enablepin, HIGH);

Stepper1.setMaxSpeed(700); //устанавливаем максимальную скорость вращения ротора двигателя (шагов/секунду)

Stepper1.setAcceleration(500); //устанавливаем ускорение (шагов/секунду^2)


}

void loop() {
int pinopen = analogRead(pinopen1); // читаем аналоговый вход A0
  pinopen = map(pinopen, 0, 900, 0, 1); // если значение больше 900, то pinopen устанавливаем равным 1

if ( pinopen==1) {
digitalWrite(enablepin, LOW); // Снимаем HIGH с драйвера 8825, тем самым запускаем драйвер
Stepper1.move(5000*dir); //устанавливает следующее перемещение на 5000 шагов 
}

if ( pinopen==0) {
digitalWrite(enablepin, HIGH); // Устанавливаем HIGH для драйвера 8825, тем самым выключаем драйвер
}

Stepper1.run(); //запуск шагового двигателя. Эта строка повторяется вновь и вновь для непрерывного вращения двигателя

}

Если в void loop добавить 2-ю кнопку и условия по ним, то тоже все работает как и задумывалось:

void loop() {
int pinopen = analogRead(pinopen1); // читаем аналоговый вход A0
pinopen = map(pinopen, 0, 900, 0, 1); // если значение больше 900, то pinopen устанавливаем равным 1
int manualpin = analogRead(manualpin1); // читаем аналоговый вход A2
manualpin = map(manualpin, 0, 900, 0, 1); // если значение больше 900, то manualpin устанавливаем равным 1

if ( (manualpin ==1)&&(pinopen==0) {
digitalWrite(enablepin, LOW); // Снимаем HIGH с драйвера 8825, тем самым запускаем драйвер
Stepper1.move(5000*dir); //устанавливает следующее перемещение на 5000 шагов 
}

if ( manualpin ==0 || pinopen==1) {
digitalWrite(enablepin, HIGH); // Устанавливаем HIGH для драйвера 8825, тем самым выключаем драйвер
}

Stepper1.run(); //запуск шагового двигателя. Эта строка повторяется вновь и вновь для непрерывного вращения двигателя

}

Но если в void loop я добавляю чтение и мапирование 3-ей кнопки, которая даже в условиях не учитывается, то начинаются непонятки, условия и по ней отрабатывают, т.е. шаговый и на нее реалирует:

void loop() {
int pinopen = analogRead(pinopen1); // читаем аналоговый вход A0
pinopen = map(pinopen, 0, 900, 0, 1); // если значение больше 900, то pinopen устанавливаем равным 1
int manualpin = analogRead(manualpin1); // читаем аналоговый вход A2
manualpin = map(manualpin, 0, 900, 0, 1); // если значение больше 900, то manualpin устанавливаем равным 1
int pinclose = analogRead(pinclose1); // читаем аналоговый вход A1
pinclose = map(pinclose, 0, 900, 0, 1); // если значение больше 900, то pinclose устанавливаем равным 1

if ( (manualpin ==1)&&(pinopen==0) {
digitalWrite(enablepin, LOW); // Снимаем HIGH с драйвера 8825, тем самым запускаем драйвер
Stepper1.move(5000*dir); //устанавливает следующее перемещение на 5000 шагов 
}

if ( manualpin ==0 || pinopen==1) {
digitalWrite(enablepin, HIGH); // Устанавливаем HIGH для драйвера 8825, тем самым выключаем драйвер
}

Stepper1.run(); //запуск шагового двигателя. Эта строка повторяется вновь и вновь для непрерывного вращения двигателя

}

Железно все подключено правильно, кнопки не замыкаются между собой, все кнопки притянуты к земле. Почему на переменную кнопки pinclose есть реакция, она же не участвует в условиях? Поднимал Stepper1.run() в if, но все равно шаговый реагирует на pinclose.

vit177
Offline
Зарегистрирован: 08.04.2017

int open,close,manualpin;

vit177
Offline
Зарегистрирован: 08.04.2017

да блин :-) нашел ошибки в своем коде пока писал тут. Как тут править сообщения? 

JasKo
Offline
Зарегистрирован: 21.11.2015

А почему не работаете с ними как с обычными цифровыми входами?

vit177
Offline
Зарегистрирован: 08.04.2017

JasKo пишет:

А почему не работаете с ними как с обычными цифровыми входами?

Что Вы имеете ввиду? Поясните, пожалуйста, более подробно.

JasKo
Offline
Зарегистрирован: 21.11.2015

pinMode(A0, INPUT)

vit177
Offline
Зарегистрирован: 08.04.2017

Ну я только учусь, в интернете вычитал про такую реализацию, вроде хорошо работает, пока 3-ю кнопку не прописал. Нет идей почему такое может быт? Она ведь в условиях не участвует? 

JasKo
Offline
Зарегистрирован: 21.11.2015

Схему проверяй, тут както один новичек три кнопки одним резистором подтягивал к земле.

vit177
Offline
Зарегистрирован: 08.04.2017

да реакция есть на все 3 кнопки и реакция разная, т.е. они явно не пересекаются нигде.  Ладно бы повторялась реакция, но тут разная. 

bwn
Offline
Зарегистрирован: 25.08.2014

Какой смысл в вашем винегрете, на один аналоговый пин вешают несколько кнопок для экономии. Если задействуете несколько пинов, то и работайте с ними как с цифровыми и не грузите МК лишней математикой. ИМХО.

vit177
Offline
Зарегистрирован: 08.04.2017

Все же винегрет работает. Проблема действительно была в схеме, видимо ноги резистора на макете далеко ушли . Вчера все разобрал и собрал все с нуля перепроверяя 10 раз, поотрезал резисторам ноги и посадил так, чтобы они лежали и ноги далеко не уходили. Теперь всё работает как часы, даже 4 кнопки. Всем спасибо за советы.