Configuración BH1750

Hola!

He conectado un chip BH1750 a un PIC16f886 a través del bus I2C y mi objetivo es mostrar el valor de iluminación dado en un LCD de 2x16 caracteres. Hace poco que comencé a programar en CCS y nunca he realizado ningún proyecto en el que use el bus para enviar o recibir datos.

Llevo ya bastantes días peleándome con el código pero tengo el problema de que no encuentro ejemplos en la web (todos son para Arduino) y tampoco puedo simularlo en Proteus porque no existe el componente BH1750.:confused:

¿Alguien puede echarme una mano? alguna librería o pauta para conseguir configurar el BH1750 y guardar el valor en un registro del PIC.

Gracias!:)

Copio la última versión de código que he realizado a ver si alguien me puede decir que estoy haciendo mal...:oops:

Código:
//******************LUXOMETRO*****************************
//
#Include <16f886.h>


#fuses INTRC_IO,NOWDT,PUT,MCLR,BROWNOUT,NOLVP,NOCPD,NOPROTECT
#use delay (Internal=4000000)
#use fast_io(A)
#use standard_io(B)
#use fast_io(C)
#use I2C(MASTER, sda=PIN_C4, scl=PIN_C3, fast=450000)

#define PWR_DOWN             0x00 
#define PWR_ON                  0x01 
#define RESET                     0X07 
#define MODE_HIGH_RES1    0X10 
#define MODE_HIGH_RES2    0X11 
#define MODE_LOW_RES       0x13
#define ADDRESS_L             0X23
                                
#Include <lcd_portb.c>

//**********************VARIABLES GLOBALES****************************

unsigned long LUX;
char HB,LB; 

//*******************FUNCIONES DE PROGRAMA*****************************

void lcd_defecto(){
lcd_init();                                  //función de inicialización del LCD
delay_ms(10);
lcd_putc('\f');                              //se limpia el LCD
delay_ms(10);
lcd_gotoxy(2,1);                             //Apunta a posición 2, fila 1
delay_ms(10);
printf(lcd_putc, "LUXOMETRO");          
delay_ms(10);
lcd_putc('\n');                              //Apunta al inicio de la línea 2
delay_ms(10);
}

void BH1750_init(){
   I2C_start();
   I2C_write(ADDRESS_L);        
   I2C_write(PWR_ON);
   delay_ms(100);
   I2C_write(RESET);
   delay_ms(100);
   I2C_write(MODE_HIGH_RES1);
   I2C_stop();
   delay_ms(200);
}


//*********************PROGRAMA PRINCIPAL***************************

void main () {

set_tris_a(0x0F);                            //Configuración de I/O puerto A
set_tris_b(0x01);                            //Configuración de I/O puerto B
set_tris_c(0xC0);                            //Configuración de I/O puerto C

lcd_defecto();
BH1750_init();

while(TRUE){
   I2C_start();
   I2C_write(ADDRESS_L);      
   hb = I2C_read(1);  
   lb = I2C_read(0);
   I2c_stop();
   LUX = make16(hb, lb);
   LUX = LUX/1.2;
   delay_ms(500);
   lcd_gotoxy(4,2);
   printf(lcd_putc, "%5lu",LUX);
   delay_ms(500);
   };   

}
Cuando pruebo todo esto, el LCD veo el mensaje "Luxometro" correctamente por lo que se que tanto el PIC como el LCD están bien. Pero la lectura que debería venirme del BH1750 se queda fija en el valor 54612...

Saludos.
 

Adjuntos

  • 2016-06-19 13.10.21.jpg
    2016-06-19 13.10.21.jpg
    88.3 KB · Visitas: 13
Última edición por un moderador:
Gracias por responder.

Ya vi el ejemplo del enlace que me indicas pero, revisando el datasheet del BH1750, no entiendo las direcciones que usa para comunicarse con el chip...

De todas formas también probé a realizar un programa copiando ese ejemplo y usando la cabecera para mi PIC pero tampoco funcionaba.

Hola, he vuelto a intentar hacerlo funcionar con ese programa y ahora si. :)

Imagino que habría escrito algo incoherente entre el programa y mi cabecera... la verdad es que he hecho tantas pruebas que ya no lo se, jeje. :oops:

Gracias!
 
Última edición por un moderador:
Hola buenos días, también estoy manejando este sensor de Luminosidad pero no he podido hacerlo funcionar y he intentado con tu código y no funciona, seria posible que me indiques cual es el error o que debo hacer para que este funcione te lo agradezco y gracias
 
Atrás
Arriba