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)