ı2c ile bh1750 lüxmetre yardım ?

Başlatan mstbzr, 30 Aralık 2014, 17:39:51

mstbzr

sayın ustalar sürücü dosyasını indirdim ekledim fakat sistemi çalıştıramadım ı2c protokolunu pek bilmiyorum nette bununla ilgili örnekde bulamadım yardımcı olabilirseniz sevinirim...

BH1750.c
#include "BH1750.h" 
                                       
               
 void BH1750_init() 
 { 
    delay_ms(100);  
    BH1750_write(power_down); 
 }                  
               

 void BH1750_write(unsigned char cmd) 
 { 
    I2C_start(); 
    I2C_write(BH1750_address_w);        
    I2C_write(cmd);                
    I2C_stop();    
 } 

               
                                     
 unsigned long BH1750_read_word() 
 {                      
    register unsigned long value = 0; 
    unsigned char lb = 0; 
    unsigned char hb = 0; 
    I2C_start(); 
    I2C_write(BH1750_address_r);      
    hb = I2C_read(1);  
    lb = I2C_read(0); 
    I2C_stop();                            
    value = make16(hb, lb);      
    return value; 
 } 


 unsigned long get_lux_value(unsigned char mode, unsigned long delay_time) 
 { 
    register unsigned long lux_value = 0;  
    BH1750_write(power_up); 
    BH1750_write(mode); 
    lux_value = BH1750_read_word(); 
    delay_ms(delay_time); 
    BH1750_write(power_down); 
    return lux_value;                                  
 }                         



BH1750.h
#use I2C (Master, SDA = PIN_A0, SCL = PIN_A1)    


 #define  BH1750_address_w 0x46                                
 #define  BH1750_address_r 0x47 
           
 #define  power_down 0x00 
 #define  power_up 0x01 
 #define  reset 0x07 
 #define  cont_H_res_mode1 0x10 
 #define  cont_H_res_mode2 0x11  
 #define  cont_L_res_mode 0x13                                          
 #define  one_time_H_res_mode1 0x20 
 #define  one_time_H_res_mode2 0x21 
 #define  one_time_L_res_mode 0x23                                      
                         

 void BH1750_init(); 
 void BH1750_write(unsigned char cmd);                                            
 unsigned long BH1750_read_word(); 
 unsigned long get_lux_value(unsigned char mode, unsigned long delay_time); 



benim kod

#include <16F676.h>
#fuses NOWDT ,NOBROWNOUT, INTRC_IO, NOMCLR
#use delay(clock=4000000)

#define USE_PORTC_LCD TRUE
#include <4x20 LCD1.c> 
#include <BH1750.c>


void main()
{

unsigned long luxx;


lcd_init();
BH1750_init(); 


while(TRUE)
{

     get_lux_value(luxx,100);

     lcd_gotoxy(5,1);
     printf(lcd_putc,"LuX Metre");
     
     
     lcd_gotoxy(4,2);
     printf(lcd_putc,"LUX %5Ld",luxx);
     
}
}

Kabil ATICI

 get_lux_value(luxx,100); //programda kullandığın

unsigned long get_lux_value(unsigned char mode, unsigned long delay_time); //fonksiyon...

sence bu uygun mu?

fonksiyon için;
unsigned long get_lux_value(unsigned char mode, unsigned long delay_time)
{
    register unsigned long lux_value = 0; 
    BH1750_write(power_up);
    BH1750_write(mode);     //>>>>>>>>>>>?????
    lux_value = BH1750_read_word();
    delay_ms(delay_time);
    BH1750_write(power_down);
    return lux_value;                                 
}
ambar7

mstbzr

usta açıkçası pek bir şey anlamadım. Lüx değerini okumam için nasıl bir şey yazmam gerekir bir örnek verebilirsen çok iyi olur diğer türlü ben bu işi çözemeyeceğim galiba :(

mehmet

"luxx" değişkeni sensörün modunu belirtiyor anladığım
kadarıyla. bh1750.h dosyasının içinde modlar bulunmakta...

//main içindeki değişken tanımlamaları
unsigned char luxx = cont_H_res_mode1; //örneğin
unsigned long okunan_lux_degeri;

//while satırınıdan sonraki satır
okunan_lux_degeri = get_lux_value(luxx,100);

//en alttaki printf satiri
printf(lcd_putc,"LUX %5Ld", okunan_lux_degeri);
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr
https://creativecommons.org/licenses/by/4.0/deed.tr "CC BY"

mstbzr

bu şekilde de denedim olmadı maalesef :( başka bir yöntemi var mı acaba ?

mehmet

Elinizdeki sensörün nasıl çalıştığını öğrenmeniz gerekmekte...
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr
https://creativecommons.org/licenses/by/4.0/deed.tr "CC BY"

FaTihan

Sensor integer değer üretmekte. Yani 2-byte bilgi. Bu iki byte birleştirilerek integer değer oluşturulması gerekir.

drRobutik

Selam,
Bu da benim kodum çalıştırdım
IOpin.addr=0;

EXT_INT_EDGE(1,L_TO_H);
enable_interrupts(INT_EXT1);
enable_interrupts(INT_EXT2);
disable_interrupts(INT_LOWVOLT);
disable_interrupts(INT_TIMER0);
disable_interrupts(INT_TIMER1);
disable_interrupts(GLOBAL);
BH1750_init();
IOpin.addr=0;

   for(;;)
   {
      lightintensity=get_lux_value(cont_H_res_mode1,1000);
      printf("lux value:%f \n\r",(float)lightintensity/1.2);
      IOpin.cpuLED=1;
      delay_ms(10);
      IOpin.cpuLED=0;
   }
}
Dr Süleyman CANAN namı diğer drRobutik Elektronik Mühendisi