Ola pessoal, comprei meu kit arduino pra iniciante aqui no ldg, chegou ontem e eu ja estou vidrado nele, pois é uma coisa que eu sempre quis aprender e meu curso nao me deu oportunidade de aprender essa parte de desenvolvimento + eletronica...
a duvida é a seguinte...
estou usando um infravermelho(somente receptor) de 3 perninhas aonde estou usando a porta digital 11 como comunicação... estou usando um controle de tv e estou conseguindo capturar os valores em formato hexadecimal tranquilamente, a pergunta é:
como faço pra armazenar em uma variavel os valores em hexadecimal para fazer uma comparação e ligar um led por exemplo ?
eu ja tentei usar string, int e long, mas como é hexadecimal e eu compilo o projeto, ele implica nas letras capturadas...
se eu armazeno os valores do hexadecilma em alguma variavel, ele soh me retorna valores em numeros...
ontem fiquei martelando nisso por umas 3h e nao sai do canto :(
Att
Wagner
Tags:
bom, explicado como funciona(é bom saber, do que papagaiar sem saber, né?), vamos mastigar:
int hex2dec(byte c) {
if (c >= '0' && c <= '9') {
return c - '0';
} else if (c >= 'A' && c <= 'F') {
return c - 'A' + 10;
}
}
vc pode usar a funçao acima pra fazer a conversao pra vc :D
ex:
int meunumdecimal = hex2dec(variavelcomnumerohex);
so que note que é byte a byte, se vc quiser converter um numero grande, depois tem que fazer a "continha"
Valeu wagner, quando eu chegar em casa eu vou testar... eu tinha visto em alguns foruns que o pessoal usava o 0x para conseguir passar sem dar erro no arduino, eu fiquei sem entender um pouco... mas quando chegar em casa e fizer o teste, eu posto aqui os resultados... se der tudo certo, eu faço um mini tutorial para colocar no wiki do ldg que eu vi que esta faltando ainda muita coisa :D
obrigado pela ajuda... acho que de noite euto postando aqui os resultados...
eu nao manjo muito do sdk do arduino, entoa nao sei se tem alguma funçao nativa que transforme um valor hexa em decimal...
ah, o descarte que falei serve só se vc for tratar na unha, fazendo o calculo como expliquei no começo... usando o tipo "byte" vc pega o valor hexa exatamente como ele vem pra vc ;)
creio que o sensor retorne valores de 0 a 254(ou 255) em formato hexa, né? nesse caso, que vc tem 1 byte por vez, pode usar direto a funçao com a variavel do jeitinho que vc recebe ela ;)
Pronto, acabei de chegar em casa e executei muitos testes, inclusive o transformador de hex que nao deu certo wagner :(
vou disponibilizar o codigo aqui e ai voces me dizem se eu fiz algo de errado, pois como sou novo em C, nao sei se esta faltando alguma coisa... mas o iR esta funcionando normalmente capturando dados tranquilamente e estou usando a biblioteca NECIRrcv e ja usei a IRremote que nenhuma das duas funcionou... ai vai o codigo:
#include <WProgram.h>
#include <NECIRrcv.h>
#define IRPIN 7 // pin that IR detector is connected to
NECIRrcv ir(IRPIN);
int ledPin = 13;
void setup()
{
Serial.begin(9600) ;
ir.begin() ;
pinMode(ledPin,OUTPUT);
}
void loop()
{
unsigned long ircode ;
while (ir.available())
{
ircode = ir.read() ;
Serial.print("0x") ;
Serial.println(ircode,HEX) ; //imprime o valor em hex com o "0x"
Serial.println("--------------------") ;
Serial.println(ircode) ; //imprime o valor que esta sendo impresso pelo iR sem nenhuma formatação.
if (ircode == 3994155780) ledVermelhoPisca; //valor em int do botão 1 do controle
if (ircode == 0xEE11FB04) ledVermelhoPisca; //valor em hex do botão 1 do controle
if (ircode == 3977444100) ledVermelhoAcende; //valor em int do botão 2 do controle
if (ircode == 0xED12FB04) ledVermelhoAcende; //valor em hex do botão 2 do controle
if (ircode == 3960732420) ledVermelhoApaga; //valor em int do botão 3 do controle
if (ircode == 0xEC13FB04) ledVermelhoApaga; //valor em hex do botão 3 do controle
}
}
void ledVermelhoPisca (){
for (int i=0;i<=10;i=i++)
{
digitalWrite(ledPin,HIGH);
delay(60);
digitalWrite(ledPin,LOW);
delay(60);
}
}
void ledVermelhoAcende (){
digitalWrite(ledPin,HIGH);
}
void ledVermelhoApaga (){
digitalWrite(ledPin,LOW);
}
aquela funçao de conversao funciona pra 1 byte so, pelo que to vendo vc recebe 4 bytes de uma vez (EC-13-FB-04)...
Bom, eu nao tenho um receptor de ir aqui pra testar, mas, uma coisa, vc ja abriu o console do sdk do arduino pra ver o que imprime aqui:
Serial.println(ircode,HEX)
?
e se vc fizer
Serial.println(ircode,DEC)
?
testes de tentativa e erro :P, fazer vc ter um valor pra poder comparar direito...
outra coisa IMPORTANTE:
if (ircode == 3960732420) ledVermelhoApaga;
ledVermelhoApaga é uma funçao, pra chamar ela, vc precisa informar que ela é uma funçao, mesmo que vc nao envie parametros, vc tem que por os ():
if (ircode == 3960732420) ledVermelhoApaga();
frescura de programador velho, tb nao gosto da forma de if de 1 linha, economiza, mas atrapalha na hora de introduzir mais açoes ao fluxo, faz assim:
if (ircode == 3960732420){
ledVermelhoApaga();
}
aumenta o numero de linhas de codigo, mas sempre que vc quiser colocar mais coisas dentro do mesmo if, a estrutura ja esta pronta
mais testes de tentativa e erro:
if (ircode == "3960732420"){
ledVermelhoApaga();
}
if (ircode == EC13FB04){
ledVermelhoApaga();
}
if (ircode == "EC13FB04"){
ledVermelhoApaga();
}
enfim, quando a gente nao tem a "literatura" pra ler como se faz, a gente vai tentando na força bruta, eheheh
eh eu ja fiz esses testes pra abrir o monitor do arduino, esses valores eu ja capturei, na questao da função, realmente eu nao tentei colocar as { } e () nofinal do nome...
vou fazer esses testes de noite...
os valores que esta dentro do if, ja eh o valor capturado pelo controle que eu vi no monitor do arduino...
vou tentar mudar de HEX pra DEC pra ver o que aparece...
mas vendo aqui, provavelmente o led nao estava acendendo por eu nao colocar essa forma que vc postou da função... de noite eu vou testar e posto os resultados... se der tudo certo, eu filmo, posto o esquema e libero o codigo pra galera iniciante como eu estudar tmb...
vlw pela ajuda wagner, de noite vou bater esse teste :D
ei, deu certo, era isso mesmo, soh estava faltando chamar a função...
voces querem que eu poste o esquema e codigo ?
é bom, pra deixar documentado pro futuro, eheheheh
depois cria uma entrada de blog com sua criação
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por