本文主要是介绍BH1750环境光传感器的基于Arduino测试例程及简单滤波,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
BH1750环境光传感器的基于Arduino测试例程及简单滤波
- 运行的硬件环境
- 变量声明和参数设置部分
- I^2^C读写函数封装
- 程序初始化部分
- 程序循环执行部分
- 简单的求平均数滤波
- 简单的限幅滤波
- 2次滤波后的效果
- 备注
运行的硬件环境
刷过特定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 upint resolution_mode = 5; // select running modebyte 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 =
这篇关于BH1750环境光传感器的基于Arduino测试例程及简单滤波的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!