Не приходят данные на ИК

Дим
Offline
Зарегистрирован: 05.05.2017

Здравству

Дим
Offline
Зарегистрирован: 05.05.2017

Здравствуйте, почему то не приходят данные с кнопок пульта. Только с первых девяти.

#include <IRremote.h>
IRsend irsend;

int x;
void setup()
{
  Serial.begin(9600);
}
void loop()
{
if (Serial.available() > 0)
  {
  x = Serial.read();
  if (x == '1'){ irsend.sendNEC(0xFF5AA5, 32);Serial.print(x);}
  if (x == '2'){ irsend.sendNEC(0xFF728D, 32);Serial.print(x);}
  if (x == '3'){ irsend.sendNEC(0xFFCA35, 32);Serial.print(x);}
  if (x == '4'){ irsend.sendNEC(0xFF0AF5, 32);Serial.print(x);}
  if (x == '5'){ irsend.sendNEC(0xFF08F7, 32);Serial.print(x);}
  if (x == '6'){ irsend.sendNEC(0xFF12ED, 32);Serial.print(x);}
  if (x == '7'){ irsend.sendNEC(0xFFEA15, 32);Serial.print(x);}
  if (x == '8'){ irsend.sendNEC(0xFF2AD5, 32);Serial.print(x);}
  if (x == '9'){ irsend.sendNEC(0xFF28D7, 32);Serial.print(x);}
  if (x == '10'){ irsend.sendNEC(0xFF18E7, 32);Serial.print(x);}  
  }
}

 

b707
Offline
Зарегистрирован: 26.05.2017

Смешно :)

Ответ такой - в строке 13 вы читаете из порта один символ, а в строке "10" их (символа) - два.

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Дим пишет:

Здравствуйте, почему то не приходят данные с кнопок пульта. Только с первых девяти.

  if (x == '10'){ irsend.sendNEC(0xFF18E7, 32);Serial.print(x);}  

Ну и правильно, что с первых девяти, т.к. нет такого символа '10'. В таблице символов есть символы '1' и '0', по отдельности. 

Дим
Offline
Зарегистрирован: 05.05.2017

А как же быть если кнопок более 10?

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011
DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Дим пишет:

А как же быть если кнопок более 10?

Понимать, в чём разница между числом и символом (байтом), как минимум.

b707
Offline
Зарегистрирован: 26.05.2017

Дим пишет:

А как же быть если кнопок более 10?

Например, кроме цифр есть еще буквы. Вместо "10" можно использовать "а" и так далее :)

Дим
Offline
Зарегистрирован: 05.05.2017

Благодарю. Только кода стало в два раза больше.

 

#include <IRremote.h>
IRsend irsend;

unsigned long a;

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

void S1() {irsend.sendNEC(0xFF5AA5, 32);delay(200); Serial.print(a);}
void S2() {irsend.sendNEC(0xFF728D, 32);delay(200); Serial.print(a);}
void S3() {irsend.sendNEC(0xFFCA35, 32);delay(200); Serial.print(a);}
void S4() {irsend.sendNEC(0xFF0AF5, 32);delay(200); Serial.print(a);}
void S5() {irsend.sendNEC(0xFF08F7, 32);delay(200); Serial.print(a);}
void S6() {irsend.sendNEC(0xFF12ED, 32);delay(200); Serial.print(a);}
void S7() {irsend.sendNEC(0xFFEA15, 32);delay(200); Serial.print(a);}
void S8() {irsend.sendNEC(0xFF2AD5, 32);delay(200); Serial.print(a);}
void S9() {irsend.sendNEC(0xFF28D7, 32);delay(200); Serial.print(a);}
void S10() {irsend.sendNEC(0xFF18E7, 32);delay(200); Serial.print(a);}

void S11() {irsend.sendNEC(0xFFF20D, 32);delay(200); Serial.print(a);}
void S12() {irsend.sendNEC(0xFF32CD, 32);delay(200); Serial.print(a);}
void S13() {irsend.sendNEC(0xFF30CF, 32);delay(200); Serial.print(a);}
void S14() {irsend.sendNEC(0xFF708F, 32);delay(200); Serial.print(a);}
void S15() {irsend.sendNEC(0xFF1AE5, 32);delay(200); Serial.print(a);}
void S16() {irsend.sendNEC(0xFFF00F, 32);delay(200); Serial.print(a);}
void S17() {irsend.sendNEC(0xFF8877, 32);delay(200); Serial.print(a);}
void S18() {irsend.sendNEC(0xFF9867, 32);delay(200); Serial.print(a);}
void S19() {irsend.sendNEC(0xFF629D, 32);delay(200); Serial.print(a);}
void S20() {irsend.sendNEC(0xFF609F, 32);delay(200); Serial.print(a);}

void S21() {irsend.sendNEC(0xFF728D, 32);delay(200); Serial.print(a);}
void S22() {irsend.sendNEC(0xFF728D, 32);delay(200); Serial.print(a);}
void S23() {irsend.sendNEC(0xFF728D, 32);delay(200); Serial.print(a);}
void S24() {irsend.sendNEC(0xFF728D, 32);delay(200); Serial.print(a);}
void S25() {irsend.sendNEC(0xFF728D, 32);delay(200); Serial.print(a);}
void S26() {irsend.sendNEC(0xFF728D, 32);delay(200); Serial.print(a);}
void S27() {irsend.sendNEC(0xFF728D, 32);delay(200); Serial.print(a);}
void S28() {irsend.sendNEC(0xFF728D, 32);delay(200); Serial.print(a);}
void S29() {irsend.sendNEC(0xFF728D, 32);delay(200); Serial.print(a);}
void S30() {irsend.sendNEC(0xFF728D, 32);delay(200); Serial.print(a);}

void S31() {irsend.sendNEC(0xFF728D, 32);delay(200); Serial.print(a);}
void S32() {irsend.sendNEC(0xFF728D, 32);delay(200); Serial.print(a);}
void S33() {irsend.sendNEC(0xFF728D, 32);delay(200); Serial.print(a);}
void S34() {irsend.sendNEC(0xFF728D, 32);delay(200); Serial.print(a);}
void S35() {irsend.sendNEC(0xFF728D, 32);delay(200); Serial.print(a);}
void S36() {irsend.sendNEC(0xFF728D, 32);delay(200); Serial.print(a);}
void S37() {irsend.sendNEC(0xFF728D, 32);delay(200); Serial.print(a);}
void S38() {irsend.sendNEC(0xFF728D, 32);delay(200); Serial.print(a);}
void S39() {irsend.sendNEC(0xFF728D, 32);delay(200); Serial.print(a);}
void S40() {irsend.sendNEC(0xFF728D, 32);delay(200); Serial.print(a);}

void S41() {irsend.sendNEC(0xFF728D, 32);delay(200); Serial.print(a);}
void S42() {irsend.sendNEC(0xFF728D, 32);delay(200); Serial.print(a);}
void S43() {irsend.sendNEC(0xFF728D, 32);delay(200); Serial.print(a);}
void S44() {irsend.sendNEC(0xFF728D, 32);delay(200); Serial.print(a);}
void S45() {irsend.sendNEC(0xFF728D, 32);delay(200); Serial.print(a);}
void S46() {irsend.sendNEC(0xFF728D, 32);delay(200); Serial.print(a);}

void loop()
{
  if (Serial.available())
  { 
  a = Serial.parseInt(); 
  if (a==1) {S1();}
  if (a==2) {S2();}
  if (a==3) {S3();}
  if (a==4) {S4();}
  if (a==5) {S5();}
  if (a==6) {S6();}
  if (a==7) {S7();}
  if (a==8) {S8();}
  if (a==9) {S9();}
  if (a==10) {S10();}
  
  if (a==11) {S11();}
  if (a==12) {S12();}
  if (a==13) {S13();}
  if (a==14) {S14();}
  if (a==15) {S15();}
  if (a==16) {S16();}
  if (a==17) {S17();}
  if (a==18) {S18();}
  if (a==19) {S19();}
  if (a==20) {S20();}
  
  if (a==21) {S21();}
  if (a==22) {S22();}
  if (a==23) {S23();}
  if (a==24) {S24();}
  if (a==25) {S25();}
  if (a==26) {S26();}
  if (a==27) {S27();}
  if (a==28) {S28();}
  if (a==29) {S29();}
  if (a==30) {S30();}
  
  if (a==31) {S31();}
  if (a==32) {S32();}
  if (a==33) {S33();}
  if (a==34) {S34();}
  if (a==35) {S35();}
  if (a==36) {S36();}
  if (a==37) {S37();}
  if (a==38) {S38();}
  if (a==39) {S39();}
  if (a==40) {S40();}
  
  if (a==41) {S41();}
  if (a==42) {S42();}
  if (a==43) {S43();}
  if (a==44) {S44();}
  if (a==45) {S45();}
  if (a==46) {S46();}
  }
}

 

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Так это ваша проблема, что кода стало больше - у вас бездумное дублирование по сути одинакового функционала, отличающегося только кодом для посылки ;) Сделаете одну функцию, которая в параметре получает код для посылки:

void SendCode(unsigned long code) 
{
	irsend.sendNEC(code, 32);
	delay(200); 
	Serial.print(a);
}

SendCode(0xFF5AA5);

 

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

можно сделать в 10 раз меньше.

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Если не заморачиваться таблицей соответствий, то в лоб можно оптимизировать так:

#include <IRremote.h>
IRsend irsend;

unsigned long FindCode(int commandReceivedThroughSerial)
{
	if(commandReceivedThroughSerial == 2 || (commandReceivedThroughSerial > 20 && commandReceivedThroughSerial < 47) )
		return 0xFF728D;
	
	switch(commandReceivedThroughSerial)
	{
		case 1: 
			return 0xFF5AA5;
			
		case 3:
			return 0xFFCA35;
			
		case 4:
			return 0xFF0AF5;
			
		case 5:
			return 0xFF08F7;
			
		case 6:
			return 0xFF12ED;
			
		case 7:
			return 0xFFEA15;
			
		case 8:
			return 0xFF2AD5;
			
		case 9:
			return 0xFF28D7;
			
		case 10:
			return 0xFF18E7;
			
		case 11:
			return 0xFFF20D;
			
		case 12:
			return 0xFF32CD;
			
		case 13:
			return 0xFF30CF;
			
		case 14:
			return 0xFF708F;
			
		case 15:
			return 0xFF1AE5;
			
		case 16:
			return 0xFFF00F;
			
		case 17:
			return 0xFF8877;
			
		case 18:
			return 0xFF9867;
		
		case 19:
			return 0xFF629D;
			
		case 20:
			return 0xFF609F;
		
	}
	
	return 0xFFFFFFFF;
}

void SendCode(unsigned long code, int commandReceivedThroughSerial)
{
	irsend.sendNEC(code, 32);
	delay(200); 
	Serial.print(commandReceivedThroughSerial);
}

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


void loop()
{
	if (Serial.available())
	{ 
		int a = Serial.parseInt(); 
		unsigned long code = FindCode(a);
		if(code != 0xFFFFFFFF)
			SendCode(code,a);

	}
}

 

Дим
Offline
Зарегистрирован: 05.05.2017

Красиво:) Буду разбираться что к чему.

Дим
Offline
Зарегистрирован: 05.05.2017

А подскажите ещё - какой код нужен для нажатой кнопки пульта. При простом клике -  понятно

FFDA25
Decoded NEC: FFDA25 (32 bits)
Raw (68): -15514 8850 -4350 600 -500 600 -500 600 -500 550 -550 550 -550 600 -500 550 -500 600 -500 600 -1650 550 -1600 600 -1600 600 -1600 600 -1600 600 -1600 600 -1600 550 -1650 550 -1600 600 -1650 550 -500 600 -1600 600 -1600 600 -500 600 -1600 600 -500 600 -450 650 -450 600 -1650 600 -450 600 -500 600 -1650 550 -500 600 -1600 600 

А при длительном нажатии

FFFFFFFF
Decoded NEC: FFFFFFFF (0 bits)
Raw (4): -28364 8750 -2250 550 
FFFFFFFF
Decoded NEC: FFFFFFFF (0 bits)
Raw (4): -28314 8800 -2200 500 
FFFFFFFF
Decoded NEC: FFFFFFFF (0 bits)
Raw (4): -28364 8750 -2200 550 
FFFFFFFF
Decoded NEC: FFFFFFFF (0 bits)
Raw (4): -28314 8800 -2200 500 
FFFFFFFF
Decoded NEC: FFFFFFFF (0 bits)
Raw (4): -28364 8750 -2200 550 
FFFFFFFF
Decoded NEC: FFFFFFFF (0 bits)
Raw (4): -28314 8800 -2200 550 
FFFFFFFF
Decoded NEC: FFFFFFFF (0 bits)
Raw (4): -28264 8800 -2200 550 
FFFFFFFF
Decoded NEC: FFFFFFFF (0 bits)
Raw (4): -28314 8800 -2200 500 
FFFFFFFF
Decoded NEC: FFFFFFFF (0 bits)
Raw (4): -28314 8800 -2200 550 
FFFFFFFF
Decoded NEC: FFFFFFFF (0 bits)
Raw (4): -28314 8800 -2200 550 
FFFFFFFF
Decoded NEC: FFFFFFFF (0 bits)
Raw (4): -28264 8800 -2200 550 

 

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Логика такая: первый раз пришёл код - запомнили пришедший код. Далее, если приходит код FFFFFFFF - считаем, что кнопка с последним актуальным кодом зажата. Если никакого кода не приходит в течение какого-либо времени - считаем, что кнопку отпустили.

Дим
Offline
Зарегистрирован: 05.05.2017

Логика понятна.:)  но вот воплощение не очень :(

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Дим пишет:

Логика понятна.:)  но вот воплощение не очень :(

Учитесь ;) Потихоньку, полегоньку - все с чего-то начинали.

Дим
Offline
Зарегистрирован: 05.05.2017

Мне бы с примерчиком - легче учиться

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Дим пишет:

Мне бы с примерчиком - легче учиться

Примерчик я вам привёл, в виде логики работы алгоритма. Осталось переложить его на любой язык программирования - и у вас будет реализация ;) За вас никто вас не научит, только вы сами.

b707
Offline
Зарегистрирован: 26.05.2017

DIYMan пишет:

Если не заморачиваться таблицей соответствий, то в лоб можно оптимизировать так:

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

#include <IRremote.h>
IRsend irsend;

const unsigned long codes[] = { 0, 0xFF5AA5, 0xFF728D, 0xFFCA35, 0xFF0AF5, 0xFF08F7,
                             	0xFF12ED, 0xFFEA15, 0xFF2AD5, 0xFF28D7, 0xFF18E7,
				0xFFF20D, 0xFF32CD, 0xFF30CF, 0xFF708F, 0xFF1AE5,
				0xFFF00F, 0xFF8877, 0xFF9867, 0xFF629D, 0xFF609F
			};

unsigned long FindCode(int commandReceivedThroughSerial)
{
	if (commandReceivedThroughSerial > 20 && commandReceivedThroughSerial < 47) 
		return 0xFF728D;
	if (commandReceivedThroughSerial > 0 && commandReceivedThroughSerial < 21) 
		return codes[commandReceivedThroughSerial];
	return 0xFFFFFFFF;
}

void SendCode(unsigned long code, int commandReceivedThroughSerial)
{
	irsend.sendNEC(code, 32);
	delay(200); 
	Serial.print(commandReceivedThroughSerial);
}

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


void loop()
{
	if (Serial.available())
	{ 
		int a = Serial.parseInt(); 
		unsigned long code = FindCode(a);
		if(code != 0xFFFFFFFF)
			SendCode(code,a);

	}
}

 

Дим
Offline
Зарегистрирован: 05.05.2017

Спасибо, осталость теперь разобраться с кнопкой длительного нажатия.

Дим
Offline
Зарегистрирован: 05.05.2017

Помогите пожалуста. Так и не получиллось сделать повторение кнопки. Пробовал как написано тут - не получилось http://arduino.ru/forum/programmirovanie/vypolnit-komandy-s-ik-pulta#comment-6275