嘉立创产业服务站群
发作品签到
专业版

OPT3001 环境光传感器

工程标签

174
0
0
0

简介

本模块基于OPT3001环境光传感器设计,采用I²C接口通信,支持中断和地址配置。电源部分使用662K稳压器,支持3.3V至5V输入。模块配备上拉电阻和去耦电容,通信稳定可靠,适合环境光强检测应用。

简介:本模块基于OPT3001环境光传感器设计,采用I²C接口通信,支持中断和地址配置。电源部分使用662K稳压器,支持3.3V至5V输入。模块配备上拉电阻和去耦电容,通信稳定可靠,适合环境光强检测应用。
模块征集令
复刻成本:1.5

开源协议

MIT License

创建时间:2025-04-01 08:38:32更新时间:2025-04-29 01:17:07

描述

OPT3001模块简介

本模块基于德州仪器(TI)公司的 OPT3001 环境光传感器设计,用于精确测量周围环境的光照强度。模块采用标准 I²C 接口(SCL、SDA)进行数据通信,同时引出了中断信号(INT)和地址选择引脚(ADDR),方便多模块扩展应用。电源部分设计了 662K LDO 稳压器,因此支持 3.3V 至 5V 的输入电压,并稳定输出 3.3V 供传感器使用,提升了模块的兼容性和应用范围。通信引脚均配备了 10kΩ 上拉电阻,保证 I²C 总线通讯的可靠性,同时在供电端增加了去耦电容(100nF),有效降低电源噪声。该模块适合应用于智能照明、环境监测、消费电子等需要高灵敏度光照感知的场景。原理图使用嘉立创EDA绘制,布局规范,便于后续开发与调试。

339860b52e05d9e766efa856a0a697e.jpg

07e6815e34f07b824a505ce9e2a3726.jpg

提供一份简易的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

d1e309d5fe71dcb453db2ca8cc266b2.jpg

#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

暂无BOM

附件

序号文件名称下载次数
1
opt3001.pdf
1
克隆工程
添加到专辑
0
0
分享
侵权投诉

评论

全部评论(1)
按时间排序|按热度排序
粉丝0|获赞0
相关工程
暂无相关工程

底部导航