Переходник с магнитолы на мульируль
- Войдите на сайт для отправки комментариев
Сб, 08/12/2018 - 16:15
Всем доброго времени суток! Само устройство описывать не будуЮ так-как это сделано тут 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
}
Неужели ни кто не знает?(
особо в код не всматривался, лениво, но могу предположить, что луп для вашей задачи слишком быстро крутится, Serial.print его немного тормозит, поэтому с ним работает.