树莓派系列4——环境光照强度测量
前期准备
- 环境要求
GY30模块(BH1750FVI传感器),树莓派系统,python-smbus,iic开启 - 安装python-smbus
这个安装会附带安装i2c-tools,省的单独安装了
sudo apt-get install python-smbus
光照强度测量
创建illuminance应用
具体方法请参考本系列前面文章
BH1750FVI与树莓派连接
BH1750FVI简介
BH1750FVI 是一种用于两线式串行总线接口的数字型光强度传感器集成电路。这种集成电路可以根据收集的光线强度数据来调整液晶或者键盘背景灯的亮度。利用它的高分辨率可以探测较大范围的光强度变化。(1lx-65535lx)
- 产品特点
- 支持I2C BUS接口(f/s Mode Support)。
- 接近视觉灵敏度的光谱灵敏度特性(峰值灵敏度波长典型值:560nm)。
- 输出对应亮度的数字值。
- 对应广泛的输入光范围(相当于1-65535lx)。
- 通过降低功率功能,实现低电流化。
- 通过50Hz/60Hz除光噪音功能实现稳定的测定
- 支持1.8V逻辑输入接口。
- 无需其他外部件。
- 光源依赖性弱(白炽灯,荧光灯,卤素灯,白光LED,日光灯)。
- 有两种可选的I2C slave地址。
- 可调的测量结果影响较大的因素为光入口大小。
- 使用这种功能能计算1.1 lx到100000 lx马克斯/分钟的范围。
- 最小误差变动在±20%。
- 受红外线影响很小。
BH1750FVI数据手册
中文数据手册
BH1750的I2C说明
BH1750支持俩种地址, ADDR=”H”(ADDR≥0.7VCC) ,地址为0x5c ADDR=”L”(ADDR≤0.3VCC),地址为0x23 由于GY-30模块已经在ADDR管脚与地之间加了一个1000欧姆的电阻,所以默认地址为0x23,BH1750命令说明
命令 | 命令含义 |
---|---|
0x00 | 断电 |
0x01 | 通电 |
0x07 | 复位 |
0x10 | 连续H分辨率模式 |
0x11 | 连续H分辨率模式2 |
0x13 | 连续L分辨率模式 |
0x20 | 一次H分辨率模式 |
0x21 | 一次H分辨率模式2 |
0x23 | 一次L分辨率模式 |
0x42 0x65 | 灵敏度100% |
0x44 0x6A | 灵敏度50% |
0x41 0x73 | 灵敏度200% |
BH1750读取方法
通电(0x01)-设定模式(0x10\0x11\0x13\0x20\0x21\0x23)-等待测量-读取数据光照强度计算
光照强度=读取值∗分辨率1.2∗灵敏度GY-30模块与树莓派连接
GY-30 | 树莓派 | |
---|---|---|
VCC | —— | 1 |
GND | —— | 9 |
SDA | —— | 3 |
SCL | —— | 5 |
ADDR | —— | 不接 |
连接测试
使用I2C TOOLS进行查看sudo i2cdetect -y 1
可看到以下结果,与我们前面所说地址为0x23相符 ![I2C](https://img-blog.csdn.net/20161011194738376)
光照强度测量
程序的设置
设置方式方法与前面相同程序
- 创建illuminance.py
cd /home/pi/helloworld/illuminance
vim illuminance.py
illuminance.py
#!/usr/bin/env python
# encoding: utf-8
import smbus
import time
#BH1750地址
__DEV_ADDR=0x23
#控制字
__CMD_PWR_OFF=0x00 #关机
__CMD_PWR_ON=0x01 #开机
__CMD_RESET=0x07 #重置
__CMD_CHRES=0x10 #持续高分辨率检测
__CMD_CHRES2=0x11 #持续高分辨率模式2检测
__CMD_CLHRES=0x13 #持续低分辨率检测
__CMD_THRES=0x20 #一次高分辨率
__CMD_THRES2=0x21 #一次高分辨率模式2
__CMD_TLRES=0x23 #一次分辨率
__CMD_SEN100H=0x42 #灵敏度100%,高位
__CMD_SEN100L=0X65 #灵敏度100%,低位
__CMD_SEN50H=0x44 #50%
__CMD_SEN50L=0x6A #50%
__CMD_SEN200H=0x41 #200%
__CMD_SEN200L=0x73 #200%
bus=smbus.SMBus(1)
bus.write_byte(__DEV_ADDR,__CMD_PWR_ON)
bus.write_byte(__DEV_ADDR,__CMD_RESET)
bus.write_byte(__DEV_ADDR,__CMD_SEN100H)
bus.write_byte(__DEV_ADDR,__CMD_SEN100L)
bus.write_byte(__DEV_ADDR,__CMD_PWR_OFF)
def getIlluminance():
bus.write_byte(__DEV_ADDR,__CMD_PWR_ON)
bus.write_byte(__DEV_ADDR,__CMD_THRES2)
time.sleep(0.2)
res=bus.read_word_data(__DEV_ADDR,0)
#read_word_data
res=((res>>8)&0xff)|(res<<8)&0xff00
res=round(res/(2*1.2),2)
result="光照强度: "+str(res)+"lx"
return result
测试结果
- 重启uwsgi服务
sudo systemctl restart emperor.uwsgi.service
- 测试
在树莓派浏览器输入
http://127.0.0.1/illuminance
或者在电脑浏览器输入 http://raspberrypi/illuminance
与C语言程序对比
illuminance.c
#include <stdio.h>
#include <fcntl.h>
#include <linux/i2c-dev.h>
#include <errno.h>
#define I2C_ADDR 0x23
int main(void)
{
int fd;
char buf[3];
char val,value;
float flight;
fd=open("/dev/i2c-1",O_RDWR);
if(fd<0)
{
printf("打开文件错误:%s\r\n",strerror(errno)); return 1;
}
if(ioctl( fd,I2C_SLAVE,I2C_ADDR)<0 )
{
printf("ioctl 错误 : %s\r\n",strerror(errno));return 1;
}
val=0x01;
if(write(fd,&val,1)<0)
{
printf("上电失败\r\n");
}
val=0x11;
if(write(fd,&val,1)<0)
{
printf("开启高分辨率模式2\r\n");
}
usleep(200000);
if(read(fd,&buf,3)){
flight=(buf[0]*256+buf[1])*0.5/1.2;
printf("光照度: %6.2flx\r\n",flight);
}
else{
printf("读取错误\r\n");
}
}
结果一样