这块模块适合做什么
VEML6030 是 I2C 数字环境光传感器,内部包含光电二极管、低噪声放大器和 16 位 ADC。客户常用它做自动背光、智能照明、光照记录、室内外亮度判断等项目。
I2C 直读
主控只需要 VCC、GND、SDA、SCL 四根线;常见地址为 0x48。
输出 lux
代码读取 ALS 原始值后按配置换算成 lux,适合串口、OLED 或上位机显示。
阈值中断
模块的 INT 引脚可选,适合亮度超过/低于阈值时唤醒主控。
视频资料和分段说明
已检查视频:这条有声音,画面中文正常,不是乱码。网页使用压缩版,B 站保留高清 1080×1920 原文件。
分段时间
产品图和模块识别
三种主控接线图
接线图按主控分开画,避免线交叉。调试时先只接 VCC、GND、SDA、SCL,确认能扫到 0x48 后再考虑 INT。
| VEML6030 | ESP32 | 说明 |
|---|---|---|
| VIN / VCC | 3V3 | 推荐 3.3V 供电 |
| GND | GND | 必须共地 |
| SDA | GPIO21 | I2C 数据线 |
| SCL | GPIO22 | I2C 时钟线 |
| INT | GPIO25 | 可选,不用可悬空 |
| VEML6030 | Arduino UNO | 说明 |
|---|---|---|
| VIN / VCC | 3.3V | 优先 3.3V |
| GND | GND | 必须共地 |
| SDA | A4 / SDA | I2C 数据线 |
| SCL | A5 / SCL | I2C 时钟线 |
| INT | D2 | 可选 |
| VEML6030 | STM32F103 I2C1 | 说明 |
|---|---|---|
| VIN / VCC | 3.3V | STM32 是 3.3V 逻辑 |
| GND | GND | 必须共地 |
| SDA | PB7 | I2C1_SDA |
| SCL | PB6 | I2C1_SCL |
| INT | PA0 | 可选外部中断 |
寄存器和配置建议
| 寄存器 | 地址 | 用途 |
|---|---|---|
| ALS_CONF | 0x00 | 增益、积分时间、开关配置 |
| ALS_WH | 0x01 | 中断高阈值 |
| ALS_WL | 0x02 | 中断低阈值 |
| PSM | 0x03 | 省电模式 |
| ALS | 0x04 | 环境光原始数据 |
| WHITE | 0x05 | 白光通道数据 |
| ALS_INT | 0x06 | 中断状态 |
| 场景 | 增益 | 积分时间 |
|---|---|---|
| 普通室内/室外 | 1/8 或 1/4 | 100 ms |
| 弱光环境 | 1 或 2 | 400-800 ms |
| 强太阳光 | 1/8 | 25-100 ms |
Arduino / ESP32 / STM32 测试代码
下面代码使用 Wire.h 直接读写寄存器,不强制依赖第三方库。先用 I2C Scanner 看 0x48,再跑 lux 读取程序。
#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);
}
#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。
常见问题和客服话术
扫不到 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 读取代码。强光读数饱和就降低增益、缩短积分时间;弱光跳动就加长积分时间并做平均。