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.
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).
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.
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.
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:
Gostou? Ajude-nos a melhorar o blog atribuindo uma nota a este tutorial (estrelas no final do artigo) e visite nossa loja FILIPEFLOP!
Site: Blog FILIPEFLOP