Запуск программы по нажатию кнопки

Ko1uH
Offline
Зарегистрирован: 28.10.2019
Пытался сделать так, чтобы программа начала выполняться при нажатии двух кнопок: одна задает количество циклов, другая разрешает выполнение это самого цикла.Получилось как- то так. Ничего не работает, возможно. вы сможете помочь. Заранее спасибо

#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;

}

 

 

b707
Offline
Зарегистрирован: 26.05.2017

давайте взглянем кусок кода начиная с 56 строчки

buttons1 = digitalRead ( buttonSPin );
delay(10);
buttons2 = digitalRead ( buttonSPin );


if(buttons1==buttons2){
buttons_Status=HIGH;}

видимо с целью борьбы с дребезгом вы читаете кнопку дважды с некоторым перерывом. А дальше у вас логическая ошибка - из того, что оба чтения кнопки вернули один и тот же результат (

if(buttons1==buttons2){

вовсе не следует, что этот результат - HIGH. Если оба чтения вернули LOW - условие все равно выполнится

Ko1uH
Offline
Зарегистрирован: 28.10.2019

Если я вас правильно понял, то в итоге должно было получиться что-то вроде этого:

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;}
}

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

b707
Offline
Зарегистрирован: 26.05.2017

Ko1uH пишет:

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

в чем заключается то, что программа не делает то, что вы хотите?

Ko1uH
Offline
Зарегистрирован: 28.10.2019

Я хочу, чтобы количество циклов, по которым программа указывалось количеством нажатий кнопки, но, чтобы, цикл этот начал выполняться при нажатии другой. Но, почему-то, программа не реагирует ни на какие мои действия с кнопками. 

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Если сам писал, то, скорее всего, в логике ошибка. Чтобы понять это, просто опиши логику работы программы обычным человеческим языком и сравни с тем, что имеется. К примеру, чтобы при нажатии кнопки зажечь светодиод: Если кнопка нажата, то зажигаем светодиод (это для примера). 

b707
Offline
Зарегистрирован: 26.05.2017

Ko1uH пишет:

Но, почему-то, программа не реагирует ни на какие мои действия с кнопками. 

а кнопки как подключены?

Ko1uH
Offline
Зарегистрирован: 28.10.2019

Кнопка разрешения работы цикла и кнопка, регулирующая количество циклов, подключены к 2 и 5 пину соответственно. С других концов к 5в  .Не уверен, что это правильно. Все-таки, я крайне неопытен во всем этом.

b707
Offline
Зарегистрирован: 26.05.2017

вам нужно подключить кнопки с подтяжкой, иначе все будет работать очень нестабильно. Почитайте вот эту тему - хотя бы первые 5-10 сообщений

http://arduino.ru/forum/programmirovanie/rabota-s-knopkami-v-pomoshch-novichku

Calmness
Offline
Зарегистрирован: 29.10.2019

Мысли :

1 . 10 мс при опросе кнопок  наверно маловато

2 . Нужно поправить код (  в 49 ну и в 62 соответственно строке  HIGH  поменять на  button2 )

3.вызывает сомнения a = a++ ( 52 строчка ) . Наверно надо или а = а + 1 ; или а++ ;

Calmness
Offline
Зарегистрирован: 29.10.2019

кроме того поставить подтягивающие резисторы 10-20 кОм между пином и минусом ( соответственно 2 резистора с 2 и 5 пина на минус)

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

Calmness пишет:

кроме того поставить подтягивающие резисторы 10-20 кОм между пином и минусом ( соответственно 2 резистора с 2 и 5 пина на минус)

Или открыть для себя заклинание - INPUT_PULLUP (хнопочки перевернуть придется).

Kakmyc
Offline
Зарегистрирован: 15.01.2018

Слишком много лишнего.
Следует сделать , что то типа этого:

boolean Btn1_flag;//для работы по условию одно нажатие=одно де ствие

if(digitalRead(button1pin)&&!Btn1_flag){a++;Btn1_flag=1;delay(10);}
if(!digitalRead(button1pin))Btn1_flag=0;

100500переменных там не нужны

Kakmyc
Offline
Зарегистрирован: 15.01.2018
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);
    }
    

}

 

 

Общий принцип должен быть понятен

 

Calmness
Offline
Зарегистрирован: 29.10.2019

 Где-то читал, что использование внутренних подтягивающих резисторов не надежно .Не помню по какой причине.Всегда использую внешние.Работает 100 %.Но в любом случае спасибо за напоминание

 

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

Calmness пишет:

 Где-то читал, что использование внутренних подтягивающих резисторов не надежно .Не помню по какой причине.Всегда использую внешние.Работает 100 %.Но в любом случае спасибо за напоминание

Ненадежно по причине их, достаточно, высокого сопротивления, а значит, меньшей помехозащищенности. Но т.к., Вы, предложили близкие номиналы, то в чем разница?))))

astwo
Offline
Зарегистрирован: 10.07.2019

Ну как сказать. Многие скорее накосячат при установке внешних резисторов.