2017年6月
        1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30  

« 学研 エヌランド レイアウトベースのプラン | トップページ | 追補 「グレンフィナン高架橋」について »

2011年4月23日 (土)

色彩表示温度計シールド (arduino)

フルカラーLEDを使ったarduino色彩温度表示計はそれなりに綺麗で楽しかったので、シールド化してみることにしました。

Img_0206

プロトシールドはこちらに紹介されていた方法で自作。でも、汎用のシールドにするワケじゃないので、必要なピンしか取り付けていません。

シールドの配線は下図のとおりです。上から見ていますので念のため。完成写真と見比べてご覧ください。

Img4210921590001

ここんとこ気力減退が著しいので、これだけの作業をするのも精一杯です。

いやほんと、ひさしぶりに半田ごてをにぎりましたが、安物の半田ごてのこて先がちびて、そろそろ寿命のようです。そのせいというわけではありませんが、汚い仕上がりでお恥ずかしい限りです(^^;;;

Img_0204  Img_0205

スケッチは下記の通り。季節によって、最低温度と最高温度の値を変えると良いと思います。エアコンなんかをつけると色の変化を楽しめます。テストするならセンサー部を指でつまむとよいでしょう。

もちろん、スケッチを入れ替えれば、フルカラーイルミネーションランプとしても楽しめます。

2012.3.22追記:

ひさかたぶりに、このシールドを動かしてみたのですが、どうも温度表示がおかしい。なぜか高い温度になるので、不思議に思ってよくよく観察したら、ICの発する熱がセンサーに影響していることが判明。基盤をとおしても熱が伝わるということなんですね。

解消法はセンサーの位置を変えるしかありません。ICチップから一番遠い位置に付け替えるか、以前のように、リード線で外部に引き出して設置するのが正解なのでしょうが、なんかやる気が起こらないので、しばらくは放置ということにします。

スケッチ

//-------------------------------------------------------------------------------------------------
// No.11c Full colour LED thermometer, created 14 June 2010

/*   0.2秒ごとに摂氏温度を計測

     0.6秒ごとに平均摂氏をシリアルモニタ出力&フルカラーLED色彩表示 */

#define analogInPin 0             // アナログ入力ピン
 
int analogVal     = 0;            // アナログ入力値(0〜1023)
const float intervalIn  = 200;    // 計測間隔(ms)
const float intervalOut = 600;    // 結果出力間隔(ms)
float freq        = 0;            // 計測回数
const float  v    = 5;            // 基準電圧値( V )
float  tempC      = 0;            // 摂氏値( ℃ )
float  tempMin    = 18;           // 摂氏最低値( ℃ )
float  tempMax    = 30;           // 摂氏最高値( ℃ )
float  tempCsum   = 0;            // 結果出力間隔ごとの合計摂氏値( ℃ )
#define ledPinRed   11
#define ledPinGreen  9
#define ledPinBlue  10
int cVal  = 0;
int rVal  = 0;
int gVal  = 0;
int bVal  = 0;
int Red   = 0;
int Green = 0;
int Blue  = 0;
int spectoralRGB[] = {
  255,0,255,
  255,0,255,
  255,0,255,
  255,0,255,
  255,0,255,
  255,0,255,
  204,0,255,
  153,0,255,
  102,0,255,
  51,0,255,
  0,0,255,
  0,51,255,
  0,102,255,
  0,153,255,
  0,204,255,
  0,255,255,
  0,255,204,
  0,255,153,
  0,255,102,
  0,255,51,
  0,255,0,
  51,255,0,
  102,255,0,
  153,255,0,
  204,255,0,
  255,255,0,
  255,235,0,
  255,214,0,
  255,194,0,
  255,173,0,
  255,153,0,
  255,122,0,
  255,92,0,
  255,61,0,
  255,31,0,
  255,0,0,
  255,0,0,
  255,0,0,
  255,0,0,
  255,0,0,
  255,0,0
};

void setup() {

  Serial.begin(9600);
  freq = intervalOut / intervalIn;
  pinMode(ledPinRed, OUTPUT);
  pinMode(ledPinGreen, OUTPUT);
  pinMode(ledPinBlue, OUTPUT);
}

void loop() {

  for(int i = 0; i < freq; i++ ){
    analogVal = analogRead( analogInPin ); // 計測値を取得(0〜1023)
    tempC = ((v * analogVal) / 1024) * 100; // 摂氏に換算
    tempCsum += tempC; // 平均値算出のため取得値を合計
    analogVal = 0;
    tempC = 0;
    delay(intervalIn);
  }

  tempC = tempCsum / freq +0.5; // 結果出力間隔間の平均摂氏値

  tempC = constrain(tempC, tempMin, tempMax) * 10; //色彩表示範囲温度設定
  cVal = map(tempC, tempMin *10, tempMax *10, 0, 40);
  rVal = cVal * 3;
  gVal = cVal * 3 + 1;
  bVal = cVal * 3 + 2;
  Red = spectoralRGB[rVal];
  Green = spectoralRGB[gVal];
  Blue = spectoralRGB[bVal];
  analogWrite(ledPinRed, Red);
  analogWrite(ledPinGreen, Green);
  analogWrite(ledPinBlue, Blue);
  Serial.print(" Temp/");
  Serial.print(intervalOut / 1000);
  Serial.print("sec | AverageTemp: ");
  Serial.print(tempC / 10);
  Serial.print(",  cVal: ");
  Serial.print(cVal);
  Serial.print(",  RGB: ");
  Serial.print(Red);
  Serial.print(",");
  Serial.print(Green);
  Serial.print(",");
  Serial.println(Blue);
  tempC =0;
  tempCsum = 0;

}
//-------------------------------------------------------------------------------------------------

« 学研 エヌランド レイアウトベースのプラン | トップページ | 追補 「グレンフィナン高架橋」について »

コメント

コメントを書く

(ウェブ上には掲載しません)

« 学研 エヌランド レイアウトベースのプラン | トップページ | 追補 「グレンフィナン高架橋」について »