Зависимость кнопок от кнопок

Duet
Offline
Зарегистрирован: 17.01.2015

Не соображу как сделать чтоб при переключении переключателя режимов оборотов происходило переключение оборотов согласно заданному. Сейчас, переключаю режим и не чего не происходит пока не нажмешь кнопку вкл/выкл.

Duet
Offline
Зарегистрирован: 17.01.2015
#include <stepperQ.h>
#include <class_BUTTON.h>

BUTTON BUTTON_01(6);
BUTTON BUTTON_02(8); 
BUTTON BUTTON_03(9); 
int ggg = 0;
byte tick_click_down_01 = 0; 

void setup () 
{
  int dir_pin = 4;
  int step_pin = 3;
  pinMode(4, OUTPUT);
  pinMode(3, OUTPUT);
  stepperq.init(dir_pin,step_pin);  
}
void loop() {
BUTTON_01.read(); 
BUTTON_02.read(); 
BUTTON_03.read(); 
if (BUTTON_01.click_up) {++tick_click_down_01; if (tick_click_down_01 == 3) {tick_click_down_01 = 2;}}
//режим 1
if (BUTTON_01.click_up && tick_click_down_01 == 1 && ggg == 1)
{
  stepperq.setMaxSpeed(2000);
  stepperq.setAcceleration(20000);
  stepperq.move(800000);
}  
if (BUTTON_01.click_up && tick_click_down_01 == 2 && ggg == 1)
{
  stepperq.move(80);
  tick_click_down_01 = 0; 
} 
//режим 2
if (BUTTON_01.click_up && tick_click_down_01 == 1 && ggg == 2)
{
  stepperq.setMaxSpeed(1000);
  stepperq.setAcceleration(20000);
  stepperq.move(800000);
}  
if (BUTTON_01.click_up && tick_click_down_01 == 2 && ggg == 2) 
{
  stepperq.move(80); 
  tick_click_down_01 = 0; 
}
if (BUTTON_02.click_up) {ggg = 1;} //переключатель режим 1
if (BUTTON_03.click_up) {ggg = 2;} //переключатель режим 2
    stepperq.start();
}

 

Alexey_Rem
Offline
Зарегистрирован: 09.09.2019

 А каким образом вы управляете вашим устройством если у вас ни одна нога не обозначена как input

Duet
Offline
Зарегистрирован: 17.01.2015

Alexey_Rem пишет:

 А каким образом вы управляете вашим устройством если у вас ни одна нога не обозначена как input

Это делает BUTTON BUTTON_01(6);

Alexey_Rem
Offline
Зарегистрирован: 09.09.2019

Простите не знал

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Duet пишет:
Зависимость кнопок от кнопок

Надо стараться иметь дело только с независимыми кнопками!

Rumata
Rumata аватар
Offline
Зарегистрирован: 29.03.2019

ЕвгенийП пишет:

Duet пишет:
Зависимость кнопок от кнопок

Надо стараться иметь дело только с независимыми кнопками!

Не стоит сепаратизм тут разводить)) Не те времена)))

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Времена всегда одинаковые.

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

Alexey_Rem пишет:

 А каким образом вы управляете вашим устройством если у вас ни одна нога не обозначена как input

Открою тайну.
Все регистры кнопок имеют при старте значение 0х00.
Так вот есть такой регистр DDRx (data direct register)- регистр направления передачи данных.
Если в бите привязанном к выводу стоит 0- то вывод будет принимать данные(вход), а если 1, то отдавать (выход).
Вопрос , почему бы не работать входу без его обозначения как вход ?

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

ЕвгенийП пишет:

Duet пишет:
Зависимость кнопок от кнопок

Надо стараться иметь дело только с независимыми кнопками!

все девки орут про независимость и Вы туда же )))

Morroc
Offline
Зарегистрирован: 24.10.2016

Эксплуатация кнопок кнопками не наблюдается ? А то может призрак бродит по ардуине ? )

Подарить кнопкам кота - будут сильные и независимые.

Duet
Offline
Зарегистрирован: 17.01.2015

Morroc пишет:
Эксплуатация кнопок кнопками не наблюдается ? А то может призрак бродит по ардуине ? ) Подарить кнопкам кота - будут сильные и независимые.

Да, эксплуатация кнопок кнопками, задача кнопками управлять режимами кнопок.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Назревает революционная ситуация

Duet
Offline
Зарегистрирован: 17.01.2015

Слепил как сумел. Почти все работает как задумано. Единственное что не работает так как задумано это переключатель оборотов, при переключении не каких изменений пока не нажмешь х- или х+, переменная ggg меняется но кнопкой не считывается.

Не сомневаюсь что это можно сделать в десять раз проще, но по другому не знаю как. Громко не смейтесь.

#include <stepperQ.h>
#include <class_BUTTON.h>

BUTTON BUTTON_01(6);
BUTTON BUTTON_02(8); 
BUTTON BUTTON_03(9); 
BUTTON BUTTON_04(14); //кнопка ручной
BUTTON BUTTON_05(15); //кнопка авто
BUTTON BUTTON_06(7);
int kkk = 0; //переменная ручной, авто режим
int ggg = 0; //переменная переключения оборотов
byte tick_click_down_01 = 0; 
byte tick_click_down_02 = 0;
void setup () 
{
  int dir_pin = 4;
  int step_pin = 3;
  pinMode(4, OUTPUT);
  pinMode(3, OUTPUT);
  stepperq.init(dir_pin,step_pin);  
}
void loop() {
BUTTON_01.read(); 
BUTTON_02.read(); 
BUTTON_03.read(); 
BUTTON_04.read();
BUTTON_05.read();
BUTTON_06.read();
if (BUTTON_01.click_up) {++tick_click_down_01; if (tick_click_down_01 == 3) {tick_click_down_01 = 2;}} 
//
if (BUTTON_01.click_up && tick_click_down_01 == 1 && ggg == 1 && kkk == 2)//переключатель оборотов режим 1, авто режим
{
  stepperq.setMaxSpeed(2000);
  stepperq.setAcceleration(20000);
  stepperq.move(800000);
}  
if (BUTTON_01.click_up && tick_click_down_01 == 2 && ggg == 1 && kkk == 2)
{
  stepperq.move(80);
  tick_click_down_01 = 0; 
} 
//
if (BUTTON_01.click_up && tick_click_down_01 == 1 && ggg == 2 && kkk == 2)//переключатель оборотов режим 2, авто режим
{
  stepperq.setMaxSpeed(1000);
  stepperq.setAcceleration(20000);
  stepperq.move(800000);
}  
if (BUTTON_01.click_up && tick_click_down_01 == 2 && ggg == 2 && kkk == 2) 
{
  stepperq.move(80); 
  tick_click_down_01 = 0; 
}
//
if (BUTTON_01.click_up && ggg == 1 && kkk == 1)//переключатель оборотов режим 1, ручной режим
{
  stepperq.setMaxSpeed(2000);
  stepperq.setAcceleration(20000);
  stepperq.move(800000);
}  
if (BUTTON_01.click_down && ggg == 1 && kkk == 1){stepperq.move(80); } 
//
if (BUTTON_01.click_up && ggg == 2 && kkk == 1)//переключатель оборотов режим 2, ручной режим
{
  stepperq.setMaxSpeed(1000);
  stepperq.setAcceleration(20000);
  stepperq.move(800000);
}  
if (BUTTON_01.click_down && ggg == 2 && kkk == 1) {stepperq.move(80);  }


//обратные обороты
if (BUTTON_06.click_up) {++tick_click_down_02; if (tick_click_down_02 == 3) {tick_click_down_02 = 2;}}
//
if (BUTTON_06.click_up && tick_click_down_02 == 1 && ggg == 1 && kkk == 2)//переключатель оборотов режим 1, авто режим
{
  stepperq.setMaxSpeed(2000);
  stepperq.setAcceleration(20000);
  stepperq.move(-800000);
}  
if (BUTTON_06.click_up && tick_click_down_02 == 2 && ggg == 1 && kkk == 2)
{
  stepperq.move(-80);
  tick_click_down_02 = 0; 
} 
//
if (BUTTON_06.click_up && tick_click_down_02 == 1 && ggg == 2 && kkk == 2)//переключатель оборотов режим 2, авто режим
{
  stepperq.setMaxSpeed(1000);
  stepperq.setAcceleration(20000);
  stepperq.move(-800000);
}  
if (BUTTON_06.click_up && tick_click_down_02 == 2 && ggg == 2 && kkk == 2) 
{
  stepperq.move(-80); 
  tick_click_down_02 = 0; 
}
//
if (BUTTON_06.click_up && ggg == 1 && kkk == 1)//переключатель оборотов режим 1, ручной режим
{
  stepperq.setMaxSpeed(2000);
  stepperq.setAcceleration(20000);
  stepperq.move(-800000);
}  
if (BUTTON_06.click_down && ggg == 1 && kkk == 1){stepperq.move(-80); } 
//
if (BUTTON_06.click_up && ggg == 2 && kkk == 1)//переключатель оборотов режим 2, ручной режим
{
  stepperq.setMaxSpeed(1000);
  stepperq.setAcceleration(20000);
  stepperq.move(-800000);
}  
if (BUTTON_06.click_down && ggg == 2 && kkk == 1) {stepperq.move(-80);  }

if (BUTTON_04.click_up){kkk = 1;}  //кнопка ручной режим
if (BUTTON_05.click_up){kkk = 2;} //кнопка авто  режим
 
if (BUTTON_02.click_up) {ggg = 1;} //переключатель оборотов режим 1
if (BUTTON_03.click_up) {ggg = 2;} //переключатель оборотов режим 2
    stepperq.start();
}

 

Duet
Offline
Зарегистрирован: 17.01.2015

Не пойму, почему, если переменная ggg=1 то функция motor_s1 или motor_s2 не запускаются, одна из кнопок BUTTON_02 или BUTTON_03 всегда замкнута, запускается только если переключить с BUTTON_02 на BUTTON_03 или на оборот. С нажатой кнопкой при установке переменной ggg=1 автоматически не запускаются функции.

#include <stepperQ.h>
#include <class_BUTTON.h>

BUTTON BUTTON_01(6);
BUTTON BUTTON_02(8); 
BUTTON BUTTON_03(9); 
volatile int ggg = 0; //переменная переключения оборотов
byte tick_click_down_01 = 0; 

void setup () 
{
  int dir_pin = 4;
  int step_pin = 3;
  pinMode(4, OUTPUT);
  pinMode(3, OUTPUT);
  stepperq.init(dir_pin,step_pin);  
}
void loop() {
BUTTON_01.read(); 
BUTTON_02.read(); 
BUTTON_03.read(); 
if (BUTTON_01.click_up) {++tick_click_down_01; if (tick_click_down_01 == 3) {tick_click_down_01 = 2;}} 
//
if (BUTTON_01.click_up && tick_click_down_01 == 1)//вкл 
{
  ggg=1;
}  
if (BUTTON_01.click_up && tick_click_down_01 == 2)// выкл
{
  ggg = 0;
  stepperq.move(80);
  tick_click_down_01 = 0; 
} 
if (BUTTON_02.click_up && ggg == 1) { motor_s1(); } //переключатель оборотов режим 1
  
if (BUTTON_03.click_up && ggg == 1) { motor_s2(); } //переключатель оборотов режим 2

    stepperq.start();   
}
void motor_s1() {

  stepperq.setMaxSpeed(2000);
  stepperq.setAcceleration(20000);
  stepperq.move(800000);}
  
void motor_s2() {
  stepperq.setMaxSpeed(1000);
  stepperq.setAcceleration(20000);
  stepperq.move(800000);}

 

Morroc
Offline
Зарегистрирован: 24.10.2016

Не знаток титановых велосипедов, но по смыслу BUTTON_02.click_up это отпускание кнопки, почему что то должно работать при нажатии ?

 

Duet
Offline
Зарегистрирован: 17.01.2015

Morroc пишет:

Не знаток титановых велосипедов, но по смыслу BUTTON_02.click_up это отпускание кнопки, почему что то должно работать при нажатии ?

 

И нажатие и отпускание одинаково, по изменению переменной не запускается, надо обязательно нажать или отпустить кнопку. Не пойму, это особенность велосипеда или stepperQ.

Morroc
Offline
Зарегистрирован: 24.10.2016

Особенности вашего кода и, возможно, велосипеда. У вас первые два условия как вообще должны работать (ну в смысле как вы сами думаете) ?

MaksVV
Offline
Зарегистрирован: 06.08.2015

Duet пишет:
И нажатие и отпускание одинаково, по изменению переменной не запускается, надо обязательно нажать или отпустить кнопку. Не пойму, это особенность велосипеда или stepperQ.

вместо stepperQ подставьте просто вывод в сериал и поймете как вел работает. 

Duet пишет:
Не пойму, почему, если переменная ggg=1 то функция motor_s1 или motor_s2 не запускаются, одна из кнопок BUTTON_02 или BUTTON_03 всегда замкнута, запускается только если переключить с BUTTON_02 на BUTTON_03 или на оборот. С нажатой кнопкой при установке переменной ggg=1 автоматически не запускаются функции.

У вас кнопка 02 или 03 всегда замкнута, соответственно вы мониторите событие, которое уже давно прошло (оно было один раз при замыкании или отпускании кнопки). вы пользуете первую версию велосипеда. Рекомендую юзать v14 . там есть метод state_button, который возвращает не событие нажатия или отпускания, а текущее состояние кнопки. и внимательно почитайте описание к библиотеке. 

а вообще как бэ проще digitalRead , не?

 

Duet
Offline
Зарегистрирован: 17.01.2015

Morroc пишет:
Особенности вашего кода и, возможно, велосипеда. У вас первые два условия как вообще должны работать (ну в смысле как вы сами думаете) ?

Кнопка 03 или 02 всегда нажата, нажатием кнопки 01 устанавливаю переменную в 1 и должно выполняться условие (BUTTON_02.click_up && ggg == 1).

Duet
Offline
Зарегистрирован: 17.01.2015

MaksVV пишет:

У вас кнопка 02 или 03 всегда замкнута, соответственно вы мониторите событие, которое уже давно прошло (оно было один раз при замыкании или отпускании кнопки). вы пользуете первую версию велосипеда. Рекомендую юзать v14 . там есть метод state_button, который возвращает не событие нажатия или отпускания, а текущее состояние кнопки. и внимательно почитайте описание к библиотеке. 

а вообще как бэ проще digitalRead , не?

 

Приблизительно понял, буду разбираться. Да, версия велосипеда одна из первых. Клапауций писал что digitalRead это топорно и не совсем эффективно.

Гриша
Offline
Зарегистрирован: 27.04.2014

Duet пишет:

 Клапауций писал что digitalRead это топорно и не совсем эффективно.

тут дело не в вере, а в понимании, что и зачем сам делаешь. Применительно к кнопкам это проблема дребезга.  

Duet
Offline
Зарегистрирован: 17.01.2015

Вот сейчас работает как задумано. 

#include <Button.h>
#include <Click.h>
#include <stepperQ.h>

Button BUTTON_01;
Button BUTTON_02;
Button BUTTON_03;

volatile int ggg = 0; //переменная переключения оборотов
byte tick_click_down_01 = 0; 

void setup () 
{
  BUTTON_01.button(6);
  BUTTON_02.button(8);
  BUTTON_03.button(9);
  int dir_pin = 4;
  int step_pin = 3;
  pinMode(4, OUTPUT);
  pinMode(3, OUTPUT);
  stepperq.init(dir_pin,step_pin);  
}
void loop() {
  BUTTON_01.read();
  BUTTON_02.read();
  BUTTON_03.read();
if (BUTTON_01.event_click_Dn()) {++tick_click_down_01; if (tick_click_down_01 == 3) {tick_click_down_01 = 2;}} 

if (BUTTON_01.event_click_Dn() && tick_click_down_01 == 1 )//вкл
{
  ggg=1;
}  
if (BUTTON_01.event_click_Dn() && tick_click_down_01 == 2)// выкл
{
  ggg = 0;
  stepperq.stop();
  tick_click_down_01 = 0; 
} 
if (BUTTON_02.state_button() && ggg == 1) { motor_s1(); } //переключатель оборотов режим 1
  
if (BUTTON_03.state_button() && ggg == 1) { motor_s2(); } //переключатель оборотов режим 2

    stepperq.start();    
}
void motor_s1() {

  stepperq.setMaxSpeed(2000);
  stepperq.setAcceleration(20000);
  stepperq.move(800000);}
  
void motor_s2() {
  stepperq.setMaxSpeed(1000);
  stepperq.setAcceleration(20000);
  stepperq.move(800000);}

 

Duet
Offline
Зарегистрирован: 17.01.2015

Спасибо MaksVV! Всем спасибо!

MaksVV
Offline
Зарегистрирован: 06.08.2015

пжалста. а строки 27-38 ? это же жесть . может вместо них сделать так? ggg сделать boolean

if (BUTTON_01.event_click_Dn()) 
{
  ggg = !ggg; 
  if (!ggg)stepperq.stop();
}

 

Duet
Offline
Зарегистрирован: 17.01.2015

MaksVV пишет:

пжалста. а строки 27-38 ? это же жесть . может вместо них сделать так? ggg сделать boolean

if (BUTTON_01.event_click_Dn()) 
{
  ggg = !ggg; 
  if (!ggg)stepperq.stop();
}

 

Да, действительно жесть, так куда лучше, в разы лучше) Этому кунг-фу с отрицанием я еще не научился. Использовал фрагменты кодов с форума.