Medidor de índice UV com Arduino

Medidor de índice UV com Arduino

Todos sabem dos danos à saúde que uma exposição prolongada ao sol pode causar, devido à radiação UV (Ultravioleta). Neste post vamos montar um medidor de índice UV com Arduino que vai ajudar você a monitorar esse nível de exposição com muito mais segurança. O sensor que vamos utilizar é o Sensor de Raio Ultravioleta UV UVM-30A.

Sensor raio ultravioleta UV UVM-30A

O medidor utiliza uma tabela criada em 1992 chamada UV Index (ou Índice Ultravioleta), que vai de 0 (baixo) a 11 (extremo), indicando o nível dos raios UV. Com esse nível podemos criar uma tabela mostrando as providências que devem ser tomadas para se proteger do sol (usar óculos escuros, protetor solar, roupas adequadas,  etc).

Indice UV - Proteção

O sensor UVM-30A é capaz de detectar raios UV com tamanho de onda entre 200 e 370mm, com uma rápida resposta. A saída de dados é analógica e utiliza um único pino, cujo valor pode ser lido pela maioria dos microcontroladores. O módulo aceita tensão de alimentação entre 3 e 5V.

Ligação do sensor UV ao Arduino

No nosso circuito vamos utilizar um display Oled I2C Azul Amarelo para mostrar a informação do índice UV. Esse display é o mesmo que utilizamos recentemente no nosso projeto de Bafômetro com Arduino. A saída do módulo UV (pino OUT) será ligada ao pino analógico A0 do Arduino.

Circuito Arduino Uno - Sensor UV

No nosso circuito colocamos o sensor UV na protoboard, mas você pode utilizar um cabo para melhor posicionamento do sensor.

Programa medidor de índice UV com Arduino

O programa lê o valor da porta analógica A0, converte esse valor em milivolts e faz a associação com a tabela mostrada abaixo, para exibir no display o valor do índice UV (UV Index) correspondente.

Tabela UV - mV

O display Oled utiliza a biblioteca U8Glib, disponível neste link. A leitura e conversão dos valores lidos do sensor UV será feita dentro do programa, sem o uso de bibliotecas.

//Programa: Medidor de Indice UV com Arduino
//Autor: FILIPEFLOP

#include "U8glib.h"

U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NO_ACK);

int pino_sensor = A0;
int valor_sensor = 0;
int posicao;
String UV_index = "0";

void draw()
{
  //Comandos graficos para o display devem ser colocados aqui
  u8g.drawRFrame(0, 16, 67, 48, 4);
  u8g.drawRFrame(67, 16, 61, 48, 4);
  u8g.drawRFrame(0, 0, 128, 16, 4);
  u8g.drawBox(11, 48, 45, 12 );
  u8g.setFont(u8g_font_8x13B);
  u8g.setColorIndex(0);
  u8g.drawStr( 13, 59, "INDEX");
  u8g.setColorIndex(1);
  u8g.drawStr( 24, 13, "Medidor UV");
  // Centraliza o valor na tela
  u8g.setFont(u8g_font_fur25);
  u8g.drawStr( 10, 45, "UV");
  //Ajusta posicao do valor do UV_Index
  if (UV_index.length() <= 1)
  {
    posicao = 88;
  }
  else
  {
    posicao = 78;
  }
  //Mostra valor do sensor
  u8g.setPrintPos(posicao, 52);
  u8g.print(UV_index);
}

void setup(void)
{
  Serial.begin(9600);
  pinMode(pino_sensor, INPUT);
  if ( u8g.getMode() == U8G_MODE_R3G3B2 ) {
    u8g.setColorIndex(255);     // white
  }
  else if ( u8g.getMode() == U8G_MODE_GRAY2BIT ) {
    u8g.setColorIndex(3);         // max intensity
  }
  else if ( u8g.getMode() == U8G_MODE_BW ) {
    u8g.setColorIndex(1);         // pixel on
  }
  else if ( u8g.getMode() == U8G_MODE_HICOLOR ) {
    u8g.setHiColorByRGB(255, 255, 255);
  }
}

void loop(void)
{
  Calcula_nivel_UV();
  //Chama a rotina de desenho na tela
  u8g.firstPage();
  do
  {
    draw();
  }
  while ( u8g.nextPage() );
  delay(150);
}

void Calcula_nivel_UV()
{
  valor_sensor = analogRead(pino_sensor);
  //Calcula tensao em milivolts
  int tensao = (valor_sensor * (5.0 / 1023.0)) * 1000;
  //Compara com valores tabela UV_Index
  if (tensao > 0 && tensao < 50)
  {
    UV_index = "0";
  }
  else if (tensao > 50 && tensao <= 227)
  {
    UV_index = "0";
  }
  else if (tensao > 227 && tensao <= 318)
  {
    UV_index = "1";
  }
  else if (tensao > 318 && tensao <= 408)
  {
    UV_index = "2";
  }
  else if (tensao > 408 && tensao <= 503)
  {
    UV_index = "3";
  }
  else if (tensao > 503 && tensao <= 606)
  {
    UV_index = "4";
  }
  else if (tensao > 606 && tensao <= 696)
  {
    UV_index = "5";
  }
  else if (tensao > 696 && tensao <= 795)
  {
    UV_index = "6";
  }
  else if (tensao > 795 && tensao <= 881)
  {
    UV_index = "7";
  }
  else if (tensao > 881 && tensao <= 976)
  {
    UV_index = "8";
  }
  else if (tensao > 976 && tensao <= 1079)
  {
    UV_index = "9";
  }
  else if (tensao > 1079 && tensao <= 1170)
  {
    UV_index = "10";
  }
  else if (tensao > 1170)
  {
    UV_index = "11";
  }
}

Abaixo temos uma imagem do circuito em funcionamento, mostrando o índice UV em uma ensolarada manhã de inverno:

Medidor UV Arduino

Gostou? Ajude-nos a melhorar o blog atribuindo uma nota a este tutorial (estrelas no final do artigo) e visite nossa loja FILIPEFLOP!

28
Medidor de índice UV com Arduino
24 votos, 4.75 classificação média (94% pontuação)

Formado em Ciência da Computação pela Universidade de Mogi das Cruzes, atualmente responsável pelo departamento técnico da FILIPEFLOP.

Compartilhe este Post

18 Comentários

  1. João - 12 de novembro de 2016

    A lógica de calcular o índice UV também é válida no sensor GY-ML8511?

  2. Renan Hecht - 10 de novembro de 2016

    Bom dia gostaria de uma ajuda, porque meu sensor só marca 0? não altera a marcação.

  3. raul guillermo - 18 de outubro de 2016

    me aparece esto al compilar el programa en arduino …. me podria ayudar ??
    exit status 1
    stray ‘\302′ in program

  4. yuri chagas - 30 de junho de 2016

    teria como programar esse mesmo sensor pra medir Lumens ?

  5. Antonio Cesario - 19 de maio de 2016

    Excelente projeto, mas voce teria algum exemplo utilizando um RaspBerry Pi com TFT ?

    Cesario

  6. O que é Internet das Coisas? - Carreira em TI - 9 de março de 2016

    […] pra montar o sistema. O blog mostra também alguns projetos mais avançados – por exemplo, um medidor de índice ultravioleta, para ver a radiação do sol no […]

  7. Iolanda Neves - 25 de fevereiro de 2016

    olá, galera
    gostariamos de saber como poderíamos juntar este circuito com o circuito da estação meteorológica.
    desde já agradecida.

  8. Rodrigo - 18 de fevereiro de 2016

    Boa tarde,

    Estou interessado em comprar 7 módulos deste sensor UV, para usar em um projeto do meu trabalho. No entanto precisaria de um código onde ao invés do resultado aparecer em um display … ele apenas faça um serial print .. mandando os resultados em numeros de 1 a 10… alguém pode ajudar?? acho que é até mais simples do que este… apenas ler o sensor e escrever no serial monitor…

    abç…

  9. Donizeti - 7 de dezembro de 2015

    Boa Noite !
    Este módulo pode ser usado externo ? Com um domo ?
    Também pode ser ligado em qualquer porta analogia ou somente na A0..
    Uso um Arduino 2560.
    Obrigado .

  10. Guilherme - 25 de novembro de 2015

    Qual melhor método para fazer a plotagem desses valores num grafico?

  11. André Luiz Canela - 4 de novembro de 2015

    Olá, muito bom o post, adorei o projeto, só que estou em dificuldade em achar o Display Oled I2C Azul Amarelo, Gostaria de ajuda para programar em um LCDC 1602BYY.
    Obrigado!

  12. Edward Clemente - 13 de outubro de 2015

    Bom,simples e funcional!Nota 10.

  13. Carlos Alexandre - 13 de outubro de 2015

    Muito interessante o projeto, pode ser facilmente adaptado para operar em uma estação.
    Vlw!

Deixe uma resposta