,

Converter de float para byte/bit Arduino

Posted by

Vamos aprender hoje a converter de float para byte/bit no Arduino, sair de um número em ponto flutuantes ou inteiro para um byte ou bit. Recentemente eu fiz um projeto onde precisei fazer exatamente isso, tinha um valor em float e precisava converter para binário para mostrar em LEDs.

Utilizaremos a IDE do Arduino e nenhuma biblioteca especial é necessária, apenas tudo que já vem com ela.

Mas antes vamos entender um pouco sobre os sistemas de numeração no Arduino, mais precisamente o tipo float. A documentação oficial fala que os floats são compostos de 32bit (4 bytes) e podem variar numéricamente entre 3.4028235E+38 e -3.4028235E+38. No caso específico do exemplo do link acima, eu estava utilizando um sensor DHT11 cuja temperatura “t” é mostrada em float.

Existem outros tipos de dados no Arduino, que você pode pesquisar por sí mesmo. Vamos à técnica que utilizei:

O problema e a solução

No projeto em questão eu precisava ler uma temperatura do sensor DHT11 e converte-la para um formato que pudesse ligar LEDs de forma binária, por exemplo: o número 26 seria igual à 011010 (6 bits). Isso sendo em 6 bit e apenas o número 26 inteiro, sem ser flutuante. Este era o objetivo do meu código: ligar LEDs conforme a temperatura apresentada pelo sensor.

A solução está na função abaixo, completa. Vou explicar passo-a-passo logo mais.

for (int i = 0; i < 6; i++) {


      bitsresultados[i] = bitRead(int(round(t)), i); //This is where the magic happens, I get the "t" value (temperature),
      // round it, convert it to integer and extract every bit of its binary equivalent. The bits are then used to enter
      // each charlieplexed LED bit value
      
    }

O laço for faz seis iterações, de 0 a 5; em cada iteração um bit da função bitRead() é lido. A variável bitsresultados[] é um array cujo tamanho é o mesmo do laço for, seis bits. É onde serão guardados os bits que a função vai extrair.

A “mágica” acontece na linha abaixo, onde eu primeiro arredondo a variável “t” (removo casas decimais), depois converto-a para inteiro (int) e depois aplico a função bitRead para extrair cada bit individualmente.

bitsresultados[i] = bitRead(int(round(t)), i);

A função do laço for é fazer a linha acima acontecer seis vezes para extrair cada bit individual.

O resultado

Para o caso de a variável “t” carregar uma temperatura de 26.3ºC por exemplo, teremos primeiro uma conversão para 26,0 e depois para 26 inteiros. Ai a função bitRead vai extrair cada bit, que no caso fica assim:

  • bitsresultados[0]= 0
  • bitsresultados[1]= 1
  • bitsresultados[2]= 0
  • bitsresultados[3]= 1
  • bitsresultados[4]= 1
  • bitsresultados[5]= 0

Tendo cada bit dentro de bitsresultados[] eu pude escrever funções que convertiam estes valores para ativação ou não de saídas digitais. Caso você queira se aprofundar na função bitRead, aqui está a documentação oficial.

Esta foi mais uma dica rápida e útil sobre a utilização do Arduino, acompanhe o blog para ficar por dentro de mais novidades.

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *