Codigo de funcionamiento del sensor BMP180-bus software I2C

Hola a todos, por favor necesito algo de ayuda con una situación a la que he llegado. Verán soy nuevo en arduino, no entiendo muy bien la programación pero necesito hacer funcionar un proyecto donde conecto 4 sensores de presión BMP180 por el bus I2C a una misma placa, un arduino uno compatible, ya revise documentación y de las formas que existen para conectarlos solo me esta disponible la opción de crear buses IC2 de software para poder acoplar los 4 sensores a un mismo procesador, dado que no hay multiplexer compatibles disponibles, en base a eso he revisado y he modificado la biblioteca estandart SODAQ_BMP085 segun la manera que recomiendan para usarse con la librería de I2C:

Segun los ejemplos de las OLED displays y la referencia de esta web:

todo me encaja, pero hay una sentencia wire.begin al inicio del código *.ccp del sensor que no puedo pasar a wire->begin, asumo que es por el modo de funcionamiento del codigo, segun ref. ese comando es el que se encarga de iniciar el bus I2C en modo maestro para el sensor, pero les pido que me ayuden a revisar esto, como les digo es la alternativa que me queda para esto. ayúdenme por favor, estoy subiendo las librerías que he modificado con las partes modificadas resaltadas para una rapida identificación.

  Written by Limor Fried/Ladyada for Adafruit Industries.  
  BSD license, all text above must be included in any redistribution
 ****************************************************/

#include <math.h>

//
#include "SoftwareI2C.h"
//
#include "Sodaq_BMP085.h"

#define BMP085_DEBUG 0
#define BMP085_ENABLE_DIAG 0

#define BMP085_I2CADDR 0x77

#define BMP085_CAL_AC1           0xAA  // R   Calibration data (16 bits)
#define BMP085_CAL_AC2           0xAC  // R   Calibration data (16 bits)
#define BMP085_CAL_AC3           0xAE  // R   Calibration data (16 bits)
#define BMP085_CAL_AC4           0xB0  // R   Calibration data (16 bits)
#define BMP085_CAL_AC5           0xB2  // R   Calibration data (16 bits)
#define BMP085_CAL_AC6           0xB4  // R   Calibration data (16 bits)
#define BMP085_CAL_B1            0xB6  // R   Calibration data (16 bits)
#define BMP085_CAL_B2            0xB8  // R   Calibration data (16 bits)
#define BMP085_CAL_MB            0xBA  // R   Calibration data (16 bits)
#define BMP085_CAL_MC            0xBC  // R   Calibration data (16 bits)
#define BMP085_CAL_MD            0xBE  // R   Calibration data (16 bits)

#define BMP085_CONTROL           0xF4
#define BMP085_TEMPDATA          0xF6
#define BMP085_PRESSUREDATA      0xF6
#define BMP085_READTEMPCMD       0x2E
#define BMP085_READPRESSURECMD   0x34

Sodaq_BMP085::Sodaq_BMP085()
{
  oversampling = BMP085_ULTRAHIGHRES;
}

void Sodaq_BMP085::begin(uint8_t mode)
{
  if (mode > BMP085_ULTRAHIGHRES)
    mode = BMP085_ULTRAHIGHRES;
  oversampling = mode;
  
  //SoftwareI2C.begin ();
    Wire->begin();// ERROR -------- AYUDAAA

  if (read8(0xD0) != 0x55)
    return;

  


/*********************************************************************/

/*
 * Read a 1 byte register
 */
uint8_t Sodaq_BMP085::read8(uint8_t a)
{
  uint8_t ret;

  Wire->beginTransmission(BMP085_I2CADDR);       // start transmission to device
  Wire->write(a);                                // sends register address to read from
  Wire->endTransmission();                       // end transmission

  Wire->beginTransmission(BMP085_I2CADDR);       // start transmission to device
  Wire->requestFrom(BMP085_I2CADDR, 1);          // send data n-bytes read
  ret = Wire->read();
  Wire->endTransmission();                       // end transmission

  return ret;
}

/*
 * Read a 2 byte register
 */
uint16_t Sodaq_BMP085::read16(uint8_t a)
{
  uint16_t ret;

  Wire->beginTransmission(BMP085_I2CADDR);
  Wire->write(a);
  Wire->endTransmission();

  Wire->beginTransmission(BMP085_I2CADDR);
  Wire->requestFrom(BMP085_I2CADDR, 2);
  ret = Wire->read();
  ret <<= 8;
  ret |= Wire->read();
  Wire->endTransmission();

  return ret;
}

/*
 * Write a 1 byte register
 */
void Sodaq_BMP085::write8(uint8_t a, uint8_t d)
{
  Wire->beginTransmission(BMP085_I2CADDR);
  Wire->write(a);
  Wire->write(d);
  Wire->endTransmission();
}
//update to I2C bus software

void Sodaq_BMP085::initSoftwareI2C(SoftwareI2C *w, int __sda, int __scl)
{
    Wire = w;
    Wire->begin(__sda, __scl);
}
//




//

Sodaq_BMP085.cpp (9.22 KB)

Sodaq_BMP085.h (2.15 KB)

Sodaq_BMP085_i2c_soft.ino (3.21 KB)

SoftwareI2C.cpp (8.7 KB)

SoftwareI2C.h (2.26 KB)

Veo que el problema esta en como manejar 4 BMP085 sin poder cambiarle el address.

Hay una opción para actuar con 2 pero no sirve para 4.

Podrias tambien usar un CD4052 y conectar los 4, direccionarlos con 2 pines y actuar con la librería como si fuera uno, sin alterar nada. Esa sería tal vez mi opcion.

Saludos, le agradezco consideración propuesta, pero mi calvario esta en que no tengo acceso a chips multiplexers en mi mercado local por ahora, por eso le he estado dando vueltas al problemas y llegue a la solucion de la creacion de buses virtuales I2C, de hecho el enlace que puse es justo la manipulacion de una libreria OLED para la creacion de un segundo bus I2C para el uso en paralele de 2 pantallas conectadas a la misma placa, vi el procedimiento y todo parece encajar con las librerias que modifique, pero el problema vino al inicio del archivo *.ccp del sensor BMP085, con una llamada:

Wire.begin() // la cual no puedo modificar como espeficifica el ejemplo de creacion del bus virtual, espero que alguien pueda ayudarme a sortear este problema, pero gracias por su granito de arena y la instruccion de edicion del post.

Atentamente

Víctor Casquero.

Resulta al menos extraño que tengas acceso a arduino y sensores de presión y no puedas hallar un simple CD4052.

Daniel_Arg:
Resulta al menos extraño que tengas acceso a arduino y sensores de presión y no puedas hallar un simple CD4052.

Hola, hummm supongo que si, el tema es que aquí no venden repuestos electronicos, de hecho todo lo que se comercializa es el producto final, si se malogra algo simplemente lo reemplazas con otro. Con arduino igual, te venden la tarjeta y algunos modulos externos, o escudos. Pero gracias por tu atención.