紫外線ボックス、太陽光、白熱灯、蛍光灯の紫外線を測定するために、紫外線メータが必要。買うと高いので自作することにする。
Arduino nano
【K-07252】 ML8511使用紫外線センサーモジュール(秋月電子)
Cake board
10バーLEDアレイ 3色(緑5黄3赤2)タイプ(秋月電子)
LED
抵抗(抵抗値不明)
回路

Sketch
Arduino統合環境(IDE)は1.8.7
/*目的
* 紫外線センサML8511のBreak out(Sparkfun社製)を使い、10レベルLEDで表示する
*紫外線センサの読み込みはhttps://github.com/sparkfun/ML8511_Breakout/blob/master/firmware/MP8511_Read_Example/MP8511_Read_Example.ino
*
*1)グローバル変数
*2)グローバル定数
*3)関数定義
*4)Set up
*5)Looop
*/
//1)グローバル変数
int gLevelLED[12]; //レベルメータLEDの定義 例)レベルメータLED(赤)10ピン→11ピンをLEDをD2端子につなぐ
int glangeOfLevelLED;//レベルLEDの分解能
int gNoOfLightingLED;//点灯するレベルLRDの番号
//2)グローバル定数
const int RUNNING_PROGRAM_LED=13; //プログラムが走っているときにD13端子につないだLEDが点灯
const int UVOUT=A0; //UVセンサの出力をA1端子へ
const int REF_3V3 = A1; //3.3V power on the Arduino board
const int LOWEST_UVOUT=211;//紫外線センサの出力の最低値
const int HIGHEST_UVOUT=271;//紫外線センサの出力の最高値(太陽光が当たったとき)
const int NO_OF_LEVEL_LED=10;//レベルLEDの数
const int WIDTH_OF_HIGHEST_AND_LOWEST=HIGHEST_UVOUT-LOWEST_UVOUT;//センサからの出力の幅
const int STEP_OF_LED=WIDTH_OF_HIGHEST_AND_LOWEST/NO_OF_LEVEL_LED;//レベルLED1個についての幅
//3)関数定義
//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);
}
//The Arduino Map function but for floats
//From: http://forum.arduino.cc/index.php?topic=3922.0
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;
}
//4)
void setup() {
//変数定義
//レベルLEDへの端子を、その名前+1の端子に設定し出力に設定
for(int i=1;i<=10;i++){
gLevelLED[i]=i+1;
pinMode(gLevelLED[i],OUTPUT);
}
// プログラム動作LEDへの端子D13を出力に設定
pinMode(RUNNING_PROGRAM_LED,OUTPUT);
//レベルメータへの端子を出力に設定
//UVセンサ出力を入力する端子UVOUTと基準電圧を入力する端子REF_3v3をINPUTに設定
pinMode(UVOUT,INPUT);
pinMode(REF_3V3,INPUT);
//シリアルプロッタを9600に設定
Serial.begin(9600);
}
//5)
void loop() {
//プログラム動作LEDを点灯
digitalWrite(RUNNING_PROGRAM_LED,HIGH);
//変数定義
int uvLevel=averageAnalogRead(UVOUT);
int refLevel=averageAnalogRead(REF_3V3);
int uvLevelFromLowest=uvLevel-LOWEST_UVOUT;
int levelLEDNo=uvLevelFromLowest/NO_OF_LEVEL_LED;
int noOfLitingLED;
//use the 3.3V power pin as a reference to get a very accurate value from sensor
float outputVoltage=3.3/refLevel*uvLevel;
float uvIntensity=mapfloat(outputVoltage,0.99,2.9,0.0,15.0);
/* //シリアルモニタ・プロッタに書き込み
Serial.print(“MP8511 output: “);
Serial.print(uvLevelFromLowest);
Serial.println();
Serial.print(“Number of lighting LED: “);
Serial.print(gNoOfLightingLED);
Serial.println();
delay(100);
*/
//出力に応じてレベルLEDを点灯
gNoOfLightingLED=uvLevelFromLowest/STEP_OF_LED;
for(int i=1;i<=10;i++){
if(gNoOfLightingLED>i){
digitalWrite(gLevelLED[11-i],HIGH);
delay(5);
digitalWrite(gLevelLED[11-i],LOW);
}
}
}
参照
https://github.com/sparkfun/ML8511_Breakout/blob/master/firmware/MP8511_Read_Example/MP8511_Read_Example.ino