ソミーの部屋アマチュア無線看板

工作室 DIY ルーム標識

紫外線測定器の製作


ページ 4 / 4
前ページへのジャンプボタン 次ページへのジャンプボタン

UV-C領域の紫外線を測定する装置を作ります

 秋月電子の「S-5420使用 紫外線センサモジュールキット」から得た信号を、I2C接続のグラフィックOLCDに ArduinoNANOで表示させるソフトウェア(スケッチ)について記述します。

 






設計時の留意点

フォント

【 GDではフォントが必要で 】

フォント

 キャラクタディスプレイは、文字コードをLCDに送れば文字が表示されますが、グラフィックディスプレィではフォントをこちらで用意しなければならないところが問題です。しかし、その辺はArduino、ライブラリもサンプルスケッチも豊富で、フリーの日本語フォントもあります。

  
フォントをGDに送信する
U文字の表示

【 1文字取り出しては表示する 】

文字の表示

LCD_CHARに、コードからフォントパターン配列を持ってきて、draw_Char()に渡して、GD上に1文字を表示すます。

 スケッチ(ソースファイル)です
 

ソースファイルはこちらです

UVセンサーの校正は測定器で

 テキスト形式の GDUVifz07.txt
 aruduino型式のzipファイル GDUVifz07.zip

 ※謝辞 すみません。どなたのサンプルスケッチを元にしたか、思い出したら、、記載します。

  
 

数値の校正は測定器で

UVセンサーの校正は測定器で

 非常にアバウトな校正です。S-5420 紫外線センサーから得た値は特性がフラットなわけでもないので、数値の一致にこだわっても意味がないので、程よいところで妥協しています。 それでも夏の強い日差しと夕刻の日差しでは肌での感じと一致していました。

  

【Tips】スケッチはこんな感じ(部分掲載)

#include "Wire.h"

#define OLED_I2C_ADDRES 0x3C // OLED アドレス
#define HEIGHT 64 // 128x64ドット0.96インチGLCDの定義 
#define WIDTH 128
#define WIRE_MAX 30
#define NEGATIVE 0
#define POSITIVE 1
#define BUZ 13 // ブザー接続ピン
#define BUZON 200 // 紫外線 圧電ブザー警告音鳴動開始値

String LCD_STRING; // LCDに表示する文字列格納
char LCD_CHAR; // 1文字取り出し用
int xcr; // 次カーソル位置X座標
int barLength = 0; // バーグラフ長
const int pinHout=A0; // 紫外線センサー H入力ADコンバータ
const int pinLout=A1; // 紫外線センサー L入力ADコンバータ

 

 

void loop() {
int i,j,k,m;
String tempString;
int LCD_STRING_Length;
unsigned int LineLength;

int h_val = analogRead(pinHout); // 高感度紫外線PD の出力電圧を読む
int l_val = analogRead(pinLout); // 低感度紫外線PD の出力電圧を読む
int d_val = h_val - l_val; // 差分をとり可視光成分を消去する

unsigned int barLength; // 棒グラフの長さ

float h_val_mv = ((float) h_val/1024)*5*1000; // 値をmV単位に変換
float l_val_mv = ((float) l_val/1024)*5*1000; // 変数名はサンプルスケッチの通り
float d_val_mv = ((float) d_val/1024)*5*1000;
h_val = int(h_val_mv - 283.2-24); // 電圧値を補正してゼロ調整
if(h_val < 0) h_val = 0; // 負にならぬよう
l_val = int(l_val_mv - 283.2-24);
if(l_val < 0) l_val = 0; // 負にならぬよう
d_val = int(d_val_mv);
if(d_val < 0) d_val = 0;

Serial.print("H= "); // 高感度紫外線PD の電圧表示(確認用シリアル出力)
Serial.print(h_val); // 残存電圧を差し引く

Serial.print(" L= "); // 低感度紫外線PD の電圧表示
Serial.print(l_val);

Serial.print(" H-L= "); // H-Lの差分を表示
Serial.print(d_val);

if(d_val_mv > BUZON){ // 紫外線値が警告値を超えたら圧電ブザー鳴動
soundC();
}
LCD_STRING = "Visible "; // 1行内に納まる任意長の表示文字列格納
LCD_STRING_Length = LCD_STRING.length(); // 文字列長を求める

for(i=0;i LCD_CHAR = LCD_STRING.charAt(i);
LCD_CHAR = LCD_CHAR -32; // ASCIIコードからこのスケッチ定義のコードに変換
draw_Char(7,i*8,LCD_CHAR,1,POSITIVE); // 1倍文字描画(16文字x8行 表示可能)
// 結果、LCD_STRING が表示される
xcr = (i+1)*8; // 次カーソル位置
} // 続けて 数値を描く

LCD_STRING = String(l_val); // L検出の数値を文字列に
LCD_STRING_Length = LCD_STRING.length(); // 文字列長を求める

for(int i=0;i LCD_CHAR = LCD_STRING.charAt(i);
LCD_CHAR = LCD_CHAR -32; // ASCIIコードからこのスケッチ定義のコードに変換
draw_Char(0,xcr+(i*16),107,2,NEGATIVE); // 1文字消去(107はこのスケッチでの消去文字コード)
draw_Char(0,xcr+(i*16),LCD_CHAR,2,POSITIVE); // 1倍文字 16文字x8行 表示可能
draw_Char(0,xcr+((i+1)*16),107,2,NEGATIVE); // 1文字消去 右側を空白に
draw_Char(0,xcr+((i+2)*16),107,2,NEGATIVE); // 1文字消去 右側を空白に
draw_Char(0,xcr+((i+3)*16),107,2,NEGATIVE); // 1文字消去 右側を空白に
} // ここまででLCD_STRINGと倍角の数字を表示

// その下に、棒グラフを描画する
barLength = int( l_val ); // 可視光の数値を棒グラフ長の変数へ
if(barLength < 200) barLength = int(barLength *0.3); // 2領域に分けて増分を変化させ
else if(barLength >= 200) barLength = int(barLength *0.1+40); // 全長127ドットに収めようとする

draw_Line(0, 20, barLength, 20,1); // 棒グラフライン1の描画
draw_Line(0, 21, barLength, 21,1); // 棒グラフのライン2描画
draw_Line(barLength, 20, 127, 20,0); // 前棒グラフライン1の部分削除
draw_Line(barLength, 21, 127, 21,0); // 前棒グラフライン2の部分削除
flash(); // GDに転送

Serial.print(" L Bar "); // 低感度紫外線PD の電圧表示
Serial.print(barLength);
// 続いて2行目の紫外線数値とグラフの表示
LCD_STRING = "U.Violet"; // 1行内に納まる任意長の文字列
LCD_STRING_Length = LCD_STRING.length(); // 文字列長を求める

for(i=0;i LCD_CHAR = LCD_STRING.charAt(i);
LCD_CHAR = LCD_CHAR -32; // ASCIIコードからこのスケッチ定義のコードに変換
draw_Char(7+32,i*7,LCD_CHAR,1,POSITIVE); // 1倍文字 16文字x8行 表示可能

xcr = (i+1)*8; // 次カーソル位置
}
LCD_STRING = String(d_val); // UV数値を文字列に
LCD_STRING_Length = LCD_STRING.length(); // 文字列長を求める
for(int i=0;i LCD_CHAR = LCD_STRING.charAt(i);
LCD_CHAR = LCD_CHAR -32; // ASCIIコードからこのスケッチ定義のコードに変換
draw_Char(0+32,xcr+(i*16),107,2,NEGATIVE); // 1文字消去(107はこのスケッチでの消去文字コード)
draw_Char(0+32,xcr+(i*16),LCD_CHAR,2,POSITIVE); // 2倍文字 16文字x8行 表示可能
draw_Char(0+32,xcr+((i+1)*16),107,2,NEGATIVE); // 1文字消去
draw_Char(0+32,xcr+((i+2)*16),107,2,NEGATIVE); // 1文字消去
draw_Char(0+32,xcr+((i+3)*16),107,2,NEGATIVE); // 1文字消去
}
barLength = int( d_val ); // 紫外の数値を棒グラフ長の変数へ
if(barLength < 200) barLength = int(barLength *0.3); // 2領域に分けて増分を変化させ
else if(barLength >= 200) barLength = int(barLength *0.1+40); // 全長127ドットに収めようとする
draw_Line(0, 52, barLength, 52,1); // 棒グラフライン1の描画
draw_Line(0, 53, barLength, 53,1); // 棒グラフライン2の描画
draw_Line(barLength, 52, 127, 52,0); // 前棒グラフライン1の部分削除
draw_Line(barLength, 53, 127, 53,0); // 前棒グラフライン2の部分削除
flash(); // GDに転送

Serial.print(" D Bar "); // H-Lの差分(紫外領域)をシリアル表示
Serial.println(barLength);
} 


ページ 4 / 4
前ページへのジャンプボタン 次ページへのジャンプボタン