bh1750c语言程序,用树莓派学编程系列4——环境光照强度测量

树莓派系列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

5bd28782c2c942a9eb6a889cf0eb6b9f.png

与C语言程序对比

illuminance.c

#include

#include

#include

#include

#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");

}

}

结果一样

08b89d3241153f2258ef35044273b116.png

参考

I2C

python-smbus

smbus-cffi

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值