Ir ao conteúdo

Posts recomendados

Postado

Olá, gostaria de enviar e receber um float para outro arduino usando i2c, já li algumas coisas mas não encontrei um código que me ajudasse. 

Enviar do Arduino1 e receber no arduino 2.

Postado

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
Postado

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.

Postado

Na verdade você pode até excluir eles... Os coloquei para o proteus não ficar louco (estava com preguiça de montar o circuito na prática :)).


Só tenha certeza de que quando o mestre for enviar os dados o escravo já está operando (já inicializou o "TWI Wire.begin(44);")

Postado

você escreveu o code de uma foma que eu entendi tudo.. Ficou muito fácil. Obrigado.
Tentei simular no proteus também, mas o serial não imprimi nada.. Devo estar errando em algo.

Obrigado, você me ajudou muito!

  • 1 ano depois...
  • Membro VIP
Postado

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;

}

 

 

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...