#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
|