Запуск программы по нажатию кнопки
- Войдите на сайт для отправки комментариев
Втр, 29/10/2019 - 18:55
Пытался сделать так, чтобы программа начала выполняться при нажатии двух кнопок: одна задает количество циклов, другая разрешает выполнение это самого цикла.Получилось как- то так. Ничего не работает, возможно. вы сможете помочь. Заранее спасибо
#include <Stepper.h> int ENBL = 8; int RL = 9; int a = 0 ; int buttonPin = 5 ; int buttonSPin = 2; int buttons1 = 0; int buttons2 = 0; int button1 = 0 ; int button2 = 0 ; int button_Status = 0 ; int buttons_Status = 0; const int stepsPerRevolution = 10000; // SUMM OF STEPS Stepper myStepper(stepsPerRevolution, 3,12); // 3- DIR, 12-PUL void setup() { myStepper.setSpeed(60); pinMode(ENBL, OUTPUT); // ENBL pinMode(RL, OUTPUT); pinMode(buttonPin, INPUT); pinMode(buttonSPin, INPUT); digitalWrite(RL, HIGH); } void loop() { while(buttons_Status != HIGH){ button1 = digitalRead ( buttonPin ); delay(10); button2 = digitalRead ( buttonPin ); if ( button1 == button2 ) { button_Status=HIGH; } if(button_Status == HIGH){ a = a ++ ; button_Status = LOW ; } buttons1 = digitalRead ( buttonSPin ); delay(10); buttons2 = digitalRead ( buttonSPin ); if(buttons1==buttons2){ buttons_Status=HIGH;} } for (int i = 0; i<a; i++) { digitalWrite(ENBL,HIGH); digitalWrite(RL,HIGH); // delay(1000); myStepper.step(stepsPerRevolution); digitalWrite(RL,LOW); digitalWrite(ENBL,LOW); delay(2000); } digitalWrite(RL,HIGH); int s2 = -stepsPerRevolution*a;// RETURN STEPS digitalWrite(ENBL, LOW); delay(1000); digitalWrite(ENBL,HIGH); digitalWrite(RL,HIGH); myStepper.step(s2); digitalWrite(ENBL, LOW); delay(1000); buttons_Status=LOW; }
давайте взглянем кусок кода начиная с 56 строчки
видимо с целью борьбы с дребезгом вы читаете кнопку дважды с некоторым перерывом. А дальше у вас логическая ошибка - из того, что оба чтения кнопки вернули один и тот же результат (
вовсе не следует, что этот результат - HIGH. Если оба чтения вернули LOW - условие все равно выполнится
Если я вас правильно понял, то в итоге должно было получиться что-то вроде этого:
,но программа все так же не делает то, чего я от нее хочу.
,но программа все так же не делает то, чего я от нее хочу.
в чем заключается то, что программа не делает то, что вы хотите?
Я хочу, чтобы количество циклов, по которым программа указывалось количеством нажатий кнопки, но, чтобы, цикл этот начал выполняться при нажатии другой. Но, почему-то, программа не реагирует ни на какие мои действия с кнопками.
Если сам писал, то, скорее всего, в логике ошибка. Чтобы понять это, просто опиши логику работы программы обычным человеческим языком и сравни с тем, что имеется. К примеру, чтобы при нажатии кнопки зажечь светодиод: Если кнопка нажата, то зажигаем светодиод (это для примера).
Но, почему-то, программа не реагирует ни на какие мои действия с кнопками.
а кнопки как подключены?
Кнопка разрешения работы цикла и кнопка, регулирующая количество циклов, подключены к 2 и 5 пину соответственно. С других концов к 5в .Не уверен, что это правильно. Все-таки, я крайне неопытен во всем этом.
вам нужно подключить кнопки с подтяжкой, иначе все будет работать очень нестабильно. Почитайте вот эту тему - хотя бы первые 5-10 сообщений
http://arduino.ru/forum/programmirovanie/rabota-s-knopkami-v-pomoshch-novichku
Мысли :
1 . 10 мс при опросе кнопок наверно маловато
2 . Нужно поправить код ( в 49 ну и в 62 соответственно строке HIGH поменять на button2 )
3.вызывает сомнения a = a++ ( 52 строчка ) . Наверно надо или а = а + 1 ; или а++ ;
кроме того поставить подтягивающие резисторы 10-20 кОм между пином и минусом ( соответственно 2 резистора с 2 и 5 пина на минус)
кроме того поставить подтягивающие резисторы 10-20 кОм между пином и минусом ( соответственно 2 резистора с 2 и 5 пина на минус)
Или открыть для себя заклинание - INPUT_PULLUP (хнопочки перевернуть придется).
Слишком много лишнего.
Следует сделать , что то типа этого:
boolean Btn1_flag;//для работы по условию одно нажатие=одно де ствие
if(digitalRead(button1pin)&&!Btn1_flag){a++;Btn1_flag=1;delay(10);}
if(!digitalRead(button1pin))Btn1_flag=0;
100500переменных там не нужны
Общий принцип должен быть понятен
Где-то читал, что использование внутренних подтягивающих резисторов не надежно .Не помню по какой причине.Всегда использую внешние.Работает 100 %.Но в любом случае спасибо за напоминание
Где-то читал, что использование внутренних подтягивающих резисторов не надежно .Не помню по какой причине.Всегда использую внешние.Работает 100 %.Но в любом случае спасибо за напоминание
Ненадежно по причине их, достаточно, высокого сопротивления, а значит, меньшей помехозащищенности. Но т.к., Вы, предложили близкие номиналы, то в чем разница?))))
Ну как сказать. Многие скорее накосячат при установке внешних резисторов.