Olá pessoal tenho feito umas experiências em conversão de variáveis do tipo float para string e de string para uint8_t, e tenho obtido erros, se alguem pudesce me dar uma ajuda agradeceria.
Vou postar o exemplo de código:
Eu recebo a variável teste float com numeros decimais com várias casas e ajusto para um numero de 8 casas:
//ajusta a variável recebida float teste para 8 caras decimais
String dados = String(teste,8); //exemplo de conteúdo -21,00000004 (Equivalente a um dado de GPS)
Preciso converter para uma variável do tipo: uint8_t
Minha dúvida é usar a string é a melhor opção sendo que preciso manter as 8 casas e um gps normalmente informa mais de 8 casas decimais? E como converter para uint8_t e manter o formato
Fiz alguns testes mas recebo a variável com valor errado, vi em um fórum em inglês para usar esse formato, mas quando executo recebo o valor da variável = 0
uint8_t lat = atoi (teste.substring(8).c_str ());
Tags:
Bom dia EMF,
vamos primeiro entendes os formatos numéricos aceitos pelo compilador do C do arduino.
numero Tamanho Formato
booleana 1 bit 0 ou 1, HIGH ou LOW true ou false (Usa o espaço de 1 byte )
char 8 bits 0 a 255 (0 até FF) (Sem sinal)
int8_t 8 bits 0 a 255 (0 até FF) (Sem sinal)
uint8_t 8 bits 0 a 255 (0 até FF) (Sem sinal)
byte 8 bits 0 a 255 (0 até FF) (Sem sinal)
int16_t 16 bits -32.768 a 32.767 (0 até FFFF) (Sinalizado)
uint16_t 16 bits 0 a 65535 (0 até FFFF) (Sem sinal)
int 16 bits -32.768 a 32.767 (0 até FFFF) (Sinalizado)
unsigned int 16 bits 0 a 65535 (0 até FFFF) (Sem sinal)
int32_t 32 bits -2.147.483.648 to 2.147.483.647 (0 até FFFFFFFF) (Sinalizadol)
uint32_t 32 bits 0 a 4.294.967.295 (0 até FFFFFFFF) (Sem sinal)
long 32 bits -2.147.483.648 to 2.147.483.647 (0 até FFFFFFFF) (Sinalizadol)
unsigned long 32 bits 0 a 4.294.967.295 (0 até FFFFFFFF) (Sem sinal)
flloat 32 bits -3.4028235E+38 a 3.4028235E+38 (6 casas decimais)
Apesar de aceitar a sintaxe int8_t , o compilador do arduino não considera como sinalizado
por ser de 8 bits.
Agora com base nestas informações vamos estudar os casos de transformações.
vamos estudar o seu caso especifico:
Você recebe o valor -21,00000004 em uma variável tipo float. minhaFloat = - 21,00000004;
Se este valor fosse positivo seria muito fácil e seria assim: uint8_t minhaVar = ( uint8_t ) (minhaFloat);
e você teria o valor 21 uint8_t na sua variável.
Mas, seu numero pode ser negativo, dai complica um pouco.
O formato de 8 bits no Arduíno não aceita sinalização. portanto não é possível uma
transformação de um numero negativo flat em um numero negativo int8_t ou uint8_t.
Ao transformar -25 em uint8_t, recebera o valor 235 (0xEB).
Se fizer como int aí terá sucesso.
float minhaFloat = -21.00000004; Serial.println(minhaFloat, 8); resultado -21.00000000
int minhaInt = (int)minhaFloat; Serial.println(minhaInt); resultado -21
RV
Excelentes informações, mas é um problema, pois se eu arredondar troco a localização, pois os números das casas decimais são importantes para uma localização de GPS por exemplo. vou fazer uns testes com int32_t, me conseguiria um exemplo com ele?
Não entendi bem sua resposta.
O arduino só trabalha com numero float com 6 casas depois da virgula. (6 casas decimais)
E o que você quer fazer?
De outro exemplo de numero recebido e como deve ficar depois da transforação.
RV
eu uso a biblioteca tinyGPS, ela me fornece um numero flutuante de mais de 8 casas eu tive que converter para 8 casas justamente por que vinha casas demais o exemplo seria assim:
-------------------------------------------------------
while(modulogps .available()) //Enquanto a gps estiver disponível
{
int c = modulogps .read(); //Le os dados do gps
if(gps.encode(c)) //Faz a tradução dos valores lidos
{
float latitude, longitude;
gps.f_get_position(&latitude, &longitude); //Obtem a latitude e longitude
Serial.print("Lat/Long: "); //Imprime
Serial.print(latitude,8);
Serial.print(", ");
Serial.println(longitude,8);
Serial.print("Velocidade(kmph): ");
==============================
Se eu não colocar aquele 8 ali vem mais do que 8 casas na resposta.
Como eu queria enviar tudo numa string só eu pensei em fazer assim:
String latelong = String(latitude,8)+ String(longitude,8);
Mas o problema que preciso enviar em outro formato por isso eu queria converter esse valor para uint8_t, mas se não é possível ia tentar com o int32_t ou uma matriz, mas ainda estou leigo nessa parte.
Entendeu?
Acho que faltou só declarar o tamanho na declaração das variáveis:
" float latitude(6), longitude(6);
unsigned long age;
gps.f_get_position(&latitude, &longitude, &age);"
...
depois converter:
"MinhaString = String(latitude,6);
MinhaString += ", ";
MinhaString += String(longitude,6);
Serial.println(MinhaString);"
Bom dia.
entendo sua boa vontade de ajudar, mas
você percebeu que este tópico é de outubro de 2018, ou seja já tem 4 anos?
RV mineirin
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por