BH1750环境光传感器的基于Arduino测试例程及简单滤波
运行的硬件环境
刷过特定BOOTLOADER的[1]STM32F103CBT6, 除了对应链接VCC和GND外,
SCL连接PB6,
SDA连接PB7.
变量声明和参数设置部分
变量声明部分有2个设置是可调的,
第1个是PIN_ADDR_STATUS宏定义,主要是设置IC的I2C地址,如果addr的pin脚拉低就设置为0,拉高就设置为1;
第2个是 resolution_mode变量,主要是把手册的6种工作(分辨率)模式做成选单样式,直接切换;
不怎么会写东西,直接上代码:
#include <Wire.h> //Arduino提供的硬件I2C的库函数
/* --------opecode------------------ */
#define POWER_DOWN 0x00
#define POWER_ON 0x01
#define RESET 0x07
#define CONTINUOUSLY_H_MODE1 0x10 //resolution_mode 0
#define CONTINUOUSLY_H_MODE2 0x11 //resolution_mode 1
#define CONTINUOUSLY_L_MODE1 0x13 //resolution_mode 2
#define ONE_TIME_H_MODE1 0x20 //resolution_mode 3
#define ONE_TIME_H_MODE2 0x21 //resolution_mode 4
#define ONE_TIME_L_MODE1 0x23 //resolution_mode 5
/* -------------------------------- */
#define READ_DATA_LEN 1
#define SIMPLE_AVG_NUM 10
#define PIN_ADDR_STATUS 0 //0-> pull down; 1->pull up
int resolution_mode = 5; // select running mode
byte i2c_addr = 0; //7-bit addr
float lux_data = 0.0f;
float sum_lux_data = 0.0f;
float avg_lux_data = 0.0f;
int avg_count = 0;
byte first_data = 0;
float compare_lux_data = 0.0f;
I2C读写函数封装
这部分主要是依照Arduino提供的硬件I2C库函数,和datasheet上的读写示例,另外结合工作精度模式做切换:
uint8_t i2c_bh1750_write(uint8 reg)
{
Wire.beginTransmission(i2c_addr);
Wire.write(reg);
Wire.endTransmission();
delayMicroseconds(50);
}
uint8_t i2c_bh1750_read(uint8 *get_data)
{
uint8 reg = 0;
int i;
int len = 2;
//工作精度模式切换部分
switch (resolution_mode) {
case 0:
reg = CONTINUOUSLY_H_MODE1;
break;
case 1:
reg = CONTINUOUSLY_H_MODE2;
break;
case 2:
reg = CONTINUOUSLY_L_MODE1;
break;
case 3:
reg = ONE_TIME_H_MODE1;
break;
case 4:
reg = ONE_TIME_H_MODE2;
break;