Да еще блок кнопок представляет из себя отдельный электронный миханизм ч микросхемами конденсаторами и тд. которое без 12 воль никак не риагирует на нажатие кнопок
Да еще блок кнопок представляет из себя отдельный электронный миханизм ч микросхемами конденсаторами и тд. которое без 12 воль никак не риагирует на нажатие кнопок
В данной ветке описано подключение резистивных кнопок к ардуине. У тебя же походу блок кнопок выдает что-то на однопроводный интерфейс, а-ля I2C. Ардуину этому интерфейсу научить естесственно можно, но, нужно знать что там передается и как Короче, снифферить шину надо или гууглить на эту тему.
ясно, спасибо за ответ. Наверное проще будет в этом корпусе собрать свои кнопки и подключит их к компу.
Протестируйте новый код, теперь моментальная реакция на нажатие, реализовал функцию удержание, минимальное время удержания 0.5сек , можно увеличить или уменьшить в коде.
PHP код:
//http://compcar.ru
byte bytes[2] = { 7, 0};
unsigned int res_dt1, old_dt1, idx;
unsigned long math_time,old_time,real_time;
void setup()
{
Serial.begin(115200); // настроить скорость com порта
}
void loop()
{
res_dt1 = analogRead(5); // прочитать данные АЦП
delay(30); //проверка дребезга
if(res_dt1 == analogRead(5) ) //если нет дребезга && res_dt1 < 1023
{
old_time = real_time;
math_time = 0;
while(math_time < 500 && res_dt1 == analogRead(5))
{
real_time = millis(); //получить реальное время
math_time = real_time - old_time; //считаем длительность паузы
}
if(math_time > 498 && res_dt1 < 1023) res_dt1 |= 1024;
bytes[0] = res_dt1 & 255; // преобразовать в 2-байта
bytes[1] = (res_dt1 & 1792) >> 8;
Serial.write( bytes,2); // отправить прочитаное значение компьютеру
}
}
функция удержание - это значит что короткое одна комбинация кнопок, длительное другая
Все верно
А как в HotKey настроить с новым кодом( короткое или длительное) , что-то не догоняю
Последний раз редактировалось FOLV; 13.03.2010 в 17:32.
Как понял - для начала надо значение времени поставить в math_time = (0,5 - дальше);
При коротком значение в HotKey например -35 при длительном увеличится на еденицу -36 и руками в инфе править
Позже проверю, а то вчера в торопях выложил и даже не проверил
Попробуй в конфиге прибавить к твоему значению кнопки 1024
Последний раз редактировалось Chip; 13.03.2010 в 18:36.
Добавлю свои 5 копеек. Такие же проблемы были, сколько не изгалялся с подбором времени задержки "дребезга" - не удалось добиться полность 100% реакции, как в штатной магнитоле.
В итоге перенес логику определения какая кнопка нажата полностью в ардуину, т.е. на выходе она выдает в компорт код нажатой кнопки, а не значение из АЦП. Получилось громоздко, зато теперь никаких двойных нажатий или проглатывания нажатой кнопки нет.
PHP код:
// Для рулевых кнопок
// Задержки между нажатиями конкретных кнопок, миллисекунды
#define KEY_CH_MINUS_DELAY (200)
#define KEY_CH_PLUS_DELAY (200)
#define KEY_VOL_MINUS_DELAY (150)
#define KEY_VOL_PLUS_DELAY (150)
#define KEY_MODE_DELAY (300)
// Значения кнопок
#define KEY_CH_MINUS (445)
#define KEY_CH_PLUS (640)
#define KEY_VOL_MINUS (90)
#define KEY_VOL_PLUS (270)
#define KEY_MODE (805)
// Погрешность при чтении кнопок
#define KEY_DELTA (30)
// Коды кнопок, что отсылаем в порт внешней проге
#define CH_MINUS (1)
#define CH_PLUS (2)
#define VOL_MINUS (3)
#define VOL_PLUS (4)
#define MODE (5)
#define NONE (0)
unsigned long LastTimeKeyPressed = millis();
int LastKeyPressed = NONE;
void setup()
{
Serial.begin(57600);
}
void loop()
{
ReadSteering();
delay(50);
}
// Читает рулевые кнопки и пишет в порт код нажатой кнопки
void ReadSteering()
{
unsigned long TimeKeyPressed;
int KeyPressed = NONE;
int dt1 = analogRead(0);
delay(50);
int dt2 = analogRead(0);
if (abs(dt1-dt2)<=5 and dt1<900 ) //если нет дребезга и что-то есть
{
// Регистрируем время нажатия кнопки
TimeKeyPressed = millis();
//CH_MINUS
if ( (dt1-KEY_DELTA <= KEY_CH_MINUS) and (dt1+KEY_DELTA >= KEY_CH_MINUS) )
{
if ( (LastKeyPressed != CH_MINUS) or (abs(TimeKeyPressed-LastTimeKeyPressed) >= KEY_CH_MINUS_DELAY) )
{
LastKeyPressed = CH_MINUS;
KeyPressed = CH_MINUS;
LastTimeKeyPressed = TimeKeyPressed;
}
}
//CH_PLUS
else if ( (dt1-KEY_DELTA <= KEY_CH_PLUS) and (dt1+KEY_DELTA >=KEY_CH_PLUS) )
{
if ( (LastKeyPressed != CH_PLUS) or (abs(TimeKeyPressed-LastTimeKeyPressed) >= KEY_CH_PLUS_DELAY) )
{
LastKeyPressed = CH_PLUS;
KeyPressed = CH_PLUS;
LastTimeKeyPressed = TimeKeyPressed;
}
}
//VOL_MINUS
else if ( (dt1-KEY_DELTA <= KEY_VOL_MINUS) and (dt1+KEY_DELTA >=KEY_VOL_MINUS) )
{
if ( (LastKeyPressed != VOL_MINUS) or (abs(TimeKeyPressed-LastTimeKeyPressed) >= KEY_VOL_MINUS_DELAY) )
{
LastKeyPressed = VOL_MINUS;
KeyPressed = VOL_MINUS;
LastTimeKeyPressed = TimeKeyPressed;
}
}
//VOL_PLUS
else if ( (dt1-KEY_DELTA <= KEY_VOL_PLUS) and (dt1+KEY_DELTA >=KEY_VOL_PLUS) )
{
if ( (LastKeyPressed != VOL_PLUS) or (abs(TimeKeyPressed-LastTimeKeyPressed) >= KEY_VOL_PLUS_DELAY) )
{
LastKeyPressed = VOL_PLUS;
KeyPressed = VOL_PLUS;
LastTimeKeyPressed = TimeKeyPressed;
}
}
//MODE
else if ( (dt1-KEY_DELTA <= KEY_MODE) and (dt1+KEY_DELTA >=KEY_MODE) )
{
if ( (LastKeyPressed != MODE) or (abs(TimeKeyPressed-LastTimeKeyPressed) >= KEY_MODE_DELAY) )
{
LastKeyPressed = MODE;
KeyPressed = MODE;
LastTimeKeyPressed = TimeKeyPressed;
}
}
if (KeyPressed != NONE)
{
Serial.print(char(255));
Serial.print(KeyPressed,DEC);
}
//Serial.print(dt1,DEC);
//Serial.print(" ");
//Serial.println(dt2,DEC);
}
}
Последний раз редактировалось Hamster; 15.03.2010 в 01:33.
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)