/*************************************************
*头文件
*************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <strings.h>
#include <linux/i2c-dev.h>
#include <linux/i2c.h>

// BH1750 指令
#define BH_POW_DOWN     0x00      // 关闭模块
#define BH_POW_ON       0x01      // 打开模块等待测量指令
#define BH_RST          0x07      // 重置数据寄存器值在PowerOn模式下有效
#define BH_MODE_H1      0x10      // 高分辨率 单位1lx 测量时间120ms
#define BH_MODE_H2      0x11      // 高分辨率模式2 单位0.5lx 测量时间120ms
#define BH_MODE_L       0x13      // 低分辨率 单位4lx 测量时间16ms
#define BH_SIG_MODE_H1  0x20      // 一次高分辨率 测量 测量后模块转到 PowerDown模式
#define BH_SIG_MODE_H2  0x21      // 同上类似
#define BH_SIG_MODE_L   0x23      // 上类似
#define SENSOR_I2C_ADDR 0x23      // 传感器地址

static int fd = -1; //驱动文件设备描述符
//char src;
/*********************************************************************************
** 函数名称: lap_close
** 功能描述: 关闭驱动文件(自动调用)
** 输入参数: None.        
** 输出参数: None.
** 返回参数: None.
**********************************************************************************/  
void lap_close(void)
{
    if(fd>=0) close(fd);
    printf("lap_close fd closeed!\n");
}


/*********************************************************************************
** 函数名称: lap_opend
** 功能描述: 打开驱动文件
** 输入参数: src:驱动路径        
** 输出参数: None.
** 返回参数: None.
**********************************************************************************/  
int lap_opend(const char *src)
{
    fd = open(src,O_RDWR);
    if(fd < 0)
    {
        printf("lap_opend open %s err!\n",src);
        return -1;
    }
    printf("lap_opend open %s ok!\n",src);

    //退出时自动关闭驱动文件
    atexit(lap_close); 
   
    return fd;
}

/*********************************************************************************
** 函数名称: bh1750_init
** 功能描述: bh1750初始化      
** 输出参数: None.
** 返回参数: None.
**********************************************************************************/  
void bh1750_init()
{
    int i=0;
    char buff[] = {BH_POW_ON,BH_RST,BH_MODE_L};
    // 2.设置从机地址
    ioctl(fd,I2C_SLAVE,SENSOR_I2C_ADDR,0x00);
   
    // 3.初始化设备
    for(i=0;i<sizeof(buff);i++)
    {
         write(fd,&buff[i],1);
        usleep(1000);   // 休眠一秒
    }
   
}

/*********************************************************************************
** 函数名称: bh1750_readData
** 功能描述: bh1750读取数据      
** 输出参数: None.
** 返回参数: None.
**********************************************************************************/  
float bh1750_readData()
{
    char buff[2];
    if (read(fd,buff,2) <0) return 0;
    return (float)((buff[0]*256+buff[1])/1.2); //合成光照强度数据 单位：LX
}


int main(void)
{
   
    float dat;
    // 1.打开i2c适配器(bh150挂接到i2c-2上)
    if(lap_opend("/dev/i2c-2") < 0) return -1;
   
    bh1750_init();
    while (1)
    {
        sleep(1);   // 休眠一秒
        dat = bh1750_readData();
        printf("dat:%0.3f\r\n",dat);
    }

    return 0;
}
