Двойное нажатие
- Войдите на сайт для отправки комментариев
Пнд, 20/05/2019 - 23:07
Добрый всем день! Не могу понять, что я делаю не так.
Задача: если нажали 1 раз на кнопку, и если через 250мс не нажали еще раз, то считать как "pressed"
если нажали 1 раз на кнопку и через 250мс нажали еще раз, то считать как "double"
Получается только получить pressed, а вот с double никак не могу разобраться.
#define button1B A0 // пин кнопки button1 int vel; boolean button1S; // храним состояния кнопок (S - State) boolean button1P; // флажки кнопок на одно нажатие (P - Press) boolean button1DP; // флажки кнопок на двойное нажатие (D - Double Pressed) #define double_timer 250 // время (мс), отведённое на второе нажатие #define debounce 80 // (мс), антидребезг unsigned long button1_timer; // таймер последнего нажатия кнопки unsigned long button1_double; // таймер двойного нажатия кнопки void setup() { Serial.begin(9600); pinMode(A0,INPUT); } void loop() { //-------опрос кнопки-------- vel = analogRead(A0); if(vel>90) { button1S = digitalRead(button1B); button(); //отработка кнопки //-------опрос кнопки-------- if (button1P) { Serial.println("pressed"); button1P = 0; } if (button1DP) { Serial.println("double"); button1DP = 0; } } } //------------------------ОТРАБОТКА КНОПКИ------------------------- void button() { if (button1S && millis() - button1_timer > debounce) { button1_timer = millis(); if(button1S && millis() - button1_double < double_timer) { button1DP = 1; button1_double = millis(); } else { button1P = 1; } } }
Для начала:
1. что за ерунда у тебя в строках 19 и 20?
2. как подключена кнопка? что должна дать функция digitalRead при нажатии и отпускании?
1. Вместо кнопки у меня пьезодатчик, использую как кнопку
2. Кнопка подключена в А0, функция digitalRead должна дать значение, если на нее идет напряжение, то 1, если нет, то 0
1. Вместо кнопки у меня пьезодатчик, использую как кнопку
2. Кнопка подключена в А0, функция digitalRead должна дать значение, если на нее идет напряжение, то 1, если нет, то 0
Вы уж определитесь - читаете эту кнопку как аналоговую или логическую.
В строках 37 и 39 надо скобки расставить, а то полный бред получатся.
На логику работы не смотрел.
Так он читает он сначала читается, как аналоговый, а потом как цифровой.
А что неправильно? В 37 и 39 перепроверил, везде скобки закрыты и тела внутри расставлены
37 и 39 перепроверил, везде скобки закрыты и тела внутри расставлены
не имейте привычки так писать условия.
Во-первых, нечитабельно, во-вторых, с такой привычкой вы рано или поздно не угадаете с приоритетом операций и получится совсем не то, что задумано.
Расставляйте скобки, не жалейти их, они бесплатны:
Спасибо большое! Буду теперь иметь ввиду
Поставил скобки, но это ничего не дало. Все осталось по прежнему
Кстати пробовал разные варианты и заметил, что если заменить "button1_timer = millis();" на "button1_double = millis();", то при нажатии выдает double, но при только при одном нажатии
Так он читает он сначала читается, как аналоговый, а потом как цифровой.
Объясните, пожалуйста, в чем глубокий смысл таких действий?
Для того чтобы установить срабатывания функции, начиная от 90 и выше.
Дело в том, что пьезодатчик очень чувствителен, и, выставляя порог, я избавлюсь от случайной вибрации, которая включит дальнейшую функцию. А перевод в цифру просто для удобства, так как в дальнейшем не имеет значение, какой сигнал будет на пине
1. Вместо кнопки у меня пьезодатчик, использую как кнопку
2. Кнопка подключена в А0, функция digitalRead должна дать значение, если на нее идет напряжение, то 1, если нет, то 0
i'm sorry, i don't understand the question. https://youtu.be/MBuywvpG0TY
Спасибо большое за код! Но DoublePressed у меня выводит только если кнопка была зажата после Pressed. Мне важно, чтобы она за 250мс была нажата 2 раза и ардуино давала мне только значение DoublePressed , нежели 2 раза Pressed
Спасибо за код! Попробовал сделать вывод в serial.println, ничего не получилось. Возможно из-за функции прерывания, не особо понимаю для чего она тут.
не имейте привычки так писать условия.
Во-первых, нечитабельно, во-вторых, с такой привычкой вы рано или поздно не угадаете с приоритетом операций и получится совсем не то, что задумано.
Расставляйте скобки, не жалейти их, они бесплатны:
Ну ОЧЕНЬ категорично. Тогда может сразу по две скобки, для надёжности? Как монашка на огурец.)
Ну ОЧЕНЬ категорично. Тогда может сразу по две скобки, для надёжности? Как монашка на огурец.)
А я за. Я предпочитаю явно расставлять приоритет скобками, а не выискивать его по затертой бумашке, водя пальцем по всем 15-ти уровням и матерно шевеля губами. Да и, тенболее, с этим вашим лживым С++ никогда нельзя сказать точно, какую сегодня с утра несёт семантику оператор присваивания (да и любой другой).
Деление с умножением тоже скобками выделяем? Только не нужно своим методам учить других выдавая за истину. Ибо сразу возникает вопрос, на кой хрен вообще эти приоритеты? Выделяем скобочками и ни о чём не думаем.)
Я, к щастью, никаво и не учу, ибо не способен. Я просто говорю, как делаю я. И всё. Кто-то разделяет взгляды старого олкаголека, кто-то твои, важен любой плюрализьм мнений.
Green, ИМХО большинство новичков не знают приоритетов операций. Поэтому тоже придерживаюсь мнения, что лучше приучать новичков расставлять скобки. Хуже от этого точно не будет.
Green, ИМХО большинство новичков не знают приоритетов операций. Поэтому тоже придерживаюсь мнения, что лучше приучать новичков расставлять скобки. Хуже от этого точно не будет.
Да, и математика не всегда поможет... Скажи мне несколько лет назад, что если прямая процедура выглядит так : N=x+k1*y+k1*k1*z , тогда обратная так: z=N/k1*k1; y=(N-k1*k1*z)/k1;x=N-k1*k1*z-k1*y - усомнился бы.
Добрый всем день! Не могу понять, что я делаю не так.
Задача: если нажали 1 раз на кнопку, и если через 250мс не нажали еще раз, то считать как "pressed"
если нажали 1 раз на кнопку и через 250мс нажали еще раз, то считать как "double"
Получается только получить pressed, а вот с double никак не могу разобраться.
Попробуйте такой код. Здесь можно фиксировать 1-10 и более нажатий. Без антидребезга - если подойдет помогу
Green, ИМХО большинство новичков не знают приоритетов операций. Поэтому тоже придерживаюсь мнения, что лучше приучать новичков расставлять скобки. Хуже от этого точно не будет.
Ну ОЧЕНЬ категорично.
Про категоричность формы - согласен. Есть за мной такой грех.
А вот по содержанию остаюсь при том же мнении - скобки более читабельны и страхуют от ошибок.
Спасибо большое за код! Он прям идеально подошел. Но у меня, как у начинащего, появились вопросы на счет логики. Почему условия начали выполняться. Ведь первый if не может вначале выполниться, так как вначале значение flag и button = 1, и второй if тоже из-за начального значения f_time = 0
Первый иф сработает - и при нажатии и при отпускании тоесть при любом изменении состояния кнопки, после этого флаг примет значение кнопки и сюда мы больше заходить не будем до следующего изменеия состояния кнопки, кстати здесь мняем f_time = 1 и уже можем заходить во второй if