05.11.2013, 23:23 | #581 |
Старший Пользователь
Регистрация: 03.10.2006
Возраст: 51
Город: Moscow
Регион: 77, 97, 99, 177
Машина: Nissan Elgrand
Сообщений: 246
|
Собрал сей девайс для управления резистивными кнопками. Заработало с первого раза, огромное спасибо Андрею за прошивку и плагин. После пары дней использования возникло пожелание - сейчас реализован автоповтор любой нажатой кнопки, но он нужен, IMHO, только для кнопок громкости, а для остальных кнопок логичней использовать долгое нажатие как другую команду. Особенно актуально, если физических кнопок не много (у меня их всего 5 шт на руле). Возможно ли такое реализовать?
И еще, у меня одна из штатных кнопок вообще без резистора - т.е. замыкает накоротко, и прошивка ее игнорирует. Я, конечно, поправил прошивку себе, но вдруг еще у кого-то такая проблема возникнет... |
05.11.2013, 23:27 | #582 | |
Старший Пользователь
Регистрация: 13.05.2010
Возраст: 40
Город: Воронеж
Регион: 36
Машина: Jetta 6
Сообщений: 899
|
Цитата:
|
|
07.11.2013, 06:17 | #583 |
Старший Пользователь
Регистрация: 03.10.2006
Возраст: 51
Город: Moscow
Регион: 77, 97, 99, 177
Машина: Nissan Elgrand
Сообщений: 246
|
|
07.11.2013, 11:55 | #584 |
Старший Пользователь
Регистрация: 25.06.2011
Возраст: 54
Город: Красноярск
Регион: 24
Машина: Nissan Wingroad WFY-11 2003
Сообщений: 166
|
|
07.11.2013, 21:29 | #585 |
Старший Пользователь
Регистрация: 03.10.2006
Возраст: 51
Город: 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. |
13.11.2013, 12:07 | #586 |
Пользователь
Регистрация: 09.06.2009
Возраст: 45
Регион: 77, 97, 99, 177
Сообщений: 46
|
Ребята подскажите пожалуйста, а можно ли повесить резистивные кнопки так, что-бы они дублировали экранные кнопки в блоке реле. Хочется, сделать так- допустим нажал на экранную кнопку в плагине блок реле, выполнилось какое то действие, например: включился свет в салоне, но если я стаю на стоянке и монитор выключен, то я жму резистивную кнопку и она выполняет тоже действие, только если я свет включил с экранной кнопки то резистивная его выключает или наоборот.
Комп стоит в грузовике, блок резистивных кнопок хочу установить в "спальник", и что-бы каждый раз на бегать и включать монитор Было бы не плохо реализовать так. Спасибо. |
13.11.2013, 12:44 | #587 |
Бывалый писикарщик
Регистрация: 23.04.2009
Возраст: 53
Город: Ставрополь
Регион: 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 |
13.11.2013, 12:48 | #588 |
Пользователь
Регистрация: 09.06.2009
Возраст: 45
Регион: 77, 97, 99, 177
Сообщений: 46
|
Не, комп работает всегда, я уже забыл когда выключался я только монитор монитор выключаю что-бы не светился, спать мешает. Надо просто если с экрана включил - то с резистивной выключил и наоборот.
|
15.11.2013, 23:28 | #589 |
Пользователь
Регистрация: 15.06.2009
Город: Москва
Регион: 77, 97, 99, 177
Машина: 2012\UAZ\PATRIOT LIMITED TDI
Сообщений: 37
|
А как назначить горячую клавишу на кнопку управления реле, что-то долгим нажатием не получается. Точнее, задача такая: внешняя программа посылает комбинацию клавиш по событию, по этой комбинации реле нужно включить на заданный интервал времени (1000мс). Как это сделать?
|
26.11.2013, 14:29 | #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. |
||
Здесь присутствуют: 3 (пользователей: 0 , гостей: 3) | |
|
|