~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
титановый велосипед для кнопки. (версия 7.0)
https://github.com/Klapautsiy/titanium-bicycle-for-button
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
инсталляция:
-------------
распаковать и поместить папку с файлами в папку с библиотеками Arduino IDE.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
файл Click.h - класс Click, логический блок.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
переменные:
------------
state_raw () - необработанное состояние кнопки
state_soft () - программное состояние кнопки
state_inactivity_Up() - состояние таймера неактивности ненажатой кнопки
state_inactivity_Dn() - состояние таймера неактивности нажатой кнопки
event_click_Up () - событие отпускания
event_click_Dn () - событие нажатия
event_click_Db () - событие двойного щелчка
event_inactivity_Up() - событие неактивности ненажатой кнопки
event_inactivity_Dn() - событие неактивности нажатой кнопки
функции:
---------
init(state_raw) - инициализация
read(state_raw, duration_bounce, duration_click_Db, duration_inactivity_Up,
duration_inactivity_Dn) - опрос кнопки
где:
state_raw - необработанное состояние кнопки
duration_bounce - длительность таймера фильтра дребезга
duration_click_Db - длительность таймера двойного щелчка
duration_inactivity_Up - длительность таймера неактивности ненажатой кнопки
duration_inactivity_Dn - длительность таймера неактивности нажатой кнопки
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
файл Button.h - класс-оболочка для класс Click, кнопки.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
класс Button создаёт массив button экземпляров класса Click, производит опрос
кнопок, подключенных к пинам и передачу их состояний массиву экземпляров класса
Click.
передача параметров:
---------------------
button(*,...) - указание номеров пинов, подключенных к кнопкам.
duration_bounce (time) - передача длительности таймера фильтра дребезга.
duration_click_Db (time) - передача длительности таймера двойного щелчка.
duration_inactivity_Up(time) - передача длительности таймера неактивности ненажатой кнопки.
duration_inactivity_Dn(time) - передача длительности таймера неактивности нажатой кнопки.
активация настроек:
--------------------
pullUp() - подтяжка пинов кнопок к Vcc.
pullDn() - подтяжка пинов кнопок к GND.
одноименные переменным класса Click возвращают логическое "ИЛИ" значений
одноименных переменных состояний и событий экземпляров класса Click.
передача параметров приводит к активации настроек по-умолчанию.
последующая передача параметров и явная активация настроек приводит к их
обновлению.
порядок передачи параметров и активации настроек не имеет значения.
вызов button() без параметров приводит к удалению массива button.
опрос кнопок производится вызовом функции read().
настройки по-умолчанию позволяют реализовать подключение кнопок к пинам
контроллера без дополнительных элементов.
при активации режима pullUp настройками по-умолчанию или явно для увеличения
помехозащищённости пины кнопок нужно подключать через резисторы 10KOm к Vcc.
при активации режима pullDn, подключение пинов кнопок к GND через резисторы
10KOm обязательно.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
файл Matrix.h - класс-оболочка для класс Click, матрица кнопок.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
класс Matrix создаёт двумерный массив matrix экземпляров класса Click,
производит опрос кнопок, подключенных к матрице и передачу их состояний массиву
экземпляров класса Click.
передача параметров:
---------------------
matrix_x(*,...) - передача номеров пинов, подключенных к колонкам матрицы.
matrix_y(*,...) - передача номеров пинов, подключенных к строкам матрицы.
duration_bounce (time) - передача длительности таймера фильтра дребезга.
duration_click_Db (time) - передача длительности таймера двойного щелчка.
duration_inactivity_Up(time) - передача длительности таймера неактивности ненажатой кнопки.
duration_inactivity_Dn(time) - передача длительности таймера неактивности нажатой кнопки.
активация настроек:
--------------------
pullUp() - подтяжка пинов строк к Vcc.
pullDn() - подтяжка пинов строк к GND.
NKRO() - режим No Key Rollover.
TKRO() - режим 2-Key Rollover.
одноименные переменным класса Click возвращают логическое "ИЛИ" значений
одноименных переменных состояний и событий экземпляров класса Click.
передача параметров приводит к активации настроек по-умолчанию.
последующая передача параметров и явная активация настроек приводит к их
обновлению.
порядок передачи параметров и активации настроек не имеет значения.
вызов matrix_x() и matrix_y() без параметров приводит к удалению
массива matrix.
опрос кнопок производится вызовом функции read().
настройки по-умолчанию позволяют реализовать подключение матрицы к пинам
контроллера и кнопок к матрице без дополнительных элементов в режиме
2-Key Rollover.
при активации режима No Key Rollover кнопки нужно подключать к матрице через
диоды.
при активации режима pullUp настройками по-умолчанию или явно для увеличения
помехозащищённости пины строк нужно подключать через резисторы 10KOm к Vcc.
при активации режима pullDn, подключение пинов строк к GND через резисторы
10KOm обязательно.
системное время кнопки замедлено в 60 раз, поэтому нажимаем и удерживаем кнопку долее 1.2 секунды, что бы сбросился фильтр дребезга и случилось нажатие
чекбоксами выбрать комбинации графиков переменных
мышью по графику выделить интересующий участок - масштабируется, двойной клик - вернётся к 1:1
системное время кнопки замедлено в 60 раз, поэтому нажимаем и удерживаем кнопку долее 1.2 секунды, что бы сбросился фильтр дребезга и случилось нажатие
чекбоксами выбрать комбинации графиков переменных
мышью по графику выделить интересующий участок - масштабируется, двойной клик - вернётся к 1:1
по примеру 414 поста только со всеми параметрами что за что отвечает
+ вообще я в примере кнопку давно понажимал. не разобрался честно сказать, только длинное нажание четко понятно. возможно дело в том что графики все на одном и все сливается. можно сделать как в лог анализаторе, первый график это кнопка, второй одинарное нажатие, двойное нажатие и т.д. ведь с каждой кнопки можно разные состояния брать, почему бы тогда и графики не сделать раздельные. мне кажется сразу понятнее будет
я сделал одинарное нажатие, потом двойное, затем длинное. и вот что я должен из этого понять? ну похоже у меня iq намного ниже твоего раз тебе все понятно, а мне нет. это в продолжение 437 поста
да выбирал я чекбоксами. ну сам посмотри, представь ты только прочитал мануал и решил потестить. что ты из этого поймешь? кто то из нас точно в танке сидит и жарафа изображает
нет. пока не будет человеческого описания. раз куча параметров которые отвечают за временные параметры, то есть близкие по функциональности, и сливаюттся в одну кашу, то без нормальной картинки хотя бы: это библиотека которая неизвестно как работает. нужно собирать макет, лог. анализатор и вперед тестировать
нет. пока не будет человеческого описания. раз куча параметров которые отвечают за временные параметры, то есть близкие по функциональности, и сливаюттся в одну кашу, то без нормальной картинки хотя бы: это библиотека которая неизвестно как работает. нужно собирать макет, лог. анализатор и вперед тестировать
в OneButton заявлены функции одиночный клик, двойной клик, нажатие и удержание - т.е. нажатие и удержание без обработки одиночного клика невозможно физически.
в ClickButton пишут:
Long clicks (hold button for one second or longer on last click):
Длинные клики (удерживайте кнопку в течение одной секунды или дольше при последнем нажатии):
т.е. для того что бы перейти в режим длинных кликов, нужно нажать и удерживать кнопку, т.е. предварительно сделать короткий клик.
*я просил подумать, а не бессмысленно тратить моё время.
А потом искать библиотеку отслеживающую длинный клик.
и ты мне пример напиши, пожалуйста.
Легко .
Пример с библиотекой 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();
}
одна кнопка:
несколько кнопок:
матрица кнопок:
README.md
визуализация переменных https://klapautsiy.github.io/titanium-bicycle-for-button/
проект титановый велосипед для кнопки в данный момент находится в состоянии жёсткого релиза.
возможно, я что-то упустил или реализовал не как, как это должно быть на самом деле.
*всем заинтересованным лицам, бобро пожаловаться в тему.
ну, не знаю - написать и нарисовать шопопало...
и вы так фильтр дребезга пишете?
http://www.atmel.com/Images/doc2532.pdf
сколько всего появилось
здесь пишу вики-справочник.
предлагайте, какие пункты нужно расписать подробно.
ну, не знаю - написать и нарисовать шопопало...
и вы так фильтр дребезга пишете?
http://www.atmel.com/Images/doc2532.pdf
автоматическая выключалка света в проходной коридор
вот вот. примеры это удобно
вот вот. примеры это удобно
примеры идут в комплекте пакета библиотеки в папке examples
а тут понятнее. еще бы что означают коэффициенты... я не понимаю, интернетом пользоваться не умею
прошу переписать попроще
я же только что переписал лично для тебя - куда же проще?
иди нахуй, йобаный троляка.
может картинку добавить например какой параметр за что отвечает. нарисовать импульс чтоли и где что прямо на нем, особенно кэффициенты
вот тебе интерактивное картинко. какие переменные, за что отвечают расписано в реадми.
визуализация переменных https://klapautsiy.github.io/titanium-bicycle-for-button/
если совсем в танке - нужно нажать на ссылко https://klapautsiy.github.io/titanium-bicycle-for-button/
читал, половину осилил. как на лекции по философии. написано как будто не для людей
короче забей
читал, половину осилил. как на лекции по философии. написано как будто не для людей
короче забей
ну, какую половину, чего ты осилил?
открываешь файл Matrix.h или Button.h и?.. что это такое?
ну, да - не для людей.
в файле реадми
повторюсь
здесь пишу вики-справочник.
предлагайте, какие пункты нужно расписать подробно.
по примеру 414 поста только со всеми параметрами что за что отвечает
+ вообще я в примере кнопку давно понажимал. не разобрался честно сказать, только длинное нажание четко понятно. возможно дело в том что графики все на одном и все сливается. можно сделать как в лог анализаторе, первый график это кнопка, второй одинарное нажатие, двойное нажатие и т.д. ведь с каждой кнопки можно разные состояния брать, почему бы тогда и графики не сделать раздельные. мне кажется сразу понятнее будет
по примеру 414 поста только со всеми параметрами что за что отвечает
в посте #414 был задан риторический вопрос и сделан скриншот, где инженеры Атмел неправильно нарисовали фильтр дребезга.
в посте #417 правильный фильтр дребезга.
я сделал одинарное нажатие, потом двойное, затем длинное. и вот что я должен из этого понять? ну похоже у меня iq намного ниже твоего раз тебе все понятно, а мне нет. это в продолжение 437 поста
в 417 действительно хорошо нарисовано и понятно
почему бы тогда и графики не сделать раздельные. мне кажется сразу понятнее будет
это я для чего писал? ты пробовал в галки мышью тыкать?
да выбирал я чекбоксами. ну сам посмотри, представь ты только прочитал мануал и решил потестить. что ты из этого поймешь? кто то из нас точно в танке сидит и жарафа изображает
и вот что я должен из этого понять?
ничего, пока не прочитаешь и не поймёшь файл README.txt
ты же его не читал совсем, от слова совсем, но солгал, что прочитал до половины.
что я должен начать понимать, когда собеседник мне нагло врёт? - правильно: такого собеседника нужно посылать нахуй.
представь ты только прочитал мануал и решил потестить.
ты не читал мануал - второй раз солгал и уже должен быть в пути, но почему-то имеешь наглость изображать из себя жертву моего интеллекта.
нет. пока не будет человеческого описания. раз куча параметров которые отвечают за временные параметры, то есть близкие по функциональности, и сливаюттся в одну кашу, то без нормальной картинки хотя бы: это библиотека которая неизвестно как работает. нужно собирать макет, лог. анализатор и вперед тестировать
нет. пока не будет человеческого описания. раз куча параметров которые отвечают за временные параметры, то есть близкие по функциональности, и сливаюттся в одну кашу, то без нормальной картинки хотя бы: это библиотека которая неизвестно как работает. нужно собирать макет, лог. анализатор и вперед тестировать
ок.
человек задаст вопрос, а в ответ получит:
я тебе дам один полезный совет - что бы быть лжецом, нужно иметь хорошую память и отличное логическое мышление.
я тебе напоминаю - ты пришёл и спросил глупость, свидетельсвующую о том, что библиотеки ты в глаза не видел, файлы описалова не читал совсем.
далее, ты начал рассказывать, что тебе неудобно и не понятно...
напоминаю ещё раз - ты ничего не читал. как тебе могло, внезапно, стать непонятно?
*третий раз послать лжеца и недотролля?
жмём кнопку "mode graph" и будет как в лох-анализаторе #434
https://klapautsiy.github.io/titanium-bicycle-for-button/
но файл README.txt нужно читать полюбому.
а можно еще подписать где что? прямо возле графика. обещаю прочитать)))
а чего сразу лох-анализатор? осадочек остался?))
а можно еще подписать где что? прямо возле графика. обещаю прочитать)))
можно - я разрешаю.
всё добро лежит здесь https://github.com/Klapautsiy/titanium-bicycle-for-button/tree/master/docs - жми кпопку "Fork" и писай.
добавил описалово всех функций в вики https://github.com/Klapautsiy/titanium-bicycle-for-button/wiki
втыкаем в примеры https://github.com/Klapautsiy/titanium-bicycle-for-button/tree/BUTTON-v7.0/examples и достигаем просветления
безуспешно пытаюсь выяснить источник ереси "короткие и длинные нажатия".
откуда это берётся и зачем народ упорно пытается реализовать сущность, противоречащую причинно-следственным связям?
дык наверно им так удобно
дык наверно им так удобно
им так неудобно и у них не получается использовать сущности "короткое и длинное нажатие" отдельно друг от друга.
в велосипеде не получается
при длинном проскакивает короткое)))
в велосипеде не получается
при длинном проскакивает короткое)))
OneButton, ClickButton
OneButton, ClickButton
в OneButton заявлены функции одиночный клик, двойной клик, нажатие и удержание - т.е. нажатие и удержание без обработки одиночного клика невозможно физически.
в ClickButton пишут:
Long clicks (hold button for one second or longer on last click):
Длинные клики (удерживайте кнопку в течение одной секунды или дольше при последнем нажатии):
т.е. для того что бы перейти в режим длинных кликов, нужно нажать и удерживать кнопку, т.е. предварительно сделать короткий клик.
*я просил подумать, а не бессмысленно тратить моё время.
да можете скока угодно философствовать, но у вас длинный клик срабатывает после одиночного, а там чётко работает без оного.
OneButton, ClickButton
т.е. для того что бы перейти в режим длинных кликов, нужно нажать и удерживать кнопку, т.е. предварительно сделать короткий клик.
А потом искать библиотеку отслеживающую длинный клик.
Выше сказали - OneButton, ClickButton и мой пост #401 .
ЗЫ. README.txt читал.
да можете скока угодно философствовать, но у вас длинный клик срабатывает после одиночного, а там чётко работает без оного.
код примера, где короткий клик инвертирует один пин, а длинный - другой пин, можно посмотреть?
А потом искать библиотеку отслеживающую длинный клик.
и ты мне пример напиши, пожалуйста.
да можете скока угодно философствовать, но у вас длинный клик срабатывает после одиночного, а там чётко работает без оного.
код примера, где короткий клик инвертирует один пин, а длинный - другой пин, можно посмотреть?
OneButton
короткое нажатие - клик
длительное нажатие - длинный клик
велосипед
короткое нажатие - клик
длительное нажатие - клик, потом длинный клик
OneButton
короткое нажатие - клик
длительное нажатие - длинный клик
велосипед
короткое нажатие - клик
длительное нажатие - клик, потом длинный клик
ну, напиши мне это в примере, что бы я не орал, что это невозможно теоретически.
меня только это интересует
if (короткое нажатие) digitalWrite(14, HIGH);
if (длинное нажатие) digitalWrite(14, LOW);
меня только это интересует
if (короткое нажатие) digitalWrite(14, HIGH);
if (длинное нажатие) digitalWrite(14, LOW);
т.е. примера, подтверждающего
OneButton
короткое нажатие - клик
длительное нажатие - длинный клик
не будет?
А потом искать библиотеку отслеживающую длинный клик.
и ты мне пример напиши, пожалуйста.
Легко .
Пример с библиотекой ClickButton
Код полностью - собирал товарищу треканальный коммутатор видеосигналов на LCD 1202. Упраляет микросхемами la7958n . Длинный клик - выбор источника видео(их 3). Короткий - коммутация между тремя телевизорами от выбранного источника.
Легко .
ну, я же просил дать полный рабочий пример кода типа:
а не выкладывать все свои исходники.
я не знаком с упомятутыми библиотеками - просто сделай рабочий пример, что бы в лупе было то, что я прошу.
велосипед делает то же самое: кликом включает, удержанием выключает светодиод.
но, я хочу убедиться, что OneButton не генерит клик перед длинным кликом - как мне это сделать?