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

Exibições: 612

Responder esta

Respostas a este tópico

bom, um modo de fazer mesmo sem conhecer o sdk do arduino é a forma manual

primeiro, trate seu numero hexadecimal como string (descartando o 0x, claro)
vamos pegar um numero de exemplo (lembrando que A a f é 10 a 15):
3FB
aí, o ultimo(o da casa da "unidade") digito é B... vamos ao truque

pra saber o valor da casa de unidades no sistema hexadecimal a gente muitiplica o numero (B) por 16^0, ou seja, a gente faz 11*(16^0)

o segundo digito, aí vem o pulo do gato
15(nosso F)*(16^1)

e o digito da "centena": 3*(16^2)


se tivessemos um digito "milhar", seria ele*(16^3) e assim por diante...

aí montamos o numero devimal da seguinte forma:

numero decimal = (3*(16^2))+(15*(16^1))+(11*(16^0))
numero decimal = 768 + 240 + 11
numero decimal = 1019

 

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  ;)

eu estava me lembrando de uma coisa que eu vi no forum que o cara estava manipulando esses dados e ele nao precisou tranformar nada nao... eu vou ter sakar direitinho. o problema eh que eu nao estou com os codigos aqui, se nao eu postava pra galera me ajudar...

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

como assim uma entrada de blog ? criar um blog com tudo que eu estou aprendendo ? :P

ahhhhhhhhhhh legal huahuahuahuahuahuhuahua nao sabia disso :P

de noite eu posto se eu nao tiver muito cansado ahuuhauhahuahu :D

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço