Raspberry Pi开发之旅-光照强度检测(BH1750)
一、前期准备
1.环境要求
GY30模块(BH1750FVI传感器),树莓派系统,python-smbus,iic开启
2.取消对IIC驱动的黑名单
nano /etc/modprobe.d/raspi-blacklist.conf
3.启动IIC驱动
nano /etc/modules
添加i2c-dev ,如下:
4.重启
5.安装python-smbus
这个安装会附带安装i2c-tools,省的单独安装了
1 | sudo apt - get install python - smbus |
6.将BH1750连接到树莓派
GY-30 | 树莓派 | |
---|---|---|
VCC | —— | 1 |
GND | —— | 6 |
SDA | —— | 3 |
SCL | —— | 5 |
ADDR | —— | 不接 |
二、连接测试
1 | sudo i2cdetect - y 1 |
问题分析:
1 2 | pi@raspberrypi:~$ i2cdetect - y 1 Error: Could not open file dev / i2c - 1 ' or `/dev/i2c/1' : No such file or directory |
无设备目录
解决方法:
方法一:raspi-config,进入Interfacing Options高级设置,将spi与i2c设置为enable,reboot;
方法二:blacklist里面有i2c,所以i2cdetect检测不到dev里面的设备,现在把blacklist里面的i2c模块注释掉就可以检测到i2cdev。
三、光照强度测量
1.创建iic_bh1750.c
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | #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" ); } } |
编译:
gcc -o bh1750 iic_bh1750.c
执行:
./bh1750
2.与python相比
创建illuminance.py
1 2 | cd / home / pi / helloworld / illuminance vim illuminance.py |
illuminance.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | #!/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服务
1 | sudo systemctl restart emperor.uwsgi.service |
测试
1 2 3 | 在树莓派浏览器输入 http: / / 127.0 . 0.1 / illuminance 或者在电脑浏览器输入 http: / / 树莓派IP / illuminance |
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步