PDA

Просмотр полной версии : [Канбус] Долгое нажатие кнопки (Не резистивные кнопки!)


lipov-andrey
26.08.2016, 00:02
Ситуация в следующем работаю с каном авто, все кнокпи работают по кану.

Хочу подключить их чтобы управлять Ардуинкой в своих личных целях.
Ардуина будет управлять Андройд приставкой.

Имеется UNO (https://duino.ru/arduino-uno-r3.html) и Atmega 2450.
Написал скетч на обработку одиночного нажатия, а вот с длительным не могу справится.

то есть например нажимаю 1 раз кнопку звук + и приходит 2-3 одинаковых сигнала в кан пусть будет 12345.

То есть если жму долго он так и будет кидать в лог:

12345 12345 12345 12345 12345 12345

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

Пробовал millis() ставить, но он к сожалению не обнуляется.

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

Или может подскажите как обнулять счетчик если допустим между действиями прошло более скажем 3 секунд.

Сейчас у меня что то типа этого:

if(rpId == 410) //Нажата кнопка след. трек >>
{
irsend.sendNEC (0x11E937,32);
Serial.println("Next track");
}



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

Что то типа этого :

if(rpId == 410) //Нажат кнопка след. трек >>
{
nextrack = nextrack++
if (nextrack > 8)
{
irsend.sendNEC (0x15D937,32);
Serial.println("Next LOND press track");
}
irsend.sendNEC (0x11E937,32);
Serial.println("Next track");
}


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

Заранее благодарен, Андрей.

lti1
26.08.2016, 02:00
uint8_t counter;

void setup() {
}

void loop() {
if ( && counter <= 8) { // здесь задать правило если пришла команда, что нужная кнопка нажата и переменная counter меньше 9
counter++;
if (counter == 8) {
//здесь выполняем действие назначенное на удержание кнопки
counter = 9;
}
}
if ( ) { // здесь задать правило если пришла команда, что кнопка отпущена
if (counter >= 1 && counter <= 7) {
//здесь выполняем действие назначенное на короткое нажатие кнопки
counter = 0;
}
if (counter == 9) {
counter = 0;
}
}
}

lipov-andrey
26.08.2016, 17:37
uint8_t counter;

void setup() {
}

void loop() {
if ( && counter <= 8) { // здесь задать правило если пришла команда, что нужная кнопка нажата и переменная counter меньше 9
counter++;
if (counter == 8) {
//здесь выполняем действие назначенное на удержание кнопки
counter = 9;
}
}
if ( ) { // здесь задать правило если пришла команда, что кнопка отпущена
if (counter >= 1 && counter <= 7) {
//здесь выполняем действие назначенное на короткое нажатие кнопки
counter = 0;
}
if (counter == 9) {
counter = 0;
}
}
}

Спасибо огромное, вы уже не в первый раз меня выручаете.
Буду разбираться. Спасибо.

vasilij_c
26.08.2016, 23:51
от кнопки приходят команды "нажатия" потом "отпускания"?
или приходит одна команда, а при удержании идет ее повтор?

lipov-andrey
27.08.2016, 00:45
от кнопки приходят команды "нажатия" потом "отпускания"?
или приходит одна команда, а при удержании идет ее повтор?
У меня команды отпускания нет.
У меня приходит одна команда а при удержании идет повтор.

T_r_D
27.08.2016, 13:40
Приходит-приходит. Бит отвечающий за кнопку становится 0 при её отпускании.
А при удержании сообщение о нажатие кнопки повторяется раз в 100мс.

(vS)
30.08.2016, 10:06
дак набирай количество "приходов". каждый раз как пришло, делай ПришлоЗвукИнк++
как пришел флаг_0, сбрасывай счетчик. Если счетчик набрал >10 скажем, длинная сработала, ну или "тепленькая пошла", как тебе удобнее

(vS)
30.08.2016, 10:08
дак набирай количество "приходов". каждый раз как пришло, делай ПришлоЗвукИнк++
как пришел флаг_0, сбрасывай счетчик. Если счетчик набрал >10 скажем, длинная сработала, ну или "тепленькая пошла", как тебе удобнее

lipov-andrey
02.10.2016, 19:42
Нет не какого флага 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("Звук короткое");
}

T_r_D
02.10.2016, 23:24
ну так millis введи туда.
unsigned long time0 = 0;

if ((millis() - time0) > 2000) {Сброс переменной в ноль}

В условии
if (rxId == 740)
time0 = millis();

И что за странный протокол передачи если нет 0?
у тебя есть пакет который отвечает за кнопку(и) rxId == 740.
Так вот у тебя этот ID передаётся только по нажатию кнопки чтоль?
Как-то странно. Обычно при отпускании в этом ID передаются нули.
и ты выше пишешь сам- нажал и пришло 1,0.
Так что в ID 0-то приходит.
И по идеи пакет при удержании должен выглядить как повторяющиеся еденица без 0.
Хотя может такой странный протокол...