Переходник с магнитолы на мульируль

RomanG95
Offline
Зарегистрирован: 18.10.2016

Всем доброго времени суток! Само устройство описывать не будуЮ так-как это сделано тут https://www.drive2.ru/l/518568992273597156/. Если не составит труда, подскажите пожалуйста, почему программа не работет с закомментированной 58 строкой Serial.println(analog);. как это вляет на ход программы? Заранее спасибо!

#define HOLDTIME 400 //Назначяем время, по прошествию которого кнопка считается зажатой
/*Описываем сколько "попугаев" в нажатых кнопках*/

#define PLUS0    506  // Кнопка "+ vol" на руле (прибавить громкость на магнитоле)
#define MINUS0   606  // Кнопка "- vol" на руле (убавить громкость на магнитоле)
#define CIRCLE0  711  // Кнопка "voice" на руле (MUTE на магнитоле)
#define RIGHT0   84  // Кнопка ">" на руле (вперед на магнитоле)
#define LEFT0    194 // Кнопка "<" на руле (назад на магнитоле)
#define SOURSE0  313 // Кнопка "MODE" на руле (SOURSE на магнитоле)
#define ALLDOWN  1023 //Все кнопки отпущены
#define DELTA    10   // Погрешность в измерении приходящего сигнала, если показания скачут более чем на 10 едениц, то можно увеличить
/* 
#define CALL0    916  // Кнопка "поднять трубку" на руле (прибавить поднять трубку на магнитоле)
#define HANGUP0  812  // Кнопка "положить трубку" на руле (прибавить положить трубку на магнитоле)
*/
/*
Назначаем команды кнопкам
Команды пульта JVC RM-RK52:
MUTE      0xF171
SOUND     0xF1B1 
UP        0xF129
DOWN      0xF1A9
LEFT      0xF1C9
RIGHT     0xF149
SOURCE    0xF111
VOL-      0xF1A1
VOL+      0xF121
*/  
/*команды которые будут соответствовать нажатой кнопке на руле и зажатой кнопке на руле

JVCVolUp();
JVCVolDn();
JVCSource();
JVCSound();
JVCMute();
JVCSkipFwd();
JVCSkipBack();
JVCSkipFwdHold();
JVCSkipBackHold();
*/
const int PIN = 3;          // Пин, который кправляет базой транзистора
const int Length = 537;     // Length in Microseconds
const int Reps = 3;         // Number of times to repeat each transmission

int analog=0;// для чтения аналогового сигнала
unsigned long time;// переменная для хранения времени


void setup() 
{
pinMode(PIN, OUTPUT); // Set pin to output
digitalWrite(PIN, LOW); // Make PIN low to shut off transistor
Serial.begin(9600); 
}

void loop(){
analog = analogRead(A0);//считываем сигнал с пина АЦП
Serial.println(analog);
  
if (abs(ALLDOWN-analog) < DELTA)// для того, чтобы отпущенная кнопка снова обрабатывалась скидываем time на ноль
        {
      time=0;
      	}
//Читаем значение кнопки, если нажата, и до этого нажата не была (time равен нулю)
if (abs(ALLDOWN-analog) > DELTA && time==0) 
{
time = millis();  // отмечаем время нажатия записью в переменную time
do
{
  Serial.print("Pushing ");
  Serial.print(analogRead(A0));
  Serial.print(" by ");
  Serial.println(millis()-time);
  delay(50); //ждем, набираем holdtime
}
while (abs(ALLDOWN-analogRead(A0)) > DELTA && millis()-time <= HOLDTIME);// пока что-то нажато и время нажатия не превысило holdtime
  
if (millis()<time+HOLDTIME)//если время удержания меньше чем holdtime, шлем сигналы одиночного нажатия

{
  if (abs(analog-SOURSE0) < DELTA)  //Кнопка "MODE" на руле
	{
	JVCSource();
  JVCSource();
	Serial.println("com1: Source");
	}
if (abs(analog-LEFT0) < DELTA)  //Кнопка "<" на руле
	{
	JVCSkipBack();
  JVCSkipBack();
	Serial.println("com1: Left");
	}
if (abs(analog-RIGHT0) < DELTA)  //Кнопка ">" на руле
	{
	JVCSkipFwd();	
  JVCSkipFwd();  
	Serial.println("com1: Right");
	}
if (abs(analog-CIRCLE0) < DELTA)  //Кнопка "voice" на руле
	{
	JVCMute();
  JVCMute();
	Serial.println("com1: Mute");
	}
if (abs(analog-PLUS0) < DELTA)  //Кнопка "+ vol" на руле
	{
	JVCVolUp();
  JVCVolUp();
	Serial.println("com1: VolUp");
	}
if (abs(analog-MINUS0) < DELTA)  //Кнопка "- vol" на руле
	{
	JVCVolDn();
 JVCVolDn();
	Serial.println("com1: VolDown");
	}

}

/*Код для зажатых кнопок */

else if (millis() >= time+HOLDTIME)// в другом случае, когда кнопка удерживалась, шлем сигналы удержания
{
if (abs(analog-SOURSE0) < DELTA)  //Кнопка "MODE" на руле
    {
		while((abs(analogRead(A0)-SOURSE0) < DELTA))
		{
		JVCSource();
		Serial.println("com2: Holding Source");
		}
    }
    
/* На моей магнитоле нет кнопок вверх и вниз, поэтому не использую эту функцию, если понадобится то нужно просто раскомментировать*/

/*if (abs(analog-LEFT0) < DELTA)  //Кнопка "<" на руле
	{
    JVCSkipBackHold();
    Serial.println("com2: Down");
    }
if (abs(analog-RIGHT0) < DELTA)  //Кнопка ">" на руле
	{
    JVCSkipFwdHold();
    Serial.println("com2: Up");
    }
    */
if (abs(analog-CIRCLE0) < DELTA)  //Кнопка "voice" на руле
	{
    JVCSound();
    Serial.println("com2: Sound");
    }
if (abs(analog-PLUS0) < DELTA)  //Кнопка "+ vol" на руле
	{
		while((abs(analogRead(A0)-PLUS0) < DELTA))
			{
			JVCVolUp();
			Serial.println("com2: Holding VolUp");
			}
	}
if (abs(analog-MINUS0) < DELTA)  //Кнопка "- vol" на руле
	{
		while((abs(analogRead(A0)-MINUS0) < DELTA))
			{
			JVCVolDn();
			Serial.println("com2: holding VolDown");
			}    
	}
  
}
}
}
/*
  Далее позаимствованый код с протоколом проводного управления:

  JVC
  Communicate with JVC car radio over 3.5mm Remote connector
  
  Connect Arduino PIN to Base of NPN transistor
  Emitter is tied to ground
  Collector is tied to 3.5mm TIP
  Ground 3.5mm Ring/Sleeve
  
  By Dan Guerra (deguerra98@yahoo.com)
  */
void JVCVolUp() {      // Send 0x04
  for (int i = 1; i <= Reps; i++); {
    Preamble();
    
    bZERO();
    bZERO();
    bONE();    // 4 
    bZERO();
    
    bZERO();
    bZERO();   // 0
    bZERO();
  
    Postamble();
  }
}

void JVCVolDn() {      // Send 0x05
  for (int i = 1; i <= Reps; i++); {
    Preamble();
    
    bONE();
    bZERO();
    bONE();    // 5 
    bZERO();
    
    bZERO();
    bZERO();   // 0
    bZERO();
  
    Postamble();
  }
}

void JVCSource() {      // Send 0x08
  for (int i = 1; i <= Reps; i++); {
    Preamble();
    
    bZERO();
    bZERO();
    bZERO();    // 8 
    bONE();
    
    bZERO();
    bZERO();   // 0
    bZERO();
  
    Postamble();
  }
}

void JVCSound() {      // Send 0x0D
  for (int i = 1; i <= Reps; i++); {
    Preamble();
    
    bONE();
    bZERO();
    bONE();    // D (13) 
    bONE();
    
    bZERO();
    bZERO();   // 0
    bZERO();
  
    Postamble();
  }
}

void JVCMute() {      // Send 0x0E
  for (int i = 1; i <= Reps; i++); {
    Preamble();
    
    bZERO();
    bONE();
    bONE();    // E (14) 
    bONE();
    
    bZERO();
    bZERO();   // 0
    bZERO();
  
    Postamble();
  }
}

void JVCSkipFwd() {      // Send 0x12
  for (int i = 1; i <= Reps; i++); {
    Preamble();
    
    bZERO();
    bONE();
    bZERO();    // 2 
    bZERO();
    
    bONE();
    bZERO();   // 1
    bZERO();
  
    Postamble();
  }
}

void JVCSkipBack() {      // Send 0x13
  for (int i = 1; i <= Reps; i++); {
    Preamble();
    
    bONE();
    bONE();
    bZERO();    // 3 
    bZERO();
    
    bONE();
    bZERO();   // 1
    bZERO();
  
    Postamble();
  }
}

void JVCSkipFwdHold() {      // Send 0x14
  for (int i = 1; i <= Reps; i++); {
    Preamble();
    
    bZERO();
    bZERO();
    bONE();    // 4 
    bZERO();
    
    bONE();
    bZERO();   // 1
    bZERO();
  
    Postamble();
  }
}

void JVCSkipBackHold() {      // Send 0x15
  for (int i = 1; i <= Reps; i++); {
    Preamble();
    
    bONE();
    bZERO();
    bONE();    // 5 
    bZERO();
    
    bONE();
    bZERO();   // 1
    bZERO();
  
    Postamble();
  }
}


void bONE() {                     // Send a binary ONE over the line
  digitalWrite(PIN, HIGH);        // Pull 3.5mm TIP low
  delayMicroseconds(Length);      // for 537us
  digitalWrite(PIN, LOW);         // Allow 3.5mm TIP to go high
  delayMicroseconds(Length * 3);  // for 537 * 3 = 1611us
}


void bZERO() {                    // Send a binary ZERO over the line
  digitalWrite(PIN, HIGH);        // Pull 3.5mm TIP low
  delayMicroseconds(Length);      // for 537us
  digitalWrite(PIN, LOW);         // Allow 3.5mm TIP to go high
  delayMicroseconds(Length);      // for 537us
}

void Preamble() {
  digitalWrite(PIN, LOW);         // Not sure what this does
  delayMicroseconds(Length * 1);
  
  digitalWrite(PIN, HIGH);        // AGC
  delayMicroseconds(Length * 16);
  
  digitalWrite(PIN, LOW);         // AGC
  delayMicroseconds(Length * 8);
  
  bONE();    // 1 Start Bit
  
  bONE();    //       (7 bit device code)
  bONE();    
  bONE();    // 7
  bZERO();
 
  bZERO();
  bZERO();    //4
  bONE();
}
    
    
void Postamble() {
  bONE();
  bONE();    // 2 stop bits
}

 

RomanG95
Offline
Зарегистрирован: 18.10.2016

Неужели ни кто не знает?(

MaksVV
Offline
Зарегистрирован: 06.08.2015

особо в код не всматривался, лениво, но могу предположить, что луп для вашей задачи слишком быстро крутится, Serial.print его немного тормозит, поэтому с ним работает.