PCCar.ru - Ваш автомобильный компьютер

PCCar.ru - Ваш автомобильный компьютер (http://pccar.ru/index.php)
-   Дополнительные устройства (http://pccar.ru/forumdisplay.php?f=177)
-   -   [Канбус] Долгое нажатие кнопки (Не резистивные кнопки!) (http://pccar.ru/showthread.php?t=24367)

lipov-andrey 26.08.2016 00:02

[Канбус] Долгое нажатие кнопки (Не резистивные кнопки!)
 
Ситуация в следующем работаю с каном авто, все кнокпи работают по кану.

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

Имеется UNO и 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

PHP код:

uint8_t counter;

void setup() {
}

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



lipov-andrey 26.08.2016 17:37

Цитата:

Сообщение от lti1 (Сообщение 367909)
PHP код:

uint8_t counter;

void setup() {
}

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



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

vasilij_c 26.08.2016 23:51

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

lipov-andrey 27.08.2016 00:45

Цитата:

Сообщение от vasilij_c (Сообщение 367954)
от кнопки приходят команды "нажатия" потом "отпускания"?
или приходит одна команда, а при удержании идет ее повтор?

У меня команды отпускания нет.
У меня приходит одна команда а при удержании идет повтор.

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.
Хотя может такой странный протокол...


Часовой пояс GMT +4, время: 10:00.

Работает на vBulletin® версия 3.8.4.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot