Arduino pro mini + alpine

Foxmaster
Offline
Зарегистрирован: 24.07.2017

Уважаемые програмеры прошу вашей помощи.

Есть такая тема как управление магнитолой Алпайн с помощью команд ардуинки.

Я нашел немного инфы на эту тему, считал значение подрулевых кнопок, запилил скетч  и никак не могу довести до ума. Ошибки компиляции для платы и тд. В програмировинии не силен.

вот скетч ( куски выдраные из другиг проэктов + свои доработки)

/////////////////////////////////////////////////////////////////
// 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); // Техническая пауза
}

 

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

хтеее setup ?

void setup(void) {
  Serial.begin(9600);
}

 

Foxmaster
Offline
Зарегистрирован: 24.07.2017
if (3 == (vol_dn))
 
 ^
 
exit status 1
expected unqualified-id before 'if'
Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

Foxmaster пишет:

if (3 == (vol_dn))
 
 ^
 
exit status 1
expected unqualified-id before 'if'

1. Данная ошибка у меня не воспроизводится.

2. Вам уже сказали выше - где функция setup() ? Зачем Вы её удалили? Во всех скетчах должны обязательно присутствовать функции setup() и loop()

Foxmaster
Offline
Зарегистрирован: 24.07.2017

Циклическое выполнение всех команд без нажатия на кнопки

/////////////////////////////////////////////////////////////////
// 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); // Техническая пауза
}

 

bwn
Offline
Зарегистрирован: 25.08.2014

Идеальные кнопки? Разброс значений менее 15мВ?

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

Foxmaster пишет:

Циклическое выполнение всех команд без нажатия на кнопки

Теперь скетч компилируется нормально: 

Скетч использует 2 150 байт (6%) памяти устройства. Всего доступно 30 720 байт.

Foxmaster
Offline
Зарегистрирован: 24.07.2017

Все компилит нормально. Циклически выполняется все заданые функции , а нужно по нажатию кнопки. 

Да кнопки идеальные. Помогите плиз

Foxmaster
Offline
Зарегистрирован: 24.07.2017

Заработало. выбросил много лишнего. но не все. Рабочий скетч 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); // Техническая пауза
}

 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Не уверен что это заработает.

/*
*/
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 байт.
*/

 

Foxmaster
Offline
Зарегистрирован: 24.07.2017

Работает Отлично. Спасибо. Укажите пожалуйста где сменить значение задержки между нажатиями, а то долго сильно жать на кнопку нужно для срабатывания. говорю я немного дубовый в этом

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

А там долго жать не надо. Надо нажать и отпустить.  Срабатывает при переходе (ничего не нажата)-> (нажата нужная кнопка). А вот удерживая одну кнопку перейти на другую не получится.

ПС: Этот код переделывал с этого. #11  А вот если долгое нажатие вызывает повторное нажатие, то надо брать отсюда #28

Foxmaster
Offline
Зарегистрирован: 24.07.2017

может и так. но у меня по другому. вот видос. поправь код пожалуйста. не удоюно так.

https://youtu.be/PgedJIxjPZs

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016
/*
*/
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 байт.
*/

 

bwn
Offline
Зарегистрирован: 25.08.2014

Foxmaster пишет:

может и так. но у меня по другому. вот видос. поправь код пожалуйста. не удоюно так.

Еще раз, про идеальные кнопки, подумай!!!!

Foxmaster
Offline
Зарегистрирован: 24.07.2017

Я походу задолбал но эта часть теперь не выполняется 

тот скетч что я наваял работает корректно до ужаса

//---------------Компоновка----------------------------------------------

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

 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Попробуйте адаптировать под вашу цель эту программу.

/*Скетч Аналоговая клавиатура
*/
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 байт.
*/

 

Foxmaster
Offline
Зарегистрирован: 24.07.2017

всеми спасибо огромное за помощ. подшаманил свой код (который как не странно работает идеально). уже стоит на машине все прекрасно и работает. кого заинтересует инфа фотки есть

Pashkon
Offline
Зарегистрирован: 15.05.2020

Поделись пожалуйста рабочим кодом.

Foxmaster
Offline
Зарегистрирован: 24.07.2017

нашел такой скетч Вроде он, давно было не помню. или в 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();
*/

 

Pashkon
Offline
Зарегистрирован: 15.05.2020

Спасибо большое. Этот код нерабочий, 8-ой пост - рабочий. Подружил sony rm-x4s с alpine cde-185 на основе кода в посте №8

sanekovich
sanekovich аватар
Offline
Зарегистрирован: 14.04.2022

Всем привет а можно схему нарисовать к Ардуино нано .просто не могу понять куда чё подключать.