Arduino pro mini + alpine
- Войдите на сайт для отправки комментариев
Пнд, 24/07/2017 - 18:43
Уважаемые програмеры прошу вашей помощи.
Есть такая тема как управление магнитолой Алпайн с помощью команд ардуинки.
Я нашел немного инфы на эту тему, считал значение подрулевых кнопок, запилил скетч и никак не могу довести до ума. Ошибки компиляции для платы и тд. В програмировинии не силен.
вот скетч ( куски выдраные из другиг проэктов + свои доработки)
/////////////////////////////////////////////////////////////////
// alpine
#define Alpine 2
#define cmdPower 0x09
#define cmdSource 0x0A
#define cmdBand 0x0D
#define cmdVolumeDown 0x15
#define cmdVolumeUp 0x14
#define cmdUp 0x0E
#define cmdDown 0x0F
#define cmdLeft 0x13
#define cmdRight 0x12
#define cmdPlay 0x07
#define cmdAProc 0x06
#define cmdMute 0x16
#define cmdAngleUp 0x4C
#define cmdAngleDown 0x4B
#define cmdCDChange 0x03
/////////////////////////////////////////////////////////////////
// маски для клавиш
const int sourse =1 ;
const int vol_up =2 ;
const int vol_dn =3 ;
const int next =4 ;
const int pre =5 ;
const int mute =6 ;
int wheelPin=A0; // аналоговый пин, на котором мы считываем сопротивление нажатой на руле кнопки
int i=0;
int prevButton=0;
int getR() // Эта функция читает сопротивление с кнопок на руле и возвращает код нажатой кнопки, либо 0
{
// читаем сопротивление (на самом деле напряжение, конечно) на аналоговом пине
int r=analogRead(wheelPin);
// Ищем, какая кнопка соответствует этому сопротивлению.
if (r >= 731 && r <= 734) return (vol_up);
if (r >= 793 && r <= 798) return (vol_dn);
if (r >= 759 && r <= 761) return (pre);
if (r >= 826 && r <= 828) return (next);
if (r >= 836 && r <= 838) return (sourse);
if (r >= 768 && r <= 770) return (mute);
// если ни одна из кнопок не нажата, возвращаем 0
return (0);
}
// цикл программы
void loop(void)
{
if (1 == (sourse))
{
SendCommand(cmdSource);
Serial.print("sourse");
Serial.println();
}
if (4 == (next))
{
SendCommand(cmdRight);
Serial.print("next");
Serial.println();
}
if (5 == (pre))
{
SendCommand(cmdLeft);
Serial.print("pre");
Serial.println();
}
if (6 == (mute))
{
SendCommand(cmdMute);
Serial.print("Mute");
Serial.println();
}
if (2 == (vol_up))
{
SendCommand(cmdVolumeDown);
Serial.print("volup");
Serial.println();
}
if (3 == (vol_dn))
{
SendCommand(cmdVolumeUp);
Serial.print("voldn");
Serial.println();
}
}
// Отправка байта (протокол NEC-Clarion)
void SendByte(byte data)
{
for (int i = 0; i < 8; i++)
{
digitalWrite(Alpine, HIGH);
delayMicroseconds(560); // Пауза между битами
digitalWrite(Alpine, LOW);
if (data & 1) // Последний бит умножаем на 1
{
delayMicroseconds(1680); // Логическая единица
}
else
{
delayMicroseconds(560); // Логический ноль
}
data >>= 1; // Новый, сдвинутый вправо байт (на 1 бит)
}
}
// Отправка команды
void SendCommand(byte command)
{
// Что-то вроде приветствия,
// особенность модифицированного протокола NEC
digitalWrite(Alpine, HIGH);
delayMicroseconds(9000);
digitalWrite(Alpine, LOW);
delayMicroseconds(4500);
// Адрес протокола (общедоступная справочная инфа)
SendByte(0x86);
SendByte(0x72);
// Отправка команды
SendByte(command);
SendByte(~command);
// Для определения последнего бита (конец посылки)
digitalWrite(Alpine, HIGH);
delayMicroseconds(560);
digitalWrite(Alpine, LOW);
delay(50); // Техническая пауза
}
хтеее setup ?
void setup(void) { Serial.begin(9600); }1. Данная ошибка у меня не воспроизводится.
2. Вам уже сказали выше - где функция setup() ? Зачем Вы её удалили? Во всех скетчах должны обязательно присутствовать функции setup() и loop()
Циклическое выполнение всех команд без нажатия на кнопки
///////////////////////////////////////////////////////////////// // alpine #define Alpine 2 #define cmdPower 0x09 #define cmdSource 0x0A #define cmdBand 0x0D #define cmdVolumeDown 0x15 #define cmdVolumeUp 0x14 #define cmdUp 0x0E #define cmdDown 0x0F #define cmdLeft 0x13 #define cmdRight 0x12 #define cmdPlay 0x07 #define cmdAProc 0x06 #define cmdMute 0x16 #define cmdAngleUp 0x4C #define cmdAngleDown 0x4B #define cmdCDChange 0x03 ///////////////////////////////////////////////////////////////// // маски для клавиш const int sourse =1 ; const int vol_up =2 ; const int vol_dn =3 ; const int next =4 ; const int pre =5 ; const int mute =6 ; int wheelPin=A0; // аналоговый пин, на котором мы считываем сопротивление нажатой на руле кнопки int i=0; int prevButton=0; int getR() // Эта функция читает сопротивление с кнопок на руле и возвращает код нажатой кнопки, либо 0 { // читаем сопротивление (на самом деле напряжение, конечно) на аналоговом пине int r=analogRead(wheelPin); // Ищем, какая кнопка соответствует этому сопротивлению. if (r >= 731 && r <= 734) return (vol_up); if (r >= 793 && r <= 798) return (vol_dn); if (r >= 759 && r <= 761) return (pre); if (r >= 826 && r <= 828) return (next); if (r >= 836 && r <= 838) return (sourse); if (r >= 768 && r <= 770) return (mute); // если ни одна из кнопок не нажата, возвращаем 0 return (0); } // цикл программы void setup(void) { Serial.begin(9600); } void loop() { if (1 == (sourse)) { SendCommand(cmdSource); Serial.print("sourse"); Serial.println(); } if (4 == (next)) { SendCommand(cmdRight); Serial.print("next"); Serial.println(); } if (5 == (pre)) { SendCommand(cmdLeft); Serial.print("pre"); Serial.println(); } if (6 == (mute)) { SendCommand(cmdMute); Serial.print("Mute"); Serial.println(); } if (2 == (vol_up)) { SendCommand(cmdVolumeDown); Serial.print("volup"); Serial.println(); } if (3 == (vol_dn)) { SendCommand(cmdVolumeUp); Serial.print("voldn"); Serial.println(); } } // Отправка байта (протокол NEC-Clarion) void SendByte(byte data) { for (int i = 0; i < 8; i++) { digitalWrite(Alpine, HIGH); delayMicroseconds(560); // Пауза между битами digitalWrite(Alpine, LOW); if (data & 1) // Последний бит умножаем на 1 { delayMicroseconds(1680); // Логическая единица } else { delayMicroseconds(560); // Логический ноль } data >>= 1; // Новый, сдвинутый вправо байт (на 1 бит) } } // Отправка команды void SendCommand(byte command) { // Что-то вроде приветствия, // особенность модифицированного протокола NEC digitalWrite(Alpine, HIGH); delayMicroseconds(9000); digitalWrite(Alpine, LOW); delayMicroseconds(4500); // Адрес протокола (общедоступная справочная инфа) SendByte(0x86); SendByte(0x72); // Отправка команды SendByte(command); SendByte(~command); // Для определения последнего бита (конец посылки) digitalWrite(Alpine, HIGH); delayMicroseconds(560); digitalWrite(Alpine, LOW); delay(50); // Техническая пауза }Идеальные кнопки? Разброс значений менее 15мВ?
Циклическое выполнение всех команд без нажатия на кнопки
Теперь скетч компилируется нормально:
Скетч использует 2 150 байт (6%) памяти устройства. Всего доступно 30 720 байт.
Все компилит нормально. Циклически выполняется все заданые функции , а нужно по нажатию кнопки.
Да кнопки идеальные. Помогите плиз
Заработало. выбросил много лишнего. но не все. Рабочий скетч nisan xtrail .
///////////////////////////////////////////////////////////////// // alpine #define Alpine 2 #define cmdPower 0x09 #define cmdSource 0x0A #define cmdBand 0x0D #define cmdVolumeDown 0x15 #define cmdVolumeUp 0x14 #define cmdUp 0x0E #define cmdDown 0x0F #define cmdLeft 0x13 #define cmdRight 0x12 #define cmdPlay 0x07 #define cmdAProc 0x06 #define cmdMute 0x16 #define cmdAngleUp 0x4C #define cmdAngleDown 0x4B #define cmdCDChange 0x03 ///////////////////////////////////////////////////////////////// // маски для клавиш const int sourse ; const int vol_up ; const int vol_dn ; const int next ; const int pre ; const int mute ; int wheelPin=A0; // аналоговый пин, на котором мы считываем сопротивление нажатой на руле кнопки int i=0; int prevButton=0; void setup() { pinMode(wheelPin, INPUT); delay(100); Serial.begin(9600); } int getR() { // Эта функция читает сопротивление с кнопок на руле и возвращает код нажатой кнопки, либо 0 // читаем сопротивление (на самом деле напряжение, конечно) на аналоговом пине int r=analogRead(wheelPin); Serial.println(r); // Ищем, какая кнопка соответствует этому сопротивлению. if (r >= 731 && r <= 734) { SendCommand(cmdVolumeUp); Serial.print("volup"); Serial.println(); } if (r >= 793 && r <= 798) { SendCommand(cmdVolumeDown); Serial.print("voldn"); Serial.println(); } if (r >= 759 && r <= 761) { SendCommand(cmdLeft); Serial.print("pre"); Serial.println(); } if (r >= 826 && r <= 828) { SendCommand(cmdRight); Serial.print("next"); Serial.println(); } if (r >= 836 && r <= 838) { SendCommand(cmdSource); Serial.print("sourse"); Serial.println(); } if (r >= 768 && r <= 770) { SendCommand(cmdMute); Serial.print("Mute"); Serial.println(); } // если ни одна из кнопок не нажата, возвращаем 0 return (0); } // цикл программы void loop() { int currButton=getR(); // заносим в переменную currButton код нажатой кнопки if (currButton!=prevButton) { // если значение поменялось с прошлого раза delay(10); currButton=getR(); // ждем 10ms и читаем еще раз, чтобы исключить "дребезг" кнопки if (currButton!=prevButton) { // если код кнопки точно поменялся с прошлого раза Serial.println(currButton); prevButton=currButton; // сохраняем новое значение в переменную prevButton } } } // Отправка байта (протокол NEC-Clarion) void SendByte(byte data) { for (int i = 0; i < 8; i++) { digitalWrite(Alpine, HIGH); delayMicroseconds(560); // Пауза между битами digitalWrite(Alpine, LOW); if (data & 1) // Последний бит умножаем на 1 { delayMicroseconds(1680); // Логическая единица } else { delayMicroseconds(560); // Логический ноль } data >>= 1; // Новый, сдвинутый вправо байт (на 1 бит) } } // Отправка команды void SendCommand(byte command) { // Что-то вроде приветствия, // особенность модифицированного протокола NEC digitalWrite(Alpine, HIGH); delayMicroseconds(9000); digitalWrite(Alpine, LOW); delayMicroseconds(4500); // Адрес протокола (общедоступная справочная инфа) SendByte(0x86); SendByte(0x72); // Отправка команды SendByte(command); SendByte(~command); // Для определения последнего бита (конец посылки) digitalWrite(Alpine, HIGH); delayMicroseconds(560); digitalWrite(Alpine, LOW); delay(50); // Техническая пауза }Не уверен что это заработает.
/* */ unsigned long mill; //---------------------------------------------------------------- // alpine #define Alpine 2 #define cmdPower 0x09 #define cmdSource 0x0A #define cmdBand 0x0D #define cmdVolumeDown 0x15 #define cmdVolumeUp 0x14 #define cmdUp 0x0E #define cmdDown 0x0F #define cmdLeft 0x13 #define cmdRight 0x12 #define cmdPlay 0x07 #define cmdAProc 0x06 #define cmdMute 0x16 #define cmdAngleUp 0x4C #define cmdAngleDown 0x4B // Отправка байта (протокол NEC-Clarion) void SendByte(byte data) { for (int i = 0; i < 8; i++) { digitalWrite(Alpine, HIGH); delayMicroseconds(560); // Пауза между битами digitalWrite(Alpine, LOW); if (data & 1) { // Последний бит умножаем на 1 delayMicroseconds(1680); // Логическая единица } else { delayMicroseconds(560); // Логический ноль } data >>= 1; // Новый, сдвинутый вправо байт (на 1 бит) } } // Отправка команды void SendCommand(byte command) { // Что-то вроде приветствия, // особенность модифицированного протокола NEC digitalWrite(Alpine, HIGH); delayMicroseconds(9000); digitalWrite(Alpine, LOW); delayMicroseconds(4500); // Адрес протокола (общедоступная справочная инфа) SendByte(0x86); SendByte(0x72); // Отправка команды SendByte(command); SendByte(~command); // Для определения последнего бита (конец посылки) digitalWrite(Alpine, HIGH); delayMicroseconds(560); digitalWrite(Alpine, LOW); delay(50); // Техническая пауза } //--------------------Cl_analog_Keys-------------------------------- class Cl_analog_Keys { const byte delta = 5; const byte pin; int data_next, data, data_old; bool bounce = 0; // антидребезговый флаг uint32_t past = 0 ; void (*Do0)(), (*Do1)(), (*Do2)(), (*Do3)(), (*Do4)(), (*Do5)(); public: Cl_analog_Keys(byte _pin, void (*_Do0)(), void (*_Do1)(), void (*_Do2)(), void (*_Do3)(), void (*_Do4), void (*_Do5)()) : pin(_pin), Do0(_Do0), Do1(_Do1), Do2(_Do2) , Do3(_Do3), Do4(_Do4), Do5(_Do5) {} void setup() { data = analogRead (pin); } void loop() { data_next = analogRead (pin); if (! bounce && mill - past >= 500) { bounce = 1; // выставить флаг past = mill; // сделать временую засветк data = 1100; } if (! bounce && (data + delta < data_next || data - delta > data_next)) { // если прошел фронт изм на выводн bounce = 1; // выставить флаг past = mill; // сделать временую засветку } else if ( bounce && mill - past >= 5 ) { // если прошло антидребезговое время bounce = 0; // то снять флаг past = mill; data_old = data ; data = data_next ; if (data_old > 1000) { if (data >= 731 && data <= 734) Do0(); else if (data >= 793 && data <= 798) Do1(); else if (data >= 759 && data <= 761) Do2(); else if (data >= 826 && data <= 828) Do3(); else if (data >= 836 && data <= 838) Do4() ; else if (data >= 768 && data <= 770) Do5() ; } } } }; //---------------Компоновка---------------------------------------------- void Do0() { SendCommand(cmdVolumeDown); Serial.print("volup"); Serial.println(); } void Do1() { SendCommand(cmdVolumeUp); Serial.print("voldn"); Serial.println(); } void Do2() { SendCommand(cmdLeft); Serial.print("pre"); Serial.println(); } void Do3() { SendCommand(cmdRight); Serial.print("next"); Serial.println(); } void Do4() { SendCommand(cmdSource); Serial.print("sourse"); Serial.println(); } void Do5() { SendCommand(cmdMute); Serial.print("Mute"); Serial.println(); } Cl_analog_Keys Keys(/*пин*/A0,/*обработчик0*/Do0,/*обработчик1х*/Do1,/*обработчик2*/Do2,/*обработчик3*/Do3,/*обработчик4*/Do4,/*обработчик5*/Do5); //----------------- Main() ----------------------- void setup() { Serial.begin(9600); Keys.setup(); } void loop() { mill = millis(); Keys.loop(); } /*Скетч использует 2756 байт (8%) памяти устройства. Всего доступно 32256 байт. Глобальные переменные используют 247 байт (12%) динамической памяти, оставляя 1801 байт для локальных переменных. Максимум: 2048 байт. */Работает Отлично. Спасибо. Укажите пожалуйста где сменить значение задержки между нажатиями, а то долго сильно жать на кнопку нужно для срабатывания. говорю я немного дубовый в этом
А там долго жать не надо. Надо нажать и отпустить. Срабатывает при переходе (ничего не нажата)-> (нажата нужная кнопка). А вот удерживая одну кнопку перейти на другую не получится.
ПС: Этот код переделывал с этого. #11 А вот если долгое нажатие вызывает повторное нажатие, то надо брать отсюда #28
может и так. но у меня по другому. вот видос. поправь код пожалуйста. не удоюно так.
https://youtu.be/PgedJIxjPZs
/* */ unsigned long mill; //---------------------------------------------------------------- // alpine #define Alpine 2 #define cmdPower 0x09 #define cmdSource 0x0A #define cmdBand 0x0D #define cmdVolumeDown 0x15 #define cmdVolumeUp 0x14 #define cmdUp 0x0E #define cmdDown 0x0F #define cmdLeft 0x13 #define cmdRight 0x12 #define cmdPlay 0x07 #define cmdAProc 0x06 #define cmdMute 0x16 #define cmdAngleUp 0x4C #define cmdAngleDown 0x4B // Отправка байта (протокол NEC-Clarion) void SendByte(byte data) { for (int i = 0; i < 8; i++) { digitalWrite(Alpine, HIGH); delayMicroseconds(560); // Пауза между битами digitalWrite(Alpine, LOW); if (data & 1) { // Последний бит умножаем на 1 delayMicroseconds(1680); // Логическая единица } else { delayMicroseconds(560); // Логический ноль } data >>= 1; // Новый, сдвинутый вправо байт (на 1 бит) } } // Отправка команды void SendCommand(byte command) { // Что-то вроде приветствия, // особенность модифицированного протокола NEC digitalWrite(Alpine, HIGH); delayMicroseconds(9000); digitalWrite(Alpine, LOW); delayMicroseconds(4500); // Адрес протокола (общедоступная справочная инфа) SendByte(0x86); SendByte(0x72); // Отправка команды SendByte(command); SendByte(~command); // Для определения последнего бита (конец посылки) digitalWrite(Alpine, HIGH); delayMicroseconds(560); digitalWrite(Alpine, LOW); delay(50); // Техническая пауза } //--------------------Cl_analog_Keys-------------------------------- class Cl_analog_Keys { const byte pin; int data_next, data; uint32_t past = 0 ; void (*Do0)(), (*Do1)(), (*Do2)(), (*Do3)(), (*Do4)(), (*Do5)(); byte read() { int data = analogRead (pin); if (data > 1000) return 0; else if (data >= 836 && data <= 838) return 1 ; else if (data >= 826 && data <= 828) return 2 ; else if (data >= 793 && data <= 798) return 3 ; else if (data >= 759 && data <= 761) return 4 ; else if (data >= 768 && data <= 770) return 5 ; else if (data >= 731 && data <= 734) return 6 ; else return 7; } public: Cl_analog_Keys(byte _pin, void (*_Do0)(), void (*_Do1)(), void (*_Do2)(), void (*_Do3)(), void (*_Do4), void (*_Do5)()) : pin(_pin), Do0(_Do0), Do1(_Do1), Do2(_Do2) , Do3(_Do3), Do4(_Do4), Do5(_Do5) {} void setup() { data = read(); } void loop() { if (mill - past >= 100) { past = mill; data = data_next; data_next = read(); if (data != 0)return; if (data_next == 1) Do4(); else if (data_next == 2) Do3(); else if (data_next == 3) Do1(); else if (data_next == 4) Do2(); else if (data_next == 5) Do5(); else if (data_next == 6) Do0(); } } }; //---------------Компоновка---------------------------------------------- void Do0() { SendCommand(cmdVolumeDown); Serial.print("volup"); Serial.println(); } void Do1() { SendCommand(cmdVolumeUp); Serial.print("voldn"); Serial.println(); } void Do2() { SendCommand(cmdLeft); Serial.print("pre"); Serial.println(); } void Do3() { SendCommand(cmdRight); Serial.print("next"); Serial.println(); } void Do4() { SendCommand(cmdSource); Serial.print("sourse"); Serial.println(); } void Do5() { SendCommand(cmdMute); Serial.print("Mute"); Serial.println(); } Cl_analog_Keys Keys(/*пин*/A0,/*обраб_0*/Do0,/*обраб_1*/Do1,/*обраб_2*/Do2,/*обраб_3*/Do3,/*обраб_4*/Do4,/*обраб_5*/Do5); //----------------- Main() ----------------------- void setup() { Serial.begin(9600); Keys.setup(); } void loop() { mill = millis(); Keys.loop(); } /*Скетч использует 2602 байт (8%) памяти устройства. Всего доступно 32256 байт. Глобальные переменные используют 243 байт (11%) динамической памяти, оставляя 1805 байт для локальных переменных. Максимум: 2048 байт. */может и так. но у меня по другому. вот видос. поправь код пожалуйста. не удоюно так.
Еще раз, про идеальные кнопки, подумай!!!!
Я походу задолбал но эта часть теперь не выполняется
тот скетч что я наваял работает корректно до ужаса
//---------------Компоновка---------------------------------------------- void Do0() { SendCommand(cmdVolumeDown); Serial.print("volup"); Serial.println(); } void Do1() { SendCommand(cmdVolumeUp); Serial.print("voldn"); Serial.println(); } void Do2() { SendCommand(cmdLeft); Serial.print("pre"); Serial.println(); } void Do3() { SendCommand(cmdRight); Serial.print("next"); Serial.println(); } void Do4() { SendCommand(cmdSource); Serial.print("sourse"); Serial.println(); } void Do5() { SendCommand(cmdMute); Serial.print("Mute"); Serial.println(); }Попробуйте адаптировать под вашу цель эту программу.
/*Скетч Аналоговая клавиатура */ unsigned long mill; //----------Cl_Key--------- // класс аналоговая клавиатура class Cl_Key { byte pin;// нога void (*Do1)(), (*Do2)(), (*Do3)(), (*Do4)(), (*Do5)(); //обработчики int val_old, val; // состояние на клавиатуре unsigned long past; int read() { // считать состояние клавиатуры int value = analogRead(pin); if (value < 130) return 1; else if (value < 310) return 2; else if (value < 500) return 3; else if (value < 730) return 4; else if (value < 900) return 5; return 6; } public: Cl_Key(byte _pin, void (*_Do1)(), void (*_Do2)(), void (*_Do3)(), void (*_Do4)(), void (*_Do5)()) : pin(_pin), Do1(_Do1), Do2(_Do2) , Do3(_Do3) , Do4(_Do4) , Do5(_Do5) {} void setup() { val_old = read(); } void loop() { if (mill - past >= 100) { past = mill; val_old = val; val = read(); if (val_old == 6) { if (val == 1) Do1(); else if (val == 2) Do2(); else if (val == 3) Do3(); else if (val == 4) Do4(); else if (val == 5) Do5(); } } } }; //--------Компоновка----------- void Do1() { Serial.println("Do1"); } void Do2() { Serial.println("Do2"); } void Do3() { Serial.println("Do3"); } void Do4() { Serial.println("Do4"); } void Do5() { Serial.println("Do5"); } Cl_Key Key(/*нога*/A0,/*обработчик1*/Do1,/*обработчик1*/Do2,/*обработчик1*/Do3,/*обработчик1*/Do4,/*обработчик1*/Do5); //----------main()--------- void setup() { Serial.begin(9600); Key.setup(); } void loop() { mill = millis(); Key.loop(); } /*Скетч использует 1920 байт (5%) памяти устройства. Всего доступно 32256 байт. Глобальные переменные используют 229 байт (11%) динамической памяти, оставляя 1819 байт для локальных переменных. Максимум: 2048 байт. */Вот эта точно работает.
ПС: А эта уже не уверен
/*Скетч Аналоговая клавиатура */ unsigned long mill; //----------Cl_Key--------- // класс аналоговая клавиатура class Cl_Key { byte pin;// нога void (*Do1)(), (*Do2)(), (*Do3)(), (*Do4)(), (*Do5)(), (*Do6)(); //обраб_и int val_old, val; // состояние на клавиатуре unsigned long past; int read() { // считать состояние клавиатуры int data = analogRead(pin); if (data >= 731 && data <= 734) return 1;// else if (data >= 793 && data <= 798) return 2;// else if (data >= 759 && data <= 761) return 3;// херня будет если значения на кнопках будут попадать в зазоры else if (data >= 826 && data <= 828) return 4;// else if (data >= 836 && data <= 838) return 5;// else if (data >= 768 && data <= 770) return 6;// return 7; } public: Cl_Key(byte _pin, void (*_Do1)(), void (*_Do2)(), void (*_Do3)(), void (*_Do4)(), void (*_Do5), void (*_Do6)()) : pin(_pin), Do1(_Do1), Do2(_Do2) , Do3(_Do3) , Do4(_Do4) , Do5(_Do5), Do6(_Do6) {} void setup() { val_old = read(); } void loop() { if (mill - past >= 100) { past = mill; val_old = val; val = read(); if (val_old == 7) { if (val == 1) Do1(); else if (val == 2) Do2(); else if (val == 3) Do3(); else if (val == 4) Do4(); else if (val == 5) Do5(); else if (val == 6) Do6(); } } } }; //--------Компоновка----------- void Do1() { Serial.println("Do1"); } void Do2() { Serial.println("Do2"); } void Do3() { Serial.println("Do3"); } void Do4() { Serial.println("Do4"); } void Do5() { Serial.println("Do5"); } void Do6() { Serial.println("Do6"); } Cl_Key Key(/*нога*/A0,/*обраб_1*/Do1,/*обраб_2*/Do2,/*обраб_3*/Do3,/*обраб_4*/Do4,/*обраб_5*/Do5,/*обраб_6*/Do6); //----------main()--------- void setup() { Serial.begin(9600); Key.setup(); } void loop() { mill = millis(); Key.loop(); } /*Скетч использует 1984 байт (6%) памяти устройства. Всего доступно 32256 байт. Глобальные переменные используют 235 байт (11%) динамической памяти, оставляя 1813 байт для локальных переменных. Максимум: 2048 байт. */всеми спасибо огромное за помощ. подшаманил свой код (который как не странно работает идеально). уже стоит на машине все прекрасно и работает. кого заинтересует инфа фотки есть
Поделись пожалуйста рабочим кодом.
нашел такой скетч Вроде он, давно было не помню. или в 8 посте он. не помню.
и там кнопки все с одинаковым сопротивлением. нужно резисторов подобавлять чтобы считывало разные значения
///////////////////////////////////////////////////////////////// // alpine #define alpinePin 2 #define cmdPower 0x09 #define cmdSource 0x0A #define cmdBand 0x0D #define cmdVolumeDown 0x15 #define cmdVolumeUp 0x14 #define cmdUp 0x0E #define cmdDown 0x0F #define cmdLeft 0x13 #define cmdRight 0x12 #define cmdPlay 0x07 #define cmdAProc 0x06 #define cmdMute 0x16 #define cmdAngleUp 0x4C #define cmdAngleDown 0x4B #define cmdCDChange 0x03 ///////////////////////////////////////////////////////////////// // маски для клавиш const int sourse =1 ; const int vol_up =2 ; const int vol_dn =3 ; const int next =4 ; const int pre =5 ; const int mute =6 ; int wheelPin=A0; // аналоговый пин, на котором мы считываем сопротивление нажатой на руле кнопки int i=0; int prevButton=0; int getR() { // Эта функция читает сопротивление с кнопок на руле и возвращает код нажатой кнопки, либо 0 // читаем сопротивление (на самом деле напряжение, конечно) на аналоговом пине int r=analogRead(wheelPin); // Ищем, какая кнопка соответствует этому сопротивлению. if (r >= 731 && r <= 734) return (vol_up); if (r >= 793 && r <= 798) return (vol_dn); if (r >= 759 && r <= 761) return (pre); if (r >= 826 && r <= 828) return (next); { if (r >= 836 && r <= 838) return (sourse); SendCommand(cmdSource); Serial.print("sourse"); Serial.println(); } if (r >= 768 && r <= 770) return (mute); // если ни одна из кнопок не нажата, возвращаем 0 return (0); } // отправка байта void SendByte(byte data) { for (int i = 0; i < 8; ++i) { digitalWrite(alpinePin, HIGH); delayMicroseconds(560); digitalWrite(alpinePin, LOW); if (data & 1) { // 1 delayMicroseconds(1680); } else { // 0 delayMicroseconds(560); } data >>= 1; } } // отправка команды void SendCommand(byte command) { digitalWrite(alpinePin, HIGH); delayMicroseconds(9000); digitalWrite(alpinePin, LOW); delayMicroseconds(4500); SendByte(0x86); SendByte(0x72); SendByte(command); SendByte(~command); digitalWrite(alpinePin, HIGH); delayMicroseconds(560); digitalWrite(alpinePin, LOW); } /* // цикл программы void loop(void) { if (1 == (sourse)) SendCommand(cmdSource); Serial.print("sourse"); Serial.println(); if (4 == (next)) SendCommand(cmdRight); Serial.print("next"); Serial.println(); if (5 == (pre)) SendCommand(cmdLeft); Serial.print("pre"); Serial.println(); if (6 == (mute)) SendCommand(cmdMute); Serial.print("Mute"); Serial.println(); if (2 == (vol_up)) SendCommand(cmdVolumeDown); Serial.print("volup"); Serial.println(); if (3 == (vol_dn)) SendCommand(cmdVolumeUp); Serial.print("voldn"); Serial.println(); */Спасибо большое. Этот код нерабочий, 8-ой пост - рабочий. Подружил sony rm-x4s с alpine cde-185 на основе кода в посте №8
Всем привет а можно схему нарисовать к Ардуино нано .просто не могу понять куда чё подключать.