失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > 树莓派上Python实现TSL2561采样光照强度

树莓派上Python实现TSL2561采样光照强度

时间:2022-12-08 04:22:43

相关推荐

树莓派上Python实现TSL2561采样光照强度

TSL2561传感器

功能

TSL2561可将光强度转换为能够直接通过I2C总线输出的数字信号。

两个积分ADC将光电二极管电流转换为数字输出,表示在每个通道上测量的辐照度。

引脚功能

I2C协议

I2C总线传输协议

wiringPi的使用

我们直接调用wiringPi中包含的I2C库来编写程序

检查TSL2561设备的地址

i2cdetect -y 1

wiringPiI2CSetup 函数

该函数的原型为:int wiringPiI2CSetup(int devId);

该函数使用指定设备标示号来初始化 I2C 系统。参数 devId 是 I2C 设备的地址,此处设备为TSL2561。fd为文件描述符。

fd = wipi.wiringPiI2CSetup(TSL2561I2C_ADDR)

wiringPiI2CWrite 函数

该函数的原型为:int wiringPiI2CWrite(int fd, int data); 简单的设备写操作。此处先写入寄存器的地址,再写入寄存器的值。

wipi.wiringPiI2CWrite(fd,CONTROL_REG)wipi.wiringPiI2CWrite(fd,POWER_UP)

wiringPiI2CRead 函数

该函数的原型为:int wiringPiI2CRead(int fd);

简单的设备读操作。此处用于读寄存器的值,返回值就是该寄存器的当前值。在wiringPiI2CWrite之后使用。

wipi.wiringPiI2CWrite(fd,DATA0LOW)data0low = wipi.wiringPiI2CRead(fd)

寄存器配置

TSL2561寄存器信息

表中给出了TSL2561中所有寄存器的名称、地址和功能。

此处我们用到命令寄存器(COMMAND)、控制寄存器(CONTROL)和数字寄存器(Ch Dh Eh Fh)

命令寄存器

命令寄存器中共有8位,最高位必须置1。第4-7位写0,低四位为寄存器的地址。

DATA0LOW = 0x8cDATA0HIGH = 0x8dDATA1LOW = 0x8eDATA1HIGH = 0x8f

当不访问数据存储器时,低四位置0。

控制寄存器

数字寄存器

传统的硅探测器对人眼看不到的红外光强烈反应。 由于硅探测器响应与人类感知的亮度之间的差异,当环境光的红外含量很高时(例如白炽灯照明),这会导致严重错误。通过使用两个光电二极管在TSL256x中克服了这个问题。 其中一个光电二极管(CH0)对可见光和红外光都敏感,而第二个光电二极管(CH1)主要对红外光敏感。 积分ADC将光电二极管电流转换为数字输出。 CH1数字输出用于补偿光的红外分量对通道0数字输出的影响。 来自两个通道的ADC数字输出用于公式中,以获得近似于Lux常用照度单位中人眼响应的值:

两个通道CH0,CH1同时对光强数据进行采集,数据处理时将两个通道CH0,CH1数据进行位运算:

CH0 = 256*data0high + data0lowCH1 = 256*data1high + data1low

光强的计算

if (ratio <= 0):Lux = 0elif ratio <= 0.50:Lux = 0.0304*float(CH0)-0.062*float(CH0)*(ratio**1.4)elif (ratio > 0.5 & ratio <= 0.61):Lux = 0.0224*float(CH0)-0.031*CH1elif (ratio > 0.61 & ratio <= 0.80):Lux = 0.0128*float(CH0)-0.0153*CH1elif (ratio > 0.80 & ratio <= 1.30):Lux = 0.00146*float(CH0)-0.00112*CH1elif ratio > 1.30:Lux = 0

Python源码:

#!/usr/bin/python"""Filename:tsl2561.pyDescription: This file is used to collect lux."""import wiringpi as wipiimport timeTSL2561I2C_ADDR = 0x39POWER_UP = 0x03POWER_DOWN= 0x00CONTROL_REG= 0x80DATA0LOW = 0x8cDATA0HIGH = 0x8dDATA1LOW = 0x8eDATA1HIGH = 0x8f#initial I2C devicefd = wipi.wiringPiI2CSetup(TSL2561I2C_ADDR)#collect datawipi.wiringPiI2CWrite(fd,CONTROL_REG)wipi.wiringPiI2CWrite(fd,POWER_UP)time.sleep(0.5) //#read datawipi.wiringPiI2CWrite(fd,DATA0LOW)data0low = wipi.wiringPiI2CRead(fd)wipi.wiringPiI2CWrite(fd,DATA0HIGH)data0high = wipi.wiringPiI2CRead(fd)wipi.wiringPiI2CWrite(fd,DATA1LOW)data1low = wipi.wiringPiI2CRead(fd)wipi.wiringPiI2CWrite(fd,DATA1HIGH)data1high = wipi.wiringPiI2CRead(fd)#data processingCH0 = 256*data0high + data0lowCH1 = 256*data1high + data1lowratio = float(CH1)/float(CH0)#calculate luxif (ratio <= 0):Lux = 0elif ratio <= 0.50:Lux = 0.0304*float(CH0)-0.062*float(CH0)*(ratio**1.4)elif (ratio > 0.5 & ratio <= 0.61):Lux = 0.0224*float(CH0)-0.031*CH1elif (ratio > 0.61 & ratio <= 0.80):Lux = 0.0128*float(CH0)-0.0153*CH1elif (ratio > 0.80 & ratio <= 1.30):Lux = 0.00146*float(CH0)-0.00112*CH1elif ratio > 1.30:Lux = 0#show luxprint '%.3f' % Lux

如果觉得《树莓派上Python实现TSL2561采样光照强度》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。