![]() |
|
|
#581 |
|
Старший Пользователь
![]() Регистрация: 03.10.2006
Возраст: 52
Город: Moscow
Регион: 77, 97, 99, 177
Машина: Nissan Elgrand
Сообщений: 246
![]() |
Собрал сей девайс для управления резистивными кнопками. Заработало с первого раза, огромное спасибо Андрею за прошивку и плагин. После пары дней использования возникло пожелание - сейчас реализован автоповтор любой нажатой кнопки, но он нужен, IMHO, только для кнопок громкости, а для остальных кнопок логичней использовать долгое нажатие как другую команду. Особенно актуально, если физических кнопок не много (у меня их всего 5 шт на руле). Возможно ли такое реализовать?
И еще, у меня одна из штатных кнопок вообще без резистора - т.е. замыкает накоротко, и прошивка ее игнорирует. Я, конечно, поправил прошивку себе, но вдруг еще у кого-то такая проблема возникнет... |
|
|
|
|
|
#582 | |
|
Старший Пользователь
![]() Регистрация: 13.05.2010
Возраст: 41
Город: Воронеж
Регион: 36
Машина: Jetta 6
Сообщений: 899
![]() |
Цитата:
|
|
|
|
|
|
|
#583 |
|
Старший Пользователь
![]() Регистрация: 03.10.2006
Возраст: 52
Город: Moscow
Регион: 77, 97, 99, 177
Машина: Nissan Elgrand
Сообщений: 246
![]() |
|
|
|
|
|
|
#584 |
|
Старший Пользователь
![]() Регистрация: 25.06.2011
Возраст: 55
Город: Красноярск
Регион: 24
Машина: Nissan Wingroad WFY-11 2003
Сообщений: 166
![]() |
|
|
|
|
|
|
#585 |
|
Старший Пользователь
![]() Регистрация: 03.10.2006
Возраст: 52
Город: Moscow
Регион: 77, 97, 99, 177
Машина: Nissan Elgrand
Сообщений: 246
![]() |
Вот кусок прошивки отвечающий за кнопки. Сделано на основе прошивки Андрея. Писал левой ногой, сильно не пинайте...
Код:
#include <EEPROM.h>
#define RES_KEY_FLAG_ 0x16 // Флаг первого запуска скетча
byte bytes[4];
//-----------------------------------------
//- входы(пины) ардуино -
//-----------------------------------------
const int RES_PIN = 5 ; // аналоговый вход(пин) для резестивных(рулевых) кнопок
//-----------------------------------------
//- переменные включения функций скетча -
//-----------------------------------------
boolean is_res_keys = false;
//-----------------------------------------
//- Новые переменные для кнопок
#define RES_BT_CNT 50 // макс кол-во кнопок
#define VOL_BT_CNT 2 // кол-во кнопок с автоповтором
#define RES_DT_MIN 5 // мин значение АЦП
#define RES_DT_MAX 1020 // макс значение АЦП
unsigned long res_key_wait_long = 600; // задержка длинного нажатия кнопки (ms)
unsigned int key_to_send = 0;
boolean res_key_hold = false;
//-----------------------------------------
//- Переменные для резистивных кнопок -
//-----------------------------------------
unsigned long res_dt = 0;
unsigned long res_dt_sum = 0;
#define RES_DT_COUNT 400 // Количество считываемых данных
#define RES_DT_SKIP_COUNT 100 // Количество данных, которые надо пропустить при нажатии
#define RES_DT_POINT 6 // Точность
int res_dt_n = 0;
unsigned long res_key = 0;
unsigned long res_key_old = 0;
unsigned long res_key_wait_next = 200; // задержка автоповтора (ms)
unsigned long res_key_wait_millis = 0;
unsigned long res_key_millis;
unsigned long res_key_array[RES_BT_CNT + 1][2];
unsigned int res_key_count = 0;
unsigned int res_key_delta = 3;
//-----------------------------------------
void setup() {
Serial.begin(115200);
res_key_millis = millis();
unsigned int first_run_key = EEPROM.read(0);
if ( first_run_key == RES_KEY_FLAG_ )
{
res_key_count = EEPROM.read(1);
//EEPROM.write(addr, val);
for(int i=0; i<res_key_count;i++)
{
res_key_array[i][0] = (EEPROM.read(i+2) * 256) + EEPROM.read(i+2+RES_BT_CNT) - res_key_delta; res_key_array[i][1] = res_key_array[i][0] + res_key_delta + res_key_delta;
}
}
for(int i=res_key_count; i<(RES_BT_CNT+1);i++)
{
res_key_array[i][0] = 0xFFFFFFFF; res_key_array[i][1] = 0xFFFFFFFF;
}
}
//-----------------------------------------
void loop() {
if (Serial.available() >= 1) // Проверяем наличие команд от компьютера
{
switch (Serial.read())
{
case 0x06: // включить передачу данных от резестивных кнопок
is_res_keys = true;
break;
case 0x86: // выключить передачу данных от резестивных кнопок
is_res_keys = false;
break;
}
}
if( is_res_keys ) res_keys(); // резистивные кнопки
// res_keys();
}
//----------------------------------------------------------------------------------
// Функция работы с резистивными кнопками
//----------------------------------------------------------------------------------
void res_keys()
{
{
res_dt = analogRead(RES_PIN); // прочитать данные АЦП
if( res_dt >= RES_DT_MIN && res_dt <= RES_DT_MAX )
{
res_dt_n++;
if( res_dt_n > RES_DT_SKIP_COUNT )
{
res_dt_sum += (res_dt << RES_DT_POINT);
if( res_dt_n == RES_DT_COUNT)
{
// res_key = (res_dt_sum / (RES_DT_COUNT - RES_DT_SKIP_COUNT));
res_key = (((((( res_dt_sum / (( RES_DT_COUNT - RES_DT_SKIP_COUNT ) + (2^(RES_DT_POINT-1)-1) ) >> (RES_DT_POINT-1)) + 1) >> 1) + 1)>> 1)); // + 1) >> 1;
res_dt_sum = 0; res_dt_n = 0;
}
}
}
else
{
res_dt_sum = 0; res_dt_n = 0; res_key = 0;
res_key_wait_millis = 0;
}
}
// обработка нажатия
int key_code = 0;
if (res_key != 0) // что-то нажато
{
key_code = keyCode(res_key);
if (key_code <= VOL_BT_CNT) // первые кнопки с автоповтором
{
if (res_key_old == res_key) // удержание кнопки
{
if (millis() - res_key_wait_millis > res_key_wait_next) // задержка автоповтора
{
sendKey(key_code);
res_key_wait_millis = millis();
}
}
else
{
sendKey(key_code);
res_key_wait_millis = millis();
res_key_old = res_key;
}
}
else // кнопки с долгим нажатием
{
if (res_key_old == res_key) // удержание кнопки
{
if (millis() - res_key_wait_millis > res_key_wait_long) // длинное нажатие
{
if (!res_key_hold)
{
sendKey(key_code+RES_BT_CNT);
res_key_wait_millis = millis();
res_key_hold = true;
}
}
}
else
{
key_to_send = key_code;
res_key_wait_millis = millis();
res_key_old = res_key;
}
}
}
else // ничего не нажато
{
res_key_old = 0;
if (key_to_send != 0 && !res_key_hold) sendKey(key_to_send);
res_key_hold = false;
key_to_send = 0;
}
}
void sendKey(int key_code)
{
bytes[0] = 0xAA; // преобразовать в 4-байта
bytes[1] = 0;
bytes[2] = RES_PIN;
bytes[3] = key_code;
Serial.write( bytes,4); // отправить прочитаное значение компьютеру
/*
Serial.write(bytes[3]+0x30); // отправить прочитаное значение компьютеру
Serial.print(" ");
Serial.print(res_key,DEC);
Serial.println("");
*/
}
unsigned int keyCode(unsigned long key_res)
{
int i = 0; boolean exit = false;
while( res_key_array[i][0] != 0xFFFFFFFF && (!exit) )
{ // проверяем новая ли кнопка
if( (res_key_array[i][0] <= key_res) && (key_res <= res_key_array[i][1]) ) exit = true; else i++;
}
if ( exit ) // кнопкка уже известная
{
return (i+1);
}
else { // кнопка новая
if ( res_key_count < RES_BT_CNT )
{
res_key_array[res_key_count][0] = key_res - res_key_delta;
res_key_array[res_key_count][1] = key_res + res_key_delta;
res_key_count++;
EEPROM.write(1, res_key_count); // Запоминаем количество кнопок
byte one_byte = key_res / 256;
EEPROM.write(res_key_count+1, one_byte ); // Запоминаем старший байт значения кнопки
one_byte = key_res - one_byte * 256;
EEPROM.write(res_key_count+1+RES_BT_CNT, one_byte ); // Запоминаем младший байт значения кнопки
EEPROM.write(0, RES_KEY_FLAG_);
return res_key_count;
}
else
{ // переполнение - больше кнопок не запоминаем
bytes[0] = 0xAA; // преобразовать в 4-байта
bytes[1] = 0xAA;
bytes[2] = (key_res & 0xFF00) >> 8;
bytes[3] = key_res & 0xFF;
Serial.write( bytes,4); // отправить прочитаное значение компьютеру
}
}
}
Если надо переопределить кнопки для автоповтора - поменяйте значение RES_KEY_FLAG_ на любое другое число, и перезалейте прошивку. Если нужно больше двух кнопок с автоповтором - поменяйте значение VOL_BT_CNT. |
|
|
|
|
|
#586 |
|
Пользователь
![]() Регистрация: 09.06.2009
Возраст: 46
Регион: 77, 97, 99, 177
Сообщений: 46
![]() |
Ребята подскажите пожалуйста, а можно ли повесить резистивные кнопки так, что-бы они дублировали экранные кнопки в блоке реле. Хочется, сделать так- допустим нажал на экранную кнопку в плагине блок реле, выполнилось какое то действие, например: включился свет в салоне, но если я стаю на стоянке и монитор выключен, то я жму резистивную кнопку и она выполняет тоже действие, только если я свет включил с экранной кнопки то резистивная его выключает или наоборот.
Комп стоит в грузовике, блок резистивных кнопок хочу установить в "спальник", и что-бы каждый раз на бегать и включать монитор Было бы не плохо реализовать так. Спасибо. |
|
|
|
|
|
#587 |
|
Бывалый писикарщик
![]() Регистрация: 23.04.2009
Возраст: 54
Город: Ставрополь
Регион: 26
Машина: Opel Zafira 2007
Сообщений: 5,275
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
Если речь о выключении кнопок при работающем компьютере, то вешаешь на резистивную кнопку команду икара duino_rеlay_1_toggle , вместо единицы указываешь свой номер реле.
А вот если комп выключен, то надо писать другой скетч для ардуино
__________________
Opel Zafira B --- ГАЗ 21 ВОЛГА в 21 веке --- Скин OpelZafira для RideRunner --- Скин CFStyle для RideRunner Плагин RRCheckEngine --- CFStyle для iCar DS --- iCarVOBD --- iCarDuino --- iCarCoreTemp --- iCarNotes --- iCarVoiceCommander |
|
|
|
|
|
#588 |
|
Пользователь
![]() Регистрация: 09.06.2009
Возраст: 46
Регион: 77, 97, 99, 177
Сообщений: 46
![]() |
Не, комп работает всегда, я уже забыл когда выключался я только монитор монитор выключаю что-бы не светился, спать мешает. Надо просто если с экрана включил - то с резистивной выключил и наоборот.
|
|
|
|
|
|
#589 |
|
Пользователь
![]() Регистрация: 15.06.2009
Город: Москва
Регион: 77, 97, 99, 177
Машина: 2012\UAZ\PATRIOT LIMITED TDI
Сообщений: 37
![]() |
А как назначить горячую клавишу на кнопку управления реле, что-то долгим нажатием не получается. Точнее, задача такая: внешняя программа посылает комбинацию клавиш по событию, по этой комбинации реле нужно включить на заданный интервал времени (1000мс). Как это сделать?
|
|
|
|
|
|
#590 | ||
|
Старший Пользователь
![]() Регистрация: 18.03.2013
Город: Жезказган
Регион: Казахстан
Машина: Mazda MPV
Сообщений: 195
![]() ![]() ![]() ![]() |
Получил с почты ардуину мега 2560 , отковырял энкодер с муз центра старого, отдельно энкодер проверил, работает. Пытался загрузить скетч но получил ошибку
Цитата:
Цитата:
P\S Запустил только один энкодер без всей остальной обвязки, круть, заработало все почти с пол пинка. Единственно что второй энкодер которого нет, глючил. Т.е. с него шел сигнал, но его физически нет, порт его висел в воздухе, заземлил пин второго энкодера и стало все замечательно..... Остальное еще не проверял, думаю "запилить" будет не сильно сложно....... Вот бы еще климат-контроль замутить .... Помимо приобретения самого икара, я бы подумал доплатить за модуль климы. По поводу сервоприводов в ардуине http://wiki.amperka.ru/%D1%80%D0%BE%...BE%D0%B4%D1%8B Последний раз редактировалось Tygra; 27.11.2013 в 09:43. |
||
|
|
|
![]() |
| Здесь присутствуют: 1 (пользователей: 0 , гостей: 1) | |
| Опции темы | Поиск в этой теме |
|
|