Ir ao conteúdo
  • Cadastre-se

Enviar e receber um float por i2c para outro arduino?


Posts recomendados

Segue um código para exemplo. 

 

Mestre:

#include <Wire.h>

float variavel_float = 46689.8750;

byte byte1, byte2, byte3, byte4;
unsigned int aux;

void setup() {
  delay(500);                           // Espera o escravo se estabilizar
  Serial.begin(9600);
  Wire.begin();

  // Para variáveis float positivas
  // Ajustando o número antes da vírgula
  aux = (unsigned int) variavel_float;  // aux = 46689, Pega somente a parte inteira da variável float (0 - 65536)
  byte2 = aux;                          // byte2 = 0B01100001, pega apenas os primeros 8 bits
  byte1 = (aux>>8);                     // byte1 = 0B10110110, pega os 8 ultimos bits
  
  // Ajustando o número depois da vírgula
  variavel_float -= aux;                // Deixa apenas o número depois da vírgula
  variavel_float *= 10000;              // Multiplica por 10k para pegar 4 dígitos após a vírgula
  aux = (unsigned int) variavel_float;  // Pega somente o valor antes da vírgula
  byte4 = aux;                          // byte2 = 0B00101110, pega apenas os primeros 8 bits
  byte3 = (aux>>8);                     // byte1 = 0B00100010, pega os 8 ultimos bits

  Wire.beginTransmission(44);           // Começa transmissão para o escravo 0x2C
  Wire.write(byte1);                    // Envia os bytes do número antes da vírgua e depois da vírgula
  Wire.write(byte2); 
  Wire.write(byte3);
  Wire.write(byte4);  
  Wire.endTransmission();               // Termina a transmissão 
}

void loop() {
  delay(1000);
}

 

Escravo:

#include <Wire.h>

float variavel_float;
byte byte1, byte2, byte3, byte4;
unsigned int aux;
int quantidade_bytes_esperados = 4;

void setup() {
  Serial.begin(9600);
  Wire.begin(44);                                   // Inicia como escravo endereço 44
  Wire.onReceive(receiveEvent);                     // Interrupção ativada quando  mestre está enviado os bytes 
}

void loop() {
  delay(1000);
}

void receiveEvent(int quantidade_bytes_esperados) { // Está código é executado quando "quantidade_bytes_esperados" foi recebido via I2C
    byte1 = Wire.read();                            // Lê os 4 bytes enviados pelo mestre 
    byte2 = Wire.read(); 
    byte3 = Wire.read(); 
    byte4 = Wire.read(); 

    // Ajustando os bytes recebidos para obetr a variavel_float
    aux = (byte3<<8) | byte4;                       // Ajusta a parte fracionáia (depois da vírgula)
    variavel_float = (float) (aux*0.0001);          // Atribui a parte fracionária, depois da vírgula 
    aux = (byte1<<8) | byte2;                       // Ajusta a parte inteira (antes da vírgula)
    variavel_float += aux;                          // Atribui a parte iteira
    Serial.println("Variavel recebida pelo escravo:");
    Serial.println(variavel_float, DEC);  
}

 

MrfQeq5.png

 

  • Amei 1
Link para o comentário
Compartilhar em outros sites

Normalmente i2c opera em 100KHz ou 400KHz.
Você pode sertar a velocidade com a função "Wire.setClock(frequencia em hertz)".
Para 100KHz o tempo para enviar os 4 bytes será em torno de 500uS.
para 400KHz o tempo cai para mais ou menos 150uS.

 

Esse é o tempo para enviar os quatro bytes somente, não contando o tempo para o ajuste da variável float.

Link para o comentário
Compartilhar em outros sites

  • 1 ano depois...
  • Membro VIP

Em c...

você pode enviar/receber o int decomposto em 2 char

envia(unsigned int e)

{

putchar(e&0x00ff); //sua rotina que envia 1 byte ou até 255

e>>=8;

putchar(e&0x00ff);

}

...

unsigned int recebe()

{

unsigned int r;

r=getchar(); //sua rotina que recebe 1 byte

r<<=8;

r|=getchar();//recompõe o int

return r;

}

 

 

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...