Boa tarde pessoal, estou quebrando a cabeça aqui pra tentar resolver um problema de um código do arduino, queria saber se alguém pode me dar uma luz sobre.. a duvida é a seguinte.

Quero que no display mostre além de outros dados, uma seta indicando o ângulo que o gps esta se deslocando, já tenho um bitmap criado da seta, gostaria que ele girasse proporcional a informação do gps de ângulo.

Fico no aguardo de eventuais soluções.

Exibições: 287

Responder esta

Respostas a este tópico

olá James Taynnã Schmitt

Já tentou criar condições (if, else if) para cada uma das direções?

Atualmente estava fazendo dessa forma, mas queria tentar simplificar o código criando só uma imagem que girasse conforme o ângulo, entende.. nao queria ter que ficar criando if pra todas as direçoes, eu já sou confuso e meu codigo já esta grande o suficiente pra eu me perder. HAHAHAHA

Olá,

O mais comum, que eu saiba, é vc ter um banco de imagens, cada uma para uma direção, como o conceito de Sprite em um jogo 2D.

Aih, como o colega tiago merces disse, fazer um if, case ou conta para escolher qual usar.

Eu usaria conta.

Por ex, criando 36 imagens vc usaria a imagem numero angulo/10.

Como a resolução é pequena 36 é até muito. 18 com angulo/20 já acho que bastariam.

Ref:

https://www.google.com/search?q=sprite+2d&tbm=isch

Eu até acho que deva existir uma forma mais fácil de fazer isso, mas estou desenvolvendo esse código a algum tempo, sou um entusiasta no Arduino, não um estudante dedicado.. HEHEHEHEHE.

Eu entendi oque você está dizendo Eduardo, mas não consigo traduzir isso em um código que funciona corretamente.

James, Veja que as sugestões são baseadas apenas no número de informações que você forneceu.

Se precisa de algo mais específico, seria mais fácil se você apresentasse uma imagem do seu circuito, com as ligações (feita no paint mesmo, nada complexo, apenas para ficar fácil o entendimento), seguido com seu código e seu objetivo com o código.

Atualmente tenho ele Assim

fc = gps.f_course(); //direção em graus


if (fc>=22 && fc<=67){
Serial.println("Nordeste"); // Angulo para nordeste
display.drawBitmap(84, 30, nordeste, 12, 23); //desenha na coluna 84 e linha 30, Nordeste, de tamanho 12x23
}
if (fc>=68 && fc<=112){
Serial.println("Leste"); // Angulo para leste
display.drawBitmap(84, 30, leste, 12, 23); //desenha na coluna 84 e linha 30, Leste, de tamanho 12x23
}
if (fc>=113 && fc<=158){
Serial.println("Sudoeste"); // Angulo para sudoeste
display.drawBitmap(84, 30, sudoeste, 12, 23); //desenha na coluna 84 e linha 30, Sudoeste, de tamanho 12x23
}
if (fc>=159 && fc<=202){
Serial.println("Sudoeste"); // Angulo para sudoeste
display.drawBitmap(84, 30, sudoeste, 12, 23); //desenha na coluna 84 e linha 30, Sudoeste, de tamanho 12x23
}

Olá James!

   Usando a sugestão do banco de imagens do Eduardo, uma outra ideia, supondo que você tenha um ângulo que varie de 0º a 360º e 20 imagens da seta rotacionadas de 18º cada uma para a anterior, seria usar a função map para obter o número do bitmap que será mostrado:

      bitMapNumber = map( angulo, 0, 360, 0, 20) ;


   Você poderia, então, colocar os bitmaps em um array bidimensional:

      uint8_t Setas[20][] = {
                                         { 0x00, 0x15, 0x1E, 0xf4, ... }, // Bit map para angulo de 351º a +9º
                                         { 0x02, 0x63, 0xdc, 0x22, ... }, // Bit map para angulo de +9º a +18º
                                         { ...                                    }, // ...
                                         { 0xd3, 0xff, 0xc4, 0x4e, ... },   // Bit map para angulo de +333º a +351º
                                     } ;

O endereço inicial do bitmap seria

                                         Setas[20][bitMapNumber]

Sucesso.

D. T. Ribeiro.

P.S. 1: Os valores no array são exemplos aleatórios. Substitua pelos valores dos bitmaps

P.S. 2: Espero que o RV não me xingue por colocar código no corpo do post  :-)

Obrigado pela ajuda D.T Ribeiro, vou tentar fazer desse jeito, em breve posto aqui se deu certo..

Olá, James!

   Desculpe-me, mas há um erro na minha última postagem.

   Onde se lê

O endereço inicial do bitmap seria

                                         Setas[20][bitMapNumber]

   O correto é:

 O endereço inicial do bitmap seria

                                         Setas[bitMapNumber][0]

   Como disse um grande pensador:

   "Copiar, colar e esquecer de editar é o maior gerador de bugs de software conhecido" - Ribeiro, D. T.

   :-)

Sucesso.

D. T. Ribeiro.

Ainda quebrando a cabeça aqui, os bitmap que criei deram erro, não consegui identificar onde foi. Ai pesquisando melhor percebi que existe uma fonte dentro da biblioteca u8g2 na qual tem o caractere que preciso, porem não consigo fazer o lcd mostrar o dito cujo. O caractere em si tem um código que acredito ser HEX, como na figura abaixo.

fntpic/u8g2_font_unifont_t_86.png

tentei com os comandos u8g2.print(11008); sem resultado tentei também u8g2.print(11008,HEX); e nada, e nem com u8g2.drawStr(0,10,11008, BIN); pois achei que poderia estar em bin também 

alguém sabe a forma correta de mostrar o caractere no display?

Olá James!

   Se você pode usar um caracter ao invés de um bitmap, então a abordagem deve ser diferente.

   A biblioteca que você usa com este display gráfico deve ter alguns arquivos com os "desenhos dos caracteres", arquivos estes que chamamos de fontes.

   Claro que é bem possível que a biblioteca seja muito simples e use apenas as fontes pré definidas do próprio LCD e aí o problema é mais complicado.

   Procure por estes arquivos de fontes, são arquivos que geralmente tem uma grande quantidade de bytes em hexadecimal.

   Você vai ver que, a cada "desenho" de caracter corresponde uma espécie de índice, que chamamos código do caracter.

   Via de regra estas bibliotecas usam o código ASCII em seus arquivos de fontes. Assim, por exemplo, o índice ( ou código ) associado ao caracter 'A' ( letra A maiúscula ) é o 0x41, que é o código ASCII para a letra A maiúscula.

   Então, para mostrar um A maúsculo no display, você tanto pode usar LCD.print( 'A' ); quanto LCD.print( 0x41 ); ou ainda LCD.print( '\x41' ); 

   Então, se na biblioteca que você está usando existir uma fonte em que conste os caracteres que você precisa, é só "carregar" esta fonte ( eu não sei como se faz isto porque você não informou qual a biblioteca que está usando ) e depois fazer um LCD.print() com o código ( ou índice ) do caracter.

   Aliás, aproveito para reforçar o conselho do Tiago Merces, no primeiro post dele nesta thread que, fosse seguido, provavelmente já haveria uma solução.

Sucesso.

D. T. Ribeiro.

   

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço