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

DIYMan
DIYMan аватар
Онлайн
Зарегистрирован: 23.11.2015

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

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

А и в самом деле, чего это я? :)) Спросонья писал, и как-то привык, что мухи и котлеты должны быть отдельно. В принципе - не нужон там analogRead, ты прав. Выпилю нещадно :)

 

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

DIYMan пишет:

А и в самом деле, чего это я? :)) Спросонья писал, и как-то привык, что мухи и котлеты должны быть отдельно. В принципе - не нужон там analogRead, ты прав. Выпилю нещадно :)

ок. и, что у нас в сухом остатке? - не реагировать на click_up при старте балалайки?

DIYMan
DIYMan аватар
Онлайн
Зарегистрирован: 23.11.2015

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

DIYMan пишет:

А и в самом деле, чего это я? :)) Спросонья писал, и как-то привык, что мухи и котлеты должны быть отдельно. В принципе - не нужон там analogRead, ты прав. Выпилю нещадно :)

ок. и, что у нас в сухом остатке? - не реагировать на click_up при старте балалайки?

Так точно, товарищ Маузер. Если, конечно, не считать добавленного событийного интерфейса - я как-то уже привык к нему, начиная с C++ деБилдера и заканчивая Си шарпом. Хотя это - на любителя, да.

И вообще - я тебе уже говорил спасибо за код ;)

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

DIYMan пишет:

И вообще - я тебе уже говорил спасибо за код ;)

ок. спасибо мне.

sirota
Offline
Зарегистрирован: 18.08.2015

Попробовал класс, понравилось. Но я так и не догнал как сделать повторяющиеся нажатия?

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

sirota пишет:

Но я так и не догнал как сделать повторяющиеся нажатия?

после нажатия кнопки, повторяешь действие.

ruka36-222x160.jpgruka36-222x160.jpg

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

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

sirota
Offline
Зарегистрирован: 18.08.2015
void loop {
  BUTTON_LEFT.read();
  if (BUTTON_LEFT.click_down) { //что то делаю;}
}
Но событие происходит только 1 раз когда нажимаю на кнопку. А мне надо что бы повторялось каждый раз как опрашиваю при чем с фильтрмо деребезка в 50ms как есть сейчас у кнопки.
Что-то можно обнулить у BUTTON_LEFT что бы он программно решил что кнопку отпустили? Типа:
void loop {
  BUTTON_LEFT.read();
  if (BUTTON_LEFT.click_down) {
    //что то делаю;
    BUTTON_LEFT.reset();
  }
}

Где BUTTON_LEFT.reset(); будет сбрасывать состояния счетчиков до нуля.

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

MaksVV пишет:

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

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

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

Спасибо почитал, и вообще спасибо за класс, очень нужная штука!

ЗЫ

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

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

 
Ну вот можешь ведь предсказывать будущее, нужно перенести эти знания в класс. )
Клапауций 232
Offline
Зарегистрирован: 05.04.2016

sirota пишет:

void loop {
  BUTTON_LEFT.read();
  if (BUTTON_LEFT.click_down) { //что то делаю;}
}
Но событие происходит только 1 раз когда нажимаю на кнопку. А мне надо что бы повторялось каждый раз как опрашиваю при чем с фильтрмо деребезка в 50ms как есть сейчас у кнопки.
Что-то можно обнулить у BUTTON_LEFT что бы он программно решил что кнопку отпустили? Типа:
void loop {
  BUTTON_LEFT.read();
  if (BUTTON_LEFT.click_down) {
    //что то делаю;
    BUTTON_LEFT.reset();
  }
}

Где BUTTON_LEFT.reset(); будет сбрасывать состояния счетчиков до нуля.

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

функция "Повтор вводимого символа".

автоповтор задаётся двумя переменными: "Задержка перед началом повтора" и "Скорость повтора", которые к фильтру дребезга имеют более, чем косвенное отношение.

*подумаю на досуге.

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

Клапауций 232 пишет:
*подумаю на досуге.

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

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

класс титановый велосипед для delay без delay(). millis() заменить на micros()


#include <class_BUTTON.h>
#include <class_noDELAY.h>

BUTTON BUTTON_01(3);
noDELAY nD_01;

void setup () {}

void loop() {

BUTTON_01.read();
nD_01.read(0); // если 0, то генерация события будет происходить каждый цикл loop()

if (BUTTON_01.click_down) {nD_01.start(); // старт генератора событий
// что-то выполняется при нажатии кнопки
}

if (BUTTON_01.click_up) {nD_01.stop(); // стоп генератора событий
// что-то выполняется при отпускании кнопки
}

if (nD_01.tick) {
// что-то выполняется с интервалом, заданным nD_01.read(n)
}

}

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

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

Подскажите куда поставить конденсатор в схеме подключения кнопки через оптопару...Расово. И  правильно ли я оптрон подключаю?

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

MaksVV пишет:

Подскажите куда поставить конденсатор в схеме подключения кнопки через оптопару...Расово. И  правильно ли я оптрон подключаю?

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

считай, что вход оптопары - это пин контроллера.

*диод индикации - убрать.

!!! но! ты зачем запитал фототранзистор и диод оптопары от одного источника питания? какой в таком случае смысл применения оптопары?

 

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

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

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

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

MaksVV пишет:

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

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

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

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

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

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

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

MaksVV пишет:

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

ты просто попробуй зажечь два последовательно соединённых диода от 5 вольт.

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

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

ты просто попробуй зажечь два последовательно соединённых диода от 5 вольт.

ну вобщем то китайцы так подключают ( например релейные модули). Там последовательно диоду оптопары, включен диод индикатор и резюк на 1 кОм.

 

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

MaksVV пишет:

ну вобщем то китайцы так подключают ( например релейные модули). Там последовательно диоду оптопары, включен диод индикатор и резюк на 1 кОм.

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

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

MaksVV пишет:

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

а что по этому поводу? просто я плату щас рисую, нужно все правильно сделать, а то переделыывать много получится

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

MaksVV пишет:

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

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

есть два девайса в одном корпусе - светодиод и фототранзистор.

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

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

спасибо за инфу

lelik1414
Offline
Зарегистрирован: 03.04.2016

Спасибо, отличный "велосипед", очень помог. Только вот одно не понятно, почему на хорошую вещь сначала пытаются нагадить.

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

lelik1414 пишет:

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

никто особо и не гадил - вся критика и претензии были не по сути работы, а исключительно косметические:
1. профессионалы уволили меня нафиг из программистов с такими именами переменных и их принципиальной публичностью.
2. чайники, боялись попасть в АдЪ, юзая простой алгоритм подавления дребезга с блек-джеком, чистыми шлюхами и жёстким БДСМ причинно-следственными связями.
Клапауций 232
Offline
Зарегистрирован: 05.04.2016

3. всё оказалось совсем не так, как на самом деле.

желающим познать дзен - странный диалог Клапауций&Logik начало отсюда #62

*подписчикам, срочно отписаться - титановый велосипед подготавливается к переплавке в титановый костыль на три кнопки. :D

lelik1414
Offline
Зарегистрирован: 03.04.2016

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

что бы работало в версиях младше вплоть до Arduino 1.0, нужно в код #1 добавить первой строкой

#include <Arduino.h>

А вот это прямо в код в первом посте добавить надо.

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

lelik1414 пишет:

А вот это прямо в код в первом посте добавить надо.

я так и написал "нужно добавить".

karl2233
karl2233 аватар
Offline
Зарегистрирован: 05.07.2015

Всем привет в этом чатике(с)

делаю зарядное для LI-Io и Ni-Mh

Но для управления выбором типа батареи и тока зарядки хочу применить второй МК(Тини13).

Задачи для второго МК (отлаживаю на плате Ардуино, поэтому в скобках указал её порты) вот:


/*кнопка РВ4(3)

При включении:
1. РВ0(6) и РВ1(5) = лог 1.
2. РВ2(4) = лог 0.
3. РВ3(2) = сигналам с D1 или D2(разрешающий лог 0).
Первое нажатие:
1. РВ1(5) = лог 0.
2. РВ2(4) = лог 0.
3. РВ0(6) = лог 1.
4. РВ3(2) = сигналам с D1 или D2(разрешающий опрос кнопки лог 0).
Второе нажатие:
1. РВ1(5) = лог 0.
2. РВ2(4) = лог 1.
3. РВ0(6) = лог 1.
4. РВ3(2) = сигналам с D1 или D2(разрешающий опрос кнопки лог 0).
Третье нажатие:
1. РВ1(5) = лог 1.
2. РВ2(4) = лог 0.
3. РВ0(6) = лог 0.
4. РВ3(2) = сигналам с D1 или D2(разрешающий опрос кнопки лог 0).
Четвертое нажатие:
1. РВ1(5) = лог 1.
2. РВ2(4) = лог 0.
3. РВ0(6) = лог 1.
4. РВ3(2) = сигналам с D1 илиD2(разрешающий опрос кнопки лог 0).
Далее по кругу.
При паузе между нажатиями более 5 сек, фиксируется последнее состояние портов, которое можно изменить следующим нажатием кнопки (если на порту РВ3 лог 0).
Если на порт РВ3 приходит лог 1, то состояние выходов нельзя изменить до отключения питания.

При лог 1 на РВ3, порт РВ4 блокируется и кнопка не действует.
*/

Вопросы:

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

2. Как организовать запрет опроса кнопки после того, как процесс будет запущен, т.е. на РВ3( Ардуино 2) будет лог 1 и Тини 13 не должна реагировать на нажатие кнопки.

а так-то я великий программист =)

 

 

sirota
Offline
Зарегистрирован: 18.08.2015

karl2233 пишет:

Всем привет в этом чатике(с)

делаю зарядное для LI-Io и Ni-Mh

Но для управления выбором типа батареи и тока зарядки хочу применить второй МК(Тини13).

 

А зачем тинька? Не хватает дуньки? Юзайте ее.

А вообще делаем скажем еще флаг Enable.И если он активен, то опрашиваем кнопку, иначе нет. ПРимеры тут же в теме.

BUTTON BUTTON_01(3); // объявляем объект класса BUTTON кнопку с именем BUTTON_01, подключенную к пину 3.


void setup () {}

void loop() {

BUTTON_01.read(); // обновляем состояние переменных кнопки BUTTON_01.


// работаем с переменными кнопки BUTTON_01.
if (BUTTON_01.click_down) {что-то делаем при нажатии}
if (BUTTON_01.click_up) {что-то делаем при отпускании}
if (BUTTON_01.doubleclick) {что-то делаем при двойном нажатии(doubleclick)}
if (BUTTON_01.timer) {что-то делаем, если кнопка отпущена и неактивна в течении определённого времени}
if (BUTTON_01.retention) {что-то делаем при нажатии и удержании в течении определённого времени}

 

karl2233
karl2233 аватар
Offline
Зарегистрирован: 05.07.2015

сама зарядка на АТМ 8, там программа в *.hex, поэтому модифицировать её никак.

Тини 13 по размеру меньше, поэтому реши применить её.

за подсказку  - спасибо!

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

karl2233 пишет:

делаю зарядное для LI-Io и Ni-Mh ...

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

karl2233 пишет:

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

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

т.е.:


#include <class_BUTTON.h>

BUTTON BUTTON_01(3); // объявляем объект класса BUTTON кнопку с именем BUTTON_01, подключенную к пину 3.

byte tick_click_down_01 = 0; // счётчик нажатий кнопки BUTTON_01

void setup () {}

void loop() {

BUTTON_01.read(); // обновляем состояние переменных кнопки BUTTON_01.

// работаем с переменными кнопки BUTTON_01.
if (BUTTON_01.click_down) {++tick_click_down_01; if (tick_click_down_01 == 5) {tick_click_down_01 = 4;}} // подсчёт нажатий кнопки до 4.
if (BUTTON_01.timer) {tick_click_down_01 = 0;} // сброс счётчика нажатий в 0 после 5 секунд неактивности кнопки.

if (BUTTON_01.click_down && tick_click_down_01 == 1) {} // что-то делаем по событию первого нажатия.
if (BUTTON_01.click_down && tick_click_down_01 == 2) {} // что-то делаем по событию второго нажатия.
if (BUTTON_01.click_down && tick_click_down_01 == 3) {} // что-то делаем по событию третьго нажатия.
if (BUTTON_01.click_down && tick_click_down_01 == 4) {} // что-то делаем по событию червёртого нажатия.

}

karl2233 пишет:

2. Как организовать запрет опроса кнопки после того, как процесс будет запущен, т.е. на РВ3( Ардуино 2) будет лог 1 и Тини 13 не должна реагировать на нажатие кнопки.

#4

if (!условие) {BUTTON_01.read();} // обновляем состояние переменных кнопки BUTTON_01.

 

karl2233 пишет:

При паузе между нажатиями более 5 сек, фиксируется последнее состояние портов, которое можно изменить следующим нажатием кнопки (если на порту РВ3 лог 0).

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

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

static const unsigned long timer_    = 5000; // длительность отслеживания неактивности.

 

karl2233
karl2233 аватар
Offline
Зарегистрирован: 05.07.2015

ооооо! Клапауций 232, гораздо понятнее стало.

спасибо!

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

 

yul-i-an
yul-i-an аватар
Offline
Зарегистрирован: 10.12.2012

Клапацуй 232, попробовал Ваш класс (после того как в своём обнаружил баг (при создании более одного экземпляра класса защита от дребезга не производится, в данный момент ищу причину).

Использовал для проверки следующий код

#include <BUTTON.h>
BUTTON BUTTON_01(2);
void setup () {
  pinMode(13,OUTPUT);
}
void loop() {
  BUTTON_01.read(); // обновляем состояние
  if (BUTTON_01.click_down) {
    digitalWrite(13,!digitalRead(13));
  }
}

К удевлению задержку между нажатием кнопки и реакцией на неё в течении длительности отслеживания дребезга я не обнаружил. В чем может быть проблемма? Код класса взят из поста #1.

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

yul-i-an пишет:

К удевлению задержку между нажатием кнопки и реакцией на неё в течении длительности отслеживания дребезга я не обнаружил. В чем может быть проблемма? Код класса взят из поста #1

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

для проверки вручную и визуально установи

static const byte bounce_              =   1000; // длительность отслеживания дребезга.

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

или сгенери аппаратным образом нажатие кнопки чаще, чем static const byte bounce_ = 50 при дефолтных настройках класса, если владеешь осциллографом. 

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

** начиная отсюда #173 пытаюсь объяснить, почему так, а не иначе.

yul-i-an
yul-i-an аватар
Offline
Зарегистрирован: 10.12.2012

Провел эксперимент. Если на вход пина кнопки подавать прямоугольные импульсы (имитация дребезга) на выходе класса должны видеть 0.

Начал с 50Гц и снижал частоту до 10Гц, и Ваш и мой класс отработали одинаково, вплоть до 11Гц на выходе у них ничего небыло, а вот на 10Гц и Ваш и мой начал переодически устанавливать выход т.к. длина импульса при частоте 10Гц около 50мс.

Так что оба решения состоятельны.

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

yul-i-an пишет:

Так что оба решения состоятельны.

как же состоятельны, если

yul-i-an пишет:
К удевлению задержку между нажатием кнопки и реакцией на неё в течении длительности отслеживания дребезга я не обнаружил. В чем может быть проблемма? Код класса взят из поста #1.

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

GarryC
Offline
Зарегистрирован: 08.08.2016

Тогда лично я не очень понял, зачем Вы текст тут разместили, если юзать будете сами? Чтобы не забыть? Или все таки для того, чтобы им могли пользоваться другие? Если второй вариант, то тогда надо позаботится об удобстве будущих пользователей и добавить в описание класа одну строчку private: в нужном месте, а не становится в позицию оскорбленного справедливой критикой. 

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

GarryC пишет:

Тогда лично я не очень понял, зачем Вы текст тут разместили, если юзать будете сами? Чтобы не забыть? Или все таки для того, чтобы им могли пользоваться другие? Если второй вариант, то тогда надо позаботится об удобстве будущих пользователей и добавить в описание класа одну строчку private: в нужном месте, а не становится в позицию оскорбленного справедливой критикой. 

и, кто мне это переведёт на русский язык?

кому я снова недодал личного внимания или недостаточно убедительно послал в пень?

GarryC
Offline
Зарегистрирован: 08.08.2016

Боюсь Вас огорчить, но послать меня достаточно убедительно в пень Вам удасться лет через 15-20 занятий встроенным программированием.

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

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

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

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

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

GarryC пишет:

Боюсь Вас огорчить...

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

- ты пишешь хороший код для работы с кнопкой и публикуешь его на этом форуме.

- ты исправляешь ошибки в код класс титановый велосипед для тактовой кнопки.

- ты идёшь в пень, как программист-пустомеля.

*кретинам, обзывающим меня программистом, повторяю: я - радиомонтажник.

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

Уважаемый GarryC, не сочтите за труд прочитать.

GarryC пишет:

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

Если Вы пришли к нам в "песочницу" из "конструкторского бюро", так помогите, если не затруднит. Если обратите внимание на попытки написать альтернативу этому коду, то увидите, что никто не довел дела до конца и/или его теория оказалась не состоятельной.

GarryC пишет:

Боюсь Вас огорчить, но послать меня достаточно убедительно в пень Вам удасться лет через 15-20 занятий встроенным программированием.

Мда, сколько таких тут мимо проходило, ни один не доказал своей состоятельности ДЕЛОМ.

GarryC пишет:

..., и советы по ее улучшению Вы категорически отвергаете, ..

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

GarryC пишет:

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

Ежу понятно, что нет предела совершенству. Вот только где эти "супер коды-алгоритмы" в законченном виде? Где-то выше, только один человек написал "я использую вот такой код" но он мне не подходит, а кде все остальные???

GarryC пишет:

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

Мог (я) бы сказать СПАСИБО, ЕСЛИ БЫ такой продвинутый человек за "спасибо" (как это сделал Клапауций 232) подарил БЫ сообществу сие чудо.

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

 /*
 этот код я написал для замка в деревне, чтоб за ключем не бегать. Если работаешь
 не далеко и кто-то пришел, он должен знать код. Устройсто втягивает защелку на замке.
 КОД необходимо набирать последовательно, дождавшись когда КРАСНЫЙ светик потухнет,
 иначе нажитие другой кнопки будет включено в КОД (комбинацию кнопок).
 Каждая кнопка имеет "вес" 1, 2, 4 и 8 соответственно, пока горит КРАСНЫЙ светодиод
 вводится КОД соответствующий зашитому в программе и установленному джамперами.
 Невозможно понять, ошибся ты или нет, пока не набраны 4 комбинации.
 Для повторного нажатия неоходимо дождаться пока потухнет подсветка...
 Ну не хватило у меня кнопок на полную клавиатуру :)))))))))))))))
 Если на А3 (тумблер в доме) лог 0 (тумблер включен) 
 при любой комбинации А0, А1 и А2 (выбор кода) работает "простой код"
силовой "полевик" выдран с компьютерной матери 18N06L (что было, то и ставим) 
 */
    #include <class_noDELAY.h>
    #include <class_BUTTON.h>
    
      // коды доступа :)))------------
    
    byte COD_A[8][5] = {     // [строка] [значение]
                        {0, 0, 0, 0, 0},   // нули. чтоб код не править по инициализации
                        {0, 1, 8, 2, 4},   // код при нажатом тумблере (простой код)
                        {0, 2, 2, 5, 5},   // первый код (по перемычкам кода)
                        {0, 2, 6, 8, 10},  // второй код и т.д.
                        {0, 10, 2, 8, 2},
                        {0, 1, 6, 8, 8},
    
                        };  
    
    //----------------------------
    
    
    noDELAY nD_01; // таймер 1
    noDELAY nD_02; // таймер 2
    noDELAY nD_011; // таймер 11
    noDELAY nD_022; // таймер 22    
    noDELAY nD_03; // таймер 3 - сброс незавершенного кода
    
    BUTTON BT_01(2); // кнопок 1 разряда
    BUTTON BT_02(3); // кнопок 2 разряда
    BUTTON BT_03(4); // кнопок 4 разряда
    BUTTON BT_04(5); // кнопок 8 разряда
    BUTTON BT_05(8); // кнопка в доме
    
    // A0, A1, A2 - джамперы выбора предустановленного кода
    // A3         - упрощенный код доступа 
    
    // an array of pin numbers to which BUTTON or jumper are attached
    int BUTTON_Pins[] = { 2, 3, 4, 5, 8, A0, A1, A2, A3 }; 
    int  i=0, j=0; 
    byte q1=0, q2=0;;                       // перебор кода, очередь нажатия
    byte Bt = 0;                            // код кнопок
    byte Bt1=0, Bt2=0, Bt3=0, Bt4=0, Bt5=0; // результат (факт) нажатия кнопок по весу
    byte AC0=0, AC1=0, AC2=0, AC3=0, AC4=0, AC5=0, AC6=0; // выбор кода
    boolean  Btc = 0;                 // признак обработки кода кнопок, 1 если еще не обработан 
    boolean OL=0; // открыть замок
    
  
    
    
    //----------------------------------------------------
    void setup () 
    {
      for (int k = 0; k < 9; k++) 
      { pinMode(BUTTON_Pins[i], INPUT);  }
      
      pinMode(6,OUTPUT); // белый светик на подсветку 
      pinMode(7,OUTPUT); // красный светик на индикацию
      pinMode(9,OUTPUT); // ШИМ на мотор замка
      
       Serial.begin(9600); // for deBug
    }
    //------------------------------------------------------
      //----------------------------------------------------------
    // процедура открытия замка 
      void OPE_LOCK ()
  {
      if (OL == 1)
                                       
    {  
                                          
      nD_011.start();
      nD_011.read(1000);
      nD_022.start();    // мигалка красным светиком пока открываем
      nD_022.read(100);  //мигает красный светик открытого замка                                      
      if (nD_011.tick) {j++;}
      
      if (j==1)
      {                                             
      digitalWrite(9, 1);   // рывок на открытие, время nD_011.read(1000);
      }   
      if (j>=2) {analogWrite(9, 30);}  // удержание задвижки замка ШИМом
      
      if (nD_022.tick) {digitalWrite(7, !digitalRead(7));} //мигает красный светик открытого замка
      
      if (j>=5) // открыли, обнуляем все переменные
      {            
      digitalWrite(9, 0);
      digitalWrite(7, 0);
      q1=0;
      q2=0;
      j=0;
      Bt  = 0;
      Btc = 0;
      nD_011.stop();
      nD_022.stop();
      OL=0;
      }
    }
  } 
 
    //------------------------------------------------------
    void loop() 
    {
       //--------------------------------- получаем код нажатия кнопок 
      BT_01.read(); // обновляем состояние
      BT_02.read(); // обновляем состояние
      BT_03.read(); // обновляем состояние
      BT_04.read(); // обновляем состояние
      BT_05.read(); // обновляем состояние кнопка в доме
        
        if (BT_01.click_down) { Bt1=1;}
        if (BT_02.click_down) { Bt2=2;}
        if (BT_03.click_down) { Bt3=4;}
        if (BT_04.click_down) { Bt4=8;}
        if (BT_05.click_down) { Bt5=16;}

    //------------------- если нажата кнопка - подсветка и отсчет на сброс переменных кода
    if (Bt1==1 || Bt2==2 || Bt3==4 || Bt4==8 || Bt5==16) 
      { 
//                                                         Serial.println ("nD_03.start()  ");
        nD_03.start();
        digitalWrite(6, 1);               
      }
       nD_03.read(10000); // время до сброса или нажатия
       if (nD_03.tick) 
               {
                 digitalWrite(6, 0);
                 nD_03.stop();
                 Bt=0;
                 Btc=0;
                 q1=0;
                 q2=0;
                } 
      // конец подсветки и ограничения времени
      
      
      // начало проверки набранной комбинации кнопок
    if (Btc == 0) // если предыдущий код обработан, а новый еще нет
    {
    if (Bt1==1 || Bt2==2 || Bt3==4 || Bt4==8 || Bt5==16) //если кнопка нажата
      { 
        digitalWrite(7, 1);
        nD_01.start();
        nD_01.read(200);
        if (nD_01.tick) {i++;}        
        if (i>=3) // интервал определения одновременного нажатия кнопок
           {
             Bt=Bt1 + Bt2 + Bt3 + Bt4 + Bt5 ;   // получен код набора кнопок
             Bt1=0, Bt2=0, Bt3=0, Bt4=0, Bt5=0; // получен код набора кнопок
             Btc = 1; // признак, код еще не обработан
//                                                                Serial.println (Bt);
             i=0;
             nD_01.stop();
             digitalWrite(7, 0);
 //                                          Serial.println ("Bt1=0, Bt2=0, Bt3=0, Bt4=0, Bt5=0;  ");
           }}}
     //========  подучен код кнопок и признак обработки 
 //----------------------------------------
 // обработчик кода нажатия кнопок
  if (Btc == 1)
  {
    q1++; //  перебор очереди нажатия
 //                                                            Serial.print ("q1=   ");
 //                                                            Serial.println (q1);
      if (Bt >= 16)  // если нажата кнопка в доме (независимо от набора на улице)
      {
//                                                      Serial.println ("if (Bt>=16) !!!!!!  ");
        OL=1;
//        OPEN_LOCK (1);  // в конце лупа
        Btc=0;
        q1=0;
        q2=0;
      }
      
      if (Bt<=15) //набираем кнопки на улице
      {
//                                                        Serial.println ("[AC4] =   ");
//                                                        Serial.println (AC4);
//                                                        Serial.println ("[q1] =   ");
//                                                        Serial.println (q1    );
//                                                        Serial.println ("COD_A[AC4][q1]    ");
//                                                        Serial.println (COD_A[AC4][q1]);
        ACCESS_CODE (); // какой код выбран т.е. где стоят джамперы  (работа с массивом)
        
        if (Bt == COD_A[AC4][q1]) // если код совпал 
        {
          q2++;
  //                                                           Serial.print ("q2=   ");
   //                                                          Serial.println (q2);
        }
        else {q2=0;}
        if ( q2 >= 4) //если все 4 цифры верно набрали
        {
          OL=1;    // открыть и обнулить
          Btc=0;
          q1=0;
          q2=0;
        }
        if ( q1 >= 12) // если кто-то брутит, можно еще больше сделать
        {
//          OL=1;
          Btc=0;
          q1=0;
          q2=0;
        }
        
       Btc=0;  // ХБЗ зачем оно тут :)
      }
    
    
  } // конец обработчика кода нажатия кнопок 

 
 //--------------------------------------- 
     
     
//                                                          Serial.print ("OL ");
//                                                         Serial.println (OL);
      OPE_LOCK (); // открыть замок, если OL = 1
    } // loop

    //--------------------------------------------------------------
    
  void ACCESS_CODE ()   // работа с кодом доступа
      {
//                                              Serial.println ("void ACCESS_CODE ()  ");
       AC0 =  !digitalRead(A0);
       AC1 =  !digitalRead(A1);
       AC2 =  !digitalRead(A2);
       AC3 =  !digitalRead(A3);
 
//                                             Serial.print ("AC0... AC2=  ");
 //                                            Serial.print (AC0);  
 //                                            Serial.print (AC1);      
 //                                            Serial.println (AC2);          
       
       if (AC3 == 1) // если код "простой" т.е. вкл. тумблер в доме
       {   // byte COD_A[8][4] =    // [строка] [значение]
       AC4 = 1;
       }
       
       if (AC3 == 0) // собираем код из джамперов и спускаем ниже кода тумблера (+1)
       {
       AC4 = 1 + AC0 + AC1 + AC1 + AC2 + AC2 + AC2 + AC2;
       }
 //                               Serial.print ("AC3=  ");
//                                Serial.println (AC3);
 //                               Serial.print ("AC4=  ");
 //                               Serial.println (AC4);                                
  
      }
    

 

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

UPD

так я и не понял этой фразы....

GarryC пишет:

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

объяснитесь, пожалуйста, так я собираюсь нажать, кликнуть 2 раза или подержать (ну скажем 5 секунд). И как там это реализовано?

пост 100

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

vvadim пишет:

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

опиши мне словами алгоритм, который будет предсказывать будущее, например:

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

 

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

Гриша пишет:

так я и не понял этой фразы....

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

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

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

анонс.

на днях выложу переписанную заново версию кода класса - через более чем год многие вещи вижу иначе.

sirota
Offline
Зарегистрирован: 18.08.2015

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

анонс.

на днях выложу переписанную заново версию кода класса - через более чем год многие вещи вижу иначе.

Ждем. Юзаю более или менее данный класс. Немного переписал под себя, убрал лишние примочки.

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

sirota пишет:

Ждем. Юзаю более или менее данный класс. Немного переписал под себя, убрал лишние примочки.

и чего мешает поделиться результатом (ну соответственно, с описание переделок.)? Я пример использования кинул в посте 243 (тока там без переделок, я их не делал)

 

GarryC
Offline
Зарегистрирован: 08.08.2016

Прежде всего, хотелось бы подчеркнуть, что воспитанный человек не может обращаться на ты к незнакомому человеку в русском языке, поскольку это невежливо. В других языках, где понятия ты И Вы сливаются, это вполне допустимо, но даже в них при общении с малознакомыми людьми принято применять безличные Mrs и Ms вместо You. Но это так заметка по поводу, конечно, можно быть хорошим разработчикам и при этом пренебрегать правилами поведения в обществе, но мне подобное сочетания представляется маловероятным в силу ряда причин, излагать которые в данном комменте считаю излишним.

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

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

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

Ну и последнее, по моему мнению, назвать человека программистом - это не обозвать его, поскольку программирование, как профессия, требует весьма высокого уровня интеллектуального развития и не может быть оскорбительныи. А что касается того, чем Вы зарабатываете в реальной жизни - по Вашему, это существенно? Я должен сделать скидку и относится к Вашей программе, исходя из иных критериев, нежели к своей или к программе коллеги? Это почему, собственно?

Если я Вам принесу криво собранную плату со "слепыми " пайками и в ответ на Ваши замечания гордо заявлю, что я программист, это как-то улучшит качество этой платы?

GarryC
Offline
Зарегистрирован: 08.08.2016

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

1. В том то и дело, что я прочитал комменты в начале и там уважаемому автору предлагалось другими участниками ввести некоторые элементарные исправления в код, чтобы соблюсти общепринятые соглашения о написании классов. Но, вместо того, чтобы последовать этим несомненно разумным советам, автор начинает вопрошать, зачем это делать (я не буду цитировать содержимое любой книги по ООП, там все наглядно показано с примерами), заявлять, что он и так прекрасно использует свой класс, что и вызвало к жизни мой комментарий относительно намерений, сподвигнувших его на выставление своего кода на всеобщее обозрение. Да, Вы правы, никто из критикующих код не предложил внятной альтернативы; как я и обещал, постараюсь исправить данное упущение.

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

3. По поводу советов именно они и были в комментах к этому посту - посмотрите внимательнее.

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

5. Если я выполню свое обещание за эти выходные, то вполне приму Вашу благодарность, ни на что другое я не рассчитываю, мои посты удовлетворяют не нижние уровни пирамиды потребностей.

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

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