класс титановый велосипед для тактовой кнопки.

vvadim
Offline
Зарегистрирован: 23.05.2012

дык наверно им так удобно

Клапауций 112
Offline
Зарегистрирован: 01.03.2017

vvadim пишет:

дык наверно им так удобно

им так неудобно и у них не получается использовать сущности "короткое и длинное нажатие" отдельно друг от друга.

vvadim
Offline
Зарегистрирован: 23.05.2012

в велосипеде не получается

при длинном проскакивает короткое)))

Клапауций 112
Offline
Зарегистрирован: 01.03.2017

vvadim пишет:

в велосипеде не получается

при длинном проскакивает короткое)))

только в велосипеде не получается? 
а, где получается? 
приведи один пример промышленной или любительской реализации нарушения причинно-следственной связи.
vvadim
Offline
Зарегистрирован: 23.05.2012

OneButton, ClickButton

Клапауций 112
Offline
Зарегистрирован: 01.03.2017

vvadim пишет:

OneButton, ClickButton

в OneButton заявлены функции одиночный клик, двойной клик, нажатие и удержание - т.е. нажатие и удержание без обработки одиночного клика невозможно физически.

в ClickButton пишут: 

Long clicks (hold button for one second or longer on last click):

Длинные клики (удерживайте кнопку в течение одной секунды или дольше при последнем нажатии):

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

*я просил подумать, а не бессмысленно тратить моё время.

vvadim
Offline
Зарегистрирован: 23.05.2012

да можете скока угодно философствовать, но у вас длинный клик срабатывает после одиночного, а там чётко работает без оного.

mobistrike
mobistrike аватар
Offline
Зарегистрирован: 19.08.2016

Клапауций 112 пишет:

vvadim пишет:

OneButton, ClickButton

 

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

 

А потом искать библиотеку отслеживающую длинный клик.

Выше сказали    -  OneButton, ClickButton и мой пост #401  .

ЗЫ. README.txt читал. 

Клапауций 112
Offline
Зарегистрирован: 01.03.2017

vvadim пишет:

да можете скока угодно философствовать, но у вас длинный клик срабатывает после одиночного, а там чётко работает без оного.

код примера, где короткий клик инвертирует один пин, а длинный - другой пин, можно посмотреть?

Клапауций 112
Offline
Зарегистрирован: 01.03.2017

mobistrike пишет:

А потом искать библиотеку отслеживающую длинный клик.

и ты мне пример напиши, пожалуйста.

vvadim
Offline
Зарегистрирован: 23.05.2012

Клапауций 112 пишет:

vvadim пишет:

да можете скока угодно философствовать, но у вас длинный клик срабатывает после одиночного, а там чётко работает без оного.

код примера, где короткий клик инвертирует один пин, а длинный - другой пин, можно посмотреть?

OneButton
короткое нажатие - клик
длительное нажатие - длинный клик

велосипед
короткое нажатие - клик
длительное нажатие - клик, потом длинный клик
 

 

Клапауций 112
Offline
Зарегистрирован: 01.03.2017

vvadim пишет:

OneButton
короткое нажатие - клик
длительное нажатие - длинный клик

велосипед
короткое нажатие - клик
длительное нажатие - клик, потом длинный клик
 

ну, напиши мне это в примере, что бы я не орал, что это невозможно теоретически.

if (короткое нажатие) digitalWrite(14, !digitalRead(14));
if (длинное  нажатие) digitalWrite(15, !digitalRead(15));

 

vvadim
Offline
Зарегистрирован: 23.05.2012

меня только это интересует

if (короткое нажатие) digitalWrite(14, HIGH);
if (длинное нажатие)  digitalWrite(14, LOW);

Клапауций 112
Offline
Зарегистрирован: 01.03.2017

vvadim пишет:

меня только это интересует

if (короткое нажатие) digitalWrite(14, HIGH);
if (длинное нажатие)  digitalWrite(14, LOW);

т.е. примера, подтверждающего

vvadim пишет:

OneButton
короткое нажатие - клик
длительное нажатие - длинный клик

не будет?

 

mobistrike
mobistrike аватар
Offline
Зарегистрирован: 19.08.2016

Клапауций 112 пишет:

mobistrike пишет:

А потом искать библиотеку отслеживающую длинный клик.

и ты мне пример напиши, пожалуйста.

Легко .

Пример с библиотекой ClickButton

 

if (button1.click == -1) {
 // Serial.println("long click");
  a0=a0+1;
  }
 
 if (button1.click == 1) {     
 // Serial.println("click");
   a1=a1+1;  
  } 

Код полностью - собирал товарищу треканальный коммутатор видеосигналов на LCD 1202. Упраляет микросхемами la7958n . Длинный клик - выбор источника видео(их 3). Короткий - коммутация между тремя телевизорами от выбранного источника. 

#include "lcd1202.h"
#include "ClickButton.h"

// the LED
//const int ledPin = 13;
//int ledState = 0;

// the Button
const int buttonPin1 = 2;
ClickButton button1(buttonPin1, LOW, CLICKBTN_PULLUP);

// Arbitrary LED function 
//int LEDfunction = 0;
LCD1202 lcd(6, 5, 4, 3);  // RST, CS, MOSI, SCK
int a1=1;
int b1=1;
int c1=1;
int aa=1;





void setup() {
 
lcd.Inicialize();  //Инициализация дисплея
lcd.Clear_LCD();  //Очистка дисплея
//pinMode(ledPin,OUTPUT);  

  // Setup button timers (all in milliseconds / ms)
  // (These are default if not set, but changeable for convenience)
  button1.maxPresses     = 3;    // max button multiclick count
  button1.debounceTime   = 20;   // Debounce timer in ms
  button1.multiclickTime = 250;  // Time limit for multi clicks
  button1.heldDownTime   = 1000; // time until "held-down clicks" register
//Serial.begin(9600);

// выходы на коммутатор
pinMode(7, OUTPUT);
pinMode(8, OUTPUT);

pinMode(9, OUTPUT);
pinMode(10, OUTPUT);

pinMode(11, OUTPUT);
pinMode(12, OUTPUT);

}

void loop() {
 button1.Update();
 



if (button1.click == -1) {
 // Serial.println("long click");
  aa=aa+1;
  }


if (aa>3) {     
 aa=1;     
  } 




//****************первый канал  
 if (aa==1) {     
 if (button1.click == 1) {     
   a1=a1+1;  

  } 
  if (a1>3){
  a1=1;
  }
  }
   
 //*****************************

 //второй канал 
 if (aa==2) {     
 if (button1.click == 1) {     
   b1=b1+1;  

  } 
  if (b1>3){
  b1=1;
  }
  }
//********************************

//третий канал  
 if (aa==3) {     
if (button1.click == 1) {     
   c1=c1+1;  

  } 
  if (c1>3){
  c1=1;
 }
  }
 //*********************************

//..**********************вывод на экран****************** 
lcd.Clear_LCD();  //Очистка дисплея
//***************************************** Рисуем по координатам скругленный прямоугольник *************************************************

lcd.drawRoundRect(1, 10, 30, 50, 10, 1);     //Рисуем скругленный прямоугольник по координатам x, y, высота, ширина, радиус скругления, цвет
lcd.drawRoundRect(32, 10, 30, 50, 10, 1);
lcd.drawRoundRect(63, 10, 30, 50, 10, 1);
//lcd.simb16x32(8, 17, 1, 8);            //Выводим в координаты x, y, цветом 1, цифру 
//lcd.simb16x32(39, 17, 1, 8);   
//lcd.simb16x32(70, 17, 1, 8);  
                            

//********************************************************************************



//****************первый канал  
 if (aa==1) {     
 //******************************************* Рисуем закрашенный, скругленный прямоугольник *************************************************

lcd.fillRoundRect(1, 10, 30, 50, 10, 1);     //Рисуем закрашенный, скругленный прямоугольник по координатам x, y, высота, ширина, радиус скругления, цвет
//lcd.fillRoundRect(32, 10, 30, 50, 10, 1);
//lcd.fillRoundRect(63, 10, 30, 50, 10, 1);
lcd.simb16x32(8, 17, 0, a1);            //Выводим в координаты x, y, цветом 1, цифру 
//lcd.simb16x32(8, 17, 1, 8);            //Выводим в координаты x, y, цветом 1, цифру 
lcd.simb16x32(39, 17, 1, b1);   
lcd.simb16x32(70, 17, 1, c1);  

//**************************************************************
  } 
  
   
 //*****************************

 //второй канал 
 if (aa==2) {     
 //******************************************* Рисуем закрашенный, скругленный прямоугольник *************************************************

//lcd.fillRoundRect(1, 10, 30, 50, 10, 1);     //Рисуем закрашенный, скругленный прямоугольник по координатам x, y, высота, ширина, радиус скругления, цвет
lcd.fillRoundRect(32, 10, 30, 50, 10, 1);
//lcd.fillRoundRect(63, 10, 30, 50, 10, 1);
//lcd.simb16x32(8, 17, 0, 8);            //Выводим в координаты x, y, цветом 1, цифру 
lcd.simb16x32(39, 17, 0, b1);   
lcd.simb16x32(8, 17, 1, a1);            //Выводим в координаты x, y, цветом 1, цифру 
//lcd.simb16x32(39, 17, 1, 8);   
lcd.simb16x32(70, 17, 1, c1);  
//**************************************************************
  }
//********************************

//третий канал  
 if (aa==3) {     
//******************************************* Рисуем закрашенный, скругленный прямоугольник *************************************************

//lcd.fillRoundRect(1, 10, 30, 50, 10, 1);     //Рисуем закрашенный, скругленный прямоугольник по координатам x, y, высота, ширина, радиус скругления, цвет
//lcd.fillRoundRect(32, 10, 30, 50, 10, 1);
lcd.fillRoundRect(63, 10, 30, 50, 10, 1);
//lcd.simb16x32(8, 17, 0, 8);            //Выводим в координаты x, y, цветом 1, цифру 
//lcd.simb16x32(39, 17, 0, 8);   
lcd.simb16x32(70, 17, 0, c1);   
lcd.simb16x32(8, 17, 1, a1);            //Выводим в координаты x, y, цветом 1, цифру 
lcd.simb16x32(39, 17, 1, b1);   
//lcd.simb16x32(70, 17, 1, 8);  
//**************************************************************
  }
 //*********************************
 if (a1==1){
 digitalWrite(7, LOW); 
 digitalWrite(8, LOW);
 }
 if (a1==2){
 digitalWrite(7, HIGH); 
 digitalWrite(8, LOW);
  
 }
 if (a1==3){
  digitalWrite(7, LOW); 
 digitalWrite(8, HIGH);
 
 }
if (b1==1){
 digitalWrite(9, LOW); 
 digitalWrite(10, LOW);
  
 }
 if (b1==2){
 digitalWrite(9, HIGH); 
 digitalWrite(10, LOW);
  
 }
 if (b1==3){
  digitalWrite(9, LOW); 
 digitalWrite(10, HIGH);
  
 }
 if (c1==1){
 digitalWrite(11, LOW); 
 digitalWrite(12, LOW);
  
 }
 if (c1==2){
 digitalWrite(11, HIGH); 
 digitalWrite(12, LOW);
  
 }
 if (c1==3){
  digitalWrite(11, LOW); 
 digitalWrite(12, HIGH);
  
 }


lcd.Update();




}

 

 

 

 

vvadim
Offline
Зарегистрирован: 23.05.2012
#include "OneButton.h"

OneButton start(4, true);

void setup() 
{
  pinMode(13, OUTPUT);
  start.attachClick(Click);
  start.attachLongPressStart(LongPressStart); 
}

void loop() 
{ 
  start.tick();
}

void Click()
{
  digitalWrite(13, HIGH);
}

void LongPressStart()
{
  digitalWrite(13, LOW);
}

 

Клапауций 112
Offline
Зарегистрирован: 01.03.2017

mobistrike пишет:

Легко .

ну, я же просил дать полный рабочий пример кода типа:

if (короткое нажатие) digitalWrite(14, !digitalRead(14));
if (длинное  нажатие) digitalWrite(15, !digitalRead(15));

а не выкладывать все свои исходники.

я не знаком с упомятутыми библиотеками - просто сделай рабочий пример, что бы в лупе было то, что я прошу.

Клапауций 112
Offline
Зарегистрирован: 01.03.2017

vvadim пишет:

#include "OneButton.h"

OneButton start(4, true);

void setup() 
{
  pinMode(13, OUTPUT);
  start.attachClick(Click);
  start.attachLongPressStart(LongPressStart); 
}

void loop() 
{ 
  start.tick();
}

void Click()
{
  digitalWrite(13, HIGH);
}

void LongPressStart()
{
  digitalWrite(13, LOW);
}

велосипед делает то же самое: кликом включает, удержанием выключает светодиод.

#include <Click.h>

Click test;

void setup() {
pinMode     (13, OUTPUT      ); // pin LED
pinMode     ( 3, INPUT_PULLUP); // pin button
test.init(!digitalRead(3));
}

void loop() {
test.read(!digitalRead(3), 20, 200, 1000, 1000);
if (test.event_click_Dn     ()) {digitalWrite(14, HIGH);}
if (test.event_inactivity_Dn()) {digitalWrite(14, LOW );}
}

но, я хочу убедиться, что OneButton не генерит клик перед длинным кликом - как мне это сделать? 

vvadim
Offline
Зарегистрирован: 23.05.2012
#include "OneButton.h"

OneButton start(4, true);

void setup() 
{
  pinMode(14, OUTPUT);
  pinMode(15, OUTPUT);
  start.attachClick(Click);
  start.attachLongPressStart(LongPressStart); 
}

void loop() 
{ 
  start.tick();
}

void Click()
{
  digitalWrite(14, !digitalRead(14));
}

void LongPressStart()
{
  digitalWrite(15, !digitalRead(15));
}

 

mobistrike
mobistrike аватар
Offline
Зарегистрирован: 19.08.2016

#include "ClickButton.h"

const int buttonPin1 = 2;
ClickButton button1(buttonPin1, LOW, CLICKBTN_PULLUP);
void setup() {
 
  // Setup button timers (all in milliseconds / ms)
  // (These are default if not set, but changeable for convenience)
  button1.maxPresses     = 3;    // max button multiclick count
  button1.debounceTime   = 20;   // Debounce timer in ms
  button1.multiclickTime = 250;  // Time limit for multi clicks
  button1.heldDownTime   = 1000; // time until "held-down clicks" register

pinMode(14, OUTPUT);
pinMode(15, OUTPUT);
digitalWrite(14,LOW);
digitalWrite(15,LOW);
}

void loop() {
 button1.Update();

if (button1.click == -1) {
 digitalWrite(15, !digitalRead(15));
  }
 
 if (button1.click == 1) {     
digitalWrite(14, !digitalRead(14));

  } 
 

}

 

Клапауций 112
Offline
Зарегистрирован: 01.03.2017
ответ для mobistrike:
библиотека ClickButton не обрабатывает событие отпускания, которое происходит после события неактивности нажатой кнопки.
если ты считаешь такой дизайн поведения нормальным, то ок.
в титановом велосипеде дизайн поведения кнопки всегда будет соответствовать логике причинно-следственных связей, а не чем-либо иным.
Клапауций 112
Offline
Зарегистрирован: 01.03.2017
ответ для vvadim:
предоставленный тобой пример обрабатывает отпускание, а не нажатие кнопки.
 
Клапауций 112
Offline
Зарегистрирован: 01.03.2017

тема ереси закрыта.

источник обнаружен.

vosara
Offline
Зарегистрирован: 08.02.2014

<< ну, напиши мне это в примере, что бы я не орал, что это невозможно теоретически.

1 if (короткое нажатие) digitalWrite(14, !digitalRead(14));
2 if (длинное  нажатие) digitalWrite(15, !digitalRead(15));

 >>

Не знаю может тоже ЕРЕСЬ, но посмотрите и на такое решение. Здесь присутствует антидребезг и пины не 14, 15 а 10, 11 а так выполняет то что Вы заявили

#define button1 3
bool kn1;
bool f_kn1;
bool f_push;
unsigned long currentTime1;
unsigned long currentTime2;
void setup()
{
  Serial.begin(9600);
  pinMode(button1, INPUT_PULLUP);
  pinMode(10, OUTPUT);
  pinMode(11, OUTPUT);
}

void loop()
{
  static bool f_d;
  
  if (!digitalRead(button1) && !f_kn1)
  {
    currentTime1 = millis();
    f_kn1 = 1;
  }
  if ( digitalRead(button1))
  {
    kn1 = 0;
    f_kn1 = 0;
    f_d = 0;
    //f_push = 0;
  }

  if (f_kn1 && millis() - currentTime1 >= 100)
  {
    kn1 = 1;
    if (!f_push && !f_d) {
      currentTime2 = millis();
      f_push = 1;
    }
  }

  if (f_push && !kn1 && millis() - currentTime2 < 500) {
    digitalWrite(10, !digitalRead(10));
    f_push = 0;
  }
  else if (kn1 && !f_d && millis() - currentTime2 > 500) {
    digitalWrite(11, !digitalRead(11));
    f_d = 1;
    f_push = 0;
  }
}

 

Клапауций 112
Offline
Зарегистрирован: 01.03.2017

vosara пишет:

Не знаю может тоже ЕРЕСЬ, но посмотрите и на такое решение.

тоже самое - событие отпускания и событие удержания кнопки.

сам код не есть ересь - если тебе так нужно, так и должно быть.
 
ересью являтеся утверждение, что возможно произвести что-то с кнопкой, предварительно её не нажав и не произвести отпускание в конце.
можно не использовать нажатие и блокировать отпускание - всё.
 
но... нет смысла вписывать все эти оригинальные танцы с бубном в библиотеку потому, что когда тебе понадобится всегда обрабатывать события отпускания кнопки, то тебя удивит странное поведение кнопки - нажал, подержал и не отжалось. О_О
 
 
 
vvadim
Offline
Зарегистрирован: 23.05.2012

Клапауций 112 пишет:

ответ для vvadim:
предоставленный тобой пример обрабатывает отпускание, а не нажатие кнопки.
 

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

mobistrike
mobistrike аватар
Offline
Зарегистрирован: 19.08.2016

Клапауций 112 пишет:

ответ для mobistrike:
библиотека ClickButton не обрабатывает событие отпускания, которое происходит после события неактивности нажатой кнопки.
если ты считаешь такой дизайн поведения нормальным, то ок.
в титановом велосипеде дизайн поведения кнопки всегда будет соответствовать логике причинно-следственных связей, а не чем-либо иным.

Полностью солидарен с vvadim !

Библиотека ClickButton выполняет то что мне нужно , а что  она не обрабатывает мне по барабану.

Никаких сбоев в ее работе не наблюдал.

Засим откланиваюсь.

 

Клапауций 112
Offline
Зарегистрирован: 01.03.2017

это какой-то цирк с конями. :D

#include <Click.h>

Click test;

void setup() {
pinMode     (14, OUTPUT      ); // pin LED
pinMode     (15, OUTPUT      ); // pin LED
pinMode     ( 3, INPUT_PULLUP); // pin button
test.init(!digitalRead(3));
}

void loop() {
test.read(!digitalRead(3), 20, 200, 1000, 1000);
static boolean flag_event_click_Up = 1;
if (test.event_click_Dn     ()                       ) {flag_event_click_Up = 1;                                    }
if (test.event_click_Up     () && flag_event_click_Up) {                         digitalWrite(14, !digitalRead(14));}
if (test.event_inactivity_Dn()                       ) {flag_event_click_Up = 0; digitalWrite(15, !digitalRead(15));}
}
да, да - титановый велосипед не делает то, что вам нужно. 
то, что вам нужно, вы будете делать сами. :D
Клапауций 112
Offline
Зарегистрирован: 01.03.2017

https://github.com/Klapautsiy/titanium-bicycle-for-button/wiki

библиотека позволяет оперировать следующими переменными-производными логического состояния кнопки по времени:

  • обработанное фильтром дребезга состояние кнопки
  • состояние таймера неактивности ненажатой кнопки
  • состояние таймера неактивности нажатой кнопки
  • событие отпускания
  • событие нажатия
  • событие двойного щелчка
  • событие неактивности ненажатой кнопки
  • событие неактивности нажатой кнопки
Илья73
Offline
Зарегистрирован: 06.09.2013

[quote=Клапауций 112]

Спасибо за велосипед, хорошо идет!

Разобрался.

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

 

Клапауций 112
Offline
Зарегистрирован: 01.03.2017

Илья73 пишет:

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

исходниках комментов более, чем достаточно.

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

файл README.txt опять же.

Илья73
Offline
Зарегистрирован: 06.09.2013

Да все понятно когда разберешься.

Просто проверил каждый пример и подписал коменты под себя, вроде того что

   - задаем время длительного удержания нажатой кнопки

   - если нажать кнопку и удерживать длительно, то делаем......

Клапауций 112
Offline
Зарегистрирован: 01.03.2017
duration_inactivity_Up(time) - передача длительности таймера неактивности ненажатой кнопки.
duration_inactivity_Dn(time) - передача длительности таймера неактивности   нажатой кнопки.
event_inactivity_Up() - событие неактивности ненажатой кнопки
event_inactivity_Dn() - событие неактивности   нажатой кнопки

файл README.txt

плюс примеры, плюс имена функций такие, что очень сложно не понять.