Странная работа кнопок на аналоговых входах и условий
- Войдите на сайт для отправки комментариев
Доброго дня.
Вчера пытался разобраться с условиями и запуска шагового в зависимости от кнопок на аналоговых входах (земля притянута резисторами 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.
intopen,close,manualpin;да блин :-) нашел ошибки в своем коде пока писал тут. Как тут править сообщения?
А почему не работаете с ними как с обычными цифровыми входами?
А почему не работаете с ними как с обычными цифровыми входами?
Что Вы имеете ввиду? Поясните, пожалуйста, более подробно.
pinMode(A0, INPUT)
Ну я только учусь, в интернете вычитал про такую реализацию, вроде хорошо работает, пока 3-ю кнопку не прописал. Нет идей почему такое может быт? Она ведь в условиях не участвует?
Схему проверяй, тут както один новичек три кнопки одним резистором подтягивал к земле.
да реакция есть на все 3 кнопки и реакция разная, т.е. они явно не пересекаются нигде. Ладно бы повторялась реакция, но тут разная.
Какой смысл в вашем винегрете, на один аналоговый пин вешают несколько кнопок для экономии. Если задействуете несколько пинов, то и работайте с ними как с цифровыми и не грузите МК лишней математикой. ИМХО.
Все же винегрет работает. Проблема действительно была в схеме, видимо ноги резистора на макете далеко ушли . Вчера все разобрал и собрал все с нуля перепроверяя 10 раз, поотрезал резисторам ноги и посадил так, чтобы они лежали и ноги далеко не уходили. Теперь всё работает как часы, даже 4 кнопки. Всем спасибо за советы.