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

Вернуться   PCCar.ru - Ваш автомобильный компьютер > MP3Car ТехИнфа > AndroidCar > Дополнительные устройства

Ответ
 
Опции темы Поиск в этой теме
Старый 26.08.2016, 00:02   #1
lipov-andrey
Новый Пользователь
 
Регистрация: 30.11.2014
Возраст: 44
Город: MoskoW
Регион: 74
Сообщений: 11
lipov-andrey is on a distinguished road
По умолчанию [Канбус] Долгое нажатие кнопки (Не резистивные кнопки!)

Ситуация в следующем работаю с каном авто, все кнокпи работают по кану.

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

Имеется 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ео нажатие выдается как долгое, хоть по одному разу жми хоть по долгу.
То есть нет срабатывания сброса как бы.

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

Последний раз редактировалось admin; 20.03.2017 в 02:15.
lipov-andrey вне форума   Ответить с цитированием
Старый 26.08.2016, 02:00   #2
lti1
Старший Пользователь
 
Аватар для lti1
 
Регистрация: 17.01.2010
Возраст: 48
Город: Самара
Регион: 63, 163
Машина: Skoda Octavia A5 FL && Skoda Octavia Tour && ̶F̶F̶3̶
Сообщений: 457
lti1 has a reputation beyond reputelti1 has a reputation beyond reputelti1 has a reputation beyond reputelti1 has a reputation beyond reputelti1 has a reputation beyond reputelti1 has a reputation beyond reputelti1 has a reputation beyond reputelti1 has a reputation beyond reputelti1 has a reputation beyond repute
По умолчанию

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;
      }
    }

lti1 вне форума   Ответить с цитированием
Старый 26.08.2016, 17:37   #3
lipov-andrey
Новый Пользователь
 
Регистрация: 30.11.2014
Возраст: 44
Город: MoskoW
Регион: 74
Сообщений: 11
lipov-andrey is on a distinguished road
По умолчанию

Цитата:
Сообщение от lti1 Посмотреть сообщение
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, 23:51   #4
vasilij_c
Пользователь
 
Регистрация: 22.01.2016
Город: СПб
Регион: 78, 98
Машина: Audi
Сообщений: 39
vasilij_c is on a distinguished road
По умолчанию

от кнопки приходят команды "нажатия" потом "отпускания"?
или приходит одна команда, а при удержании идет ее повтор?
vasilij_c вне форума   Ответить с цитированием
Старый 27.08.2016, 00:45   #5
lipov-andrey
Новый Пользователь
 
Регистрация: 30.11.2014
Возраст: 44
Город: MoskoW
Регион: 74
Сообщений: 11
lipov-andrey is on a distinguished road
По умолчанию

Цитата:
Сообщение от vasilij_c Посмотреть сообщение
от кнопки приходят команды "нажатия" потом "отпускания"?
или приходит одна команда, а при удержании идет ее повтор?
У меня команды отпускания нет.
У меня приходит одна команда а при удержании идет повтор.
lipov-andrey вне форума   Ответить с цитированием
Старый 27.08.2016, 13:40   #6
T_r_D
Старший Пользователь
 
Регистрация: 03.07.2015
Регион: 77, 97, 99, 177
Сообщений: 372
T_r_D is a jewel in the roughT_r_D is a jewel in the roughT_r_D is a jewel in the rough
По умолчанию

Приходит-приходит. Бит отвечающий за кнопку становится 0 при её отпускании.
А при удержании сообщение о нажатие кнопки повторяется раз в 100мс.
T_r_D вне форума   Ответить с цитированием
Старый 30.08.2016, 10:06   #7
(vS)
Гуру
 
Аватар для (vS)
 
Регистрация: 13.10.2006
Возраст: 46
Город: Санкт-Петербург
Регион: 54
Машина: '98 PRIUS NHW10
Сообщений: 1,991
(vS) will become famous soon enough(vS) will become famous soon enough
По умолчанию

дак набирай количество "приходов". каждый раз как пришло, делай ПришлоЗвукИнк++
как пришел флаг_0, сбрасывай счетчик. Если счетчик набрал >10 скажем, длинная сработала, ну или "тепленькая пошла", как тебе удобнее
__________________
маст{ер} c[лов]а и стил<ус>а

мои детки: сивик и геша + а у него названья нет + примус +
грандесла
(vS) вне форума   Ответить с цитированием
Старый 30.08.2016, 10:08   #8
(vS)
Гуру
 
Аватар для (vS)
 
Регистрация: 13.10.2006
Возраст: 46
Город: Санкт-Петербург
Регион: 54
Машина: '98 PRIUS NHW10
Сообщений: 1,991
(vS) will become famous soon enough(vS) will become famous soon enough
По умолчанию

дак набирай количество "приходов". каждый раз как пришло, делай ПришлоЗвукИнк++
как пришел флаг_0, сбрасывай счетчик. Если счетчик набрал >10 скажем, длинная сработала, ну или "тепленькая пошла", как тебе удобнее
__________________
маст{ер} c[лов]а и стил<ус>а

мои детки: сивик и геша + а у него названья нет + примус +
грандесла
(vS) вне форума   Ответить с цитированием
Старый 02.10.2016, 19:42   #9
lipov-andrey
Новый Пользователь
 
Регистрация: 30.11.2014
Возраст: 44
Город: MoskoW
Регион: 74
Сообщений: 11
lipov-andrey is on a distinguished road
По умолчанию

Нет не какого флага 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("Звук короткое");
}
lipov-andrey вне форума   Ответить с цитированием
Старый 02.10.2016, 23:24   #10
T_r_D
Старший Пользователь
 
Регистрация: 03.07.2015
Регион: 77, 97, 99, 177
Сообщений: 372
T_r_D is a jewel in the roughT_r_D is a jewel in the roughT_r_D is a jewel in the rough
По умолчанию

ну так millis введи туда.
unsigned long time0 = 0;

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

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

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


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.



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


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