En este tutorial aprenderás a construir un medidor de índice UV con un sensor de luz UV VEML6070, un OLED y un Arduino Uno.
El UV Index es una medida de la intensidad de la radiación ultravioleta (UV) del sol. El propósito del índice UV es ayudar a las personas a protegerse de la radiación UV, que puede causar quemaduras solares, envejecimiento de la piel, daño al ADN, cáncer de piel, inmunosupresión y daño ocular.
Nuestro medidor de índice UV leerá la intensidad de la luz UV de un sensor VEML6070 y la mostrará junto con un nivel de riesgo en una pantalla OLED para mantenerte informado sobre el riesgo UV actual. Para contexto, las recomendaciones del Cancer Council son consultar el índice UV cuando estás:
- planeando o participando en una actividad o evento al aire libre
- realizando actividades recreativas como correr, nadar, ciclismo o deportes en equipo
- viendo un deporte como espectador, como tenis o cricket
- trabajando al aire libre, o siendo responsable de trabajadores al aire libre, o
- responsable de niños pequeños y sus actividades al aire libre.
Comencemos con este proyecto y echemos un vistazo primero a la lista de piezas necesarias.
Piezas necesarias
Usé un Arduino Uno para este proyecto, pero cualquier otro Arduino o cualquier placa ESP32/ESP8266 también funcionará. Ten en cuenta que los sensores VEML6070 pueden ser bastante caros. Listé el más barato que encontré en Amazon, pero te recomiendo que busques un poco y compares precios.

Sensor de luz UV VEML6070

Arduino Uno

Cable USB para Arduino UNO

Juego de cables Dupont

Protoboard

Pantalla OLED
Makerguides is a participant in affiliate advertising programs designed to provide a means for sites to earn advertising fees by linking to Amazon, AliExpress, Elecrow, and other sites. As an Affiliate we may earn from qualifying purchases.
El sensor de luz UV VEML6070
El sensor de luz UV VEML6070 es un sensor digital que mide la intensidad de la luz ultravioleta (UV). Usa un fotodiodo para convertir la luz UV en una señal eléctrica, que luego es procesada por un circuito interno para proporcionar una salida digital. Tiene una sensibilidad máxima para luz UVA a una longitud de onda de 355 nm. El gráfico a continuación muestra la respuesta espectral del VEML6070:

El sensor VEML6070 está diseñado para integrarse fácilmente en varios dispositivos y proyectos electrónicos debido a su tamaño pequeño y bajo consumo de energía. Tiene un modo de apagado que reduce el consumo a menos de 1 μA.
Diagrama de bloques
El sensor se comunica con microcontroladores mediante una interfaz I2C, lo que lo hace compatible con placas populares como Arduino y ESP32. La imagen a continuación muestra el diagrama de bloques de los componentes internos y los pines IO:

SDA y SCL son los pines para la interfaz I2C. Vdd y GND son para la alimentación y el sensor funciona con 2.7 V a 5.5 V. El VEML6070 tiene compensación de temperatura que asegura una sensibilidad lineal a la luz solar UV. La sensibilidad puede ajustarse mediante una resistencia externa conectada a RSET. El pin de reconocimiento activo (ACK) permite que el sensor envíe una señal de alerta de índice UV si se supera un umbral. Para más detalles consulta la hoja de datos:
Este sensor se usa comúnmente en aplicaciones donde es importante monitorear la exposición a la luz UV, como en dispositivos portátiles, medidores de índice UV y sistemas de esterilización UV. Su alta sensibilidad y precisión lo hacen una herramienta valiosa para medir niveles de luz UV tanto en interiores como en exteriores.
Placa breakout
Si quieres usar el sensor crudo con un microcontrolador necesitarás algunas piezas extra (resistencias, condensadores). Consulta el circuito típico de aplicación del VEML6070 según la hoja de datos.

Para evitar complicaciones, puedes conseguir placas breakout que ya tienen estas piezas integradas. La imagen a continuación muestra una placa breakout típica para el VEML6070, con la interfaz I2C (SCL, SDA), alimentación (VCC, GND) y la salida de reconocimiento (ACK).

En lo siguiente usaremos una placa breakout así para conectar el sensor VEML6070 a un Arduino.
Conectando VEML6070 a Arduino
Gracias a la interfaz I2C, conectar el sensor VEML6070 a un Arduino Uno es muy fácil. Solo conecta los pines SCL y SDA de la placa breakout VEML6070 a los pines correspondientes del Arduino como se muestra abajo.

Luego, conecta tierra y VCC. Puedes usar 5V o 3.3V para VCC; yo usé 3.3V.
Y eso es todo lo que necesitas para conectar el sensor.
Código para leer índice UV del VEML6070
En esta sección escribiremos un pequeño código para probar el sensor. Primero necesitaremos instalar una librería adecuada.
Hay tres librerías para leer datos del sensor VEML6070. Está la librería Adafruit_VEML6070, la librería Seeed_VEML6070 y la librería arduino-VEML6070. Usé la última, ya que es fácil de usar y calcula el índice y nivel de riesgo. Puedes instalarla como siempre vía Library Manager y tras la instalación debería verse así:

Ahora podemos escribir algo de código. El siguiente ejemplo muy simple lee la intensidad UV medida por el sensor VEML6070 y la imprime en el Monitor Serial:
#include "VEML6070.h"
void setup() {
Serial.begin(9600);
VEML.begin();
}
void loop() {
uint16_t uvs = VEML.read_uvs_step();
Serial.print("UVS:");
Serial.println(uvs);
delay(1000);
}
Si subes este código y abres el Serial Plotter, deberías ver aparecer una curva para UVS. Y cuando expongas el sensor a una fuente de luz (por ejemplo, una linterna) deberías ver un pico:

Como ves, leer datos del sensor VEML6070 es muy sencillo. Para hacerlo un poco más interesante, añadiremos un OLED en la siguiente sección.
Añadiendo un OLED
En lugar de mostrar los datos de intensidad UV en el Monitor Serial, sería mejor mostrarlos en una pantalla separada. Esto nos permitiría construir un medidor de índice UV portátil. En esta sección, por tanto, añadimos un OLED al circuito y mostramos los datos UV en él.
Conectando OLED a Arduino
Como el OLED también es un dispositivo I2C, conectarlo es sencillo. Simplemente conectamos SDA y SCL a los mismos pines a los que está conectado el sensor VEML6070. Como el OLED funciona a 3.3V, también podemos compartir las líneas de alimentación. La imagen a continuación muestra el cableado completo.

Si tienes alguna dificultad con el OLED, echa un vistazo al tutorial How to Interface the SSD1306 I2C OLED Graphic Display With Arduino.
Y así es como se ve el circuito funcionando en la realidad 😉

Código para mostrar índice UV en OLED
En esta sección escribiremos el código para mostrar los datos UV en el OLED. Para controlar el OLED usaremos la librería Adafruit_SSD1306. Tendrás que instalarla vía Library Manager y tras la instalación debería verse así:

Y aquí está el código completo. Échale un vistazo primero y luego discutimos sus detalles.
#include "VEML6070.h"
#include "Adafruit_SSD1306.h"
Adafruit_SSD1306 oled(128, 64, &Wire, -1);
void oled_init() {
oled.begin(SSD1306_SWITCHCAPVCC, 0x3C);
oled.clearDisplay();
oled.setTextSize(2);
oled.setTextColor(WHITE);
}
void centered(const char* text, int y) {
int16_t x1, y1;
uint16_t w, h;
oled.getTextBounds(text, 0, 0, &x1, &y1, &w, &h);
oled.setCursor(64 - w / 2, y);
oled.print(text);
}
void display_uvs() {
static char text[30];
uint16_t uvs = VEML.read_uvs_step();
int risk_level = VEML.convert_to_risk_level(uvs);
char* risk = VEML.convert_to_risk_char(risk_level);
oled.clearDisplay();
centered(risk, 15);
sprintf(text, "%d", uvs);
centered(text, 45);
oled.display();
}
void setup() {
oled_init();
VEML.begin();
}
void loop() {
display_uvs();
delay(1000);
}
El código anterior lee la intensidad de luz UV del sensor y la muestra junto con un nivel de riesgo en la pantalla OLED, donde los niveles de radiación UV son:
- bajo (1-2)
- moderado (3-5)
- alto (6-7)
- muy alto (8-10)
- extremo (11 y más).
Librerías e inicialización de la pantalla
Comenzamos incluyendo las librerías necesarias para el sensor VEML6070 y la pantalla OLED Adafruit SSD1306. Luego inicializamos la pantalla OLED en la función oled_init(). Esta función configura la pantalla, la limpia, establece el tamaño del texto y el color del texto.
#include "VEML6070.h"
#include "Adafruit_SSD1306.h"
Adafruit_SSD1306 oled(128, 64, &Wire, -1);
void oled_init() {
oled.begin(SSD1306_SWITCHCAPVCC, 0x3C);
oled.clearDisplay();
oled.setTextSize(2);
oled.setTextColor(WHITE);
}
Ten en cuenta que la dirección I2C para la pantalla OLED está configurada en 0x3C en oled.begin(). La mayoría de estos pequeños OLED usan esta dirección, pero la tuya podría ser diferente. Si no ves nada en el OLED, probablemente tenga una dirección I2C distinta y tendrás que cambiar la dirección pasada a oled.begin(). Si no sabes la dirección I2C, consulta el tutorial How to Interface the SSD1306 I2C OLED Graphic Display With Arduino.
Funciones de pantalla
La función centered() se usa para imprimir texto centrado en la pantalla OLED en una coordenada y especificada. La función display_uvs() lee la intensidad de luz UV del sensor, calcula el nivel de riesgo y lo muestra junto con la intensidad UV en la pantalla OLED.
void centered(const char* text, int y) {
// Function to center text on OLED display
}
void display_uvs() {
// Function to display UV index and risk level on OLED display
}
Función setup
En la función setup(), inicializamos la comunicación serial para depuración, inicializamos la pantalla OLED y comenzamos la comunicación con el sensor VEML6070.
void setup() {
oled_init();
VEML.begin();
}
Función loop
La función loop() llama continuamente a la función display_uvs() para actualizar y mostrar el índice UV y el nivel de riesgo en la pantalla OLED. Luego añade un retardo de 1 segundo antes de la siguiente actualización.
void loop() {
display_uvs();
delay(1000);
}
Salida en OLED
Si subes el código, deberías ver la siguiente salida en el OLED. La línea superior muestra el nivel de riesgo y el número debajo es la intensidad UV.

Conclusiones
Este tutorial te mostró cómo construir un medidor de índice UV con un sensor de luz UV VEML6070. Usamos un Arduino Uno y una pantalla OLED en este proyecto. Pero podrías usar fácilmente un ESP32 alimentado por batería y una pantalla e-Paper para construir un medidor de índice UV portátil y de bajo consumo.
Alternativamente, un medidor de índice UV también sería un buen complemento para una estación meteorológica para advertir sobre alta exposición a luz UV. Para detalles técnicos sobre cómo realizar esto, consulta los tutoriales Simple ESP32 Internet Weather Station y Weather Station on e-Paper Display.
Finalmente, si solo quieres medir luz (y no específicamente luz UV), puedes usar el sensor BH1750. Cómo usarlo está descrito en el tutorial: Ambient Light Sensor BH1750 with Arduino.
Si tienes alguna otra pregunta, no dudes en preguntar.
¡Feliz bricolaje ; )

