Comunicación I2C entre un arduino MEGA y tres UNO

Hola a todos, tengo un problema con la comunicacion I2C al momento de enviar datos de dos canales analógicos
procedentes de los ARDUINOS UNO al MEGA el cual se encargara de mandarlos por el puerto serie a la pc.

Consiste en que la funcion Wire.read() solo lee 7 bits, y las lecturas que realizo con los arduinos UNO son de 10 bits (la resolucion del adc) entonces he tenido que emplear la funcion map para convertir esos valores entre 0 y 127, pero el problema es que pierdo resolución en las medidas. Alguien sabra como puede mandar un valor entre 0 y 1023 utilizando la libreria Wire sin tener que utilizar la funcion map para la conversión ?

Gracias, de ante mano.

las lecturas que realizo con los arduinos UNO son de 10 bits (la resolucion del adc) entonces he tenido que emplear la funcion map para convertir esos valores entre 0 y 127

Porque convertir usando map? Esa es una mala idea desde todo punto de vista.

Una cosa es lo que I2C envia con cada byte y otra es que puede enviar muchos bytes y entonces no pierdes resolución, pero no lo sabrías.

El dato de 10 bits de un ADC se descompone en dos bytes, un LSB (byte menos significativo) y un MSB (byte mas significativo).

Asi que olvida el map.. esa solución no va por buen camino.

supongamos que valor sea un unsigned int

 usigned int valor;

 // luego en el loop
 valor = analogRead(A0); // olvida cambiarlo a 5v y todo eso. Solo transmites el valor 

 byte lsb = valor & 0xff;              // esto enmascara el byte menos significativo o LSB
 byte msb=(valor>>8) & 0xff;     // se desplaza 8 bits y luego se hace un AND con la mascara 0xFF y te queda el MSB

casi seguro debes enviarlos en un array.

Y agrego a lo que te dijo @surbyte, que para recibir el dato podés hacer

int valor = (uint16_t) Wire.read() << 8;  // lee y guada el MSB
valor |= Wire.read();  // lee y guarda el LSB

Hola gracias surbyte y gatul, he hecho lo que me aconsejais, pero ahora como hago para enviar por cada Arduino UNO dos valores tomados del adc 0 y 1.

Este es el código del ESCLAVO pero solo envia un valor del canal 0

void requestCallback()
{
  int input = analogRead(0);
  uint8_t buffer[2];
  buffer[0] = input >> 8;
  buffer[1] = input & 0xff; 
  Wire.write(buffer,2);
  
}

y Este del MAESTRO

#include <Wire.h>

const byte DeviceID= 1;

void setup()
{

  Wire.begin(); 
  Serial.begin(9600);
}

void loop()
{
  
  
  Wire.beginTransmission(DeviceID);
  int available = Wire.requestFrom(DeviceID, (uint8_t)2);
  
  if(available == 2)
  {
    int receivedValue = Wire.read() << 8 | Wire.read(); 
    Serial.println(receivedValue);
  }
  
  delay(1000);
}

Te aconsejo mejor esto

void requestCallback() {

  int input = analogRead(A0);
  uint8_t buffer[4];
  buffer[0] = input >> 8;
  buffer[1] = input & 0xff;
  input = analogRead(A1);
  buffer[2] = input >> 8;
  buffer[3] = input & 0xff;

  Wire.write(buffer,4);
 
}

Gracias surbyte por la ayuda ! Ya solucione el problema. :slight_smile:

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.