Официальный сайт компании Arduino по адресу arduino.cc
титановый велосипед для тактовой кнопки
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Пт, 31/07/2015 - 07:09
титановый велосипед для тактовой кнопки
с фильтрацией дребезга, двойным кликом и таймерами, запускаемыми одиночным кликом или удержанием кнопки.
Первый!
нах!
теперь всех кнопочных навичков засылать сюда, и пусть не говорят, что здесь нет, того о чём они мечтали всю жисть.
Осталось только в виде библиотеки оформить :)
Осталось только в виде библиотеки оформить :)
оформляй - я не умею.
заодно и научусь.
нах!
теперь всех кнопочных навичков засылать сюда, и пусть не говорят, что здесь нет, того о чём они мечтали всю жисть.
А где обработка тачскринов? Типа там кружок нарисовал или крестик... не доработочка.
бе бе бе. переменные зачем каждый раз объявляешь? смысла в этом нет. тем более настраивать проще когда переменные вначале объявлены, а не где то в коде
а эту строку напиши так чтобы еще веселее новичкам было
да и объяви пин и константы через define
в 51 строке не хвататет скобочки
бе бе бе. переменные зачем каждый раз объявляешь? смысла в этом нет. тем более настраивать проще когда переменные вначале объявлены, а не где то в коде
в этом есть смысл, если ты пожелаешь скопипастить блок для второй кнопки - достаточно изменить в коде _00 на _01, _02,.. _0n.
локальные переменные объявляются для обновления состояния до настоящего
статические переменные сохраняют свои значения между вызовами, но при первом то запуске они должны быть чему-то равны, поэтому, именно так.
а эту строку напиши так чтобы еще веселее новичкам было
синоним функционала - смысл писать так, а не эдак?
да и объяви пин и константы через define
с чего ты взял, что это константы? а, если я пожелаю их программно поменять?
в 51 строке не хвататет скобочки
ага... а, есчё в 39-й и 60-й не хватает - пичалька.
так написал чтобы новичкам было веселее)))
так написал чтобы новичкам было веселее)))
голословный наговор - я весь код так пишу, что бы веселье распределялось равномерно на всех не взирая.
с чего ты взял, что это константы? а, если я пожелаю их программно поменять?
если пожелаешь объяви как глобальную переменную в начале))
кто о чём, а вшивый о бане.
алё! гараж!, - это тактовая кнопка, в ею уже всё встроено на аппаратном уровне: чёрное круглое - это тачскрин.
если пожелаешь объяви как глобальную переменную в начале))
как это повлияет на функционал и на удобство встраивания и масштабирования?
кто о чём, а вшивый о бане.
алё! гараж!, - это тактовая кнопка, в ею уже всё встроено на аппаратном уровне: чёрное круглое - это тачскрин.
а где титан?
И ведь никто просто не сказал "СПАСИБО Клапауций 999 тебе за труды и старания!" Правда, я тут первый новичок и поэтому говорю СПАСИБО Клапауций 999 за труды и старания!)
ок. велосипед ты видишь - пили раму.
И ведь никто просто не сказал "СПАСИБО Клапауций 999 тебе за труды и старания!" Правда, я тут первый новичок и поэтому говорю СПАСИБО Клапауций 999 за труды и старания!)
ты вначале запили на этом шото своё - нужно понять, насколько оно портируемо.
*куда засылать мешки с баплом, я скажу потом.
И ведь никто просто не сказал "СПАСИБО Клапауций 999 тебе за труды и старания!" Правда, я тут первый новичок и поэтому говорю СПАСИБО Клапауций 999 за труды и старания!)
Вот когда доведет до библиотеки.
Типа что бы иницилизируется пин как кнопка. Вот тады бум заставлять новичков выпиливать памятник из светиков
Ссылку сохранил на будусчее... Ща пока надо веб-сервер на sd-карте w5100 запилить... Времени много отнимает нафиг..
Судя по 5му посту придется либо упрашивать, либо сильно упрашивать)
пожалуйста
07
pinMode(pb_00, INPUT);
// конфигурируется пин для кнопки BUTTON_00.
08
digitalWrite(pb_00, 1);
*библиотекари хреновы.
А где тут томик Петрова-Водкина?
Будет время поизучаю как делается библиотека и тогда переделаю.
Если делать библиотеку (или класс оформлять) то надо учесть:
1) что кнопка может быть как на + так и на - садиться...
2) при обьявлении кнопки должен обьявляться PIN, к которому она подключена
что то типа:
class_button <key_name>(PIN_N, HIGH\LOW);
дальше в программе уже будет
<key_name>.down();
<key_name>.up();
и т.д.
а смысл кнопку на плюс зажать?
а смысл кнопку на плюс зажать?
сакральный смысл.
так вроде как 2 типа подключения
1) в отк.состоянии 0, в замкнутом 1 (подтяжка на 0)
2) в отк.состоянии 1, в замкнутом 0 (подтяжка на 1)
я и так и так делаю, в зависимости от задачи.
кнопку к плюсу ведь имеет ряд недостатков
так вроде как 2 типа подключения
1) в отк.состоянии 0, в замкнутом 1 (подтяжка на 0)
2) в отк.состоянии 1, в замкнутом 0 (подтяжка на 1)
я и так и так делаю, в зависимости от задачи.
я в коде особо не заморачивался на эту тему - подразумевается, что на землю замыкается
можно вытаскивать, вкуда подтянута кнопка отсюда
static
boolean p = digitalRead(pb_00);
> 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
Молоток, чо. :)
Клапауций 999, а как предлагается решать проблему, если нужны две кнопки? Дублированием кода?
Клапауций 999, а как предлагается решать проблему, если нужны две кнопки? Дублированием кода?
Он же так и написал. Тац циферку меняешь и вперед
Клапауций 999, а как предлагается решать проблему, если нужны две кнопки? Дублированием кода?
попробуй заменить в дубле кода _00 на _01 и т.д.
я не проверял, но Лешак обещал правильное поведение переменных типа static, и если я правильно понял, как они работают.
сегодня ночью проверю с двумя кнопками.
Т.е. код надо дублировать? Так я и думал.
Статичекие переменные-то работать,конечно, будут, куда нахрен денутся, они ж локально объявлены. А вот сам факт дублирование кода ... Вы тут писали ...
Как можно? Проще всего через класс. Переменные - члены класса (не статические) вполне себе будут схранять значения. Новая кнопка добавляется просто объявлением переменной типа "кнопка".
Как можно? Проще всего через класс. Переменные - члены класса (не статические) вполне себе будут схранять значения. Новая кнопка добавляется просто объявлением переменной типа "кнопка".
ок покажи мне на примере блинка, но с двумя светодиодами - я примерно понимаю, что нужно написать общую функцию, которая на основе переменной "номер кнопки" будет брать переменные из места, соответсвующего номеру кнопки.
*с другой стороны - шото у меня большие подозрения, что выйдет большая экономия на менее чем десяти кнопках.
*с другой стороны - шото у меня большие подозрения, что выйдет большая экономия на менее чем десяти кнопках.
Пример с блинкером ... щас, дайте несколько минут.
Испытал сериал принтами....
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
Клапауций 999,
Как видите здесь три светодиода, а по коду (не по строкам, а именно по коду, т.к. строки типа "public" никакого кода не генерят) к тому, что было у Вас добавилось по две строки на каждый светодиод - всё остальное, как у Вас.
Как видите здесь три светодиода, а по коду (не по строкам, а именно по коду, т.к. строки типа "public" никакого кода не генерят) к тому, что было у Вас добавилось по две строки на каждый светодиод - всё остальное, как у Вас.
ок - спасибо. буду разбираться.
функция опроса кнопки должна возвращать готовые события, а не полуфабрикаты.
Без лишних промежуточных значений.
Чтобы не было такого когда я получил нажатие кнопки, побежал его обрабатывать,
и тут приходит двойное нажатие.
Мне что - однократное теперь отменять? Всю обработку?
или delay (999) вставлять- а вдруг это не простое, а двойное нажатие.
А если я держу кнопку? Приходит нажатие, сколько ждать окнчания?
я ничего не понял - вытащены наружу основные функции из кнопки, дубли удалены.
если вы нажали, то получили BUTTON_00_bounce_down
если вы отпустили, то получили BUTTON_00_bounce_up
если вы два раза кликнули, то здесь никак не получится отфильтровать два раза BUTTON_00_bounce_down и BUTTON_00_bounce_up, что бы получить в результате в BUTTON_00_doubleclick_down один тик.
*фильтровать, вообще-то можно, но результат будет не мгновенный, а после отработки максимального времени работы халабуды - 10 сек. всё запишет в переменные и по окончании вывалит результат - оно такое нужно?
Например:
0 - ничего не было
1 - однократное нажатие
2 - двухкратное нажатие
3 - удержание ( или 999 - держали почти секунду)
0 - такого не бывает, всегда будет один тик отжатия при инициализации контроллера, ничем не отличается от дизайна поведения ненажатой тактовой кнопки.
1- верно - однократное нажатие, у вас получилось два тика при однократном нажатии?
2 - один тик при даблклике, вызывается однократно BUTTON_00_doubleclick_down
3 - при настоящих настройках срабатывает BUTTON_00_retention_down через две секунды один раз.
*ещё раз - если желается изменить дизайн поведения кнопки, то никто не запрещает изменять её функционал, помещая свои хотелки в подпрограммы, выведенные наружу. о чём говорил в описании.
Как отличить вот это
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
Функция сама должна понять что ещё не ясно что возвращать и при этом не возвращать НИЧЕГО!
Типа: ждите ответа.
Не состоял не участвовал, не привлекался.
Не было ничего, отдыхай пока, что-то будет- пренепременно сообщу.
Получается: У тебя нажали красную кнопку- это пожар.....
через какое-то время: Ой, извини, двойное нажатие- это не пожар, это ограбление!
А мне нужна была информация о пожаре?
Как отличить вот это
BUTTON_00_bounce_down однократное короткое нажатие кнопки
BUTTON_00_bounce_up отпускание кнопки сразу
никак не отличать - поведение обычной тактовой кнопки с фильтром дребезга, фильтруется при нажатии начало фронта и при отжатии конец фронта + 20 миллисекунд.
Получается: У тебя нажали красную кнопку- это пожар.....
через какое-то время: Ой, извини, двойное нажатие- это не пожар, это ограбление!
сделай пожар по даблклику, а ограбление при удержании.
я не понимаю - ты предлагаешь выбросить из кнопки основной функционал "нажато/отжато"?
ок не пользуйся подпрограммами :D
BUTTON_00_bounce_down
BUTTON_00_bounce_up
А как мне тогда ловить однократное нажатие?
А как мне тогда ловить однократное нажатие?
На червя!
Всё, завтра меня не ждите, пойду на карася. Уговорил...
Всё, завтра меня не ждите, пойду на карася. Уговорил...
Щука щас хорошо идет. Батя вчера прям около дома вытащил щуку на 6 кг.
А как мне тогда ловить однократное нажатие?
я же говорил, как - нужно подождать 200 миллисекунд, убедиться, что это не даблклик, затем 2 секунды, что это не удерживание кнопки, затем 10 секунд, внезапно, проявится какая-то активность кнопки. и, через 10 секунд мы всё узнаем...
т.к. отслеживание даблклика происходит в течении 200 миллисекунд с момента последнего нажатия/отжатия - узнать, что это было "одиночный клик или даблклик" можно только через 200 миллисекунд.
если есть желание затупить кнопку на 200 миллисекунд, то - вперёд.
не знаю, что за "медленные", "быстрые" нажатия вы придумали - нет здесь такого, всё происходит честно и в реальном времени, за исключением задержки для фильтрации дребезга - 20 миллисекунд.
кароче - классический функционал имеет приоритет над производными этого функционала типа даблклика и прочего.
я могу сделать, что вам желается, но не буду - ибо, ересь.
- всё остальное, как у Вас.
не совсем мне прозрачно понятно, как это реализовать с 17-ю переменными.
ок. посмотрю в тырнетах ещё примеров.
вот тут внятно расписано как использовать классы вместо дублирования кода: http://robotosha.ru/arduino/multi-tasking-arduino.html
Клапауций 999,
не совсем мне прозрачно понятно, как это реализовать с 17-ю переменными.
Ну, вот, смотрите, у меня обявлено 3 переменных (строки 17-19). Объвите там ещё 14, если нужно.
Например, я хочу заявить, что у меня кнопки на пинах со второго по двенадцатый. Отлично, вместо строк 17-19, так и пишу.
а для того, чтобы они все работали, вместо строк 24-26 пишу теперь:
В принципе, кнопки можно объявить массивом и тогда в loop не надо перечислять все, а достаточно написать цикл по массиву. Если интересно, могу написать и такой пример. Надо?