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

Штирлиц
Штирлиц аватар
Offline
Зарегистрирован: 13.06.2015

vvadim пишет:

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

Неплохой велосипед . Но возможно ли при помощи него реализовать то , о чем спрашивал vvadim ?Как в этом скетче

unsigned long previousMillis = 0;
unsigned long prevMillis = 0;
int bc=0; 
int count=0;
boolean flag=0;
boolean countflag=0;
void setup()    
{ 

  pinMode(9, OUTPUT); 
  pinMode(8, OUTPUT);  
} 

void loop() {

  if(digitalRead(3)==HIGH&&flag==0)//если кнопка нажата ... 
  { 

    if (millis() -previousMillis >20)    
    { 

      previousMillis = millis();     
      bc++; 
      if(countflag==0)
      {      
        count++;
        countflag=1;
      } 
    }  
  } 

  if(bc>=2) 
  {   
    flag=1; 
    bc=0; 
  } 

  if(digitalRead(3)==LOW&&flag==1)
  {
    flag=0;
    countflag=0;
  }
  if (millis() -prevMillis >500)    
  {
    if(count==1){
      digitalWrite(8,!digitalRead(8));
    }
    else  if(count==2){
      digitalWrite(9,!digitalRead(9));
    } 
    count=0;
    prevMillis = millis(); 
  } 

} 

 

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

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

Штирлиц пишет:

о чем спрашивал vvadim ?

на вопрос vvadim я дал развёрнутый ответ.

Штирлиц пишет:

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

код не смотрел - влом мне. извини.

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

if (BUTTON_01.click_down) {}
if (BUTTON_01.doubleclick) {}

 

Mr.Privet
Mr.Privet аватар
Offline
Зарегистрирован: 17.11.2015
я думаю что можно так сделать и в самой программе, не изобритая велосипед :)

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

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


if (button_1.click_down)
 {
    pm=millis();
    boolean bc_1=true;
    while(pm-millis<250)
      {
         button_1.read();
         if (button_1.double_click)
        { 
            ...........// делаем что то при двойном клике
            bc_1=false;
         }
      }
      if (bc_1)
     {
.............// делаем что то при одинарном нажатии
      }
}



как то так

 

Mr.Privet
Mr.Privet аватар
Offline
Зарегистрирован: 17.11.2015

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

Mr.Privet пишет:

функции timer и retention работают наоборот, то есть timer как retention а retention как timer.

наличие неполадки практически не подтверждено

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

 

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

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

Mr.Privet пишет:

там где нужно различить клик от даблклика

где нужно различать клик от дабл клика?

*мне просто интересно, зачем плохой алгоритм работы с кнопкой лечить странными костылями?

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

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

//====
m  =      millis();
p  = digitalRead(_pb);
b  =                0;
dc =                0;
c  =                0;
t  =                0;
r  =                0;
//====
эти переменные доступны для чтения и записи, не смотря на то, что меня профессионалы критиковали за это, но я не зря так сделал, т.к. знал, что у некоторых ползателей класса обязательно возникнет желание делать что-то не так, как должно быть, а по своему. :D
 
т.е. класс абсолютно самодостаточен в плане переменных, которые можно вытащить из алгоритма работы кнопки.
костыли с переменными производными от millis() рекомендую писать с вышеуказанными переменными класса, а не плодить свои дубли сущностей класса.
 
надеюсь, я доступно объяснил суть отсутствия проблемы как таковой.
Гриша
Offline
Зарегистрирован: 27.04.2014

подписался на новости топика :)

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

Гриша пишет:

подписался на новости топика :)

новостей особо не предвидится - пинаю иногда мистиков и критиканов.

*если есть мысли, какие ещё функции, отсутсвующие в классе, можно вытащить из работы тактовой кнопки, то обсудим и впишу в класс.

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

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

*если есть мысли, какие ещё функции, отсутсвующие в классе, можно вытащить из работы тактовой кнопки, то обсудим и впишу в класс.

мне пока не потянуть такой топик - но скоро и до него добирусь (научусь)

* возможно!, этот алгоритм поможет следующим пользователям... :

в программе определяется "что" использовать (нажатие, двойное нажатие, удержание) и устанавливается интервал (время) определения - до его окончания никаких действий. Соответственно если использовать только простое нажатие - мгновенное исполнение, во всех других комбинациях - действие исполняется по истечении времени интервала определения - да хоть тройное нажатие! Также (я повторюсь, код полностью не понимаю) меры по предотвращению дребезга контактов - это еще один защитный интервал (короткий)!

в разных ПОДпрограммах (меню) можно назначить свой список типов нажатий, простое нажатие и удержание может исполнятся после отпуска кнопки, но если есть двойное - только по истечении времени.

ИМХО ну, я вижу алгоритм таким и не вижу альтернативы борьбы с "ложным определением" - МК не обладает даром предвидения, а вот реализация, надеюсь, в этом топике оптимальная (по коду).

 

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

Гриша пишет:

* возможно!, этот алгоритм поможет следующим пользователям... :

в программе определяется "что" использовать (нажатие, двойное нажатие, удержание) и устанавливается интервал (время) определения - до его окончания никаких действий. Соответственно если использовать только простое нажатие - мгновенное исполнение, во всех других комбинациях - действие исполняется по истечении времени интервала определения - да хоть тройное нажатие! 

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

Гриша пишет:

Также (я повторюсь, код полностью не понимаю) меры по предотвращению дребезга контактов - это еще один защитный интервал (короткий)!

алгорим кода фильтрации дребезга прост и прозрачен: запрет обработки одиночного нажатия длительностью bounce_ - предполагаемого времени существоания физического явления "дребезг контакта".

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

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

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

1) и не пытался, просто акцентировал внимание тех, кто этого не видит, пост 99 побудил снова написать алгоритм всех вариантов и моментов употребления кнопки.

 UPD пост 109. "залипание кнопки" - если  перекрыть все моменты, то необходимо позаботиться в алгоритме о том, что есть "залипание кнопки" и как этот момент обрабатывать!!! 

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

Гриша пишет:

UPD пост 109. "залипание кнопки" - если  перекрыть все моменты, то необходимо позаботиться в алгоритме о том, что есть "залипание кнопки" и как этот момент обрабатывать!!! 

никак не обрабатывать, т.к. при залипании кнопки(постоянном нажатии) обработается один раз событие удержание кнопки и в дальнейшем кнопка перестанет работать совсем от слова СОВСЕМ.

проверь - нажми и держи кнопку:

if (BUTTON_01.retention) {digitalWrite(14, !digitalRead(14));} // светодиод включается/выключается при удержании кнопки через retention_ = 1000 (1 сек.)

 

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

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

Гриша пишет:

UPD пост 109. "залипание кнопки" - если  перекрыть все моменты, то необходимо позаботиться в алгоритме о том, что есть "залипание кнопки" и как этот момент обрабатывать!!! 

никак не обрабатывать, т.к. при залипании кнопки(постоянном нажатии) обработается один раз событие удержание кнопки и в дальнейшем кнопка перестанет работать совсем от слова СОВСЕМ.

исходя из условий поставленной задачи, можно вообще не обрабатывать "удержание" если кнопку не отпустили!!! НО, это все должен определить РАЗРАБОТЧИК (програмист) согласно алгоритму по ТЗ.

ИМХО. Написать код достаточно просто,  правильно составить алгоритм почти -  искусство. Это как в школе – правильно составленное условие задачи больше половины решения. А в данном случае, разработчик должен описать все возможные события именно так, как ему это нужно.

Темка понравилась именно тем, что есть код (доступный), который можно допилить под свои нужды – все универсальное слишком громоздко.

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

Гриша пишет:

исходя из условий поставленной задачи, можно вообще не обрабатывать "удержание" если кнопку не отпустили!!! НО, это все должен определить РАЗРАБОТЧИК (програмист) согласно алгоритму по ТЗ.

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

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

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

Гриша пишет:

исходя из условий поставленной задачи, можно вообще не обрабатывать "удержание" если кнопку не отпустили!!! НО, это все должен определить РАЗРАБОТЧИК (програмист) согласно алгоритму по ТЗ.

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

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

Вот установить время в часы при отпускании кнопки т.е. я установил время (в переменные),   нажал я ее и жду, когда наступит мгновение Ч, и исполню действие (запишу в RTC) через 5 минут (или когда рука устанет), в момент отпуска кнопки. 

это не касается данного кода - это вариант события!

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

Гриша пишет:

если такое событие возможно, значит его необходимо учитывать!!!

это не касается данного кода - это вариант события!

Гриша, почему бы честно не признать, что у тебя нет претензий к алгоритму работы класса?

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

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

Гриша пишет:

если такое событие возможно, значит его необходимо учитывать!!!

это не касается данного кода - это вариант события!

Гриша, почему бы честно не признать, что у тебя нет претензий к алгоритму работы класса?

да я вообще прицепился к посту 99, еслиб не он, даже и писать не стал - мне нечего добавить касаемо классов!

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

Гриша пишет:

да я вообще прицепился к посту 99, еслиб не он, даже и писать не стал - мне нечего добавить касаемо классов!

да, вообще-то я писал ответ #100 не для тебя, если б я не написал #100, то ничего бы не изменилось - правда?

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

офф. топ

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

Гриша пишет:

да я вообще прицепился к посту 99, еслиб не он, даже и писать не стал - мне нечего добавить касаемо классов!

да, вообще-то я писал ответ #100 не для тебя, если б я не написал #100, то ничего бы не изменилось - правда?

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

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

Гриша пишет:

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

это не офтоп - это факт того, что ты и, возможно, многие читатели топика не поняли смысла моего сообщения #100

сообщение #100 является фундаментальным теоретическим обоснованием алгоритма работы класса - работа в реальном субъективном времени, неразрывность причинно-следственных связей. 

Mr.Privet
Mr.Privet аватар
Offline
Зарегистрирован: 17.11.2015

Клапауций, как я понял из прочитанного выше ты хотел и сделал алгоритм, который не стал тормозить программу при клике в ожидании даблклика и мгновенно его обрабатывал. Просто это нужно довести до тех, кто хотел чтобы функции клика и даблклика были "разнесены" и событие клик при даблклике не наступало. При твоем алгоритме очень удобно вешать клик такие функции, которые не идут в противоречие с даблкликом. Даблклик для этого и придуман. Представьте если бы в виндус при клике всегда думал пол секунды, прежде чем сделать какое то действие. однако если жмакнуть на файл он выделится (1 клик), если дважды жмакнуть он откроется. Функции друг другу не мешают и обрабатываются быстро. Тут важно чтобы функции не исключали друг друга, как на пример, если бы клик что то взрывал, а даблклик обезвреживал. Можно же при помощи данного класса разделить события как вариант долгим нажатием. На пример вместо клика сделать какое-то действие при отпускании, и другое при долгом нажатии. Так если нажал кнопку и отпустил произойдет 1 действие, нажал и жмешь 2 сек. произошло другое. вот и разделили без тормозов. Пользователем же, желающим сделать так как им хочется (с тормозами) необходимо сделать это самим, ведь Клапауций не против если кто-то захочет допилить-перепилить этот класс. Предложений высказывается много, но никто делать ничего не хочет. А тебя, Клапауций класс устраивает так как он есть. В общем я под итожил смысл нескольких сообщений выше... Пользуюсь твоим классом, все классно, спасибо большое...  

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

Mr.Privet пишет:

Клапауций, как я понял из прочитанного выше ты хотел и сделал алгоритм

Я не хотел, меня заставили.(с)

*чёто ржу, как люди могут не понимать очевидных вещей.

 

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

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

*чёто ржу, как люди могут не понимать очевидных вещей. 

Уважаемый, мне вот плакать хочется, приходят соискатели на должность инженера-электроника молодые и не очень  специалисты после института. 90% просто валятся после вопроса «Закон Ома с простейшими примерами». Т.е.   половина "инженеров" не знает закон Ома, зато про Кирхгоффа чего-то слышали (в смысле, слово знакомое)… как такое вообще можно осознать…  А Вы говорите о коде. По опыту прочтения тем, могу судить, что многие впервые взялись  за это дело после прочтения слов "Ардуино – это просто". Те, кто очень хорошо в этом разбирается, пользуются другими ресурсами и вообще редко появляются в обсуждениях, чаще,  у таких людей просто нет времени, за редким исключением.

 ЗЫ много раз писал, что Ардуино для меня хобби – вместо пива, дивана и телевизора, и как и многом, мне не хватает времени во всем разобраться, вот и читаю все подряд, что более менее несет развитие в данной области и далеко не все понимаю (пока еще).   

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

Гриша пишет:

Уважаемый, мне вот плакать хочется, приходят соискатели на должность инженера-электроника молодые и не очень  специалисты после института. 90% просто валятся после вопроса «Закон Ома с простейшими примерами». 

вы тоже ничего не поняли - после сообщения #100 разговор идёт об отсутсвии бога, о мистическом и логическом складе ума.
у кого-то сейчас есть дуино, а когда-то у кого-то в школе был программируемый калькулятор - суть одна и та же.
Клапауций 777
Offline
Зарегистрирован: 21.11.2015

в версии Дуино ИДЕ arduino-1.6.6 класс можно подключить как библиотеку:

#include <class_BUTTON.h>
- копируем код #1 в файл class_BUTTON.h
- копируем файл class_BUTTON.h в папку class_BUTTON.
- папку class_BUTTON размещаем в *\Мои документы\Arduino\libraries\

 

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

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

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

если эта схема расово правильная, то почему большинство схем в гугле не имеют сопротивления R1? На что оно влияет?

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

Резистор ограничивает ток через контакты кнопки при её нажимании.
Смотреть про второй закон коммутации:

https://ru.wikipedia.org/wiki/%D0%9F%D0%B5%D1%80%D0%B5%D1%85%D0%BE%D0%B4%D0%BD%D1%8B%D0%B5_%D0%BF%D1%80%D0%BE%D1%86%D0%B5%D1%81%D1%81%D1%8B_%D0%B2_%D1%8D%D0%BB%D0%B5%D0%BA%D1%82%D1%80%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D1%85_%D1%86%D0%B5%D0%BF%D1%8F%D1%85

Хотя при 0.1 без резистора будет и  не  смертельно для кнопки...... какое-то время......
Поставьте для "пробы"   2200.0 - могут и контакты "свариться"
 

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

Tomasina пишет:

если эта схема расово правильная, то почему большинство схем в гугле не имеют сопротивления R1? На что оно влияет?

*большинство схем в гугле имеют сиськи.

R1 , если:

1. если ты по запарке что-то не то зальёшь в дуино и пин у тебя окажется оутпут.

2. см. #128

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

отлично. Беру на вооружение.

Mr.Privet
Mr.Privet аватар
Offline
Зарегистрирован: 17.11.2015

и еще один дурацкий вопрос - а конденсатор зачем? от скачков напряжения?

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

он забирает на себя дребезг контактов. Кое-что, конечно, прорывается, но для МК все же легче.

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

Mr.Privet пишет:

и еще один дурацкий вопрос - а конденсатор зачем? от скачков напряжения?

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

*прекращаем тупые вопросы.

IgorU
Offline
Зарегистрирован: 03.12.2014

Что-то Клапауциев развелось...  :D

"Велосипед" работает, и дребезг обрабатывается, бывало проскакивали ложные срабаттывания... СПАСИБО!

Беру на вооружение пердложения от ЕвгенийП #75

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

IgorU пишет:

Беру на вооружение пердложения от ЕвгенийП #75

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

DeGlucker
Offline
Зарегистрирован: 23.07.2014

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

(Зто новая тема для размышлений).

а пока с НАСТУПАЮЩИМ !!!

 

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

DeGlucker пишет:

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

(Зто новая тема для размышлений).

а пока с НАСТУПАЮЩИМ !!!

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

IgorU
Offline
Зарегистрирован: 03.12.2014

DeGlucker пишет:

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

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

С Новым Годом!!!

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

IgorU пишет:

на ногах же пять пальцев

десять пальцев на ногах

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

тогда можно 10 кнопок прилепить

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

vvadim пишет:

тогда можно 10 кнопок прилепить

если привлечь в качестве оператора кнопок кота, то 20.

skif
Offline
Зарегистрирован: 24.03.2015

Этож надо, в новогоднюю ночь, вместо того чтобы пить, тут сидеть :)

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

skif пишет:

Этож надо, в новогоднюю ночь, вместо того чтобы пить, тут сидеть :)

алё! Курилы!, у меня тогда был день 31/12/2015 - 14:15(плюс 2 часа - врёт движок форума)

а, вот чего ты, когда все бухают, тут сидишь и херню пишешь - вопрос.

skif
Offline
Зарегистрирован: 24.03.2015

А у меня стояло только что что ты тут. А я в принципе не пью :)

 

skif
Offline
Зарегистрирован: 24.03.2015

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

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

skif пишет:

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

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

skif
Offline
Зарегистрирован: 24.03.2015

а то...

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

здесь #125 ступил

#include "class_BUTTON.h"

так работает и в arduino-1.0.6

Alexino
Offline
Зарегистрирован: 29.12.2015

Только что, минут 15 назад, читая соседнюю ветку про кнопку, думал о создании подобного велика и ради интереса зашёл сюда.
Теперь велик изобретать не буду, пост плюсанул.
Правда я хотел сделать с очередью, чтобы обработчик был один.

Angbor
Angbor аватар
Offline
Зарегистрирован: 26.10.2015

удивляет не количество пальцев на ногах, а количество Клапауци-ев на форуме :)

тема хороша, но так и не знаю, как подписаться на этом фоуме на тему, не оставив сообщение