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

Клапауций 999
Offline
Зарегистрирован: 06.06.2015
титановый велосипед для тактовой кнопки
 
с фильтрацией дребезга, двойным кликом и таймерами, запускаемыми одиночным кликом или удержанием кнопки.
Клапауций 999
Offline
Зарегистрирован: 06.06.2015
// титановый велосипед для тактовой кнопки
// с фильтрацией дребезга, двойным кликом и таймерами, запускаемыми одиночным кликом или удержанием кнопки.

byte pb_00 = 3; // объявляется пин, к которому подключена кнопка BUTTON_00.

void setup() {
pinMode(pb_00, INPUT); // конфигурируется пин для кнопки BUTTON_00.
digitalWrite(pb_00, 1);
}

void loop() {
BUTTON_00(); // подпрограмма обработки нажатий кнопки.
// здесь крутятся подпрограммы или тело основной программы.
}

void BUTTON_00() {
//=======================================================
static unsigned long  m =           millis();
       unsigned long nm =           millis();
static boolean        p = digitalRead(pb_00);
       boolean       np = digitalRead(pb_00);
//=================
if (np != p) {p = np; m = nm;}
//=======================================================
static byte         bounce      =   20; // длительность дребезга.
static boolean      b           =    0;
       boolean     nb;
//=================
static unsigned int doubleclick =  200; // длительность двойного клика.
static boolean      dc          =    0;
       boolean     ndc;
static byte          c          =    0;
//=================
if (nm - m > bounce) {nb = 1;} else {nb = 0;}

if (nm - m > doubleclick) {ndc = 1;} else {ndc = 0;}
if (ndc != dc) {dc = ndc; if (dc == 1) {c = 0;}}

if (nb != b) {b = nb;
if (p == 0 && b == 0) {BUTTON_00_bounce_down();// нажатие кнопки.
++c;      if (c == 2) {BUTTON_00_doubleclick_down();} // двойной клик.
}
if (p == 1 && b == 1) {BUTTON_00_bounce_up();} // отпускание кнопки.
}
//=======================================================
static unsigned long timer = 10000; // длительность таймера, запускаемого одиночным кликом.
static boolean       t     =     0;
       boolean      nt;
//=================
if (nm - m > timer) {nt = 1;} else {nt = 0;}
if (nt != t) {t = nt;
if (p == 1 && t == 1) {BUTTON_00_timer_up();} // срабатывание таймера, запускаемого одиночным кликом.
}
//=======================================================
static unsigned int retention = 2000; // длительность удержания кнопки до срабатывания таймера.
static boolean      r         =    0;
       boolean     nr;
//=================
if (nm - m > retention) {nr = 1;} else {nr = 0;}
if (nr != r) {r = nr;
if (p == 0 && r == 1) {BUTTON_00_retention_down();} // срабатывание таймера, запускаемого удержанием кнопки.
}
//=======================================================
}

void BUTTON_00_bounce_down() {} // подпрограмма, содержащая всё, что должно происходить при нажатии кнопки.
void BUTTON_00_bounce_up() {} // подпрограмма, содержащая всё, что должно происходить при отпускании кнопки.
void BUTTON_00_doubleclick_down() {} // подпрограмма, содержащая всё, что должно происходить при двойном клике.
void BUTTON_00_timer_up() {} // подпрограмма, содержащая всё, что должно происходить при срабатывании таймера, запущенного одиночным кликом кнопки.
void BUTTON_00_retention_down() {} // подпрограмма, содержащая всё, что должно происходить при после срабатывания таймера, запущенного нажатием и удержанием кнопки.
подпрограммы срабатывают по событию изменения логического состояния кнопки, срабатыванию фильтра дребезга или таймера.
т.е. мы имеем конструкт, с помощью которого неофит может реализовать на тактовой кнопке все свои хотелки, дописывая их в тело подпрограмм, а при достаточном любопытстве, понять, как же эта херня работает без delay() и не долбит в loop() то, что нужно делать один раз и забывать до следующего события.
 
примеры: 
- можно зажечь светодиод двойным кликом и погасить одиночным.
- можно зажечь одиночным кликом и погасить двойным.
- можно зажечь, удерживая кнопку и погасить двойным кликом.
- т.е. можно зажечь любым доступным способом и погасить любым доступным способом... и, наоборот.
- можно одной частью функционала управлять одним светодиодом, в второй частью - вторым светодиодом.
- LCD, включающий подсветку при активности клавиатуры и автоматически выключающий по истечении заданного периода времени.
достаточный выбор функционала для реализации любителям однокнопочных меню и прочих девайсов с ограниченным количеством кнопок.
 
*неофитам, вопросы по существу после недельной медитации на код.
**профессиональным программистам, конструктивная критика и предложения по внесению изменений в код приветсвуется, так как сам не являюсь программистом и уверен, что код местами наивен, а местами можно оптимизировать.
***Свидетелям Правильного Форматирования кода - идите в жопу.
Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Первый!

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

Puhlyaviy пишет:
Первый!

нах!

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

nevkon
Offline
Зарегистрирован: 20.01.2015

Осталось только в виде библиотеки оформить :)

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

nevkon пишет:

Осталось только в виде библиотеки оформить :)

оформляй - я не умею.

заодно и научусь.

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

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

Puhlyaviy пишет:
Первый!

нах!

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


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

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

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

***Свидетелям Правильного Форматирования кода - идите в жопу.

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

а эту строку напиши так чтобы еще веселее новичкам было

if (nm - m > bounce) {nb = 1;} else {nb = 0;}

(nm - m > bounce)?  nb = 1 : nb = 0;

да и объяви пин и константы через define

в 51 строке не хвататет скобочки

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

jeka_tm пишет:

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

в этом есть смысл, если ты пожелаешь скопипастить блок для второй кнопки - достаточно изменить в коде _00 на _01, _02,.. _0n.

локальные переменные объявляются для обновления состояния до настоящего

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

jeka_tm пишет:

а эту строку напиши так чтобы еще веселее новичкам было

if (nm - m > bounce) {nb = 1;} else {nb = 0;}

(nm - m > bounce)?  nb = 1 : nb = 0;

синоним функционала - смысл писать так, а не эдак?

jeka_tm пишет:

да и объяви пин и константы через define

с чего ты взял, что это константы? а, если я пожелаю их программно поменять?

jeka_tm пишет:

в 51 строке не хвататет скобочки

ага... а, есчё в 39-й и 60-й не хватает - пичалька.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

так написал чтобы новичкам было веселее)))

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

jeka_tm пишет:

так написал чтобы новичкам было веселее)))

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

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

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

с чего ты взял, что это константы? а, если я пожелаю их программно поменять?

если пожелаешь объяви как глобальную переменную в начале))

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

Puhlyaviy пишет:
А где обработка тачскринов? Типа там кружок нарисовал или крестик... не доработочка.

кто о чём, а вшивый о бане.

алё! гараж!, - это тактовая кнопка, в ею уже всё встроено на аппаратном уровне: чёрное круглое - это тачскрин.

 

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

jeka_tm пишет:

если пожелаешь объяви как глобальную переменную в начале))

как это повлияет на функционал и на удобство встраивания и масштабирования?

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

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

кто о чём, а вшивый о бане.

алё! гараж!, - это тактовая кнопка, в ею уже всё встроено на аппаратном уровне: чёрное круглое - это тачскрин.

 


а где титан?

Andrey-S
Offline
Зарегистрирован: 02.01.2015

И ведь никто просто не сказал "СПАСИБО Клапауций 999 тебе за труды и старания!" Правда, я тут первый новичок и поэтому говорю СПАСИБО Клапауций 999 за труды и старания!)

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

Puhlyaviy пишет:
а где титан?

ок. велосипед ты видишь - пили раму.

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

Andrey-S пишет:

И ведь никто просто не сказал "СПАСИБО Клапауций 999 тебе за труды и старания!" Правда, я тут первый новичок и поэтому говорю СПАСИБО Клапауций 999 за труды и старания!)

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

*куда засылать мешки с баплом, я скажу потом.

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Andrey-S пишет:

И ведь никто просто не сказал "СПАСИБО Клапауций 999 тебе за труды и старания!" Правда, я тут первый новичок и поэтому говорю СПАСИБО Клапауций 999 за труды и старания!)


Вот когда доведет до библиотеки.
Типа что бы иницилизируется пин как кнопка. Вот тады бум заставлять новичков выпиливать памятник из светиков

Andrey-S
Offline
Зарегистрирован: 02.01.2015

Ссылку сохранил на будусчее... Ща пока надо веб-сервер на sd-карте w5100 запилить... Времени много отнимает нафиг..

Andrey-S
Offline
Зарегистрирован: 02.01.2015

Puhlyaviy пишет:
[ Вот когда доведет до библиотеки...

Судя по 5му посту придется либо упрашивать, либо сильно упрашивать)

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

Puhlyaviy пишет:
Вот когда доведет до библиотеки. Типа что бы иницилизируется пин как кнопка. Вот тады бум заставлять новичков выпиливать памятник из светиков

пожалуйста

07 pinMode(pb_00, INPUT); // конфигурируется пин для кнопки BUTTON_00.
08 digitalWrite(pb_00, 1);

*библиотекари хреновы.

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

А где тут томик Петрова-Водкина?

nevkon
Offline
Зарегистрирован: 20.01.2015

Будет время поизучаю как делается библиотека и тогда переделаю.

roman2712@mail.ru
Offline
Зарегистрирован: 16.01.2014

Если делать библиотеку (или класс оформлять) то надо учесть: 

1) что кнопка может быть как на + так и на - садиться... 

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

что то типа:

class_button <key_name>(PIN_N, HIGH\LOW); 

дальше в программе уже будет

<key_name>.down();

<key_name>.up();

и т.д.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

а смысл кнопку на плюс зажать?

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

jeka_tm пишет:

а смысл кнопку на плюс зажать?

сакральный смысл.

roman2712@mail.ru
Offline
Зарегистрирован: 16.01.2014

так вроде как 2 типа подключения

1) в отк.состоянии 0, в замкнутом 1 (подтяжка на 0)

2) в отк.состоянии 1, в замкнутом 0 (подтяжка на 1)

я и так и так делаю, в зависимости от задачи.

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

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

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

roman2712@mail.ru пишет:

так вроде как 2 типа подключения

1) в отк.состоянии 0, в замкнутом 1 (подтяжка на 0)

2) в отк.состоянии 1, в замкнутом 0 (подтяжка на 1)

я и так и так делаю, в зависимости от задачи.

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

можно вытаскивать, вкуда подтянута кнопка отсюда

static boolean        p = digitalRead(pb_00);

Radjah
Offline
Зарегистрирован: 06.08.2014

> Sketch uses 1,298 bytes (4%) of program storage space. Maximum is 30,720 bytes.

> Global variables use 37 bytes (1%) of dynamic memory, leaving 2,011 bytes for local variables. Maximum is 2,048 bytes.

Ну норм.

Клапауций 999

Молоток, чо. :)

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

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

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

ЕвгенийП пишет:

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


Он же так и написал. Тац циферку меняешь и вперед

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

ЕвгенийП пишет:

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

попробуй заменить в дубле кода _00 на _01 и т.д.

я не проверял, но Лешак обещал правильное поведение переменных типа static, и если я правильно понял, как  они работают.

сегодня ночью проверю с двумя кнопками.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Т.е. код надо дублировать? Так я и думал.

Статичекие переменные-то работать,конечно, будут, куда нахрен денутся, они ж локально объявлены. А вот сам факт дублирование кода ... Вы тут писали ...

Клапауций 999 пишет:
**профессиональным программистам, конструктивная критика и предложения по внесению изменений в код приветсвуется
Так вот, дублирование кода ради добавления нового объекта никуда нахрен не годится. Так делать нельзя!

Как можно? Проще всего через класс. Переменные - члены класса (не статические) вполне себе будут схранять значения. Новая кнопка добавляется просто объявлением переменной типа "кнопка".

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

ЕвгенийП пишет:

Как можно? Проще всего через класс. Переменные - члены класса (не статические) вполне себе будут схранять значения. Новая кнопка добавляется просто объявлением переменной типа "кнопка".

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

const int led = 13;

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

void loop()
{
	digitalWrite(led, HIGH);
	delay(100);
	digitalWrite(led, LOW);
	delay(100);
}

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

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

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

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

Экономия? Ну, код Вашей функции будет один. А добавится (это если реализовывать простейшим путём) две строчки на каждую доп. кнопку: одна строчка - создание кнопки, а вторая - вызов функции в loop'е (так же как у Вас в loop'е сейчас вызывается, только там будет по такому вызову на каждую кнопку). Так что, как видите уже при двух кнопках экономия по коду почти в вдвое.

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

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

Испытал сериал принтами....

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

BUTTON_00_bounce_down         однократное короткое нажатие кнопки
BUTTON_00_bounce_up             отпускание  кнопки сразу
BUTTON_00_timer_up                через 10 секунд если ничего не трогать

BUTTON_00_bounce_down         долгое нажатие кнопки
BUTTON_00_retention_down       удержание кнопки
BUTTON_00_bounce_up             отпускание кнопки
BUTTON_00_timer_up                через 10 секунд если ничего не трогать

BUTTON_00_bounce_down         первое быстрое нажатие кнопки
BUTTON_00_bounce_up             первое быстрое отпускание кнопки
BUTTON_00_bounce_down         второе быстрое нажатие кнопки
BUTTON_00_doubleclick_down    ОБНАРУЖЕНО ДВОЙНОЕ НАЖАТИЕ КНОПКИ
BUTTON_00_bounce_up             второе быстрое отпускание кнопки
BUTTON_00_timer_up                через 10 секунд если ничего не трогать
 

 

Красиво, ИМХО не очень удобно.
функция опроса кнопки должна возвращать готовые события, а не полуфабрикаты.
Без лишних промежуточных значений.
Чтобы не было такого когда я получил нажатие кнопки, побежал его обрабатывать,
и тут приходит двойное нажатие.
Мне что - однократное теперь отменять? Всю обработку?
или delay (999) вставлять-  а вдруг это не простое, а двойное нажатие.

А если я держу кнопку? Приходит нажатие, сколько ждать окнчания?

Например:

0 - ничего не было
1 - однократное нажатие
2 - двухкратное нажатие
3 - удержание ( или 999 - держали почти секунду)
 

Было что-то похожее в 2011 году https://github.com/usefulthink/ebl-arduino/tree/master/ButtonEvent
 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Клапауций 999,

class Blinker {
  public:
    Blinker(const int8_t ledPin) {
      m_ledPin = ledPin;
      pinMode(m_ledPin, OUTPUT);
    }
    void DoBlink(const int TimeMs = 100) {  // если ничего не задать, то 100ms
      digitalWrite(m_ledPin, HIGH);
      delay(TimeMs);
      digitalWrite(m_ledPin, LOW);
      delay(TimeMs);
    }
  private:
    int8_t m_ledPin;
};

Blinker RedBlinker(10);     // LED на пине 10
Blinker BlueBlinker(11);    // LED на пине 11
Blinker YellowBlinker(12);  // LED на пине 12

void setup () {}

void loop() {
  RedBlinker.DoBlink();       // горит/пауза 100ms
  BlueBlinker.DoBlink(200);   // горит/пауза 200ms
  YellowBlinker.DoBlink(150); // горит/пауза 150ms
}

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

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

ЕвгенийП пишет:

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

ок - спасибо. буду разбираться.

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

trembo пишет:

функция опроса кнопки должна возвращать готовые события, а не полуфабрикаты.
Без лишних промежуточных значений.
Чтобы не было такого когда я получил нажатие кнопки, побежал его обрабатывать,
и тут приходит двойное нажатие.
Мне что - однократное теперь отменять? Всю обработку?
или delay (999) вставлять-  а вдруг это не простое, а двойное нажатие.

А если я держу кнопку? Приходит нажатие, сколько ждать окнчания?

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

если вы нажали, то получили BUTTON_00_bounce_down

если вы отпустили, то получили BUTTON_00_bounce_up

если вы два раза кликнули, то здесь никак не получится отфильтровать два раза BUTTON_00_bounce_down и BUTTON_00_bounce_up, что бы получить в результате в BUTTON_00_doubleclick_down один тик.

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

 

trembo пишет:

Например:
0 - ничего не было
1 - однократное нажатие
2 - двухкратное нажатие
3 - удержание ( или 999 - держали почти секунду)

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

1- верно - однократное нажатие, у вас получилось два тика при однократном нажатии?

2 - один тик при даблклике, вызывается однократно BUTTON_00_doubleclick_down

3 - при настоящих настройках срабатывает BUTTON_00_retention_down через две секунды один раз.

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

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

Как отличить вот это
BUTTON_00_bounce_down         однократное короткое нажатие кнопки
BUTTON_00_bounce_up             отпускание  кнопки сразу
BUTTON_00_timer_up                через 10 секунд если ничего не трогать

От этого
BUTTON_00_bounce_down         первое быстрое нажатие кнопки
BUTTON_00_bounce_up             первое быстрое отпускание кнопки
BUTTON_00_bounce_down         второе быстрое нажатие кнопки
BUTTON_00_doubleclick_down    ОБНАРУЖЕНО ДВОЙНОЕ НАЖАТИЕ КНОПКИ
BUTTON_00_bounce_up             второе быстрое отпускание кнопки

Начинаются-то они одинаково, значит на выделенное не надо сразу реагировать?
А сколько ждать? 
Работает, то есть показывает что нажимали, красиво.
А готовых событий не даёт.
Готовых к употреблению в switch-case или if - elseif

Функция сама должна понять что ещё не ясно что возвращать и при этом не возвращать НИЧЕГО!
Типа:  ждите ответа. 
Не состоял не участвовал, не привлекался.
Не было ничего, отдыхай пока, что-то будет- пренепременно сообщу.

Получается: У тебя нажали красную кнопку- это пожар.....
через какое-то время: Ой, извини, двойное нажатие- это не пожар, это ограбление!
А мне нужна была информация о пожаре?

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

trembo пишет:

Как отличить вот это
BUTTON_00_bounce_down         однократное короткое нажатие кнопки
BUTTON_00_bounce_up             отпускание  кнопки сразу

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

trembo пишет:

Получается: У тебя нажали красную кнопку- это пожар.....
через какое-то время: Ой, извини, двойное нажатие- это не пожар, это ограбление!

сделай пожар по даблклику, а ограбление при удержании.

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

ок не пользуйся подпрограммами :D

BUTTON_00_bounce_down

BUTTON_00_bounce_up

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

А как мне тогда ловить однократное нажатие?

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

trembo пишет:

А как мне тогда ловить однократное нажатие?


На червя!

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

Всё, завтра меня не ждите, пойду на карася. Уговорил...

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

trembo пишет:

Всё, завтра меня не ждите, пойду на карася. Уговорил...


Щука щас хорошо идет. Батя вчера прям около дома вытащил щуку на 6 кг.

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

trembo пишет:

А как мне тогда ловить однократное нажатие?

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

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

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

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

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

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

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

ЕвгенийП пишет:

- всё остальное, как у Вас.

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

ок. посмотрю в тырнетах ещё примеров.

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

вот тут внятно расписано как использовать классы вместо дублирования кода: http://robotosha.ru/arduino/multi-tasking-arduino.html

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Клапауций 999,

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

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

Вы имеет в виду 17 кнопок?

Ну, вот, смотрите, у меня обявлено 3 переменных (строки 17-19). Объвите там ещё 14, если нужно.

Например, я хочу заявить, что у меня кнопки на пинах со второго по двенадцатый. Отлично, вместо строк 17-19, так и пишу.

Blinker btn2(2), btn3(3), btn4(4), btn5(5), btn6(6), btn7(7), 
    btn8(8), btn9(9), btn10(10), btn11(11), btn12(12);

а для того, чтобы они все работали, вместо строк 24-26 пишу теперь:

btn2.DoBlink(); btn3.DoBlink(); btn4.DoBlink(); btn5.DoBlink(); 
btn6.DoBlink(); btn7.DoBlink(); btn8.DoBlink(); btn9.DoBlink(); 
btn10.DoBlink(); btn11.DoBlink(); btn12.DoBlink(); 

В принципе, кнопки можно объявить массивом и тогда в loop не надо перечислять все, а достаточно написать цикл по массиву. Если интересно, могу написать и такой пример. Надо?