Запуск программы по нажатию кнопки
- Войдите на сайт для отправки комментариев
Втр, 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 строчки
buttons1 = digitalRead ( buttonSPin ); delay(10); buttons2 = digitalRead ( buttonSPin ); if(buttons1==buttons2){ buttons_Status=HIGH;}видимо с целью борьбы с дребезгом вы читаете кнопку дважды с некоторым перерывом. А дальше у вас логическая ошибка - из того, что оба чтения кнопки вернули один и тот же результат (
if(buttons1==buttons2){вовсе не следует, что этот результат - HIGH. Если оба чтения вернули LOW - условие все равно выполнится
Если я вас правильно понял, то в итоге должно было получиться что-то вроде этого:
while(buttons_Status != HIGH){ button1 = digitalRead ( buttonPin ); delay(10); button2 = digitalRead ( buttonPin ); if ( button1==HIGH && button2==HIGH ) { button_Status=HIGH; } if(button_Status == HIGH){ a = a ++ ; button_Status = LOW ; } buttons1 = digitalRead ( buttonSPin ); delay(10); buttons2 = digitalRead ( buttonSPin ); if(buttons1==HIGH && buttons2==HIGH){ buttons_Status=HIGH;} },но программа все так же не делает то, чего я от нее хочу.
,но программа все так же не делает то, чего я от нее хочу.
в чем заключается то, что программа не делает то, что вы хотите?
Я хочу, чтобы количество циклов, по которым программа указывалось количеством нажатий кнопки, но, чтобы, цикл этот начал выполняться при нажатии другой. Но, почему-то, программа не реагирует ни на какие мои действия с кнопками.
Если сам писал, то, скорее всего, в логике ошибка. Чтобы понять это, просто опиши логику работы программы обычным человеческим языком и сравни с тем, что имеется. К примеру, чтобы при нажатии кнопки зажечь светодиод: Если кнопка нажата, то зажигаем светодиод (это для примера).
Но, почему-то, программа не реагирует ни на какие мои действия с кнопками.
а кнопки как подключены?
Кнопка разрешения работы цикла и кнопка, регулирующая количество циклов, подключены к 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переменных там не нужны
boolean Btn1flag; static int Btn1pin=2,Btn2pin=5; boolean Btn1State,Btn2State;//если уж так принципиально через переменную int cycle_value; void setup(){ pinMode(Btn1pin,INPUT_PULLUP);//подтягиваем пин программно к +5, работать кнопка будет относительно gnd pinMode(Btn2pin,INPUT_PULLUP); } void loop(){ Btn1State=digitalRead(Btn1pin); Btn2State=digitalRead(Btn2pin); /*не обязательно писать if(Btn1State==LOW), даже скорее вредно, есть шанс накосячить с операторами присвоения и сравнения. if в нашем случае проверяет условие на истинность, переменные типа boolean могут принимать два значения 0 и 1. и по факту : Btn1State==LOW, это то же самое , что и Btn1State==0 и то же самое, что и !Btn1State с переменной Btn1_flag точно так же , это в случае с 0 верно и для случая с 1 : Btn1State==HIGH Btn1State==1 Btn1State */ if(!Btn1State&&!Btn1flag){ cycle_value++; Btn1flag=1; delay(10); } }Общий принцип должен быть понятен
Где-то читал, что использование внутренних подтягивающих резисторов не надежно .Не помню по какой причине.Всегда использую внешние.Работает 100 %.Но в любом случае спасибо за напоминание
Где-то читал, что использование внутренних подтягивающих резисторов не надежно .Не помню по какой причине.Всегда использую внешние.Работает 100 %.Но в любом случае спасибо за напоминание
Ненадежно по причине их, достаточно, высокого сопротивления, а значит, меньшей помехозащищенности. Но т.к., Вы, предложили близкие номиналы, то в чем разница?))))
Ну как сказать. Многие скорее накосячат при установке внешних резисторов.