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

FAQ

常见问题和客服话术

扫不到 0x48

先确认 VCC/GND,SDA/SCL 是否接反,ESP32 代码是否用了对应引脚;UNO 用 A4/A5,STM32 I2C1 常用 PB7/PB6。

读数一直 0

先跑 I2C Scanner;确认模块没有遮光,配置寄存器写入成功,串口波特率为 115200。

强光下读数很大或饱和

降低增益,缩短积分时间。强太阳光下建议先用 1/8 增益和 25-100 ms 积分时间。

弱光下读数跳动

提高积分时间到 400 ms 或 800 ms,多次平均后再显示,线太长时也要检查 I2C 上拉和干扰。

可直接回复客户

您好,这个 VEML6030 是 I2C 环境光传感器,常见地址是 0x48。建议先只接 VCC、GND、SDA、SCL 四根线,用 I2C 扫描程序确认能扫到 0x48,再运行 lux 读取代码。强光读数饱和就降低增益、缩短积分时间;弱光跳动就加长积分时间并做平均。

DOWNLOADS

下载和官方资料