Voha888

Pioneer-DEH-2700RB-modding 29-06-18

Jun 28th, 2018
61
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 9.85 KB | None | 0 0
  1. #include <boarddefs.h>
  2. #include <IRremote.h>
  3. #include <IRremoteInt.h>
  4. #include <ir_Lego_PF_BitStreamEncoder.h>
  5. #include <EEPROM.h>
  6. IRsend irsend;
  7.  
  8. int RECV_PIN = 38;
  9. int current_mode; // переменная режимов: 0 - usb, 1 - fm, 2- bt
  10. int current_time; //пишем текущее время каждый цикл
  11. int time_to_on; // время для включения bt
  12. int last_mode; // последний режим, для возврата после работы bt
  13.  
  14.  
  15. IRrecv irrecv(RECV_PIN);
  16.  
  17. decode_results results;
  18. int message;
  19.  
  20.  
  21. // the setup function runs once when you press reset or power the board
  22. void setup() {
  23.   // initialize digital pin LED_BUILTIN as an output.
  24.  pinMode(20, OUTPUT); digitalWrite(20, HIGH); // "Самоподхват" реле включения
  25.  pinMode(25, OUTPUT); digitalWrite(25, HIGH); // Подадим AAC на магнитолу для её запуска
  26.  pinMode(22, INPUT); //настроим сигнал о включении магнитолы (питание антены)
  27.  pinMode(24, OUTPUT); digitalWrite(25, HIGH); // Настроим пин запуска ATJ2009
  28.  
  29.   Serial.begin(9600);
  30.   irrecv.enableIRIn(); // Start the receiver
  31.   pinMode(42, OUTPUT);
  32.   pinMode(44, OUTPUT);
  33.   pinMode(40, OUTPUT); // пин отправки команд в ATJ2009 по проводу
  34.   pinMode(49, OUTPUT); pinMode(51, OUTPUT); // пины управления мультиплексором GD4052
  35.   pinMode(13, OUTPUT);pinMode(11, OUTPUT);pinMode(9, OUTPUT);pinMode(7, OUTPUT);pinMode(5, OUTPUT);pinMode(3, OUTPUT);pinMode(15, OUTPUT);pinMode(16, OUTPUT); // пины управления Qualcomm CSR86xx
  36.   pinMode(18, INPUT); // csr86xx LED1
  37.   pinMode(59, INPUT); pinMode(18, INPUT); // csr86xx PIO 17, PIO 14
  38.    
  39.     /*
  40. коды кнопок ATJ2009
  41. FF629D Folder-
  42. FFE01F |<<
  43. FFA857 >>|
  44. FF906F Play-pause
  45. FFB04F +
  46. FF9867 -
  47. FFFFFFFF повтор
  48. */
  49.  
  50. if (EEPROM.read(0)==0){ current_mode =0; last_mode=0; digitalWrite(24, HIGH);}  // проверяем последний выбранный режим в eeprom, который был установлен перед выключением питания, и если это 0-usb то запустим ATJ2009 через пин 24
  51. else {current_mode=1;last_mode=1;}
  52.  
  53.  
  54.  
  55.  
  56.    //пины для Pioneer wired control, подтянем их к "+" для реализации обратной логики:
  57.    pinMode(26, OUTPUT); digitalWrite(26, HIGH); // Pioneer wired remote "Source/off 2sec"
  58.    pinMode(28, OUTPUT); digitalWrite(28, HIGH); // Pioneer wired remote "Up"
  59.    pinMode(30, OUTPUT); digitalWrite(30, HIGH); // Pioneer wired remote "Down"
  60.    pinMode(32, OUTPUT); digitalWrite(32, HIGH); // Pioneer wired remote "Vol +"
  61.    pinMode(34, OUTPUT); digitalWrite(34, HIGH); // Pioneer wired remote "Vol -"
  62.    pinMode(36, OUTPUT); digitalWrite(36, HIGH); // Pioneer wired remote WREM2
  63.  
  64.  
  65. }
  66.  
  67. //функции для кнопок:
  68.  
  69. void up() {
  70.  
  71.   if (current_mode==1) {digitalWrite(36, LOW); digitalWrite(28, LOW); delay(200); digitalWrite(28, HIGH); digitalWrite(36, HIGH);} // в режиме радио шлём команду в pioneer wired control
  72.   else if (current_mode==0) {irsend.sendNEC(0xFFA25D, 24);} // в режиме usb шлём команду в ATJ2009
  73.   else if (current_mode==2) {digitalWrite(11, HIGH); delay(200); digitalWrite(11, LOW);} // в режиме BT шлём кнопку в CSR86xx
  74.   else {error(2);} //иначе ошибка
  75.   }
  76.  
  77. void right() {
  78.  
  79.   if (current_mode==1) {digitalWrite(28, LOW); delay(200); digitalWrite(28, HIGH);} // в режиме радио шлём команду в pioneer wired control
  80.   else if (current_mode==0) {irsend.sendNEC(0xFFA857, 24);}
  81.   else if (current_mode==2) {digitalWrite(11, HIGH); delay(200); digitalWrite(11, LOW);} // в режиме BT шлём кнопку в CSR86xx
  82.   else {error(3);}
  83.  
  84.   }
  85.  
  86. void down() {  
  87.  
  88.    if (current_mode==1) {digitalWrite(36, LOW); digitalWrite(30, LOW); delay(200); digitalWrite(30, HIGH); digitalWrite(36, HIGH);} // в режиме радио шлём команду в pioneer wired control
  89.    else if (current_mode==0) {irsend.sendNEC(0xFF629D, 24);}
  90.    else if (current_mode==2) {digitalWrite(7, HIGH); delay(200); digitalWrite(7, LOW);} // в режиме BT шлём кнопку в CSR86xx
  91.    else {error(4);}
  92.   }
  93.  
  94. void left() {
  95.  
  96.    if (current_mode==1) {digitalWrite(30, LOW); delay(200); digitalWrite(30, HIGH);} // в режиме радио шлём команду в pioneer wired control
  97.    else if (current_mode==0) {irsend.sendNEC(0xFFE01F, 24);}
  98.    else if (current_mode==2) {digitalWrite(9, HIGH); delay(200); digitalWrite(9, LOW);} // в режиме BT шлём кнопку в CSR86xx
  99.    else {error(5);}
  100.   }
  101.  
  102.  void play_pause()  {
  103.    if (current_mode==1) {return;} // здесь нужен код на установку не существующего источника на CD4052 для имитации "паузы" радио
  104.    else if (current_mode==0) {irsend.sendNEC(0xFFF906F, 24);}
  105.    else if (current_mode==2) {digitalWrite(13, HIGH); delay(200); digitalWrite(13, LOW);} // в режиме BT шлём кнопку в CSR86xx
  106.    else {error(6);}
  107.  
  108.   }
  109.  
  110.  void vol_up() {
  111.  
  112.   digitalWrite(32, LOW); delay(200); digitalWrite(32, HIGH); // добавление громкости через pioneer wired control
  113. //irsend.sendNEC(0xFFB04F, 24); // добавление громкости ATJ2009
  114. }
  115.  void vol_down() {
  116.   digitalWrite(34, LOW); delay(200); digitalWrite(34, HIGH); // уменьшение громкости через pioneer wired control
  117. //irsend.sendNEC(0xFF9867, 24);  // уменьшение громкости ATJ2009
  118. }
  119.  
  120.  void usb_fm() {
  121.  
  122. if (current_mode==2){ return;} //проверяем текущий режим девайса, и если это bt "2" - то просто выходим
  123. else if (current_mode==1) {current_mode=0; last_mode=0; EEPROM.write(0, 0);digitalWrite(24, HIGH);} //  если это fm "1", то меняем на "0" - usb и пишем в eeprom и включаем ATJ2009 через пин 24
  124. else if (current_mode==0) {current_mode=1; last_mode=1; EEPROM.write(0, 1);digitalWrite(24, LOW);} //  если это usb "0", то меняем на "1" - fm и пишем в eeprom и выключаем ATJ2009 через пин 24
  125. else {error(1);} // иначе ошибка 1
  126.  
  127. }
  128.  
  129.  void answer() {
  130. digitalWrite(15, HIGH); delay(200); digitalWrite(15, LOW); // шлём кнопку в CSR86xx
  131. }
  132.  
  133.  void reject() {
  134. digitalWrite(16, HIGH); // шлём кнопку VCHRG в CSR86xx
  135. key_hold =1 ; // включаем флаг удержания
  136. }
  137.  
  138.  void poweroff() {
  139. if (last_mode==0) {EEPROM.write(0, 0);} //  запомним последний режим девайса, если это usb "0", то пишем в eeprom 0
  140. else if (last_mode==1) {EEPROM.write(0, 1);} //  запомним последний режим девайса, если это fm "1", то пишем в eeprom 1
  141. else {error(7);} // иначе ошибка
  142.  
  143.  
  144.  //digitalWrite(26, LOW); delay(200); digitalWrite(26, HIGH); // кнопка Source, poweroff 2sec для pioneer wired control
  145. //digitalWrite(13, HIGH); delay(200); digitalWrite(13, LOW); // проверим включение-выключение модуля CSR86xx
  146. delay(200);
  147. pinMode(20, OUTPUT); digitalWrite(20, LOW); // Отключим всю схему
  148.  
  149. }
  150.  
  151.  void repeat_command() {
  152.  
  153.  
  154. //irsend.sendNEC(0xFFFFFFFF, 32); //команда повтора ATJ2009
  155.  
  156.  
  157. }
  158.  
  159.  
  160. void unknown_command () {
  161.  
  162.  
  163.  
  164. }
  165.  
  166. void error(int error_number){
  167. return; // здесь будет код обработки ошибок
  168.  
  169.  
  170.  
  171. }
  172.  
  173.  
  174.  
  175.  
  176. // the loop function runs over and over again forever
  177. void loop() {
  178.  
  179.   if (digitalRead(22)==0){ delay(4000); if (digitalRead(22)==0){ poweroff(); }}
  180.  
  181.   digitalWrite(42, LOW);    // выключаем светодиод
  182.  
  183.   //digitalWrite(44, HIGH);
  184.   //delay(100);
  185. digitalWrite(44, LOW);
  186. delay(20);
  187. digitalWrite(44, HIGH);
  188.  
  189.  
  190.  
  191.  //digitalWrite(40, HIGH);   // зажигаем светодиод
  192.  //delay(2000);    
  193.   //Serial.println(1.23456, 4); // ждем секунду
  194.  //digitalWrite(40, LOW);    // выключаем светодиод
  195.  //delay(2000);              // ждем секунду
  196.  
  197.  
  198.   if (irrecv.decode(&results)) {
  199. Serial.println(results.value, HEX);
  200. digitalWrite(42, HIGH);
  201.  
  202.  message = results.value, HEX; // отправим принятые клавиши в соответствующие им функции
  203.  switch (message){
  204.  case 0xFFE21D: key_hold =0 ; up() ;   break;
  205.  case 0xFF22DD: key_hold =0 ; right() ; break;
  206.  case 0xFFA25D: key_hold =0 ; down() ;  break;
  207.  case 0xFF02FD: key_hold =0 ; left() ; break;
  208.  case 0xFF906F: key_hold =0 ; play_pause() ; break;
  209.  case 0xFFA857: key_hold =0 ; vol_up() ; break;
  210.  case 0xFFE01F: key_hold =0 ; vol_down() ; break;
  211.  case 0xFFB04F: key_hold =0 ; usb_fm() ; break;
  212.  case 0xFF9867: key_hold =0 ; answer() ; break;
  213.  case 0xFF629D: key_hold =0 ; reject() ; break;
  214.  case 0xFFC23D: key_hold =0 ; poweroff(); break;
  215.  case 0xFFFFFFFF: repeat_command() ; break;
  216.  default: key_hold =0 ; unknown_command () ;
  217.  }
  218.  
  219.  
  220. irrecv.enableIRIn();
  221. irrecv.resume(); // Receive the next value
  222.  
  223. }
  224.  
  225. else {                                      //этот код выполняется каждый цикл, когда не было команд с пульта
  226. //Serial.println("no command");
  227. key_hold =0 ;
  228. return;
  229.  }
  230.  
  231. if (key_hold==0) {digitalWrite(16, LOW);} //отпустим кнопку
  232.  
  233. current_time=millis();
  234. if (digitalRead(18)==0){ current_mode==2; time_to_on = current_time } //если сработал LED1 на CSR866xx, нужно включить BT (current_mode=2) на 3 секунды
  235. if (current_mode==2 &&((time_to_on - current_time) > 3000)) { current_mode=last_mode; }
  236.  
  237.  
  238.  
  239.  
  240. }
Add Comment
Please, Sign In to add comment