Neste tutorial, vais aprender a construir um Medidor de Índice UV com um sensor de luz UV VEML6070, um OLED e um Arduino Uno.
O UV Index é uma medida da intensidade da radiação ultravioleta (UV) do sol. O objetivo do índice UV é ajudar as pessoas a protegerem-se da radiação UV, que pode causar queimaduras solares, envelhecimento da pele, danos no DNA, cancro de pele, imunossupressão e danos nos olhos.
O nosso Medidor de Índice UV vai ler a intensidade da luz UV de um sensor VEML6070 e mostrar essa informação juntamente com um nível de risco num ecrã OLED para te manter informado sobre o risco UV atual. Para contexto, as recomendações do Cancer Council são verificar o Índice UV quando estiveres:
- a planear ou a participar numa atividade ou evento ao ar livre
- a realizar atividades recreativas como corrida, natação, ciclismo ou desportos de equipa
- a assistir a um desporto como espectador, como ténis ou críquete
- a trabalhar ao ar livre, ou a ser responsável por trabalhadores ao ar livre, ou
- a ser responsável por crianças pequenas e as suas atividades ao ar livre.
Vamos começar este projeto e dar uma vista de olhos à lista de peças necessárias primeiro.
Peças Necessárias
Usei um Arduino Uno para este projeto, mas qualquer outro Arduino ou placa ESP32/ESP8266 também funciona. Note que os sensores VEML6070 podem ser bastante caros. Listei o mais barato que encontrei na Amazon, mas recomendo que pesquises um pouco e compares preços.

Sensor de Luz UV VEML6070

Arduino Uno

Cabo USB para Arduino UNO

Conjunto de fios Dupont

Breadboard

Ecrã 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.
O Sensor de Luz UV VEML6070
O sensor de luz UV VEML6070 é um sensor digital que mede a intensidade da luz ultravioleta (UV). Usa um fotodíodo para converter a luz UV num sinal elétrico, que é depois processado por um circuito interno para fornecer uma saída digital. Tem sensibilidade máxima para luz UVA com um comprimento de onda de 355nm. O gráfico abaixo mostra a Resposta Espectral do VEML6070:

O sensor VEML6070 foi projetado para ser facilmente integrado em vários dispositivos eletrónicos e projetos devido ao seu tamanho pequeno e baixo consumo de energia. Tem um modo de desligamento que reduz o consumo para menos de 1 μA.
Diagrama de Blocos
O sensor comunica com microcontroladores via interface I2C, tornando-o compatível com placas populares como Arduino e ESP32. A imagem abaixo mostra o diagrama de blocos dos componentes internos e os pinos IO:

SDA e SCL são os pinos para a interface I2C. Vdd e GND são para a alimentação e o sensor funciona entre 2.7 V e 5.5 V. O VEML6070 tem compensação de temperatura que assegura uma sensibilidade linear à luz solar UV. A sensibilidade pode ser ajustada por um resistor externo ligado ao RSET. O pino de reconhecimento ativo (ACK) permite que o sensor envie um sinal de alerta de Índice UV se um limiar for ultrapassado. Para mais detalhes, consulta o datasheet:
Este sensor é comummente usado em aplicações onde monitorizar a exposição à luz UV é importante, como em dispositivos vestíveis, medidores de índice UV e sistemas de esterilização UV. A sua alta sensibilidade e precisão fazem dele uma ferramenta valiosa para medir níveis de luz UV em ambientes interiores e exteriores.
Placa Breakout
Se quiseres usar o sensor cru com um microcontrolador, vais precisar de algumas peças extra (resistores, condensadores). Vê o Circuito Típico de Aplicação do VEML6070 no datasheet.

Para evitar complicações, podes adquirir placas breakout que já têm estas peças integradas. A imagem abaixo mostra uma placa breakout típica para o VEML6070, com a interface I2C (SCL, SDA), alimentação (VCC, GND) e a saída de reconhecimento (ACK).

De seguida, vamos usar uma placa breakout destas para ligar o sensor VEML6070 a um Arduino.
Ligação do VEML6070 ao Arduino
Devido à interface I2C, ligar o sensor VEML6070 a um Arduino Uno é muito fácil. Basta ligar os pinos SCL e SDA da placa breakout do VEML6070 aos pinos correspondentes no Arduino, como mostrado abaixo.

De seguida, liga o terra e o VCC. Podes usar 5V ou 3.3V para o VCC; eu usei 3.3V.
E é tudo o que precisas para ligar o sensor.
Código para ler o Índice UV do VEML6070
Nesta secção vamos escrever um pequeno código para testar o sensor. Primeiro, precisamos de instalar uma biblioteca adequada.
Existem três bibliotecas para ler dados do sensor VEML6070. Há a biblioteca Adafruit_VEML6070, a biblioteca Seeed_VEML6070 e a biblioteca arduino-VEML6070. Usei a última, pois é fácil de usar e calcula o índice e nível de risco. Podes instalá-la normalmente via Library Manager e, após a instalação, deverá aparecer assim:

Agora podemos escrever algum código. O exemplo muito simples a seguir lê a intensidade UV medida pelo sensor VEML6070 e imprime-a no 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);
}
Se carregares este código e abrires o Serial Plotter, deverás ver uma curva para UVS a aparecer. E quando expuseres o sensor a uma fonte de luz (ex. uma lanterna), deverás ver um pico:

Como podes ver, ler dados do sensor VEML6070 é muito simples. Para tornar as coisas um pouco mais interessantes, vamos adicionar um OLED na próxima secção.
Adicionar um OLED
Em vez de mostrar os dados de intensidade UV no Monitor Serial, seria mais agradável exibi-los num ecrã separado. Isso permitiria construir um Medidor de Índice UV portátil. Nesta secção, vamos portanto adicionar um OLED ao circuito e mostrar os dados UV nele.
Ligação do OLED ao Arduino
Como o OLED também é um dispositivo I2C, a ligação é direta. Ligamos simplesmente SDA e SCL aos mesmos pinos onde o sensor VEML6070 está ligado. Como o OLED funciona a 3.3V, podemos também partilhar as linhas de alimentação. A imagem abaixo mostra a ligação completa.

Se tiveres dificuldades com o OLED, vê o tutorial How to Interface the SSD1306 I2C OLED Graphic Display With Arduino.
E aqui está como o circuito a funcionar se apresenta na realidade 😉

Código para mostrar o Índice UV no OLED
Nesta secção vamos escrever o código para mostrar os dados UV no OLED. Para controlar o OLED vamos usar a biblioteca Adafruit_SSD1306. Terás de a instalar via Library Manager e, após a instalação, deverá aparecer assim:

E aqui está o código completo. Vê primeiro e depois discutimos os detalhes.
#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);
}
O código acima lê a intensidade da luz UV do sensor e mostra-a juntamente com um nível de risco no ecrã OLED, onde os níveis de radiação UV são:
- baixo (1-2)
- moderado (3-5)
- alto (6-7)
- muito alto (8-10)
- extremo (11 ou mais).
Bibliotecas e Inicialização do Ecrã
Começamos por incluir as bibliotecas necessárias para o sensor VEML6070 e para o ecrã OLED Adafruit SSD1306. Depois inicializamos o ecrã OLED na função oled_init(). Esta função configura o ecrã, limpa-o, define o tamanho do texto e a cor do 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);
}
Note que o endereço I2C para o ecrã OLED está definido para 0x3C na oled.begin(). A maioria destes pequenos OLEDs usa este endereço, mas o teu pode ser diferente. Se não vires nada no OLED, provavelmente tem um endereço I2C diferente e terás de alterar o endereço passado para oled.begin(). Se não souberes o endereço I2C, vê o tutorial How to Interface the SSD1306 I2C OLED Graphic Display With Arduino.
Funções do Ecrã
A função centered() é usada para imprimir texto centrado no ecrã OLED numa coordenada y especificada. A função display_uvs() lê a intensidade da luz UV do sensor, calcula o nível de risco e mostra-o juntamente com a intensidade UV no ecrã 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
}
Função Setup
Na função setup(), inicializamos a comunicação serial para depuração, inicializamos o ecrã OLED e iniciamos a comunicação com o sensor VEML6070.
void setup() {
oled_init();
VEML.begin();
}
Função Loop
A função loop() chama continuamente a função display_uvs() para atualizar e mostrar o índice UV e o nível de risco no ecrã OLED. Depois adiciona um atraso de 1 segundo antes da próxima atualização.
void loop() {
display_uvs();
delay(1000);
}
Saída no OLED
Se carregares o código, deverás ver a seguinte saída no OLED. A linha superior mostra o nível de risco e o número abaixo é a intensidade UV.

Conclusões
Este tutorial mostrou como construir um Medidor de Índice UV com um sensor de luz UV VEML6070. Usámos um Arduino Uno e um ecrã OLED neste projeto. Mas poderias facilmente usar um ESP32 alimentado a bateria e um ecrã e-Paper para construir um medidor de índice UV portátil e de baixo consumo.
Alternativamente, um Medidor de Índice UV seria também uma boa adição a uma Estação Meteorológica para alertar sobre exposição elevada à luz UV. Para detalhes técnicos sobre como realizar isto, vê os tutoriais Simple ESP32 Internet Weather Station e Weather Station on e-Paper Display.
Finalmente, se só quiseres medir luz (e não especificamente luz UV), podes usar o sensor BH1750. Como usá-lo está descrito no tutorial: Ambient Light Sensor BH1750 with Arduino.
Se tiveres outras perguntas, não hesites em perguntar.
Boas experiências ; )

