紫外線メータの自作(1)

紫外線ボックス、太陽光、白熱灯、蛍光灯の紫外線を測定するために、紫外線メータが必要。買うと高いので自作することにする。

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