AMBIENT LIGHT SENSOR

VEML6030 环境光传感器模块资料

把环境亮度转换成可读 lux 数据。资料整理了 ESP32、Arduino UNO、STM32 三种接线方式,I2C 地址 0x48,寄存器读写代码,以及强光饱和、弱光跳动、扫描不到地址的排查方法。

VEML6030 环境光传感器模块产品图
0x48I2C 地址
16-bitALS ADC
lux输出单位
2.5-3.6V芯片供电
INT阈值中断
大纲
OVERVIEW

这块模块适合做什么

VEML6030 是 I2C 数字环境光传感器,内部包含光电二极管、低噪声放大器和 16 位 ADC。客户常用它做自动背光、智能照明、光照记录、室内外亮度判断等项目。

I2C 直读

主控只需要 VCC、GND、SDA、SCL 四根线;常见地址为 0x48。

输出 lux

代码读取 ALS 原始值后按配置换算成 lux,适合串口、OLED 或上位机显示。

阈值中断

模块的 INT 引脚可选,适合亮度超过/低于阈值时唤醒主控。

VIDEO

视频资料和分段说明

已检查视频:这条有声音,画面中文正常,不是乱码。网页使用压缩版,B 站保留高清 1080×1920 原文件。

分段时间

00:00模块外观和用途:I2C 输出环境光数据
00:15ESP32 接线:GPIO21/SDA、GPIO22/SCL
00:31ESP32 代码:Wire 直接读寄存器
00:51Arduino UNO 接线:A4/SDA、A5/SCL
01:06串口输出 RAW 和 lux 读数
01:21STM32 接线:PB7/SDA、PB6/SCL
01:38STM32 HAL 地址写法和读取思路
01:52常见问题:扫不到、饱和、弱光跳动
REAL PHOTO

产品图和模块识别

VEML6030 模块正面产品图
模块约 15mm × 15mm,常见丝印包含 VCC、GND、SDA、SCL、INT。
VEML6030 模块传感器位置细节图
中间小封装为 VEML6030 感光芯片,安装时避免被外壳、胶水、遮光片挡住。
WIRING

三种主控接线图

接线图按主控分开画,避免线交叉。调试时先只接 VCC、GND、SDA、SCL,确认能扫到 0x48 后再考虑 INT。

VEML6030 接 ESP32 I2C 接线图
VEML6030ESP32说明
VIN / VCC3V3推荐 3.3V 供电
GNDGND必须共地
SDAGPIO21I2C 数据线
SCLGPIO22I2C 时钟线
INTGPIO25可选,不用可悬空
VEML6030 接 Arduino UNO I2C 接线图
VEML6030Arduino UNO说明
VIN / VCC3.3V优先 3.3V
GNDGND必须共地
SDAA4 / SDAI2C 数据线
SCLA5 / SCLI2C 时钟线
INTD2可选
VEML6030 接 STM32 I2C 接线图
VEML6030STM32F103 I2C1说明
VIN / VCC3.3VSTM32 是 3.3V 逻辑
GNDGND必须共地
SDAPB7I2C1_SDA
SCLPB6I2C1_SCL
INTPA0可选外部中断
REGISTERS

寄存器和配置建议

寄存器地址用途
ALS_CONF0x00增益、积分时间、开关配置
ALS_WH0x01中断高阈值
ALS_WL0x02中断低阈值
PSM0x03省电模式
ALS0x04环境光原始数据
WHITE0x05白光通道数据
ALS_INT0x06中断状态
场景增益积分时间
普通室内/室外1/8 或 1/4100 ms
弱光环境1 或 2400-800 ms
强太阳光1/825-100 ms
CODE

Arduino / ESP32 / STM32 测试代码

下面代码使用 Wire.h 直接读写寄存器,不强制依赖第三方库。先用 I2C Scanner 看 0x48,再跑 lux 读取程序。

ESP32_Arduino_VEML6030.ino
#include <Wire.h>

#define VEML6030_ADDR 0x48
#define SDA_PIN 21
#define SCL_PIN 22
#define REG_ALS_CONF 0x00
#define REG_ALS      0x04

void write16(uint8_t reg, uint16_t value) {
  Wire.beginTransmission(VEML6030_ADDR);
  Wire.write(reg);
  Wire.write(value & 0xFF);
  Wire.write((value >> 8) & 0xFF);
  Wire.endTransmission();
}

uint16_t read16(uint8_t reg) {
  Wire.beginTransmission(VEML6030_ADDR);
  Wire.write(reg);
  Wire.endTransmission(false);
  Wire.requestFrom(VEML6030_ADDR, 2);
  uint16_t lsb = Wire.read();
  uint16_t msb = Wire.read();
  return (msb << 8) | lsb;
}

void setup() {
  Serial.begin(115200);
  Wire.begin(SDA_PIN, SCL_PIN);
  write16(REG_ALS_CONF, 0x0000);
  delay(120);
  Serial.println("VEML6030 ESP32 ready");
}

void loop() {
  uint16_t raw = read16(REG_ALS);
  float lux = raw * 0.0672;
  Serial.print("RAW: ");
  Serial.print(raw);
  Serial.print("  Lux: ");
  Serial.println(lux, 2);
  delay(1000);
}
I2C_Scanner.ino
#include <Wire.h>

void setup() {
  Serial.begin(115200);
  Wire.begin();
  Serial.println("I2C scan start");

  for (byte addr = 1; addr < 127; addr++) {
    Wire.beginTransmission(addr);
    if (Wire.endTransmission() == 0) {
      Serial.print("Found I2C device: 0x");
      if (addr < 16) Serial.print("0");
      Serial.println(addr, HEX);
    }
  }
}

void loop() {}

STM32 HAL 地址提醒

VEML6030 的 7 位地址是 0x48。STM32 HAL 常见写法需要左移一位:#define VEML6030_ADDR (0x48 << 1),也就是 0x90。

新手改代码看这几行

Arduino IDE 的 .ino 文件要放在同名文件夹里,例如 VEML6030_Test/VEML6030_Test.ino。如果还有 .h、.cpp 驱动文件,也一起放进这个文件夹。

要改的内容代码位置什么时候改
ESP32 SDA 引脚#define SDA_PIN 21你的 SDA 不是接 GPIO21 时
ESP32 SCL 引脚#define SCL_PIN 22你的 SCL 不是接 GPIO22 时
I2C 地址#define VEML6030_ADDR 0x48I2C 扫描到其它地址时才改
串口波特率Serial.begin(115200)串口监视器也要选 115200
UNO I2CWire.begin()UNO 固定 A4/A5,一般不用写 21/22

扫不到 0x48 时,不要先乱改地址。先检查供电、GND 共地、SDA/SCL 是否接反,再看程序引脚是否和实际接线一致。

Support

需要技术支持时,把这几项一起发来

复制下面这段填一下发给客服,我们一次就能定位,不用来回问。

【VEML6030 环境光传感器模块资料 技术支持】
主控型号:            (如 Arduino UNO / ESP32 / STM32)
供电接的是:          □ 3.3V   □ 5V
I2C Scanner 扫到的地址:
串口显示的内容:
用的是哪份代码:      □ 本页示例   □ 其他(请说明)
接线照片:            (请附一张能看清接线的照片)
DOWNLOADS

下载和官方资料