UV meter (adding up, with Seeeduino XIAO)

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電球なので紫外線をほとんど含みません。

参考リンク