Monte um medidor de índice UV com Arduino
O verão foi embora mas você não vai deixar de se cuidar, certo? Um das maiores preocupações das pessoas deveria ser com a exposição ao sol e os danos que os raios ultravioleta podem causar. Para ajudar você a medir isso, hoje vamos construir um medidor de UV com Arduino e Sensor de Raio Ultravioleta UV Guva-S12SD, exibindo o valor do índice em um display Oled 128×32.
Antes de começar o nosso projeto, vamos ver qual a importância de medir e ficar atento ao índice UV.
O índice UV
O índice UV, ou índice ultravioleta, é uma escala relativamente recente (criada em 1992) e mede a força dos raios ultravioleta em um determinado lugar e tempo. É um padrão internacional desenvolvido por cientistas canadenses e é aprovada e padronizada pela Organização Mundial de Saúde e pela Organização Meteorológica Mundial.
A escala ou índice UV é utilizada para previsões diárias e em muitos sites e serviços meteorológicos encontramos a previsão de incidência de raios UV ao longo do dia, o que pode ajudar em muito a prevenção, por exemplo, de câncer de pele.
Importante destacar que evitar a exposição aos raios UV mais intensos é apenas uma das formas de se prevenir de problemas de pele, ok? Até porque mesmo em dias nublados devemos fazer uso de protetor solar, chapéu, roupas adequadas, etc, pois mesmo nesses dias temos a incidência desse tipo de raio.
Medidor de índice UV com Arduino
O nosso medidor utilizar uma placa Arduino Uno e um Sensor de Raio Ultravioleta UV Guva-S12SD como esse da imagem abaixo. Ele é um sensor relativamente compacto, conta com furos para fixação e tem somente 1 pino de conexão com o microcontrolador:
No pino Vcc podemos usar uma alimentação de 2.2 a 5V (o que é bem interessante, pois permite que o módulo seja alimentado por pilhas). O GND é o conhecido “terra/negativo” e SIG é o pino de sinal, que no nosso circuito será conectado ao pino analógico A0 do microcontrolador.
O circuito de conexão ao Arduino Uno fica então desse jeito, com o módulo e o display compartilhando a alimentação de 5V:
Para exibição dos dados do nosso medidor de UV vamos usar um display Oled I2C 128×32 de 0,91″, outro componente de fácil conexão no Arduino e que como podemos ver no circuito acima está conectado nos pinos analógicos A4 (SDA) e A5 (SCL).
Programa medidor UV com Arduino
No programa abaixo vamos usar duas bibliotecas da Adafruit: a GFX e a SSD1306, instalando as duas a partir da IDE do Arduino.
Primeiro vamos instalar a SSD1306. Na IDE do Arduino, vá até o menu Sketch->Incluir Biblioteca->Gerenciar Bibliotecas e procure por SSD1306 clicando em seguida em Instalar, conforme a imagem abaixo:
Em seguida faça a mesma coisa com a biblioteca GFX:
O programa abaixo faz a leitura da porta analógica A0, onde está conectado o sensor de raio UV, e calcula o índice UV correspondente. Depois apresenta o valor do índice no display a cada 5 segundos:
//Programa: Sensor UV Guva s12sd Arduino e display Oled 128x32 //Autor: Arduino e Cia #include <SPI.h> #include <Wire.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> //Resolucao do display Oled (em pixels) #define SCREEN_WIDTH 128 #define SCREEN_HEIGHT 32 #define OLED_RESET 4 // Reset pin # (or -1 if sharing Arduino reset pin) Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); int indiceUV; void setup() { Serial.begin(9600); //Checagem do display no endereço I2C 0x3C if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { Serial.println(F("SSD1306 allocation failed")); for (;;); //Para o programa } //Inicializa o display Oled display.display(); delay(2000); } void loop() { //Leitura dos dados do sensor int leitura_porta = analogRead(A0); //De acordo com a leitura define o indice UV corrrspondente if (leitura_porta <= 10) { indiceUV = 0; } else if (leitura_porta > 10 && leitura_porta <= 46) { indiceUV = 1; } else if (leitura_porta > 46 && leitura_porta <= 65) { indiceUV = 2; } else if (leitura_porta > 65 && leitura_porta <= 83) { indiceUV = 3; } else if (leitura_porta > 83 && leitura_porta <= 103) { indiceUV = 4; } else if (leitura_porta > 103 && leitura_porta <= 124) { indiceUV = 5; } else if (leitura_porta > 124 && leitura_porta <= 142) { indiceUV = 6; } else if (leitura_porta > 142 && leitura_porta <= 162) { indiceUV = 7; } else if (leitura_porta > 162 && leitura_porta <= 180) { indiceUV = 8; } else if (leitura_porta > 180 && leitura_porta <= 200) { indiceUV = 9; } else if (leitura_porta > 200 && leitura_porta <= 221) { indiceUV = 10; } else { indiceUV = 11; } //Mostra os valores no Serial Monitor Serial.print("Valor porta: "); Serial.print(leitura_porta); Serial.print(" - Indice: "); Serial.println(indiceUV); //Apaga o display display.clearDisplay(); //Desenha retangulos display.fillRect(46, 0, 81, 32, SSD1306_INVERSE); display.drawRect(0, 0, 45, 32, SSD1306_WHITE); display.display(); //Define tamanho da fonte display.setTextSize(1); //Texto com letras em branco display.setTextColor(SSD1306_WHITE); //Posicao do cursor display.setCursor(4, 3); display.println(F("INDICE")); display.setCursor(12, 14); display.setTextSize(2); display.println(F("UV")); display.setTextSize(4); //Texto invertido, com texto preto e fundo branco display.setTextColor(SSD1306_BLACK, SSD1306_WHITE); display.setCursor(65, 2); display.println(indiceUV); display.display(); delay(2000); }
Existem várias maneiras de calcular o índice UV dentro do programa. Você pode por exemplo aumentar o número de amostras e depois tirar uma média, ou realizar um cálculo baseado na tensão (milivolts) do pino do sensor. No caso eu optei por usar uma entrada simples da porta analógica.
Gostou? Confira também o post Como usar um sensor de chuva com Arduino aqui mesmo no Arduino e Cia!
Como sei pelo display que estou entre 180 a 280???
Estou com o circuito pronto, mas ele vai só até 11
Oi Carolina,
Isso, vai somente até o 11, que é a faixa máxima do indice UV que usei no programa.
Abraço!
Adilson
Olá! Tem algum problema no código ou estou fazendo errado, pois a noite está com índice 11. Favor indicar meu erro. Obrigado
Oi Cleber,
Pode me dar mais detalhes do problema?
Abraço!
Adilson
Olá! Achei interessante a ideia. Porém sou bem leigo, não consigo identificar o que seria positivo e negativo nessa protoboard, ou se utiliza essas linhas nos modelos que possuem positivo e negativo?