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

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

ну, шо? будет список нереализованных искаропки функций и улучшения сусчествующих?

*отож. звездоболы бессмысленные.

Дим
Offline
Зарегистрирован: 05.05.2017

Листать тему в которой более половины сообщений не относитсяя к теме - не состовляет удовольствия. Автору, имеющему свой сайт, следовало бы всё подробно разжевать хотя бы на нём. Или здесь в первом сообщении, а не тянутьрезину на 15 листов

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

Дим пишет:

Листать тему в которой более половины сообщений не относитсяя к теме - не состовляет удовольствия. Автору, имеющему свой сайт, следовало бы всё подробно разжевать хотя бы на нём. Или здесь в первом сообщении, а не тянутьрезину на 15 листов

это гитхаб имеет мой сайт. https://klapautsiy.github.io
каждый может себе за пять минут написать страничку и залить ея на https://pages.github.com/ 
в пакете с библиотекой есть файлы описалова на ангельском и русском языке.
есть краткий WIKI
есть примеры
 
вот у тебя лично есть вопросы по существу?
нет.
потому, что ты в глаза библиотеки не видел, описалово и вики не читал, то мнение имеешь.
bwn
Offline
Зарегистрирован: 25.08.2014

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

это гитхаб имеет мой сайт. https://klapautsiy.github.io
каждый может себе за пять минут написать страничку и залить ея на https://pages.github.com/ 
в пакете с библиотекой есть файлы описалова на ангельском и русском языке.
есть краткий WIKI
есть примеры
 
вот у тебя лично есть вопросы по существу?
нет.
потому, что ты в глаза библиотеки не видел, описалово и вики не читал, то мнение имеешь.

Клапа, иди накати пивка или чего покрепче, да пошли всех на этот, как его,  суд. Вчувствующую, с даром прорицания, кнопку еще не скоро придумают. Дай людям помечтать.

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

 Давича собирал кодовый замок на четырех кнопках т.к. 4 шт проще паять и разнес их под 4 пальца для удобства нажатий :))))) так в замке реализовал алгоритм распознавания:  одновременного нажатия нескольких кнопок, удержание кнопки, короткое и  двойное нажатие... потом, за неудобством выкинул удержание и двойное нажатие  -  товарищи попросили, им трудно было запомнить :))))))))))))))))))  и все это катается на первом велосипеде и  delay без delay() .  Я это написал к тому, что я  знал чего хочу, брал кубики готового конструктора и складывал.  А этот срач на 15 страниц образовался из-за того, что многие хотят дом, а сами даже не представляют что такое кирпич и чем его можно заменить. 

Р.С.  хватит цапаться  и оффтопить ,  достало пустопорожнее словоизлияние, оставьте страничку для дела.

Р.Р.С.  Мир вашему дому и этому топику :))))))))))))))))))))

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

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

Гриша, ты всех запутал.

а, как же глас обладателей альтернативного мнения, готовых продать свою задницу за возможность одной кнопкой управлять Вселенной?

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

sirota пишет:

Я предлагаю стопе. Ибо оффтоп. библа приятна и очень полезна. Есть куча функционала которая она из коробки не поддерживает, но... какие-то плюшки можно и обсудить, но опять же не терки без существа.

в очередной раз поддержу ползателя форума под ником sirota:

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

- предлагайте сделать более лучшим имеющийся.

Спасибо. О_О

https://klapautsiy.github.io

NM
NM аватар
Offline
Зарегистрирован: 17.02.2018

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

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

Спасибо! Есть одно пожелание для титанового велосипеда: переключатель логического уровня сигнала кнопки.

Так как кнопки могут как подтягивать сигнал к питанию, так и стягивать к земле, эта функция будет очень удобна для новичков и ленетяев.

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

RTFM

pullUp() - подтяжка пинов кнопок к Vcc
pullDn() - подтяжка пинов кнопок к GND

для увеличения помехозащищённости в режиме pullUp пины кнопок рекомендуется подключать
через резисторы 10KOm к Vcc

в режиме pullDn подключение пинов кнопок через резисторы 10KOm к GND обязательно

NM
NM аватар
Offline
Зарегистрирован: 17.02.2018

Спасибо за ответ! Разобрался благодаря вам, можно было бы оформить это так: 

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

Удачи! :)

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

NM пишет:

Спасибо за ответ! Разобрался благодаря вам, можно было бы оформить это так: 

нужно было бы послать тебя на Север. О_О

NM
NM аватар
Offline
Зарегистрирован: 17.02.2018

И за что нужно было бы послать меня на север, странный ты человек?

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

NM пишет:

И за что нужно было бы послать меня на север, странный ты человек?

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

Я уверен, что ты, дорогой человек, встал сегодня не с той ноги.

Я ступил и признаю это. Ступил я после того, как в моем коде титановый велосипед не стал работать с подтяжкой на питание, но работал с подтяжкой на землю. После того, как я разобрался, я написал об этом с приставокой "можно было бы".

Но все это ни разу не повод посылать кого угодно на север, учти. Спасибо за код, он действительно хорош!

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

NM пишет:

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

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

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

NM
NM аватар
Offline
Зарегистрирован: 17.02.2018

Извини, не хотел тебя обидеть. Кстати, я и не знал, что где-то на 15 страницах темы есть более совершенный код! 

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

NM пишет:

Извини, не хотел тебя обидеть. Кстати, я и не знал, что где-то на 15 страницах темы есть более совершенный код! 

ты прочитал первую страницу.
когда тебе зацитировали файл описалова, ты начал читать дальше, но не угомонился и продолжил умничать.
на последней странице последняя версия - это должно быть очевидно.
Клапауций 567
Offline
Зарегистрирован: 17.02.2018

сайтик библиотеки "титановый велосипед для кнопки" находится здесь: https://klapautsiy.github.io

вопросы и хотелки писать сюда: https://github.com/Klapautsiy/titanium-bicycle-for-button/issues/new

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

Клапа, здоров! Слушай, можно твою библу прикрутить к сенсорным кнопкам тача? Чето с ходу не нашел. Типа передавать библиотеке аппаратное состояние кнопки, а дальше все как обычно.

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

MaksVV пишет:
Клапа, здоров! Слушай, можно твою библу прикрутить к сенсорным кнопкам тача? Чето с ходу не нашел.

где искал и где не нашёл?

MaksVV пишет:
Типа передавать библиотеке аппаратное состояние кнопки, а дальше все как обычно.

типа меняешь digitalRead на тачRead в примере Click.ino и дальше всё, как обычно.

 

 

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

читал Readme , поюзал немного поиск по форуму, а про примеры то и забыл. 

Клапауций 400 пишет:
типа меняешь digitalRead на тачRead в примере Click.ino и дальше всё, как обычно.

Ок, пасиб! должно получиться.

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

сделал сенсорные кнопки так. Может корявенько конечно исполнено, но функционирует пока отлично. Единственное, не смог нормально присваивать событие event_inactivity_Up(i) к конкретной кнопке (отрабатывает после отпускания любой из кнопок), но я этим не пользуюсь. Либо надо это всё манстырить не к Click.h , а  к оболочке Button.h, но там нет в открытом доступе входа аппаратного состояния кнопок. 

/////////////Ниже библиотеки экрана и тача

#include <Adafruit_GFX.h>
#include <UTFTGLUE.h>    

UTFTGLUE myGLCD(0x7783, A2, A1, A3, A4, A0);

#include <stdint.h>
#include "TouchScreen.h"


#define YP A1  // must be an analog pin, use "An" notation!
#define XM A2  // must be an analog pin, use "An" notation!
#define YM 7   // can be a digital pin
#define XP 6   // can be a digital pin

#define MINPRESSURE 10
#define MAXPRESSURE 1000

TouchScreen myTouch = TouchScreen(XP, YP, XM, YM, 300);
TSPoint p;

///////////////выше библиотеки экрана и тача


#include <Click.h>
struct type_click in_Click;
Click test;

bool SensButton_PRESSED = 0;    // аппаратное состояние сенсорной кнопки
unsigned long timerButton = 0;  // стабилизирующий таймер сенсорной кнопки
uint8_t Button_N = 0;           // программный номер сенсорной кнопки

bool Button_N_timerenabled = 0;   // для таймера сброса программного номера кнопки
unsigned long timerButton_N = 0;  // для таймера сброса программного номера кнопки

// дефайним названия кнопок на программные номера кнопок 

#define NEXT 1
#define OK   2

void setup()
{

in_Click.timestamp_system       =  millis();
in_Click.state_hard             = SensButton_PRESSED;
in_Click.duration_bounce        =   50;
in_Click.duration_click_Db      =  250;
in_Click.duration_inactivity_Up = 5000;
in_Click.duration_inactivity_Dn = 1000;
in_Click.duration_press         =  500;

test.reset(in_Click);

 
Serial.begin (9600);

  myGLCD.InitLCD();
  myGLCD.clrScr();
  myGLCD.setFont(BigFont);
  myGLCD.setTextSize(2);

  // нарисуем кнопки 
  myGLCD.setColor (255,255,255);
  myGLCD.print("NEXT", 227, 47);
  myGLCD.drawRect (210, 30, 290, 80);
  myGLCD.print("OK", 240, 147);
  myGLCD.drawRect (210, 130, 290, 180);
  

  
    pinMode(YP, OUTPUT);      //restore shared pins
    pinMode(XM, OUTPUT);
    digitalWrite(YP, HIGH);   //because TFT control pins
    digitalWrite(XM, HIGH);
  
}

void loop()
{ 
readResistiveTouch();          // опрос тача

in_Click.timestamp_system =  millis();
in_Click.state_hard       = SensButton_PRESSED;
test.read(in_Click);


// если давим на сенсорную кнопку "NEXT"

if (test.event_click_Db     () == 1 && Button_N == NEXT) {Serial.println ("Double click NEXT");}
if (test.event_press_short  () == 1 && Button_N == NEXT) {Serial.println ("Short click NEXT"); }
if (test.event_press_long   () == 1 && Button_N == NEXT) {Serial.println ("Long click NEXT"); }
if (test.event_inactivity_Dn   () == 1 && Button_N == NEXT) {Serial.println ("Inactivity DN NEXT"); }

// если давим на сенсорную кнопку "OK"
if (test.event_click_Db     () == 1 && Button_N == OK) {Serial.println ("Double click OK");}
if (test.event_press_short  () == 1 && Button_N == OK) {Serial.println ("Short click OK"); }
if (test.event_press_long   () == 1 && Button_N == OK) {Serial.println ("Long click OK"); }
if (test.event_inactivity_Dn   () == 1 && Button_N == OK) {Serial.println ("Inactivity DN OK"); }


 
if (test.event_inactivity_Up   () == 1 ) {Serial.println ("Inactivity UP ALL BUTTONS"); }


 
}




void readResistiveTouch(void)
{
    p = myTouch.getPoint(); // опрос тача


if (p.z > MINPRESSURE && p.z < MAXPRESSURE) { //если нажали на тач
     
//если это область кнопки "1"           
     if (p.x>=647 && p.x <= 840 && p.y>=245 && p.y <= 400)  Button_N=1;   //присвоим этот номер переменной

//если это область кнопки "2"           
else if (p.x>=647 && p.x <= 840 && p.y>=580 && p.y <= 740)  Button_N=2;   //присвоим этот номер переменной
     
    SensButton_PRESSED = 1;       //аппаратное состояние - делаем "нажато"
    timerButton = millis();       //включаем таймер стабилизации на 5мс
    
    Button_N_timerenabled = 1;    //активируем таймер на сброс программного номера кнопки
    timerButton_N = millis();     //активируем таймер на сброс программного номера кнопки
                                             }

 //ниже отпускаем аппаратное состояние через 5мс. (без этого коряво работало)
  else if (SensButton_PRESSED && millis()- timerButton>5) SensButton_PRESSED = 0; 
 
 //ниже сбрасываем программный номер кнопки после подавления дребезга+10мс
  else if (Button_N_timerenabled && millis()- timerButton_N>in_Click.duration_bounce+10) {Button_N = 0; timerButton_N = 0;}
  

}

 

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

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

к Button.h ты ничего не прикрутишь - это оболочка для массива экземпляров Click.h аппаратно прикрученных к пинам.

ven-til
Offline
Зарегистрирован: 13.02.2018

Клапауций 567,  спасибо за библиотеку.

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

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

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

к Button.h ты ничего не прикрутишь - это оболочка для массива экземпляров Click.h аппаратно прикрученных к пинам.

может и есть, но твои шлюхи на титановом велосипеде покруче будут)

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

MaksVV пишет:

может и есть, но твои шлюхи на титановом велосипеде покруче будут)

ок.

но, мне кажется, что достаточно было сделать in_Click.state_hard       = SensButton_PRESSED; а всё отсальное не нужно.

хотя, возможно, просто тачкнопка шумит, поэтому тебе приходится её тупить. О_О

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

может и шумит, дисплей самый дешевый китайский а потому и вредный  2.4 McuFriend . Тут уже не до блекджека  со шл... кое как вообще рабочую библиотеку нашел. Когда добавил эти 5мс все заработало отлично. Тоже не понял почему, но без задержки этой не работает. все остальное в качестве примера, вдруг кому пригодится. Наример при нажатии на кнопку она меняет цвет. Немного причесал код, сделал чтобы event_inactivity_Up(i) отрабатывало по конкретной кнопке, также можно это событие в целом после касания в любом месте тача получить. 

/////////////Ниже библиотеки экрана и тача

#include <Adafruit_GFX.h>
#include <UTFTGLUE.h>    

UTFTGLUE myGLCD(0x7783, A2, A1, A3, A4, A0);

#include <stdint.h>
#include "TouchScreen.h"


#define YP A1  // must be an analog pin, use "An" notation!
#define XM A2  // must be an analog pin, use "An" notation!
#define YM 7   // can be a digital pin
#define XP 6   // can be a digital pin

#define MINPRESSURE 10
#define MAXPRESSURE 1000

TouchScreen myTouch = TouchScreen(XP, YP, XM, YM, 300);
TSPoint p;

///////////////выше библиотеки экрана и тача


#include <Click.h>
struct type_click in_Click;
Click test;

bool SensButton_PRESSED = 0;    // аппаратное состояние сенсорной кнопки
unsigned long timerButton = 0;  // стабилизирующий таймер сенсорной кнопки
uint8_t Button_N = 0;           // программный номер сенсорной кнопки
uint8_t inactivUpButton_N = 0;  // программный номер сенсорной кнопки для отработки события неактивности отжатой кнопки

bool Button_N_timerenabled = 0;   // для таймера сброса программного номера кнопки
unsigned long timerButton_N = 0;  // для таймера сброса программного номера кнопки

// дефайним названия кнопок на программные номера кнопок 

#define NEXT 1
#define OK   2

void setup()
{

in_Click.timestamp_system       =  millis();
in_Click.state_hard             = SensButton_PRESSED;
in_Click.duration_bounce        =   50;
in_Click.duration_click_Db      =  250;
in_Click.duration_inactivity_Up = 5000;
in_Click.duration_inactivity_Dn = 1000;
in_Click.duration_press         =  500;

test.reset(in_Click);

 
Serial.begin (9600);

  myGLCD.InitLCD();
  myGLCD.clrScr();
  myGLCD.setFont(BigFont);
  myGLCD.setTextSize(2);

  // нарисуем кнопки 
  myGLCD.setColor (255,255,255);
 printNEXTbutton();
 printOKbutton();
  

  
    
  
}

void loop()
{ 
readResistiveTouch();          // опрос тача

// ниже опрос велосипеда
in_Click.timestamp_system =  millis(); 
in_Click.state_hard       = SensButton_PRESSED;
test.read(in_Click);


// ~~~~~~~~~~~~~~~~~~~~~~~~~если давим на сенсорную кнопку "NEXT"


if (test.event_click_Dn     () == 1 && Button_N == NEXT) {// на этом событии, например, подкрасим кнопку
  myGLCD.setColor (255,0,0); printNEXTbutton();}

if (test.event_click_Up     () == 1 && Button_N == NEXT) {// на этом событии, например, вернём кнопке цвет
  myGLCD.setColor (255,255,255); printNEXTbutton();}

if (test.event_click_Db     () == 1 && Button_N == NEXT) {Serial.println ("Double click \"NEXT\"");}
if (test.event_press_short  () == 1 && Button_N == NEXT) {Serial.println ("Short click \"NEXT\""); }
if (test.event_press_long   () == 1 && Button_N == NEXT) {Serial.println ("Long click \"NEXT\""); }
if (test.event_inactivity_Dn   () == 1 && Button_N == NEXT) {Serial.println ("Inactivity DN \"NEXT\""); }

// ниже событие отработает, если после отпускания кнопки не задевать остальную (кроме данной кнопки) область тача;
// если после отпускания кнопки снова задеть область этой кнопки просто сбросится таймер неактивности, но событие отработает
if (test.event_inactivity_Up   () == 1 && inactivUpButton_N == NEXT) {Serial.println ("Inactivity UP \"NEXT\""); }





// ~~~~~~~~~~~~~~~~~~~~~~~~~ если давим на сенсорную кнопку "OK"

if (test.event_click_Dn     () == 1 && Button_N == OK) {// на этом событии, например, подкрасим кнопку
  myGLCD.setColor (0,255,0); printOKbutton();}

if (test.event_click_Up     () == 1 && Button_N == OK) {// на этом событии, например, вернём кнопке цвет
  myGLCD.setColor (255,255,255); printOKbutton();}


if (test.event_click_Db     () == 1 && Button_N == OK) {Serial.println ("Double click \"OK\"");}
if (test.event_press_short  () == 1 && Button_N == OK) {Serial.println ("Short click \"OK\""); }
if (test.event_press_long   () == 1 && Button_N == OK) {Serial.println ("Long click \"OK\""); }
if (test.event_inactivity_Dn   () == 1 && Button_N == OK) {Serial.println ("Inactivity DN \"OK\""); }

// ниже событие отработает, если после отпускания кнопки не задевать остальную (кроме данной кнопки) область тача;
// если после отпускания кнопки снова задеть область этой кнопки просто сбросится таймер неактивности, но событие отработает
if (test.event_inactivity_Up   () == 1 && inactivUpButton_N == OK) {Serial.println ("Inactivity UP \"OK\""); }




if (test.event_click_Up () == 1) inactivUpButton_N = Button_N; // записываем последний программный номер кнопки
                                                               // для отработки события неактивности отжатой кнопки


if (test.event_inactivity_Up   () == 1) {} // это событие отработает после последнего касания тача и конца таймера неактивности


}




void readResistiveTouch(void)
{
    p = myTouch.getPoint(); // опрос тача
    pinMode(YP, OUTPUT);      //restore shared pins
    pinMode(XM, OUTPUT);
    digitalWrite(YP, HIGH);   //because TFT control pins
    digitalWrite(XM, HIGH);

if (p.z > MINPRESSURE && p.z < MAXPRESSURE) { //если нажали на тач
     
//если это область кнопки "1"           
     if (p.x>=647 && p.x <= 840 && p.y>=245 && p.y <= 400)  Button_N=1;   //присвоим этот номер переменной

//если это область кнопки "2"           
else if (p.x>=647 && p.x <= 840 && p.y>=580 && p.y <= 740)  Button_N=2;   //присвоим этот номер переменной
     
    SensButton_PRESSED = 1;       //аппаратное состояние - делаем "нажато"
    timerButton = millis();       //включаем таймер стабилизации на 5мс
    
    Button_N_timerenabled = 1;    //активируем таймер на сброс программного номера кнопки
    timerButton_N = millis();     //активируем таймер на сброс программного номера кнопки
                                             }

 //ниже отпускаем аппаратное состояние через 5мс. (без этого коряво работало)
  else if (SensButton_PRESSED && millis()- timerButton>5) SensButton_PRESSED = 0; 
 
 //ниже сбрасываем программный номер кнопки после подавления дребезга+10мс
  else if (Button_N_timerenabled && millis()- timerButton_N>in_Click.duration_bounce+10) {Button_N = 0; timerButton_N = 0;}
  

}

// ниже отрисовка кнопок

void printNEXTbutton() {
  myGLCD.print("NEXT", 227, 47);
  myGLCD.drawRect (210, 30, 290, 80);
    }

void printOKbutton() {
  myGLCD.print("OK", 240, 147);
  myGLCD.drawRect (210, 130, 290, 180);
    }

 

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

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

neverok пишет:

меня отослали к вам на ветку...

сволочи... О_О

Клапочка, рафик неуиноат, всегда забываю, что нынче читать = писать.((((

Lexan
Offline
Зарегистрирован: 12.02.2016

Ребят подскажите пожалуйста как в этой библиотеке заново запускать timer неактивности.

Сам таймер у меня работает но тоько один раз через 30 секунд. А надо чтобы он срабатывал каждые 30 секунд.

Запускаю вот так:

 if (BUTTON_01.timer)  //таймер отслеживает время простоя кнопки
  {
    zvukAlarm();
//Здесь видимо нужно чтото типо timer = millis(); Но почемуто так неработает :)
    }

 

 

Вот эта версия библиотеки.

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// класс титановый велосипед для тактовой кнопки. (версия 1.0)
// фильтр дребезга, отслеживание событий: нажатие, отпускание, двойное нажатие(doubleclick), нажато и удерживается в течении определённого времени, отпущено и неактивно в течении определённого времени.

#include <Arduino.h>

class BUTTON {
public:
//============================================================================================
// константы настроек класса.
static const byte bounce_            =  50; // длительность отслеживания дребезга.
static const byte doubleclick_       =  200; // длительность отслеживания двойного нажатия.
static const unsigned long timer_    = 30000; // длительность отслеживания неактивности.
static const unsigned int retention_ = 1500; // длительность отслеживания нажатия и удержания.
//============================================================================================
unsigned long start; // старт отсчёта времени.
boolean p;           // состояние пина кнопки.
boolean s;           // программное состояние кнопки.
boolean b;           // состояние таймера фильтра дребезга.
byte    c;           // переменная счётчика двойного нажатия.
boolean t;           // состояние таймера неактивности.
boolean r;           // состояние таймера нажатия и удержания.
//============================================================
boolean click_down;  // событие нажатия.
boolean click_up;    // событие отпускания.
boolean doubleclick; // событие двойного нажатия.
boolean timer;       // событие неактивности.
boolean retention;   // событие нажатия и удержания.
//============================================================
byte _pb;
//============================================================
BUTTON(byte pb) {
_pb = pb;
pinMode(_pb, INPUT);
digitalWrite(_pb, 1);
//===================
start = millis();
p     = digitalRead(_pb);
 p     = !digitalRead(_pb); // отключить тихий старт.
s     = p;
b     = 0;
c     = 0;
t     = 0;
r     = 0;
//==============
click_down  = 0;
click_up    = 0;
doubleclick = 0;
timer       = 0;
retention   = 0;
//==============
}

void read() {
//==============================================================================
boolean np = digitalRead(_pb); // текущее состояние пина кнопки.
unsigned long stop = millis(); // стоп отсчёта времени.
//==============================================================================
click_down  = 0;
click_up    = 0;
doubleclick = 0;
timer       = 0;
retention   = 0;
//==============================================================================
if (np != p) {p = np; click(); start = stop; b = 1; t = 1; r = 1;} // состояние цифрового пина изменилось.
//==============================================================================
if (b != 0          ) {if (stop - start > bounce_     ) {b = 0; click();      }} // фильтр дребезга.
if (c != 0          ) {if (stop - start > doubleclick_) {c = 0;               }} // обнуление счётчика двойного клика.
if (t != 0 && s == 1) {if (stop - start > timer_      ) {t = 0; timer     = 1;}} // неактивность.
if (r != 0 && s == 0) {if (stop - start > retention_  ) {r = 0; retention = 1;}} // нажатие и удержание.
//==============================================================================
}

void click() { // нажатие, отпускание, двойное нажатие.
if (b == 0 && s != p) {s = p;
if (s == 0) {click_down = 1; ++c; if (c == 2) {c = 0; doubleclick = 1;}}
if (s == 1) {click_up   = 1;                                           }
}
}

};
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

 

ven-til
Offline
Зарегистрирован: 13.02.2018

Lexan пишет:
Ребят подскажите пожалуйста как в этой библиотеке заново запускать timer неактивности.

Взять библиотеку новее.

Lexan
Offline
Зарегистрирован: 12.02.2016

А что разве в этой неполучится так сделать? Она меня вполне устраивает. Хотелось бы её и оставить.

ven-til
Offline
Зарегистрирован: 13.02.2018

Получится.

Lexan
Offline
Зарегистрирован: 12.02.2016

Подскажите как если не секрет .

ven-til
Offline
Зарегистрирован: 13.02.2018

Я думаю в 69 строке не устанавливать t в 0. И дальше start приравнивать к миллис.

Lexan
Offline
Зарегистрирован: 12.02.2016

ven-til пишет:
Я думаю в 69 строке не устанавливать t в 0. И дальше start приравнивать к миллис.

 

Спасибо друг выручил!

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

Lexan пишет:

Ребят подскажите пожалуйста как в этой библиотеке заново запускать timer неактивности.

отпустить кнопку. О_О

если нужно генерить события, то не калечить библиотеку, а юзать класс титановый велосипед для delay без delay().

skalinas
Offline
Зарегистрирован: 13.01.2016

Проверил, не работает по входам. Если задать 0 и 1 вход, работает, если другие входа, как в примере не работает. Поправь библиотеку (version 14.0). 

include <Button.h>
Button t;
 
#define long_3_Time 200       //время авто нажатий 
long timerButton_2 = 0;       //сброс времени 
int Hz = 50;
int Fiag = 0;
int Fiag1 = 0;
 
void setup() {
   Serial.begin(9600); 
t.NO();      //кнопка с нормально разомкнутыми контактами
t.pullUp();  //подтяжка пинов кнопок к Vcc
 
t.duration_bounce       (  50);//настройка длительности фильтра дребезга кнопки
t.duration_click_Db     ( 250);//настройка длительности двойного щелчка кнопки
t.duration_inactivity_Up(5000);//настройка длительности таймера неактивности ненажатой кнопки
t.duration_inactivity_Dn(5000);//настройка длительности таймера неактивности нажатой кнопки
t.duration_press        ( 750);//настройка длительности длинного нажатия кнопки
t.button( 7, 8, 9);                 //передача номеров пинов Arduino, подключенных к кнопкам
}
 
void loop() {
t.read();
if (t.event_click_Up     (7) == 1) {Fiag = 0;}                        //событие отпускания кнопки
if (t.event_click_Dn     (7) == 1) {Hz ++; Serial.println(Hz);}       //событие нажатия кнопки 
if (t.event_press_long   (7) == 1) {Fiag = 1;}                        //событие длинного  нажатия кнопки
 
if (t.event_click_Up     (8) == 1) {Fiag1 = 0;}                       //событие отпускания кнопки
if (t.event_click_Dn     (8) == 1) {Hz --; Serial.println(Hz);}       //событие нажатия кнопки 
if (t.event_press_long   (8) == 1) {Fiag1 = 1;}                       //событие длинного  нажатия кнопки Serial.println(10); 
 
if (Fiag == 1) {                                                      //событие тактирования при длинном  нажатия кнопки  
  if (millis()-timerButton_2 > long_3_Time){        
         Hz ++;
        Serial.println(Hz); 
         if(Hz >= 100){ 
         Hz = 0;        
          }
         timerButton_2=millis();        
        }
  }
if (Fiag1 == 1) {                                                     //событие тактирования при длинном  нажатия кнопки  
  if (millis()-timerButton_2 > long_3_Time){        
         Hz --;
        Serial.println(Hz); 
         if(Hz <= 0){ 
         Hz = 100;        
          }
         timerButton_2=millis();        
        }
  }
}
 
Клапауций 555
Offline
Зарегистрирован: 10.03.2018

у тебя три кнопки: t.button( 7, 8, 9); три кнопки - т.е. кнопка(0), кнопка(1), кнопка(2). ты же обращаешься к кнопкам не по индексам, а по номерам пинов: t.event_click_Up (7), t.event_click_Up (8)

о каких - 0 и 1 ты говоришь?

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

Клапочка, ты тут вроде большую стирку затеял, #568 не убирай, эт моя подписка на твою тему.

skalinas
Offline
Зарегистрирован: 13.01.2016

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

у тебя три кнопки: t.button( 7, 8, 9); три кнопки - т.е. кнопка(0), кнопка(1), кнопка(2). ты же обращаешься к кнопкам не по индексам, а по номерам пинов: t.event_click_Up (7), t.event_click_Up (8)

о каких - 0 и 1 ты говоришь?

Если в скетче заменить 7, 8 на 0, 1   (где 0, 1 - пины), то работает нормально, если меняем на любые другие пины, в примере 7 и 8, то не работает. Или я неправильно, что то делаю?

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

bwn пишет:

Клапочка, ты тут вроде большую стирку затеял, #568 не убирай, эт моя подписка на твою тему.

шедевральные посты остаются... их мало, поэтому - будут.

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

skalinas пишет:

Если в скетче заменить 7, 8 на 0, 1   (где 0, 1 - пины), то работает нормально, если меняем на любые другие пины, в примере 7 и 8, то не работает. Или я неправильно, что то делаю?

ты передал в настройках пины кнопок один раз: t.button( 7, 8, 9);

дальше в скетче не номера пинов фигурируют, а индексы в порядке их перечисления в настройках t.button(..., ..., ...); начиная с 0 - т.е. 0, 1, 2.

*в скетче исправь t.event_click_Up (7), t.event_click_Up (8), t.event_click_Up (9)на t.event_click_Up (0), t.event_click_Up (1), t.event_click_Up (2).

skalinas
Offline
Зарегистрирован: 13.01.2016

Тупанул, все заработало!

Еще вопрос, можно в библиатеку добавить, при длительном удержании, происходило тактирование кнопки, как в скетче. Пример работы, если нажимаем длительностью меньше, чем длительное удержания, кнопка нажимается 1 раз, если больше то нажимается через время циклически (допустим 250мс) пока кнопка нажата.

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

skalinas пишет:

Еще вопрос, можно в библиатеку добавить, при длительном удержании, происходило тактирование кнопки, как в скетче. Пример работы, если нажимаем длительностью меньше, чем длительное удержания, кнопка нажимается 1 раз, если больше то нажимается через время циклически (допустим 250мс) пока кнопка нажата.

я понял - что бы как в клаве компьютера было.

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

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

класс титановый велосипед для delay без delay(). - запускай ега кнопками.

skalinas
Offline
Зарегистрирован: 13.01.2016

Получилось сделать (для примера), 7 и 9 пины увеличивают значение 8 уменьшает.

Подскажите, как можно вынести скетч в процедуру? Допустим, нужно менять несколько значений с разными диапазонами. Например значения Hz0, Hz1, Hz2, Hz3, Hz4,..., от нижнего диапазона Hzn0, Hzn1, Hzn2, Hzn3, Hzn4,..., до верхнего диапазона Hzb0, Hzb1, Hzb2, Hzb3, Hzb4,... Вызывая  Процедуру (Hz0), меняем значение Hz0 и т.д. Сами значения и диапазоны хранятся в массиве.

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

 t.event_inactivity_Up(0) == 1) {} - событие неактивности ненажатой кнопки, как я понял, это для кажной кнопка? 

И еще хотелка, if (t.event_inactivity_Up() == 1) {} - что бы это событие было для всех кнопок, срабатывало от последнего нажатия любой кнопки. Будет удобно выходить в основное меню, если в подменю не нажимались длительное время кнопки.

 

#include <Button.h>
Button t;

#define long_3_Time 200       //время авто нажатий 
long timerButton_2 = 0;       //сброс времени 
int Hz = 98;
int Fiag = 0;
int Fiag1 = 0;

void setup() {
   Serial.begin(9600); 
t.NO();      //кнопка с нормально разомкнутыми контактами
t.pullUp();  //подтяжка пинов кнопок к Vcc

t.duration_bounce       (  50);               //настройка длительности фильтра дребезга кнопки
t.duration_click_Db     ( 250);               //настройка длительности двойного щелчка кнопки
t.duration_inactivity_Up(5000);               //настройка длительности таймера неактивности ненажатой кнопки
t.duration_inactivity_Dn(5000);               //настройка длительности таймера неактивности нажатой кнопки
t.duration_press        ( 750);               //настройка длительности длинного нажатия кнопки
t.button( 7, 8, 9);                           //передача номеров пинов Arduino, подключенных к кнопкам
}

void loop() {
  
        Serial.println(Hz);  
t.read();
if (t.event_click_Up     (0) == 1) {Fiag = 0;}                        //событие отпускания кнопки
if (t.event_click_Dn     (0) == 1) {Hz ++; if(Hz >= 100){Hz = 100;}}    //событие нажатия кнопки 
if (t.event_press_long   (0) == 1) {Fiag = 1;}                        //событие длинного  нажатия кнопки

if (t.event_click_Up     (1) == 1) {Fiag1 = 0;}                       //событие отпускания кнопки
if (t.event_click_Dn     (1) == 1) {Hz --; if(Hz <= 0){Hz = 0;}}       //событие нажатия кнопки 
if (t.event_press_long   (1) == 1) {Fiag1 = 1;}                       //событие длинного  нажатия кнопки

if (t.event_click_Up     (2) == 1) {Fiag = 0;}                        //событие отпускания кнопки
if (t.event_click_Dn     (2) == 1) {Hz ++; if(Hz >= 100){Hz = 100;}}    //событие нажатия кнопки 
if (t.event_press_long   (2) == 1) {Fiag = 1;}                        //событие длинного  нажатия кнопки

if (Fiag == 1) {                                                      //событие тактирования при длинном  нажатия кнопки  
  if (millis()-timerButton_2 > long_3_Time){        
         Hz ++;
         if(Hz >= 100){ 
         Hz = 100;        
          }
         timerButton_2=millis();        
        }
  }
if (Fiag1 == 1) {                                                     //событие тактирования при длинном  нажатия кнопки  
  if (millis()-timerButton_2 > long_3_Time){        
         Hz --; 
         if(Hz <= 0){ 
         Hz = 0;        
          }
         timerButton_2=millis();        
        }
  } 
}

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

skalinas пишет:

Подскажите, как можно вынести скетч в процедуру? Допустим, нужно менять несколько значений с разными диапазонами. Например значения Hz0, Hz1, Hz2, Hz3, Hz4,..., от нижнего диапазона Hzn0, Hzn1, Hzn2, Hzn3, Hzn4,..., до верхнего диапазона Hzb0, Hzb1, Hzb2, Hzb3, Hzb4,... Вызывая  Процедуру (Hzn0), меняем значение Hzn0 и т.д. Сами значения и диапазоны хранятся в массиве.

я не понял, что ты хотел сказать.

skalinas пишет:

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

событие от состояния именно тем и отличается, что имеет параметр "время события", но не имеет параметра "продолжительность" - поэтому, "висеть" не может. объявляй переменные-флаги и рули ими переменными класса. взводи флаг длинным нажатием и сбрасывай отпусканием. О_О

skalinas пишет:

 t.event_inactivity_Up(0) == 1) {} - событие неактивности ненажатой кнопки, как я понял, это для кажной кнопка? 

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

skalinas пишет:

И еще хотелка, if (t.event_inactivity_Up() == 1) {} - что бы это событие было для всех кнопок, срабатывало от последнего нажатия любой кнопки. Будет удобно выходить в основное меню, если в подменю не нажимались длительное время кнопки.

так, что ли?

if (test.state_inactivity_Up() == 0 && test.event_inactivity_Up() == 1) {}

проверь, если работает, то я не понимаю, зачем это пихать в класс.

skalinas
Offline
Зарегистрирован: 13.01.2016

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

Для сброса таймера для перехода из подменю на основно экран меню, достатачно такой строчки.

if (test.event_click_Up     () == 1) {тут сбрасываем таймер}

После любой отжатой кнопки таймер будет сбрасывается. Отличная библиотека!

Едиственное, много ест памяти. Например, если нам нужно изменять порядка 7 значений, на это нужно уже порядка 7,5 кбайт.

 

 

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

skalinas пишет:

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

ну, впиши это в файл Button.h - жизнь упростится. кнопка "Fork" на https://github.com/Klapautsiy/titanium-bicycle-for-button и пиши, шо захочется.

skalinas пишет:

Для сброса таймера для перехода из подменю на основно экран меню, достатачно такой строчки.

if (test.event_click_Up     () == 1) {тут сбрасываем таймер}

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

skalinas
Offline
Зарегистрирован: 13.01.2016

Переделал скетч под измененную библиотеку.

#include <Button.h>
Button t;

#define long_3_Time 200           //время авто нажатий 
long timerButton_2 = 0;           //сброс времени 
int Hz = 50;                      //начало 

void setup() {
   Serial.begin(9600); 
  t.NO();                           //кнопка с нормально разомкнутыми контактами
  t.pullUp();                       //подтяжка пинов кнопок к Vcc
  t.duration_bounce       (  50);   //настройка длительности фильтра дребезга кнопки
  t.duration_click_Db     ( 250);   //настройка длительности двойного щелчка кнопки
  t.duration_inactivity_Up(5000);   //настройка длительности таймера неактивности ненажатой кнопки
  t.duration_inactivity_Dn(5000);   //настройка длительности таймера неактивности нажатой кнопки
  t.duration_press        (750);    //настройка длительности длинного нажатия кнопки
  t.button(7,8,9);                  //передача номеров пинов Arduino, подключенных к кнопкам UP, DOWN, SELECT
}

void loop() {  
t.read();
/*
  if (t.state_button       (0) == 1) {Serial.println(1);}           //состояние кнопки
  if (t.state_inactivity_Up(0) == 1) {Serial.println(2);}           //состояние таймера неактивности ненажатой кнопки
  if (t.state_inactivity_Dn(0) == 1) {Serial.println(3);}           //состояние таймера неактивности нажатой кнопки
  if (t.event_click_Up     (0) == 1) {Serial.println(4);}           //событие отпускания кнопки 
  if (t.event_click_Dn     (0) == 1) {Serial.println(5);}           //событие нажатия кнопки   
  if (t.event_click_Db     (0) == 1) {Serial.println(6);}           //событие двойного щелчка кнопки 
  if (t.event_inactivity_Up(0) == 1) {Serial.println(7);}           //событие неактивности ненажатой кнопки
  if (t.event_inactivity_Dn(0) == 1) {Serial.println(8);}           //событие неактивности нажатой кнопки
  if (t.event_press_short  (0) == 1) {Serial.println(9);}           //событие короткого нажатия кнопки  
  if (t.event_press_long   (0) == 1) {Serial.println(10);}          //событие длинного  нажатия кнопки
           //Для сброса таймера для перехода из подменю на основной экран меню, достаточно такой строчки.
  if (test.event_click_Up   () == 1) {тут сбрасываем таймер перехода} 
*/

  if (t.event_click_Dn     (0) == 1) {Hz ++; if(Hz >= 100){Hz = 100;}} //одно нажатие кнопки  
  if (t.event_press_long   (0) == 1) {                                 //длинное нажатие кнопки
   if (millis()-timerButton_2 > long_3_Time){        
      Hz ++;
       if(Hz >= 100){ 
         Hz = 100;        
          }
      timerButton_2=millis();        
    }
  }
  if (t.event_click_Dn     (1) == 1) {Hz --; if(Hz <= 0){Hz = 0;}}     //одно нажатие кнопки 
  if (t.event_press_long   (1) == 1) {                                 //длинное нажатие кнопки
   if (millis()-timerButton_2 > long_3_Time){        
      Hz --; 
       if(Hz <= 0){ 
        Hz = 0;        
          }
      timerButton_2=millis();        
    }
  }
}

 

skalinas
Offline
Зарегистрирован: 13.01.2016

Клапауций 555 посмотри, так будет работать библиотека, может чего лишнего добавил?
Выше скетч под эту библиотеку.


/*
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
titanium bicycle for button. (version 14.0) +++
file Click.h - class Click, logical block.
https://klapautsiy.github.io/titanium-bicycle-for-button/
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*/

#ifndef Click_h
#define Click_h

#include <Arduino.h>

struct click_t{
unsigned long timestamp_system      ; // снимок системного времени
unsigned long duration_bounce       ; // длительность фильтра дребезга               кнопки
unsigned long duration_click_Db     ; // длительность двойного щелчка                кнопки
unsigned long duration_inactivity_Up; // длительность таймера неактивности ненажатой кнопки
unsigned long duration_inactivity_Dn; // длительность таймера неактивности   нажатой кнопки
unsigned long duration_press        ; // длительность длинного нажатия               кнопки
boolean       state_hard            ; // аппаратное состояние                        кнопки
};

class Click {

private:

unsigned long timestamp_bounce_;
unsigned long timestamp_click_ ;

void          timestamp_bounce(unsigned long t) {timestamp_bounce_ = t;}
void          timestamp_click (unsigned long t) {timestamp_click_  = t;}

struct {
unsigned counter_Db       : 1; // счётчик двойного щелчка            кнопки
unsigned state_button     : 1; // состояние                          кнопки
unsigned state_inactivity : 1; // состояние таймера неактивности     кнопки
unsigned state_press      : 1; // состояние таймера длинного нажатия кнопки
unsigned event_click      : 1; // событие нажатия/отпускания         кнопки
unsigned event_click_Db   : 1; // событие двойного щелчка            кнопки
unsigned event_inactivity : 1; // событие           неактивности     кнопки
unsigned event_press      : 1; // событие           длинного нажатия кнопки
             unsigned event_press1    : 1; // событие           флаг длинного нажатия кнопки
} click;

void     counter_Db      (boolean bit) {click.counter_Db       = bit;}
void     state_button    (boolean bit) {click.state_button     = bit;}
void     state_inactivity(boolean bit) {click.state_inactivity = bit;}
void     state_press     (boolean bit) {click.state_press      = bit;}
void     event_click     (boolean bit) {click.event_click      = bit;}
void     event_click_Db  (boolean bit) {click.event_click_Db   = bit;}
void     event_inactivity(boolean bit) {click.event_inactivity = bit;}
void     event_press     (boolean bit) {click.event_press      = bit;}
             void     event_press1     (boolean bit) {click.event_press1      = bit;}
public:

unsigned long timestamp_bounce() {return timestamp_bounce_;}
unsigned long timestamp_click () {return timestamp_click_ ;}

boolean  counter_Db         () {return  click.counter_Db      ;}
boolean  state_button       () {return  click.state_button    ;}
boolean  state_inactivity   () {return  click.state_inactivity;}
boolean  state_press        () {return  click.state_press     ;}
boolean  event_click        () {return  click.event_click     ;}
boolean  event_click_Db     () {return  click.event_click_Db  ;}
boolean  event_inactivity   () {return  click.event_inactivity;}
boolean  event_press        () {return  click.event_press     ;}
              boolean  event_press1        () {return  click.event_press1     ;}

boolean  state_inactivity_Up() {return (state_inactivity() == 1 && state_button() == 0);}
boolean  state_inactivity_Dn() {return (state_inactivity() == 1 && state_button() == 1);}
boolean  event_click_Up     () {return (event_click     () == 1 && state_button() == 0);}
boolean  event_click_Dn     () {return (event_click     () == 1 && state_button() == 1);}
boolean  event_inactivity_Up() {return (event_inactivity() == 1 && state_button() == 0);}
boolean  event_inactivity_Dn() {return (event_inactivity() == 1 && state_button() == 1);}
boolean  event_press_short  () {return (event_click_Up  () == 1 && state_press () == 1);}
              boolean  event_press_long   () {return (event_press1     () == 1 && state_button() == 1);}

void reset_events() {
event_click     (0);
event_click_Db  (0);
event_inactivity(0);
event_press     (0);
}

void reset(click_t &in_Click) {
timestamp_bounce(in_Click.timestamp_system);
timestamp_click (in_Click.timestamp_system);
counter_Db                              (0);
state_button    (in_Click.state_hard      );
state_inactivity                        (0);
state_press                             (0);
reset_events();
}

void read(click_t &in_Click) {

                if  (state_button() == 0) event_press1  (0);

reset_events();
if  (state_button() == in_Click.state_hard) timestamp_bounce(in_Click.timestamp_system);
else
if  (in_Click.timestamp_system - timestamp_bounce() >= in_Click.duration_bounce) {timestamp_click(in_Click.timestamp_system);
                                                                                                                        state_button    (in_Click.state_hard);
                                                                                                                        state_inactivity(1); event_click     (1);
if  (state_button() == 1) {state_press(1); counter_Db(!counter_Db()); if (counter_Db() == 0) event_click_Db(1);}}
if  (counter_Db         () != 0 && in_Click.timestamp_system - timestamp_click () >= in_Click.duration_click_Db      )  counter_Db      (0);
if ((state_inactivity_Up() != 0 && in_Click.timestamp_system - timestamp_click () >= in_Click.duration_inactivity_Up)
||  (state_inactivity_Dn() != 0 && in_Click.timestamp_system - timestamp_click () >= in_Click.duration_inactivity_Dn)) {state_inactivity(0); event_inactivity(1);}
if  (state_press        () != 0 && in_Click.timestamp_system - timestamp_click () >= in_Click.duration_press ) {state_press     (0); event_press     (1);}
               if  (event_press     () == 1 ) event_press1  (1);
}

Click() {
timestamp_bounce(0);
timestamp_click (0);
counter_Db      (0);
state_button    (0);
state_inactivity(0);
state_press     (0);
reset_events();
}


};

#endif