UV meter for cyanotype developing work
UVメーター(積算)を自作するきっかけは、サイアノタイプのプリントを太陽光で露光する為でした。
太陽光で露光をする場合、天気によって紫外線量が一定でない為、露光量にどうしてもばらつきが出てしまいます。
サイアノタイプは露光されるにつれ色が変化するので、目安として目視で露光量を推測する事もできます。
なので当初は色の変化で確認していたのですが、もう十分だと思って露光終了してみたら、まだもう少し露光した方がよかった…なんてことがしばしばありました。また、ネガによっては露光部分が見えにくかったりもして、いずれにせよ不安定な結果になりがちでした。
そこで、これを解消する為に紫外線の量がわかるUVメーターが必要でしたが、市販されているUV(紫外線)の計量器は紫外線の強さをはかるモノばかりでした。もちろん時間的な量をはかる計量器もありますが、とても値段の高い、業務使用を前提とした精度の高いモノです。とても手が出ません。
自分の用途としては、1分ごとの紫外線量が判り、それを時間の経過分足してくれれば十分です。
(サイアノタイプは感度があまり高くないのでこれで十分なのです)
なんとかならないかな? とぼんやり思っていたところ、時々巡回していた(電子)パーツ屋さんで目についたのが紫外線センサです。
「なければ作ればいいじゃない!」……ここからこの制作が始まりました。
UV積算メーター
使用した部品
<Seeduino XIAO>
<Seeduino XIAO用 Groveシールド>
<S-5420使用 紫外線センサモジュールキット >
<0.96インチ 128×64ドット有機ELディスプレイ(OLED) 白色>
<基板取付用小型ダイナミックスピーカ UGCM0603APE>
<DTP443442(PHR) 640mAh リチウムイオンポリマー電池 3.7V 640mAh>
接続図
Cord
下記コードをArduino IDEにてブートしています。
動作としては(ほぼ)1秒毎に紫外線量(HとL)を計測。60回に一度その平均を出し、それの積算を表示する。そしてその積算量が一定量超える毎に発声とゲージが変化し、目標値を超えた時、さらに表示を変化させています。
/*
UV light meter
S-5420 UV sensor module
Oled interfacing with Seeeduino XIAO
*/
#include <Wire.h>
#include <ACROBOTIC_SSD1306.h>
int pinHout = A0;
int pinLout = A1;
int buzz = A3;
int input0;
int d_val_mv; // sensor final value
unsigned long time;
int sec;
int addUV;
int UV_value;
int addUVadd;
void setup() {
Serial.begin(9600);
pinMode(pinHout, INPUT);
pinMode(pinLout, INPUT);
pinMode(buzz, OUTPUT);
Wire.begin();
oled.init();
addUV=0;
addUVadd=0;
}
void loop() {
delay(1000);
int h_val = analogRead(pinLout);
int l_val = analogRead(pinHout);
int d_val = h_val - l_val;
float d_val_mv = ((float)d_val / 1024) * 5 * 1000;
Serial.println(d_val_mv);
addUV += d_val_mv;
Serial.println(addUVadd);
oled.clearDisplay();
oled.setTextXY(0,0);
oled.putString("UV Meter:");
oled.setTextXY(2,0);
oled.putNumber(d_val_mv);
oled.setTextXY(3,0);
oled.putString("+-+ ");
oled.setTextXY(7,0);
oled.putString("---HIDECHIKA---");
tone(buzz,370,37);
oled.setTextXY(0,170);
oled.putNumber(sec);
sec++;
oled.setTextXY(2,170);
oled.putNumber(addUVadd);
int seconds=sec;
if (seconds == 60){
sec=sec-60;
UV_value = addUV / 60;
addUVadd += UV_value;
oled.setTextXY(1,70);
oled.setTextXY(3,70);
oled.putNumber(UV_value);
Serial.println(UV_value);
tone(buzz,170,300);
addUV = 0;
delay(700);
}
if (addUVadd >= 700){
oled.setTextXY(5,0);
oled.putString("=");
tone(buzz,370,70);
delay(300);
}
if (addUVadd >= 1370){
oled.setTextXY(5,0);
oled.putString("==");
tone(buzz,770,170);
delay(300);
}
if (addUVadd >= 1730){
oled.setTextXY(5,0);
oled.putString("===");
tone(buzz,1700,370);
delay(170);
tone(buzz,70,300);
delay(300);
oled.setTextXY(3,170);
oled.putString(" * * ");
oled.setTextXY(4,170);
oled.putString("*1730*");
oled.setTextXY(5,170);
oled.putString(" **** ");
}
if (addUVadd >= 2300){
oled.setTextXY(5,0);
oled.putString("====-");
tone(buzz,170,300);
delay(370);
tone(buzz,70,300);
delay(700);
oled.setTextXY(3,170);
oled.putString("= =");
oled.setTextXY(5,170);
oled.putString("= =");
}
if (addUVadd >= 2700){
oled.setTextXY(5,0);
oled.putString("====-:");
tone(buzz,3700,300);
delay(370);
tone(buzz,70,300);
delay(700);
oled.setTextXY(3,170);
oled.putString(" === ");
oled.setTextXY(4,170);
oled.putString(" === ");
oled.setTextXY(5,170);
oled.putString(" === ");
}
if (addUVadd >= 3000){
oled.setTextXY(5,0);
oled.putString("====-!!");
tone(buzz,70,170);
delay(370);
tone(buzz,70,370);
delay(700);
tone(buzz,70,170);
delay(370);
oled.setTextXY(3,170);
oled.putString("= =");
oled.setTextXY(4,170);
oled.putString(" X ");
oled.setTextXY(5,170);
oled.putString("= =");
}
}
作動動画
上左より
⚫︎タイトル ⚫︎計測数カウンター
(1-60繰り返し)
⚫︎計測値 ⚫︎積算数
計測値下の+-+ のさらに下部に積算量が定数超える毎に長さが長くなるゲージが出現します。
目標値に達すると右下に表示が出ます。
動画の途中、左から出てくるのはLED UVライトです。
全体の光が途中で変化しますが、どちらも(昼白色と電球色)LED電球なので紫外線をほとんど含みません。