温度センサーLM61の測定データを前回はArduinoIDEのシリアルモニタ上に表示してみたが、今回は同データを4桁の7セグLEDに表示をしてみることにする。

Arduinoとの接続

使用する7セグLED

・赤色4桁モジュール、小数点表示(DP)可能
・カソードコモン
・駆動電流は5mA/seg、全点灯だと5mAx8seg=40mAとなりスペックギリギリとなるが常時点灯ではないので通常使用ではOKと考える。
(ArduinoNanoのピン当たりの電流許容値は最大40mA、但しチップ全体の許容値200mAを超えないこと。)
・電流制限抵抗は330Ωとした。

ブレッドボードを使い接続する。

7セグLEDは4桁のものでカソードコモンのものを使用する、電流制限抵抗は330Ω

回路図

Arduinoプログラム

ライブラリ

以下の2種のライブラリーが必要。

1)SevenSegment_BW428.h

7セグに表示する数値(4桁・10進数)及び小数点位置を指定するだけでセグメントの表示パターンを生成してさらに表示までする。

但し、ダイナミック駆動タイミングはこのライブラリではやってくれないので自身のプログラム内で実施する必要がある。

2)MovingAverage.h

移動平均の算出処理をするライブラリ、サンプル数は初期化時に指定すること。但し、最大500個。

<補足>ライブラリーの詳細説明はまた別の記事で記載する予定なので、今回は以下の手順をそのまま実施する。

ライブラリのインストール

ArduinoIDEがコンパイル時に参照してコードに入れ込む時に必要であるが格納場所が決まっている。

ライブラリフォルダーごとDocument⇒Arduino⇒librarilesとフォルダを辿りコピーする。

以下の画像を参考にしてコピペ。

スケッチ


include <SevenSegment_BW428.h>
SevenSegment_BW428 sevsegBW428;
#include <MovingAverage.h>
MovingAverage movingAverage(80);
const int dp = 1; //小数点以下桁数の指定
int mag;
int calValue;
int calTemperature;

void setup() {
  sevsegBW428.init();
  mag = pow(10, dp);
  calValue = 2;
}

void loop() {
  int analogIn , temperature , sensorVout , aveTemperature ;
  analogIn = analogRead(0) ; // アナログ0番ピンからセンサー値を読込む
  sensorVout  = map(analogIn, 0, 1023, 0, 4600) ; // センサー値(デジタル)を電圧に変換する
  temperature = map(sensorVout, 350, 1450, -25 * mag, 85 * mag) ; // センサー電圧を温度に変換する
  calTemperature = temperature - calValue * mag;
  movingAverage.writein(calTemperature);
  aveTemperature = movingAverage.readout();
  sevsegBW428.disp(aveTemperature, dp);
  sevsegBW428.refresh();
}

上記プログラム(スケッチ)の簡単な説明を書きました。

数字は行番号を意味します。

1.#include <SevenSegment_BW428.h>
⇒ヘッダーファイル”SevenSegment_BW428.h”を読み込む。イメージ的にはこの場所にファイルの内容を持ってくるという感じです。xxx.hの様に拡張子が”h”のファイルをヘッダーファイルと呼ぶ。そしてライブラリーはヘッダーファイルで定義される。

2.SevenSegment_BW428 sevsegBW428;
⇒SevenSegment_BW428型のインスタンスsevsegBW428を宣言。ちなみに変数宣言なのでsevsegBW428は任意の文字を付与して構わない。(たまたま、この名前を付けただけです)

3.#include <MovingAverage.h>
⇒上記と同じ意味なので詳細説明は省略。ライブラリーの取り込み。

4.MovingAverage movingAverage(80);
⇒MovingAvarage型のインスタンスmovingAverageをサンプル数80個で移動平均を算出するように宣言。

5.const int dp = 1;
⇒dp変数を固定値(const)で使うように変数宣言し、更に初期値として1を代入。

6.int mag;
⇒int型の変数magを宣言、magは倍率magnifyを意味した名付けで、小数点以下の桁数を指数に持つ10の累乗数。
小数点以下1桁の場合:10の1乗なのでmagは10となる。小数点以下2桁(dp=2の場合)はmagは10の2乗で100となる。(どのように使うかは後述)

7.int calValue;
⇒温度センサーLM61は初期誤差が±2℃あり、結構大きいので補正の必要があり、この補正値をこの変数に’格納する。単位は℃。

8.int calTemperature;
⇒上記補正値で補正した後の値を格納するための変数。

11.sevsegBW428.init()
⇒7セグLEDライブラリの内部を初期化。(何をしているかはよくわからないがとりあえずするように作者のコメントに記述。

21.temperature = map(sensorVout, 350, 1450, -25 * mag, 85 * mag) ;
⇒基本的な話ですが、本スケッチでは変数はすべて整数を使用するので小数点以下の実数は扱えない、そのため測定値をmag倍して整数化してから処理を津で受けています。表示する時に小数点をどおの桁に表示するかで内部的には整数処理でありながら表面的には小数点以下があるように振舞っている。

そのため、ここで測定温度範囲をmag倍している、そのためセンサーの測定値が28.5℃の場合でも変数Temperature は285℃の様に受けている。

25.sevsegBW428.disp(aveTemperature, dp);
⇒7セグい表示する温度データをライブラリーに送る、dpは小数点の表示位置指定、ここで4桁の数値を送っているが、そのうちの1桁のみ表示する。

・26.sevsegBW428.refresh();
⇒この関数をライブらりに送ることで表示桁の移動が行われる。つまりこれを4回送れば4桁すべての表示が終了する、続けてこの関数を送れば桁表示が循環する。

END