
OPT3001 环境光传感器
简介
本模块基于OPT3001环境光传感器设计,采用I²C接口通信,支持中断和地址配置。电源部分使用662K稳压器,支持3.3V至5V输入。模块配备上拉电阻和去耦电容,通信稳定可靠,适合环境光强检测应用。
简介:本模块基于OPT3001环境光传感器设计,采用I²C接口通信,支持中断和地址配置。电源部分使用662K稳压器,支持3.3V至5V输入。模块配备上拉电阻和去耦电容,通信稳定可靠,适合环境光强检测应用。开源协议
:MIT License
描述
OPT3001模块简介
本模块基于德州仪器(TI)公司的 OPT3001 环境光传感器设计,用于精确测量周围环境的光照强度。模块采用标准 I²C 接口(SCL、SDA)进行数据通信,同时引出了中断信号(INT)和地址选择引脚(ADDR),方便多模块扩展应用。电源部分设计了 662K LDO 稳压器,因此支持 3.3V 至 5V 的输入电压,并稳定输出 3.3V 供传感器使用,提升了模块的兼容性和应用范围。通信引脚均配备了 10kΩ 上拉电阻,保证 I²C 总线通讯的可靠性,同时在供电端增加了去耦电容(100nF),有效降低电源噪声。该模块适合应用于智能照明、环境监测、消费电子等需要高灵敏度光照感知的场景。原理图使用嘉立创EDA绘制,布局规范,便于后续开发与调试。
提供一份简易的ESP8266测试代码。
电源连接:
- OPT3001 VCC → ESP8266 3.3V-5V
- OPT3001 GND → ESP8266 GND
I2C通信线:
- OPT3001 SCL → ESP8266 D1 (GPIO5)
- OPT3001 SDA → ESP8266 D2 (GPIO4)
地址选择引脚:
-
OPT3001 ADDR → GND (这会将I2C地址设置为0x44)
-
或者 OPT3001 ADDR → VCC (这会将I2C地址设置为0x45)
-
OPT3001 ADDR 未连接悬空 则默认地址为 0x44
#include
// 该模块默认使用0x44
// OPT3001 I2C 地址 (通常为 0x44 或 0x45,取决于ADDR引脚连接)
#define OPT3001_ADDRESS 0x44
// OPT3001 寄存器地址
#define OPT3001_CONFIGURATION 0x01
#define OPT3001_RESULT 0x00
#define OPT3001_MANUFACTURER_ID 0x7E
#define OPT3001_DEVICE_ID 0x7F
void setup() {
Serial.begin(115200);
Wire.begin(); // ESP8266默认使用GPIO4(D2)作为SDA,GPIO5(D1)作为SCL
// 等待串口连接
while (!Serial) {
delay(10);
}
Serial.println("\nOPT3001 Light Sensor Test");
// 检查传感器是否存在
if (!checkSensor()) {
Serial.println("OPT3001传感器未找到,请检查连接!");
while (1) {
delay(100);
}
}
// 配置传感器
configureSensor();
}
void loop() {
// 读取并打印光照度数据
float lux = readLux();
Serial.print("Light intensity: ");
Serial.print(lux);
Serial.println(" lux");
delay(1000); // 每秒读取一次
}
bool checkSensor() {
Wire.beginTransmission(OPT3001_ADDRESS);
if (Wire.endTransmission() != 0) {
return false;
}
uint16_t manufacturerID = readRegister(OPT3001_MANUFACTURER_ID);
uint16_t deviceID = readRegister(OPT3001_DEVICE_ID);
Serial.print("Manufacturer ID: 0x");
Serial.println(manufacturerID, HEX);
Serial.print("Device ID: 0x");
Serial.println(deviceID, HEX);
// OPT3001制造商ID应为0x5449 (TI - Texas Instruments)
// 设备ID应为0x3001
return (manufacturerID == 0x5449 && deviceID == 0x3001);
}
void configureSensor() {
/*
* 配置寄存器 (0x01):
* 位 15-12: 自动满量程范围 (1100)
* 位 11: 转换时间 1 = 800ms
* 位 10-9: 连续转换模式 (01)
* 位 8: 禁用中断 (1)
* 位 7-4: 故障计数 (0000)
* 位 3-2: 保留
* 位 1-0: 保留
*/
uint16_t config = 0b1100010010000000; // 0xC220
writeRegister(OPT3001_CONFIGURATION, config);
// 读取并打印配置寄存器的值进行验证
uint16_t configValue = readRegister(OPT3001_CONFIGURATION);
Serial.print("Configuration register: 0x");
Serial.println(configValue, HEX);
}
float readLux() {
// 读取结果寄存器
uint16_t result = readRegister(OPT3001_RESULT);
// 提取指数和小数位
uint16_t exponent = (result >> 12) & 0x000F;
uint16_t fractional = result & 0x0FFF;
// 计算lux值: lux = 0.01 * 2^exponent * fractional
float lux = 0.01 * (1 << exponent) * fractional;
return lux;
}
uint16_t readRegister(uint8_t reg) {
// 向传感器发送寄存器地址
Wire.beginTransmission(OPT3001_ADDRESS);
Wire.write(reg);
Wire.endTransmission();
// 请求2个字节的数据
Wire.requestFrom(OPT3001_ADDRESS, 2);
// 读取高字节和低字节
uint16_t highByte = Wire.read();
uint16_t lowByte = Wire.read();
// 组合成16位值 (OPT3001使用大端格式)
return (highByte << 8) | lowByte;
}
void writeRegister(uint8_t reg, uint16_t value) {
// 向传感器写入寄存器地址和数据
Wire.beginTransmission(OPT3001_ADDRESS);
Wire.write(reg);
Wire.write((value >> 8) & 0xFF); // 高字节
Wire.write(value & 0xFF); // 低字节
Wire.endTransmission();
}
设计图

BOM


评论