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

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

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

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

Dmti пишет:

пытаюсь сокротить время общего цикла, на времени опроса кнопок. Получится, нет ?

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

откуда ты думаешь берётся значение test1.event_click_Dn() ?

внезапно:

boolean event_click_Dn     () {for (byte x = 0; x < pin_n_x; x++) {for (byte y = 0; y < pin_n_y; y++) {if (matrix[x][y].event_click_Dn     ()                              ) return 1;}} return             0;}

 

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

продолжение эпопеи с длинными и короткими нажатиями...

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

теперь можно разделить удержания кнопки в нажатом состоянии(или в отпущенном) на длинные и короткие - до обнуления таймера и после.


#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), 50, 200, 1000, 1000, 1, 400);
if (test.event_click_Up() == 1 && test.state_timer() == 0) {digitalWrite(14, !digitalRead(14));}
if (test.event_click_Up() == 1 && test.state_timer() == 1) {digitalWrite(15, !digitalRead(15));}
}

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

...и, пофиксил state_inactivity_Up()/state_inactivity_Dn() - теперь значение state_inactivity_Up нажатой кнопки равно 0, значение state_inactivity_Dn() отпущенной кнопки равно 0. 

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

прописал в классы-оболочки Button, Matrix деструкторы, утилизирующие массивы класса Click из памяти.

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

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

тоись, на лету можно клавиатуру отрывать? :)

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

DetSimen пишет:

тоись, на лету можно клавиатуру отрывать? :)

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

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

маленький сайтик титанового велосипеда https://klapautsiy.github.io/titanium-bicycle-for-button/

hijin
Offline
Зарегистрирован: 20.08.2017

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

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

hijin пишет:

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

иногда мне даже не понять мокшанского наречия русского языка аборигенов Суберии...

hijin
Offline
Зарегистрирован: 20.08.2017

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

hijin пишет:

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

иногда мне даже не понять мокшанского наречия русского языка аборигенов Суберии...

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

А Вы общаетесь сосвоими собратьями по форуму как мажор с высока

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

hijin пишет:

А Вы общаетесь сосвоими собратьями по форуму как мажор с высока

угнетаю мышебратьев. ок.

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

аргументы функции - ссылки. вот оно чё, Михалыч...

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

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

так не работает:


byte ledPin         =  13;
byte previousMillis =   0;
byte interval       = 250;

void setup() {pinMode(ledPin, OUTPUT);}

void loop() {
byte currentMillis = millis();
if(currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
digitalWrite(ledPin, !digitalRead(ledPin));
}
}

так работает, но это сцуко грёбаный костыль:


byte ledPin         =  13;
byte previousMillis =   0;
byte interval       = 248; // должно быть кратно 8-ми UPD: вроде не обязательно.

void setup() {pinMode(ledPin, OUTPUT);}

void loop() {
byte currentMillis = millis();
if(byte(currentMillis - previousMillis) >= interval) { // должно быть byte(a - b)
previousMillis = currentMillis;
digitalWrite(ledPin, !digitalRead(ledPin));
}
}

у кого какие мысли - как из unsigned long корректно сделать byte?

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

and 0xFF

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

DetSimen пишет:

and 0xFF

пробовал я уже и millis()&0xFF и millis()&0x000000FF - пока не сделаешь byte(currentMillis - previousMillis), пример не работает. и тогда работает с любым способом переделанным в byte millis().

вот и вопрос: почему получается отрицательный (currentMillis - previousMillis) если обе переменные имеют тип byte?

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

правильней, наерн, в word преобразовывать, byte переполняется быстро (за 255 мс).  Не?

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

DetSimen пишет:

правильней, наерн, в word преобразовывать, byte переполняется быстро (за 255 мс).  Не?

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

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

в С int это сакральный тип, компилятор пытается к нему привести целочисленные выражения, поэтому тут нужно явное приведение типов, типа 

byte now = byte(millis());  

и тогда с разностью проблем не будет.  Я думаю. 

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

DetSimen пишет:

в С int это сакральный тип, компилятор пытается к нему привести целочисленные выражения, поэтому тут нужно явное приведение типов, типа 

byte now = byte(millis());  

и тогда с разностью проблем не будет.  Я думаю. 

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

кстати,: byte now = (любой тип)millis(); делает тоже самое.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

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

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

исправил взвод таймера неактивности при изменении аппаратного состояния кнопки.

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

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

внезапно обнаружил режим 1KRO клавиатуры у старого кнопочного проводного телефона.

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

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

«Filter out pulses shorter then 5 clockcycles»

О_О

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

Поэтому мой код делает следующее: Если кнопка нажата, срабатывает if, потом происходит задержка 200мс, за это время дребезг пропал и остался чистый сигнал. (с)labviewportal.ru

О_О обнять и плакать...

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017
#define FALSE  0
#define TRUE  (!FALSE)

О_О

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

у кого есть идеи, как сгенерить random(a, b) меньше 50% и больше 33.33% нулей или единиц?

50% - очевидно: boolean(random(0, 2));

33.33% - не очевидно, но можно напрячь мосг и... очевидно: boolean(random(0, 3));

а, что бы вписать в random(a, b), что бы покрыть диапазон 33.33% - 50% ?

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017
		// Запоминаем старое состояние
		old_value = new_value;

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

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

кому не влом и самому интересно - замерьте время лупа ваших программ и отпишитесь всюда в формате: программа делает это, время столько-то.

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

спасибо.


void setup() {Serial.begin(115200);}

void loop() {
unsigned long start = millis();
/*здесь код вашего скетча*/
unsigned long stop  = millis();
Serial.print(stop - start);
}

 

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017
 
титановый велосипед для кнопки. (версия 11.0)
 
- добавил выбор типа контактов кнопки(нормально разомкнуты, нормально замкнуты)
- добавил короткие, длинные нажатия
- спрятал уродливое *.button[].*, *.matrix[][].*
- внутри чуть оптимизации и удобочитаемости кода
 
auct
Offline
Зарегистрирован: 14.12.2014

Объясните пожалуйста, как запрограммировать нажатие нормальнозамкнутой кнопки?

Но есть еще 2 нормально открытые кнопки. Они не будут конфликтовать?

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Клапа, скорее всего, в каком-нить Египте щас попу греет.  Отпуск у радиомонтажников длинный, так что жди терпеливо. 

andycat
Offline
Зарегистрирован: 07.09.2017

auct пишет:

Объясните пожалуйста, как запрограммировать нажатие нормальнозамкнутой кнопки?

Но есть еще 2 нормально открытые кнопки. Они не будут конфликтовать?

не поверите - аналогично нормально разомкнутой - только вместо ==0 ставим !=0 или наоборот в зависимости к чему кнопка притянута

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

auct пишет:

Объясните пожалуйста, как запрограммировать нажатие нормальнозамкнутой кнопки?

вот так.


/*
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
titanium bicycle for button. (version 11.0)
file Button.h - shell for to class Click, buttons.
https://klapautsiy.github.io/titanium-bicycle-for-button/
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*/

#include <Button.h>

Button button_Normal_Open;
Button button_Normal_Closed;

void setup() {
button_Normal_Open.NO(); // N.O. Normal Open
// button_Normal_Open.NC(); // N.C. Normal Closed
button_Normal_Open.pullUp();
// button_Normal_Open.pullDn();
button_Normal_Open.duration_bounce       (  50);
button_Normal_Open.duration_click_Db     ( 250);
button_Normal_Open.duration_inactivity_Up(5000);
button_Normal_Open.duration_inactivity_Dn(1000);
button_Normal_Open.duration_press        ( 500);
button_Normal_Open.button( 5, 4, 9, 7, 8); // arduino pins connected to button
// button_Normal_Open.button();

/////
// button_Normal_Closed.NO(); // N.O. Normal Open
button_Normal_Closed.NC(); // N.C. Normal Closed
button_Normal_Closed.pullUp();
// button_Normal_Closed.pullDn();
button_Normal_Closed.duration_bounce       (  50);
button_Normal_Closed.duration_click_Db     ( 250);
button_Normal_Closed.duration_inactivity_Up(5000);
button_Normal_Closed.duration_inactivity_Dn(1000);
button_Normal_Closed.duration_press        ( 500);
button_Normal_Closed.button( 9, 10, 11, 12, 13); // arduino pins connected to button
// button_Normal_Closed.button();

}

void loop() {
button_Normal_Open.read();
if (button_Normal_Open.state_button       (0) == 1) {}
if (button_Normal_Open.state_inactivity_Up(0) == 1) {}
if (button_Normal_Open.state_inactivity_Dn(0) == 1) {}
if (button_Normal_Open.event_click_Up     (0) == 1) {}
if (button_Normal_Open.event_click_Dn     (0) == 1) {}
if (button_Normal_Open.event_click_Db     (0) == 1) {}
if (button_Normal_Open.event_inactivity_Up(0) == 1) {}
if (button_Normal_Open.event_inactivity_Dn(0) == 1) {}
if (button_Normal_Open.event_press_short  (0) == 1) {}
if (button_Normal_Open.event_press_long   (0) == 1) {}
//  button_Normal_Open....................(*) == 1) {}
if (button_Normal_Open.state_button       (4) == 1) {}
if (button_Normal_Open.state_inactivity_Up(4) == 1) {}
if (button_Normal_Open.state_inactivity_Dn(4) == 1) {}
if (button_Normal_Open.event_click_Up     (4) == 1) {}
if (button_Normal_Open.event_click_Dn     (4) == 1) {}
if (button_Normal_Open.event_click_Db     (4) == 1) {}
if (button_Normal_Open.event_inactivity_Up(4) == 1) {}
if (button_Normal_Open.event_inactivity_Dn(4) == 1) {}
if (button_Normal_Open.event_press_short  (4) == 1) {}
if (button_Normal_Open.event_press_long   (4) == 1) {}

button_Normal_Closed.read();
if (button_Normal_Closed.state_button       (0) == 1) {}
if (button_Normal_Closed.state_inactivity_Up(0) == 1) {}
if (button_Normal_Closed.state_inactivity_Dn(0) == 1) {}
if (button_Normal_Closed.event_click_Up     (0) == 1) {}
if (button_Normal_Closed.event_click_Dn     (0) == 1) {}
if (button_Normal_Closed.event_click_Db     (0) == 1) {}
if (button_Normal_Closed.event_inactivity_Up(0) == 1) {}
if (button_Normal_Closed.event_inactivity_Dn(0) == 1) {}
if (button_Normal_Closed.event_press_short  (0) == 1) {}
if (button_Normal_Closed.event_press_long   (0) == 1) {}
//  button_Normal_Open....................(*) == 1) {}
if (button_Normal_Closed.state_button       (4) == 1) {}
if (button_Normal_Closed.state_inactivity_Up(4) == 1) {}
if (button_Normal_Closed.state_inactivity_Dn(4) == 1) {}
if (button_Normal_Closed.event_click_Up     (4) == 1) {}
if (button_Normal_Closed.event_click_Dn     (4) == 1) {}
if (button_Normal_Closed.event_click_Db     (4) == 1) {}
if (button_Normal_Closed.event_inactivity_Up(4) == 1) {}
if (button_Normal_Closed.event_inactivity_Dn(4) == 1) {}
if (button_Normal_Closed.event_press_short  (4) == 1) {}
if (button_Normal_Closed.event_press_long   (4) == 1) {}
}

т.е. - если желаешь рулить настройками пакета кнопок, то объявляешь для этого пакета экземпляр класса и соответсвующим образом ега настраиваешь. настройки распространяются на все кнопки, которые ты указал в настройках // arduino pins connected to button

так, для твоего сабжа:

Button button_Normal_Open;
Button button_Normal_Closed;

button_Normal_Open.NO(); // N.O. Normal Open
button_Normal_Closed.NC(); // N.C. Normal Closed

button_Normal_Open.button( 5, 4, 9, 7, 8); // arduino pins connected to button
button_Normal_Closed.button( 9, 10, 11, 12, 13); // arduino pins connected to button

auct пишет:

Но есть еще 2 нормально открытые кнопки. Они не будут конфликтовать?

для того и написана библиотека, что бы такого не происходило.

*да. для матрицы кнопок - аналогично.

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

andycat пишет:

не поверите - аналогично нормально разомкнутой - только вместо ==0 ставим !=0 или наоборот в зависимости к чему кнопка притянута

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

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

DetSimen пишет:

Клапа, скорее всего, в каком-нить Египте щас попу греет.

на ягелевых плантациях солнечной Тувы.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Клапа!!!!  Как я рад тебя видеть.  Пойду тяпну за твоя здоровью, а то переживал сильно.

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

DetSimen пишет:

Клапа!!!!  Как я рад тебя видеть.  Пойду тяпну за твоя здоровью, а то переживал сильно.

Аллаху Акбар иже еси...

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

auct пишет:

Объясните пожалуйста, как запрограммировать нажатие нормальнозамкнутой кнопки?

Но есть еще 2 нормально открытые кнопки. Они не будут конфликтовать?

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

будем считать, что этого всего не было...

просто, тупо взять и проверить самостоятельно, будут конфликтовать или нет - кто запретил? Я!? ¯\_(ツ)_/¯

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

кстати, не заметил сразу вот это

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

заранее поясню своё недоумение именно цифрой "5" - почему не "3" или "7" ? О_О

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

с возвращением!!!

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Клапа, ты там это... В живых людей кактелями не кидайся.  Лучше титановый лисапед пили. 

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

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

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

всем спасибо - тема закрыта.