![]() |
[Канбус] Долгое нажатие кнопки (Не резистивные кнопки!)
Ситуация в следующем работаю с каном авто, все кнокпи работают по кану.
Хочу подключить их чтобы управлять Ардуинкой в своих личных целях. Ардуина будет управлять Андройд приставкой. Имеется UNO и Atmega 2450. Написал скетч на обработку одиночного нажатия, а вот с длительным не могу справится. то есть например нажимаю 1 раз кнопку звук + и приходит 2-3 одинаковых сигнала в кан пусть будет 12345. То есть если жму долго он так и будет кидать в лог: 12345 12345 12345 12345 12345 12345 Вот мне нужно при удерживании скажем более 8 секунд сделать чтобы он выполнял другое действие. Пробовал millis() ставить, но он к сожалению не обнуляется. Пока что работает только один мой вариант по количеству, то есть если пришло в лог более 8 одинаковых сигналов 12345 то выполнять долгое действие, но это не очень удобно, так как счетчик не обнуляется а постоянно по кругу идут. Или может подскажите как обнулять счетчик если допустим между действиями прошло более скажем 3 секунд. Сейчас у меня что то типа этого: Цитата:
А нужно чтобы при длительном нажатии на кнопку другое действие. Что то типа этого : Цитата:
То есть нет срабатывания сброса как бы. Заранее благодарен, Андрей. |
PHP код:
|
Цитата:
Буду разбираться. Спасибо. |
от кнопки приходят команды "нажатия" потом "отпускания"?
или приходит одна команда, а при удержании идет ее повтор? |
Цитата:
У меня приходит одна команда а при удержании идет повтор. |
Приходит-приходит. Бит отвечающий за кнопку становится 0 при её отпускании.
А при удержании сообщение о нажатие кнопки повторяется раз в 100мс. |
дак набирай количество "приходов". каждый раз как пришло, делай ПришлоЗвукИнк++
как пришел флаг_0, сбрасывай счетчик. Если счетчик набрал >10 скажем, длинная сработала, ну или "тепленькая пошла", как тебе удобнее |
дак набирай количество "приходов". каждый раз как пришло, делай ПришлоЗвукИнк++
как пришел флаг_0, сбрасывай счетчик. Если счетчик набрал >10 скажем, длинная сработала, ну или "тепленькая пошла", как тебе удобнее |
Нет не какого флага 0 при отпускании. Вообще нет ни какого сигнала что ты отпустил кнопку.
Когда я отпускаю или держу кнопку разницы нет. Например держу, то приходит: 1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0 Например нажал один раз то пришло 1,0 Вот небольшая часть кода, он работает и срабатывает лонг после 15 сигналов затем счетчик обнуляется. Но если я отпустил кнопку до этого, то в счетчике например на 7 сигнале, то там так и будет висеть 7 и обнулится только когда дойдет до 15. Вот в этом то и есть основной вопрос данной темы если допустим в счетчике накопилось 7 сигналов и при этом я кнопку не трогаю например более 2 секунд, нужно обнулять счетчик. if (rxId == 740) { UpVol = UpVol++; //Фиксируем нажатие кнопки "UpVol" if (UpRight > 15) {UpRight = 0; irsend.sendNEC(0x1FEE65D, 32); Serial.println("Звук long"); } else if (UpVol!= 0) {if (UpVol<= 12) { irsend.sendNEC(0x1FE11BF, 32); Serial.println("Звук короткое"); } |
ну так millis введи туда.
unsigned long time0 = 0; if ((millis() - time0) > 2000) {Сброс переменной в ноль} В условии if (rxId == 740) time0 = millis(); И что за странный протокол передачи если нет 0? у тебя есть пакет который отвечает за кнопку(и) rxId == 740. Так вот у тебя этот ID передаётся только по нажатию кнопки чтоль? Как-то странно. Обычно при отпускании в этом ID передаются нули. и ты выше пишешь сам- нажал и пришло 1,0. Так что в ID 0-то приходит. И по идеи пакет при удержании должен выглядить как повторяющиеся еденица без 0. Хотя может такой странный протокол... |
Часовой пояс GMT +4, время: 04:45. |
Работает на vBulletin® версия 3.8.4.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot