Sensor UV ML8511 e Arduino para Medidor de Intensidade de Raios UV

Tempo de leitura: 7 minutes

Neste projeto, estamos fazendo a interface do Sensor UV ML8511 com o Arduino para medir a intensidade da luz ultravioleta em mW/cm^2. Faremos a interface do Sensor UV ML8511 com Arduino e LCD ou Display OLED. A radiação ultravioleta ou radiação de luz ultravioleta ocorre de comprimento de onda de 10 nm a 400 nm no espectro eletromagnético. Portanto, para obter uma saída efetiva de acordo com a luz ultravioleta, o sensor GY/ML8511 do semicondutor lapis ajuda muito. O sensor de UV ML8511 detecta 280nm – 390nm luz de uma maneira melhor, este comprimento de onda é categorizado como parte do espectro de raios de queima UVB e a maior parte do espectro de raios de bronzeamento UVA.

O sensor ML8511 é muito fácil de usar. Ele produz uma tensão analógica que está linearmente relacionada à intensidade de UV medida (mW/cm2). Se o seu microcontrolador pode fazer uma conversão analógica para a tensão, então você pode detectar o nível de UV. Possui baixa corrente de alimentação de 300uA e baixa corrente de espera de 0,1A. Ele vem com um pacote de montagem em superfície pequeno e fino (4,0 mm x 3,7 mm x 0,73 mm (0,16 ″ x 0,15 ″ x 0,03 ″), cerâmica de 12 pinos QFN).

Lista de Materiais

A seguir estão os componentes necessários para fazer a interface do sensor UV ML8511 com o Arduino e o display LCD 16X2.

Nome dos ComponentesDescriçãoQuantidade
1Arduino BoardArduino Nano1
2UV SensorML85111
3Potentiometer10K1
4LCD DisplayJHD162A 16×2 LCD Display1
5OLED Display0.96″ I2C OLED Display1
6Fios de ConecçãoFios de Conecção10
7ProtoBoard1

 

Sensor UV ML8511
Introdução:

O sensor de UV ML8511 é fácil de usar o sensor de luz ultravioleta. O Sensor MP8511 UV (ultravioleta) funciona emitindo um sinal analógico em relação à quantidade de luz UV detectada. Esse breakout pode ser muito útil na criação de dispositivos que avisam o usuário sobre queimaduras solares ou detectam o índice de UV relacionado às condições climáticas.

Este sensor detecta a luz de 280-390 nm de forma mais eficaz. Isso é classificado como parte do espectro de UVB (raios em chamas) e a maior parte do espectro de UVA (raios de bronzeamento). Ele produz uma tensão analógica que está linearmente relacionada à intensidade de UV medida (mW/cm2). Se o seu microcontrolador pode fazer uma conversão de sinal analógico para digital, você pode detectar o nível de UV!

Diagrama de bloco:

O Sensor UV ML8511 possui Fotodiodo sensível a UV-A e UV-B. Em seguida, ele tem um amplificador operacional interno embutido que irá converter fotocorrente em saída de tensão dependendo da intensidade da luz UV.

A saída está sempre na forma de tensão analógica. Por meio da saída de tensão, é fácil fazer a interface com microcontroladores externos e ADC.

 

Características UV:

As características são desenhadas entre a tensão de saída do sensor em relação à intensidade UV (mW/cm²) com alimentação VDD constante. As curvas em cores diferentes representam a operação do sensor nas diferentes faixas de temperatura.

 

Diagrama de Circuito: Interface do Sensor UV ML8511 com Arduino

O diagrama de circuito para fazer a interface do sensor UV ML8511 com o Arduino e o display LCD é fornecido abaixo. O LCD 16×2 RS, EN, D4, D5, D6, D7 é conectado ao Arduino 12, 11, 5, 4, 3, 2 pinos. O LCD é fornecido com 5V. Possui 10K POT anexado ao pino 3 do LCD para ajustar o contraste.

O Sensor UV tem 5 pinos Vin, 3V3, GND, OUT, EN. Alguns dos módulos não têm pino Vin, que também não é usado. O pino EN e o pino 3V3 são conectados ao pino 3,3V do Arduino. O mesmo pino 3V3 é conectado ao pino analógico A1, que é usado como tensão de referência. O pino de saída é conectado a A0 do Arduino e GND ao GND.

Esta conexão para ML8511 é um pouco complicada. As conversões analógicas para digitais dependem totalmente do VCC. Presumimos que seja 5,0V, mas se a placa for alimentada por USB, isso pode ser tão alto quanto 5,25V ou tão baixo quanto 4,75V. Por causa dessa janela desconhecida, torna o ADC no Arduino bastante impreciso. Para corrigir isso, usamos a referência de 3,3V a bordo muito precisa (com precisão de 1%). Então, fazendo uma conversão analógica para digital no pino de 3,3V (conectando-o a A1) e, em seguida, comparando esta leitura com a leitura do sensor, podemos extrapolar uma leitura real, não importa qual seja o VIN (como desde que esteja acima de 3,4V).

 

Programa / Código Fonte:

O código-fonte do Arduino ML8511 é fornecido abaixo. Copie o código-fonte e carregue-o na placa Arduino.

#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
// Definições de pinos de hardware
int UVOUT = A0; // Saída do sensor
int REF_3V3 = A1; //Alimentação de 3,3 V na placa Arduino
 
void setup()
{
  Serial.begin(9600);
  lcd.begin(16, 2);
 
  pinMode(UVOUT, INPUT);
  pinMode(REF_3V3, INPUT);
 
  Serial.println("Exemplo ML8511");
}
 
void loop()
{
  int uvLevel = averageAnalogRead(UVOUT);
  int refLevel = averageAnalogRead(REF_3V3);
  
  // Use o pino de alimentação de 3,3 V como referência para obter um valor de saída muito preciso do sensor
  float outputVoltage = 3.3 / refLevel * uvLevel;
  
  float uvIntensity = mapfloat(outputVoltage, 0.99, 2.8, 0.0, 15.0); // Converta a voltagem para um nível de intensidade de UV
 
  Serial.print("output: ");
  Serial.print(refLevel);
 
  Serial.print("ML8511 output: ");
  Serial.print(uvLevel);
 
  Serial.print(" / ML8511 voltage: ");
  Serial.print(outputVoltage);
 
  Serial.print(" / UV Intensity (mW/cm^2): ");
  Serial.print(uvIntensity);
  lcd.clear();
  lcd.print("UV Ray Intensity");
  lcd.setCursor(0, 1);
  lcd.print(uvIntensity);
  lcd.print(" mW/cm^2");
  
  Serial.println();
  
  delay(200);
}
 
// Faz uma média de leituras em um determinado pino
// Retorna a média
int averageAnalogRead(int pinToRead)
{
  byte numberOfReadings = 8;
  unsigned int runningValue = 0; 
 
  for(int x = 0 ; x < numberOfReadings ; x++)
    runningValue += analogRead(pinToRead);
  runningValue /= numberOfReadings;
 
  return(runningValue);
}
 
float mapfloat(float x, float in_min, float in_max, float out_min, float out_max)
{
  return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}

 

 

Diagrama de circuito: Sensor UV ML8511 com Arduino e display OLED

O diagrama de circuito para fazer a interface do sensor UV ML8511 com o Arduino e o display OLED é fornecido abaixo. O display OLED usado aqui é um display OLED I2C de 0,96″ 128×64. Portanto, ele está conectado aos Pins I2C do Arduino. O pino SDA é conectado ao A4 do Arduino e o SCL ao A5.

O Sensor UV tem 5 pinos Vin, 3V3, GND, OUT, EN. Alguns dos módulos não têm pino Vin, que também não é usado. O pino EN e o pino 3V3 são conectados ao pino 3,3V do Arduino. O mesmo pino 3V3 é conectado ao pino analógico A1, que é usado como tensão de referência. O pino de saída é conectado a A0 do Arduino e GND ao GND.

Esta conexão para ML8511 é um pouco complicada. As conversões analógicas para digitais dependem totalmente do VCC. Presumimos que seja 5,0V, mas se a placa for alimentada por USB, isso pode ser tão alto quanto 5,25 V ou tão baixo quanto 4,75V. Por causa dessa janela desconhecida, torna o ADC no Arduino bastante impreciso. Para corrigir isso, usamos a referência de 3,3V a bordo muito precisa (com precisão de 1%). Então, fazendo uma conversão analógica para digital no pino de 3,3V (conectando-o a A1) e, em seguida, comparando esta leitura com a leitura do sensor, podemos extrapolar uma leitura real, não importa qual seja o VIN (como desde que esteja acima de 3,4V).

 

Programa / Código Fonte:

O código-fonte OLED do ML8511 Arduino é fornecido abaixo. Copie o código-fonte e carregue-o na placa Arduino.

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
 
int UVOUT = A0; //Saída do sensor
int REF_3V3 = A1; //Alimentação de 3,3 V na placa Arduino
 
#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);
 
void setup()
{
  Serial.begin(9600);
  pinMode(UVOUT, INPUT);
  pinMode(REF_3V3, INPUT);
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C); //inicializar com o addr I2C 0x3C (128x64)
  display.clearDisplay();
  Serial.println("ML8511 example");
  
}
 
void loop()
{
  int uvLevel = averageAnalogRead(UVOUT);
  int refLevel = averageAnalogRead(REF_3V3);
  
  //Use o pino de alimentação de 3,3 V como referência para obter um valor de saída muito preciso do sensor
  float outputVoltage = 3.3 / refLevel * uvLevel;
  
  float uvIntensity = mapfloat(outputVoltage, 0.99, 2.8, 0.0, 15.0); //Converta a voltagem para um nível de intensidade de UV
 
  Serial.print("output: ");
  Serial.print(refLevel);
 
  Serial.print("ML8511 output: ");
  Serial.print(uvLevel);
 
  Serial.print(" / ML8511 voltage: ");
  Serial.print(outputVoltage);
 
  Serial.print(" / UV Intensity (mW/cm^2): ");
  Serial.print(uvIntensity);
  Serial.println();
 
  display.setCursor(20,0);  //display oled
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.println("UV Ray Intensity");
  
  display.setCursor(20,20);  //display oled
  display.setTextSize(3);
  display.setTextColor(WHITE);
  display.println(uvIntensity);
  
  display.setCursor(20,45);  //display oled
  display.setTextSize(2);
  display.setTextColor(WHITE);
  display.println("mW/cm^2");
  display.display();
 
  delay(300);
  display.clearDisplay();
}
 
//Faz uma média de leituras em um determinado pino
//Retorna a média
int averageAnalogRead(int pinToRead)
{
  byte numberOfReadings = 8;
  unsigned int runningValue = 0; 
 
  for(int x = 0 ; x < numberOfReadings ; x++)
    runningValue += analogRead(pinToRead);
  runningValue /= numberOfReadings;
 
  return(runningValue);
}
 
float mapfloat(float x, float in_min, float in_max, float out_min, float out_max)
{
  return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}

 

Explicação do código:

UV_Voltage / uvLevel = 3.3 / refLevel

uvLevel é o que lemos do pino OUT. refLevel é o que lemos no pino de 3,3V. Resolvendo para UV_Voltage, podemos obter uma leitura precisa.

float mapfloat(float x, float in_min, float in_max, float out_min, float out_max)
{
  return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}

Mapear UV_Voltage para intensidade é direto. Nenhuma luz UV começa em 1V com um máximo de 15mW/cm2 em torno de 2,8V. O Arduino tem uma função map() embutida, mas map() não funciona para floats, então temos uma função mapFloat() simples.

float uvIntensity = mapfloat(outputVoltage, 0.99, 2.8, 0.0, 15.0);

A linha a seguir converte a tensão lida do sensor em intensidade mW/cm2.