아두이노를 이용해서 휴대용 자외선 측정기 만들기
아두이노를 이용해서 휴대용 자외선 측정기를 만드는 방법이다.
아래 방법으로 자외선 측정기를 만들고 나면, 자외선 지수를 측정 할 수 있다.
0. 준 비물
아두이노 우노 R3

다른 아두이노 제품이나, 아두이노 호환 보드도 상관 없음
ML8511

ML8511 센서는 280-390nm의 빛을 효과적으로 감지할 수 있다.
(UV-B 파장과 대부분의 UV-A 파장을 감지)
(UV-B 파장과 대부분의 UV-A 파장을 감지)
OLED 디스플레이 모듈

0.96인치 128x64의 OLED 디스플레이 모듈을 기준으로 작성함
브레드보드(빵판)

아두이노와 센서간 연결을 임시로 하기 위해서 브레드보드를 사용했으며, 직접 납땜 하더라도 상관 없음
점퍼케이블

OLED와 센서를 빵판에 직접 연결할 경우, 수-수 케이블 10개가 필요함
보조배터리
보조배터리를 이용해 아두이노에 전원을 공급함
1. 회로도
아래 사진과 같이 회로를 구성하면 된다. (ML8511 센서의 VIN 포트는 연결하지 않음)

2. 코드
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
int UVOUT = A0; //Output from the sensor
int REF_3V3 = A1; //3.3V power on the Arduino board
#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); //initialize with the I2C addr 0x3C (128x64)
display.clearDisplay();
Serial.println("ML8511 example");
}
void loop()
{
int uvLevel = averageAnalogRead(UVOUT);
int refLevel = averageAnalogRead(REF_3V3);
//Use the 3.3V power pin as a reference to get a very accurate output value from sensor
float outputVoltage = 3.3 / refLevel * uvLevel;
float uvIntensity = mapfloat(outputVoltage, 0.99, 2.8, 0.0, 15.0); //Convert the voltage to a UV intensity level
// 콘솔 출력 부분
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();
// oled 출력 부분
display.setCursor(0,0);
display.setTextSize(3);
display.setTextColor(WHITE);
if (uvIntensity <= 0) {
display.println("0.00");
} else {
display.println(uvIntensity);
}
display.setCursor(0,25); //oled display
display.setTextSize(1.5);
display.setTextColor(WHITE);
display.println("mW/cm^2");
display.display();
delay(300);
display.clearDisplay();
}
//Takes an average of readings on a given pin
//Returns the average
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;
}
3. 완성
보조배터리 상단에 oled 디스플레이와 오렌지보드를 부착하고, 앞쪽에 90도 각도로 자외선 센서를 부착함

4. 시연
실내에서 창문을 열고 바깥 자외선을 측정한 영상이다. (영상에서는 디스플레이에 플리커 현상이 일어나지만 실제로는 잘 보임)

여러 곳에서 추가로 측정했는데, 장애물 없는 곳의 직사광선 수치가 날씨앱의 자외선 지수와 거의 비슷하게 나왔다.