Dúvida em conversão de variáveis string x uint8_t Arduino Uno

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





Exibições: 5323

Responder esta

Respostas a este tópico

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

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço