Sensor UV ML8511 e Arduino para Medidor de Intensidade de Raios UV
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).
Conteudo
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 Componentes | Descrição | Quantidade | |
---|---|---|---|
1 | Arduino Board | Arduino Nano | 1 |
2 | UV Sensor | ML8511 | 1 |
3 | Potentiometer | 10K | 1 |
4 | LCD Display | JHD162A 16×2 LCD Display | 1 |
5 | OLED Display | 0.96″ I2C OLED Display | 1 |
6 | Fios de Conecção | Fios de Conecção | 10 |
7 | ProtoBoard | – | 1 |
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.