【花雕学编程】Arduino动手做(188)---TSL2561模块5个小实验

2025-05-075112
AI 快速预览详细 收起
本文介绍了使用TSL2561数字I2C环境光传感器GY-2561模块进行5个小实验的方法。实验内容包括硬件连接、代码编写及实验结果。通过这些实验,用户可以轻松掌握环境光传感器的使用方法,适合初学者和对Arduino感兴趣的用户。


37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手试试多做实验,不管成功与否,都会记录下来——小小的进步或是搞不掂的问题,希望能够抛砖引玉。

【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验一百八十八:TSL2561数字I2C环境光传感器 GY-2561光照强度检测模块 TSL2561数字I2C环境光传感器 GY-2561光照强度检测模块


【花雕学编程】Arduino动手做(188)---TSL2561模块5个小实验图2

【花雕学编程】Arduino动手做(188)---TSL2561模块5个小实验图1

创作许可协议

本项目采用 None(不开放任何权利,保留所有权利) 进行许可。

评论(29)
驴友花雕
驴友花雕
作者

驴友花雕
驴友花雕
作者
实验串口绘图器返回情况

驴友花雕
驴友花雕
作者
实验串口返回情况

驴友花雕
驴友花雕
作者
代码解读
这段代码使用 Adafruit TSL2561 传感器库 通过 I2C 读取光照强度,并打印出亮度数据(Lux),核心逻辑如下:
1. 初始化传感器
✅ tsl.begin(); → 检查传感器是否连接正常
✅ displaySensorDetails(); → 获取传感器信息(版本号、分辨率、最小/最大值)
✅ configureSensor(); → 设置增益、自动调整光照范围,确保低光环境检测精度
2. 传感器配置
✅ tsl.enableAutoRange(true); → 开启自动增益调整(在亮光与暗光之间自动切换)
✅ tsl.setIntegrationTime(TSL2561_INTEGRATIONTIME_13MS); → 设定积分时间,适合强光环境
✅ 可调整 积分时间 为 101ms 或 402ms 以提高精度
3. 读取光照数据
✅ sensors_event_t event; tsl.getEvent(&event); → 获取新的传感器数据
✅ event.light → 获取 Lux 光照值(如果为 0,可能是传感器过载)
✅ Serial.print(event.light); Serial.println(" lux"); → 打印光照值(单位 Lux)
4. 循环采集数据
✅ delay(250); → 每 250 毫秒更新一次光照数据
这段代码让 TSL2561 传感器不断测量环境光照强度,并在串口输出 Lux 值。
驴友花雕
驴友花雕
作者
【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验一百八十八:TSL2561数字I2C环境光传感器 GY-2561光照强度检测模块
项目之五:TSL2561 传感器使用Adafruit类库的通用测试
实验开源代码
[code]/*
【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验一百八十八:TSL2561数字I2C环境光传感器 GY-2561光照强度检测模块
项目之五:TSL2561 传感器使用Adafruit类库的通用测试
*/
#include
#include
#include
/* This driver uses the Adafruit unified sensor library (Adafruit_Sensor),
which provides a common 'type' for sensor data and some helper functions.
To use this driver you will also need to download the Adafruit_Sensor
library and include it in your libraries folder.
You should also assign a unique ID to this sensor for use with
the Adafruit Sensor API so that you can identify this particular
sensor in any data logs, etc. To assign a unique ID, simply
provide an appropriate value in the constructor below (12345
is used by default in this example).
Connections
===========
Connect SCL to I2C SCL Clock
Connect SDA to I2C SDA Data
Connect VCC/VDD to 3.3V or 5V (depends on sensor's logic level, check the datasheet)
Connect GROUND to common ground
I2C Address
===========
The address will be different depending on whether you leave
the ADDR pin floating (addr 0x39), or tie it to ground or vcc.
The default addess is 0x39, which assumes the ADDR pin is floating
(not connected to anything). If you set the ADDR pin high
or low, use TSL2561_ADDR_HIGH (0x49) or TSL2561_ADDR_LOW
(0x29) respectively.
History
=======
2013/JAN/31 - First version (KTOWN)
*/
Adafruit_TSL2561_Unified tsl = Adafruit_TSL2561_Unified(TSL2561_ADDR_FLOAT, 12345);
/**************************************************************************/
/*
Displays some basic information on this sensor from the unified
sensor API sensor_t type (see Adafruit_Sensor for more information)
*/
/**************************************************************************/
void displaySensorDetails(void)
{
sensor_t sensor;
tsl.getSensor(&sensor);
Serial.println("------------------------------------");
Serial.print ("Sensor: "); Serial.println(sensor.name);
Serial.print ("Driver Ver: "); Serial.println(sensor.version);
Serial.print ("Unique ID: "); Serial.println(sensor.sensor_id);
Serial.print ("Max Value: "); Serial.print(sensor.max_value); Serial.println(" lux");
Serial.print ("Min Value: "); Serial.print(sensor.min_value); Serial.println(" lux");
Serial.print ("Resolution: "); Serial.print(sensor.resolution); Serial.println(" lux");
Serial.println("------------------------------------");
Serial.println("");
delay(500);
}
/**************************************************************************/
/*
Configures the gain and integration time for the TSL2561
*/
/**************************************************************************/
void configureSensor(void)
{
/* You can also manually set the gain or enable auto-gain support */
// tsl.setGain(TSL2561_GAIN_1X); /* No gain ... use in bright light to avoid sensor saturation */
// tsl.setGain(TSL2561_GAIN_16X); /* 16x gain ... use in low light to boost sensitivity */
tsl.enableAutoRange(true); /* Auto-gain ... switches automatically between 1x and 16x */
/* Changing the integration time gives you better sensor resolution (402ms = 16-bit data) */
tsl.setIntegrationTime(TSL2561_INTEGRATIONTIME_13MS); /* fast but low resolution */
// tsl.setIntegrationTime(TSL2561_INTEGRATIONTIME_101MS); /* medium resolution and speed */
// tsl.setIntegrationTime(TSL2561_INTEGRATIONTIME_402MS); /* 16-bit data but slowest conversions */
/* Update these values depending on what you've set above! */
Serial.println("------------------------------------");
Serial.print ("Gain: "); Serial.println("Auto");
Serial.print ("Timing: "); Serial.println("13 ms");
Serial.println("------------------------------------");
}
/**************************************************************************/
/*
Arduino setup function (automatically called at startup)
*/
/**************************************************************************/
void setup(void)
{
Serial.begin(9600);
Serial.println("Light Sensor Test"); Serial.println("");
/* Initialise the sensor */
//use tsl.begin() to default to Wire,
//tsl.begin(&Wire2) directs api to use Wire2, etc.
if(!tsl.begin())
{
/* There was a problem detecting the TSL2561 ... check your connections */
Serial.print("Ooops, no TSL2561 detected ... Check your wiring or I2C ADDR!");
while(1);
}
/* Display some basic information on this sensor */
displaySensorDetails();
/* Setup the sensor gain and integration time */
configureSensor();
/* We're ready to go! */
Serial.println("");
}
/**************************************************************************/
/*
Arduino loop function, called once 'setup' is complete (your own code
should go here)
*/
/**************************************************************************/
void loop(void)
{
/* Get a new sensor event */
sensors_event_t event;
tsl.getEvent(&event);
/* Display the results (light is measured in lux) */
if (event.light)
{
Serial.print(event.light); Serial.println(" lux");
}
else
{
/* If event.light = 0 lux the sensor is probably saturated
and no reliable data could be generated! */
Serial.println("Sensor overload");
}
delay(250);
}[/code]
驴友花雕
驴友花雕
作者



驴友花雕
驴友花雕
作者
实验串口绘图器返回情况


驴友花雕
驴友花雕
作者
实验串口返回情况

驴友花雕
驴友花雕
作者
代码解读
这段代码使用 TSL2561 光照传感器 读取光强数据,并通过 串口打印亮度值(Lux),核心逻辑如下:
1. 传感器连接
✅ 使用 I2C (Wire.h),连接 SCL(时钟)到模拟 5,SDA(数据)到模拟 4
✅ 传感器地址 → TSL2561_ADDR_FLOAT 默认浮动地址(0x39)
✅ 可修改地址 → TSL2561_ADDR_LOW(0x29) 或 TSL2561_ADDR_HIGH(0x49)
2. 初始化
✅ tsl.begin() → 检测传感器是否正确连接
✅ tsl.setGain(TSL2561_GAIN_16X); → 设置 16 倍增益,适用于低光环境
✅ tsl.setTiming(TSL2561_INTEGRATIONTIME_13MS); → 设定积分时间,短时间适用于强光环境
3. 读取光照数据
✅ tsl.getLuminosity(TSL2561_VISIBLE); → 获取可见光强度
✅ tsl.getLuminosity(TSL2561_INFRARED); → 获取红外线强度
✅ tsl.getLuminosity(TSL2561_FULLSPECTRUM); → 获取全光谱数据
4. 计算亮度
✅ getFullLuminosity(); → 获取 32 位光照数据(高 16 位红外光,低 16 位全光谱)
✅ calculateLux(full, ir); → 计算光照强度(Lux)
✅ Serial.println(lux); → 打印 Lux 值
5. 循环读取
✅ delay(100); → 每 100 毫秒更新数据
这段代码让 TSL2561 传感器不断读取光照强度,包括可见光、红外光和 Lux 值,并在串口打印数据。
驴友花雕
驴友花雕
作者
【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验一百八十八:TSL2561数字I2C环境光传感器 GY-2561光照强度检测模块
项目之四:使用 TSL2561 传感器读取全光谱四类数据
实验开源代码
[code]/*
【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验一百八十八:TSL2561数字I2C环境光传感器 GY-2561光照强度检测模块
项目之四:使用 TSL2561 传感器读取全光谱四类数据
*/
#include
#include "TSL2561.h"
// Example for demonstrating the TSL2561 library - public domain!
// connect SCL to analog 5
// connect SDA to analog 4
// connect VDD to 3.3V DC
// connect GROUND to common ground
// ADDR can be connected to ground, or vdd or left floating to change the i2c address
// The address will be different depending on whether you let
// the ADDR pin float (addr 0x39), or tie it to ground or vcc. In those cases
// use TSL2561_ADDR_LOW (0x29) or TSL2561_ADDR_HIGH (0x49) respectively
TSL2561 tsl(TSL2561_ADDR_FLOAT);
void setup(void) {
Serial.begin(9600);
if (tsl.begin()) {
Serial.println("Found sensor");
} else {
Serial.println("No sensor?");
while (1);
}
// You can change the gain on the fly, to adapt to brighter/dimmer light situations
//tsl.setGain(TSL2561_GAIN_0X); // set no gain (for bright situtations)
tsl.setGain(TSL2561_GAIN_16X); // set 16x gain (for dim situations)
// Changing the integration time gives you a longer time over which to sense light
// longer timelines are slower, but are good in very low light situtations!
tsl.setTiming(TSL2561_INTEGRATIONTIME_13MS); // shortest integration time (bright light)
//tsl.setTiming(TSL2561_INTEGRATIONTIME_101MS); // medium integration time (medium light)
//tsl.setTiming(TSL2561_INTEGRATIONTIME_402MS); // longest integration time (dim light)
// Now we're ready to get readings!
}
void loop(void) {
// Simple data read example. Just read the infrared, fullspecrtrum diode
// or 'visible' (difference between the two) channels.
// This can take 13-402 milliseconds! Uncomment whichever of the following you want to read
uint16_t x = tsl.getLuminosity(TSL2561_VISIBLE);
//uint16_t x = tsl.getLuminosity(TSL2561_FULLSPECTRUM);
//uint16_t x = tsl.getLuminosity(TSL2561_INFRARED);
Serial.println(x, DEC);
// More advanced data read example. Read 32 bits with top 16 bits IR, bottom 16 bits full spectrum
// That way you can do whatever math and comparisons you want!
uint32_t lum = tsl.getFullLuminosity();
uint16_t ir, full;
ir = lum >> 16;
full = lum & 0xFFFF;
Serial.print("IR: "); Serial.print(ir); Serial.print("\t\t");
Serial.print("Full: "); Serial.print(full); Serial.print("\t");
Serial.print("Visible: "); Serial.print(full - ir); Serial.print("\t");
Serial.print("Lux: "); Serial.println(tsl.calculateLux(full, ir));
delay(100);
}[/code]
驴友花雕
驴友花雕
作者
实验场景图

驴友花雕
驴友花雕
作者
代码简单解读
这段代码使用 TSL2561 传感器 读取 红外光强度 并通过 串口打印 Lux 值,核心逻辑如下:
1. 初始化
✅ tsl.begin(); → 检查传感器是否连接正常
✅ tsl.setGain(TSL2561_GAIN_16X); → 设置 16 倍增益,提高测量精度
✅ tsl.setTiming(TSL2561_INTEGRATIONTIME_13MS); → 设定 13ms 积分时间
2. 获取红外光数据
✅ uint16_t ir_luminosite = tsl.getLuminosity(TSL2561_INFRARED); → 读取红外光强度
✅ Serial.print("红外线强度:"); Serial.print(ir_luminosite); Serial.println(" Lux"); → 打印红外光强度 Lux 值
3. 定期采集数据
✅ delay(1000); → 每 1 秒获取一次红外光照数据
这段代码让 TSL2561 传感器定期获取红外光强度,并显示在串口监视器上。
驴友花雕
驴友花雕
作者
【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验一百八十八:TSL2561数字I2C环境光传感器 GY-2561光照强度检测模块
项目之三:使用 TSL2561 传感器读取红外线强度数据(IR)
实验开源代码
[code]/*
【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验一百八十八:TSL2561数字I2C环境光传感器 GY-2561光照强度检测模块
项目之三:使用 TSL2561 传感器读取红外线强度数据(IR)
*/
#include
#include "TSL2561.h"
TSL2561 tsl(TSL2561_ADDR_FLOAT);
void setup() {
Serial.begin(9600);
if (tsl.begin()) {
Serial.println("找到传感器");
} else {
Serial.println("没有检测到传感器?");
while (1);
}
tsl.setGain(TSL2561_GAIN_16X);
tsl.setTiming(TSL2561_INTEGRATIONTIME_13MS);
}
void loop() {
uint16_t ir_luminosite = tsl.getLuminosity(TSL2561_INFRARED); // **获取红外线强度**
Serial.print("红外线强度:");
Serial.print(ir_luminosite);
Serial.println(" Lux");
delay(1000); // **每秒读取一次**
}[/code]
驴友花雕
驴友花雕
作者
实验串口绘图器返回情况



驴友花雕
驴友花雕
作者
代码简单解读
这段代码使用 TSL2561 传感器 读取光照强度,并通过 绘图器(Serial Plotter) 实时显示 光强波形,核心逻辑如下:
1. 初始化
✅ tsl.begin(); → 检查传感器是否连接正常
✅ tsl.setGain(TSL2561_GAIN_16X); → 设置增益 16 倍,提高检测精度
✅ tsl.setTiming(TSL2561_INTEGRATIONTIME_13MS); → 设定积分时间 13ms
2. 读取光照数据
✅ uint16_t luminosite = tsl.getLuminosity(TSL2561_VISIBLE); → 获取可见光亮度
✅ Serial.println(luminosite); → 直接输出数值,适配 Serial Plotter
3. 绘图器显示光强波形
✅ Arduino Serial Plotter 读取连续数据,自动生成 实时光强曲线
✅ 刷新间隔 → delay(100); 让数据更新更快,形成流畅波形
这段代码让 TSL2561 传感器不断测量光照强度,并在绘图器上显示光强变化曲线
驴友花雕
驴友花雕
作者
【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验一百八十八:TSL2561数字I2C环境光传感器 GY-2561光照强度检测模块
项目之二:读取光强数据显示为动态波形
实验开源代码
[code]/*
【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验一百八十八:TSL2561数字I2C环境光传感器 GY-2561光照强度检测模块
项目之二:读取光强数据显示为动态波形
*/
#include
#include "TSL2561.h"
TSL2561 tsl(TSL2561_ADDR_FLOAT);
void setup() {
Serial.begin(9600);
if (tsl.begin()) {
Serial.println("找到传感器");
} else {
Serial.println("没有检测到传感器?");
while (1);
}
tsl.setGain(TSL2561_GAIN_16X);
tsl.setTiming(TSL2561_INTEGRATIONTIME_13MS);
}
void loop() {
uint16_t luminosite = tsl.getLuminosity(TSL2561_VISIBLE);
Serial.println(luminosite); // **只打印光强数值,适配绘图器**
delay(100); // **降低刷新间隔,使波形更流畅**
}[/code]
驴友花雕
驴友花雕
作者
实验场景图

驴友花雕
驴友花雕
作者
实验串口返回情况

驴友花雕
驴友花雕
作者
代码解读
这段代码使用 TSL2561 光照传感器 读取光强数据,并通过 串口打印亮度值(Lux),核心逻辑如下:
1. 初始化
✅ #include → 使用 I2C 进行通信
✅ TSL2561 tsl(TSL2561_ADDR_FLOAT); → 初始化 TSL2561 传感器
✅ Serial.begin(9600); → 启动串口通信,波特率 9600
2. 传感器检测
✅ if (tsl.begin()) { Serial.println("Capteur trouvé"); } → 检查是否找到传感器
✅ else { Serial.println("Aucun capteur détecté ?"); while(1); } → 未找到传感器时进入死循环
3. 传感器设置
✅ tsl.setGain(TSL2561_GAIN_16X); → 设置增益 16 倍,提高检测精度
✅ tsl.setTiming(TSL2561_INTEGRATIONTIME_13MS); → 设置积分时间 13ms
4. 读取光照数据
✅ uint16_t luminosite = tsl.getLuminosity(TSL2561_VISIBLE); → 获取可见光强度
✅ Serial.print("Luminosité : "); Serial.print(luminosite); Serial.println(" Lux"); → 打印光照数据(单位 Lux)
5. 循环读取
✅ delay(1000); → 每 1 秒读取一次光照数据
这段代码让 TSL2561 传感器每秒读取一次光照强度,并在串口打印 Lux 值
驴友花雕
驴友花雕
作者
【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验一百八十八:TSL2561数字I2C环境光传感器 GY-2561光照强度检测模块
项目之一:使用 TSL2561 光照传感器读取光强数据
实验开源代码
[code]/*
【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验一百八十八:TSL2561数字I2C环境光传感器 GY-2561光照强度检测模块
项目之一:使用 TSL2561 光照传感器读取光强数据
*/
#include
#include "TSL2561.h"
TSL2561 tsl(TSL2561_ADDR_FLOAT);
void setup(void) {
Serial.begin(9600);
if (tsl.begin()) {
Serial.println("找到传感器");
} else {
Serial.println("没有检测到传感器?");
while (1);
}
tsl.setGain(TSL2561_GAIN_16X);
tsl.setTiming(TSL2561_INTEGRATIONTIME_13MS);
}
void loop(void) {
uint16_t luminosite = tsl.getLuminosity(TSL2561_VISIBLE);
Serial.print("亮度:");
Serial.print(luminosite);
Serial.println(" Lux");
delay(1000);
}[/code]