Arduino Example Snippet
#include <Wire.h>
#include "veml6040.h"
#define LED_PIN P1_IO2
#define LED_BRIGHTNESS 1 // 0-255
VEML6040 sensor;
float rTrim = 1.0, gTrim = 1.0, bTrim = 1.0;
void setup() {
Serial.begin(115200);
delay(1000);
pinMode(LED_PIN, OUTPUT);
analogWrite(LED_PIN, LED_BRIGHTNESS);
Wire.begin();
sensor.begin();
sensor.setConfiguration(VEML6040_IT_160MS + VEML6040_AF_AUTO + VEML6040_SD_ENABLE);
delay(1000);
// ---- Auto white balance ----
Serial.println("Hold a WHITE object under the sensor...");
delay(3000);
uint16_t r = sensor.getRed();
uint16_t g = sensor.getGreen();
uint16_t b = sensor.getBlue();
uint16_t maxC = max(r, max(g, b));
rTrim = (float)maxC / r;
gTrim = (float)maxC / g;
bTrim = (float)maxC / b;
Serial.println("Calibrated! Point at colors now.");
Serial.println();
}
void loop() {
float r = sensor.getRed() * rTrim;
float g = sensor.getGreen() * gTrim;
float b = sensor.getBlue() * bTrim;
uint16_t w = sensor.getWhite();
Serial.print("-> ");
Serial.println(detectColor(r, g, b, w));
delay(300);
}
const char* detectColor(float r, float g, float b, uint16_t w) {
if (w < 300) return "BLACK / nothing";
float maxC = max(r, max(g, b));
float minC = min(r, min(g, b));
// After white balance, R ~= G ~= B means white/gray
if ((maxC - minC) / maxC < 0.15) {
return (w > 4000) ? "WHITE" : "GRAY";
}
// Dominant channel decides the family
if (r >= g && r >= b) {
if (g > b * 1.3) return "ORANGE / YELLOW";
if (b > g * 1.3) return "PINK / MAGENTA";
return "RED";
}
if (g >= r && g >= b) {
if (r > b * 1.3) return "YELLOW";
return "GREEN";
}
// blue is max
if (g > r * 1.3) return "CYAN";
if (r > g * 1.3) return "PURPLE";
return "BLUE";
}