como leer 2 sensores de luz GY-30 (BH1750) a la vez I2C

ALguien podría ayudarme a comunicar 2 sensores de luz.

ya he trabajado antes con uno solo, y no he tenido problemas.

el Sensor BH1750 se comunica al arduino por I2C y admite 2 direcciones distintas: 0x5C y 0x23 para cambiar la direccion de unou otro basta con conectar del Pin ADD a negativo(0x23) o positivo(0x5C), esto me funciona bien, tengo los 2 sensores conectados uno a cada direccion correspondiente, le cargo el programa y me funciona bien (ya probé con las 2 direcciones).

Por lo tanto estoy seguro que mi problema no es de conexion, y evidentemente el problema esta en el programa.

ESTE ES EL PROGRAMA ORIGINAL:

#include <Wire.h>

int BH1750_address = 0x5c; // i2c Addresse
byte buff[2];

void setup(){

Wire.begin();
BH1750_Init(BH1750_address);

delay(200);
Serial.begin(9600);
Serial.println("Starte Beleuchtungsstaerkemessung - blog.simtronyx.de");
}

void loop(){

float valf=0;

if(BH1750_Read(BH1750_address)==2){

  valf=((buff[0]<<8)|buff[1])/1.2;

  if(valf<0)Serial.print("> 65535");
  else Serial.print((int)valf,DEC); 

  Serial.println(" lx"); 
}
delay(1000);
}

void BH1750_Init(int address){

Wire.beginTransmission(address);
Wire.write(0x10); // 1 [lux] aufloesung
Wire.endTransmission();
}

byte BH1750_Read(int address){

byte i=0;
Wire.beginTransmission(address);
Wire.requestFrom(address, 2);
while(Wire.available()){
  buff[i] = Wire.read(); 
  i++;
}
Wire.endTransmission();  
return i;
}

entiendo pero en la parte del final me pierdo un poco (desde el ultimo void)

intenté modificar el programa original, duplicando las variables poniendole la letra A a uno y la letra B al otro, pero no pude compilar el programa sin error.

creo que mi problema va por aquí:

void BH1750_Init(int address)

no se como duplicar ese void, no tengo muy claro a q se refiere (ojala alguien me pueda explicar)

No soy muy experto en el tema, si alguien tiene mayor experiencia q pueda echarme una mano se lo agradezco de antemano

Saludos

ESTE ES EL PROGRAMA QUE MODIFIQUE (ME MARCA ERROR):

#include <Wire.h>

int BH1750_address_A = 0x23; // i2c Addresse
int BH1750_address_B = 0x5c; // i2c Addresse
byte buff_A[2];
byte buff_B[2];

void setup(){

Wire.begin();
BH1750_Init(BH1750_address_A);
delay(100);
BH1750_Init(BH1750_address_B);
delay(100);

Serial.begin(9600);
Serial.println("Starte Beleuchtungsstaerkemessung - blog.simtronyx.de");
}

void loop(){

float valf_A=0;
float valf_B=0;

if(BH1750_Read(BH1750_address_A)==2){

  valf_A=((buff_A[0]<<8)|buff_A[1])/1.2;

  if(valf_A<0)Serial.print("> 65535");
  else Serial.print((int)valf_A,DEC); 
  Serial.println(" lx"); 
}
delay(500);


if(BH1750_Read(BH1750_address_B)==2){

  valf_A=((buff_A[0]<<8)|buff_A[1])/1.2;

  if(valf_A<0)Serial.print("> 65535");
  else Serial.print((int)valf_A,DEC); 
  Serial.println(" lx"); 
}
delay(500);

}

void BH1750_Init(int address_A){

Wire.beginTransmission(address_A);
Wire.write(0x10); // 1 [lux] aufloesung
Wire.endTransmission();
}

void BH1750_Init(int address_B){

Wire.beginTransmission(address_B);
Wire.write(0x10); // 1 [lux] aufloesung
Wire.endTransmission();
}


byte BH1750_Read(int address_A){

byte i=0;
Wire.beginTransmission(address_A);
Wire.requestFrom(address_A, 2);
while(Wire.available()){
  buff_A[i] = Wire.read(); 
  i++;
}

byte BH1750_Read(int address_B){

byte i=0;
Wire.beginTransmission(address_B);
Wire.requestFrom(address_B, 2);
while(Wire.available()){
  buff_B[i] = Wire.read(); 
  i++;
}


Wire.endTransmission();  
return i;
}

ME MARCA ESTE ERROR:

ERROR: exit status 1
redefinition of 'void BH1750_Init(int)'

Lee las Normas del foro
Luego ve a More (abajo a la derecha), click, luego Modify y estas en modo EDICION.
Si tienes que editar un código -> Selecciona todo el código y click en </> arriba del emoticon.
**Si tienes que editar un enlace -> Selecciona el enlace. Copialo al portapapeles. Click en el eslabón (ver abajo) y sigue los pasos que habras visto al leer las normas. **

Dos cosas

  1. Prueba el I2CScanner para garantizar que las direcciones esten bien. Segun he leido el pin debe dejarse desconectado para una dirección y a GND para 0x23. Internamente tiene un resistor Pull up.

  2. Parece ser que la librería que usas no es la apropiada, en este hilo (I2C bus on multiple BH1750 sensor) sugieren estas librerías

las estuve observando y no veo que usen ambos a la vez.

gracias por la info :smiley:

no tengo problema con la librería. como expliqué anteriormente yo estoy leyendo datos de los 2 sensores de luz sin problema, yo tengo los 2 sensores conectados a mi sistema, pero solo puedo leer uno a la vez, de manera que cuando cargo el sketch original (el primero que subí) le asigno la direccion 0x23 me lee el sensor1 perfecto, y cuando quiero leer el sensor 2 le cargo nuevamente el sketch y le asigno la direccion 0x25 al sensor y me lee sin problemas. pero lo que yo deseo hacer es que me lean los 2 al mismo tiempo.

El sensor viene con la opcion de definir su direccion I2C ya sea a 0x5c (conectando el terminal ADD a positivo) o 0x23 (conectando el terminal ADD a negativo o si no está conectado el termianl ADD define esta direccion por defecto)

me imagino que si el sensor da la opcion de utilizar 2 direcciones distintas (0x23 y 0x5c), debería ser posible utilizar 2 sensores con distinta direccion al mismo tiempo.

En caso que no pueda utilizar las 2 direcciones en el mismo programa tengo pensado probar lo siguiente:

Conectar los pines ADD de cada sensor a una salida digital del arduino, y correr el programa original definiendo la direccion 0x5c para el sensor. Entonces cada vez que quiera leer el sensor 1 conecto el ADD a positivo para que quede con la direccion 0x5c (mientras que el ADD del sensor 2 lo dejo en negativo), de la misma manera si quiero leer el sensor 2 conecto el ADD a positivo (con ADD del sensor 1 a negativo), no se si el arduino me permite ese cambio constante de dirección.

pero de todos modos me interesa utilizar los 2 sensores al mismo tiempo dejando cada sensor con una dirección fija. creo que tiene que ser posible.

gracias de antemano :wink:

Lo que lei es que el pin ADD debe dejarse sin conexión cuando se busca la direccion 0x53 y a GND cuando quieres la dirección 0x23.

Lee este tutorial a ver si ayuda. en especial a como conecta los pines i2c al Arduino.

Entiendo que dices que funciona bien en una u otra dirección de manera individual.

ya solucioné el problema este es el codigo final:

#include <Wire.h>

int BH1750_address = 0x5c; // i2c Addresse
byte buff[2];

const int ADDR1 = 11;      // GY-30 BH1750FVI(1)
const int ADDR2 = 12;      // GY-30 BH1750FVI(2)


void setup(){

 pinMode(ADDR1, OUTPUT);
 pinMode(ADDR2, OUTPUT);
 
  Wire.begin();
  BH1750_Init(BH1750_address);

  delay(200);
  Serial.begin(9600);
  Serial.println("Prueba 2 sensores de luz GY-30 BH1750FVI");
  }

void loop(){

 digitalWrite(ADDR1, HIGH); // ASIGNAR DIRECCION 0X5C A GY-30(1)
 digitalWrite(ADDR2, LOW); // ASIGNAR DIRECCION 0X23 A GY-30(2)
 
  float valf=0;

  if(BH1750_Read(BH1750_address)==2){

    valf=((buff[0]<<8)|buff[1])/1.2;

    if(valf<0)Serial.print("> 65535");
    else Serial.print((int)valf,DEC); 

    Serial.print(" lx(1)     ----   "); 
  }




 digitalWrite(ADDR2, HIGH); // ASIGNAR DIRECCION 0X5C A GY-30(2)
 digitalWrite(ADDR1, LOW); // ASIGNAR DIRECCION 0X23 A GY-30(1)
 
valf=0;

  if(BH1750_Read(BH1750_address)==2){

    valf=((buff[0]<<8)|buff[1])/1.2;

    if(valf<0)Serial.print("> 65535");
    else Serial.print((int)valf,DEC); 

    Serial.println(" lx(2)"); 
  }
  delay(1000);



   
}

void BH1750_Init(int address){

  Wire.beginTransmission(address);
  Wire.write(0x10); // 1 [lux] aufloesung
  Wire.endTransmission();
}

byte BH1750_Read(int address){

  byte i=0;
  Wire.beginTransmission(address);
  Wire.requestFrom(address, 2);
  while(Wire.available()){
    buff[i] = Wire.read(); 
    i++;
  }
  Wire.endTransmission();  
  return i;
}
1 Like

Olá mandoone, tem como você enviar o esquema de montagem?

Muito Obrigado!