Arduinoでサーミスタを使って温度を計測!ビジュアルプログラミングLESSON22
こんにちは、せでぃあ(@cediablog)です。
今回のArduinoプログラミングLESSON22では、「サーミスタを使った温度計測プログラム」を紹介します。
温度計と聞くと、この写真のようなアナログ温度計を思い浮かべるかたが多いのではないでしょうか?
アナログ温度計は、電池不要でぱっと見で温度が分かるためとても便利な温度測定器です。
ただし、温度データを使って何かの機器を制御しようとすると不便さが出てきます。
例えば、「室内温度が30℃以上になったら扇風機を自動で動かす」という動作をさせようと思ったら、現在の室内温度が何度なのかがわかる数値データが必要となります。
そこで紹介するのが、サーミスタ(thermistor)です。
見た目はとってもシンプルですが、この機器を使うことで温度を計測することが可能になります。
今回は、液晶ディスプレイLCD1602に「サーミスタを使った計測温度を表示させる」プログラムの作り方を紹介します。
ELEGOOスーパースターターキットに含まれるサーミスタを使って、サーミスタ仕組みがわかる電子工作を作っていきます。
今回液晶ディスプレイLCD1602の制御はI2Cを使ったシリアル通信を使います。
I2C通信を使ったLECディスプレイ表示方法については、こちらの記事にて詳しく解説しています。
本記事は、プログラミングと電子パーツの知識が習得できるプログラミング初心者も安心して取り組めるテーマとなっています。
小学生、中学生も安心してプログラミングができるように、文字列を使わなビジュアルプログラミング方法を動画付きで紹介しています。
ビジュアルプログラミングを使えば小学生から抵抗なくプログラミングができますよ!
本記事では、スクラッチベースのビジュアルプログラミングツールmBlockとArduinoIDEプログラムどちらのプログラミング方法も紹介しています。
無料のブロックプログラミングツールmBlockのインストール方法については、こちらの記事を参照してください。
- サーミスタの仕組みと各種機器の配線方法
- Arduino IDEでのプログラミング方法
- mBlockを使ったビジュアルプログラミング方法
せでぃあはこんな人物です
✅プライム企業に勤める電気・機械設計エンジニア
✅親子の絆を深めるため、夏休みに子供と一緒に電子工作を製作
✅Arduinoプログラミングを用いて作ったプログラミング電子工作「信GO機」が市の発明くふう展で「優秀賞」を受賞
✅本ブログにてArduinoスクラッチプログラミングLESSON記事投稿中
✅YouTubeチャンネル「せでぃあブログちゃんねる」運営中
温度を測定する方法として、温度と湿度の両方を測定できるセンサ「DHT11」という機器もあります。
サーミスタの仕組みと温度の算出方法
まずはじめに、サーミスタの仕組みについて解説します。
サーミスタの動作原理
サーミスタは大きく分けて性質が異なる2種類に分けられます。
サーミスタの種類
- NTC:温度が上がると抵抗値が下がる
- PTC:温度が上がると抵抗値が上がる
今回使用するサーミスタ「MF52D-103f-3950」はNTCタイプのため、測定温度が高くなると抵抗値が下がる性質があります。
サーミスタが検出した温度変化=抵抗変化を利用して、Arduinoに入力する電圧を変化させてデータへと変換していきます。
Arduinoに入力する電圧を変化させる方法について、説明していきます。
サーミスタ抵抗値を取得するためには分圧回路の構築が必要
サーミスタ抵抗値を取得するために、分圧回路を構築します。
抵抗が直列つなぎされると、それぞれにかかる電圧は抵抗値の割合に応じて分配されます。
抵抗側にかかる電圧が、Arduinoアナログソケットに入力される電圧値となります。
サーミスタにかかる電圧+抵抗にかかる電圧=入力電圧5Vになります。
その電圧値の計算式は上図に記載の通りとなります。
サーミスタの抵抗値が検出温度に応じて変動するため、上記式により抵抗に流れる電圧値が変動します。
この電圧変動幅をアナログ入力値としてArduinoに入力します。
- Vin:入力電圧=5V
- Vout:分圧抵抗にかかる電圧(V)
- R1:分圧抵抗値(Ω)
- Rth:サーミスタ抵抗値(Ω)
分圧抵抗にかかる電圧を算出する式になります。
サーミスタ抵抗値を導く形に変換します。
サーミスタを使った温度算出方法
ネットで調べてみると、NTCサーミスタを使う場合は上記計算式を用いて温度を算出できることが分かりました。
- 変数T:計測時のケルビン温度(K)
- 変数R:計測時のサーミスタ抵抗値(Ω)
- 定数B:サーミスタのB定数(温度変化に対する抵抗値の変化定数)
- 定数R0:摂氏25度のときのサーミスタ抵抗値(Ω)
- 定数T0:摂氏25度のときのケルビン温度(K)
これらの変数の中でポイントになるのが「B定数」です。
B定数とは、温度変化に対するサーミスタ抵抗値の変化定数といい、データシートに記載されています。
サーミスタ「MF52D-103f-3950」のB定数は「3950」であることがわかります。
また摂氏25度のときのサーミスタ抵抗値は、型式「MF52D-103f-3950」により、10×10の3乗=10kΩです。
この値は、定数R0に代入して計算します。
サーミスタの抵抗値Rの算出式は、先ほど解説した以下の式を使って求めます。
- Vin(入力電圧):5(V)
- Vout:分圧抵抗にかかる電圧(V)
- R1(分圧抵抗値):10000(Ω)
定数についてまとめると、以下になります。
- B(B定数):3950
- R0(摂氏25度のときのサーミスタ抵抗値):10000(Ω)
- T0(摂氏25度のときのケルビン温度):298.15(K)
摂氏0度のときのケルビン温度は273.15Kになるため、+25度した値がT0になります。
分圧抵抗値に10KΩを選定した理由は、摂氏25度のときのサーミスタ抵抗値と同じ抵抗値にすることでサーミスタの検出温度が25℃のとき入力電圧の1/2の出力電圧に設定できるためです。
分圧回路の考え方については、こちらの記事にて詳しく説明しています。
サーミスタ検出温度をLCDディスプレイに表示させる動作の解説
今回紹介する「サーミスタを使って検出した温度をLCDディスプレイに表示させる動作」について説明します。
動作の説明
- ディスプレイ上段に「アナログ入力値(0~1023)」、下段に「検出温度」が表示される。
- サーミスタを指でつまんで、体温レベルまで温度が上昇することを確認する。
- サーミスタから指を離すと室温レベルまで温度が低下することを確認する。
- サーミスタの仕組みについて
- LCDディスプレイへのサーミスタ検出温度の表示動作
- mBlockを使ったプログラミング方法
まずは動画を見て、今回のLESSONで実行させたい動作内容を確認してください。
また、mBlockを使ったブロックプログラミングや動作確認方法についても解説しています。
ビジュアルプログラミングの作り方も動画で解説しています。
サーミスタ検出温度をLCDに表示させるまでの流れ
サーミスタが検出した温度をLCDディスプレイに表示させるために必要な作業を解説します。
今回は文字列を使ったプログラム形式と、文字列を使わないブロックプログラミング形式の両方について説明します。
あなたの作りたいプロブラム形式に対応した手順に応じて、対応してください。
プログラム形式に応じた開発環境
- 文字列による命令語形式 ⇒ ArduinoIDE
- スクラッチベースのビジュアル形式 ⇒ mBlock
プログラミング初心者の方は、ビジュアルプログラミングがおすすめです!
プログラミングするために、パソコンが必要です。
電子部品等の必要な機器については、このあと説明します。
パソコンに統合開発ソフトウェア「ArduinoIDE」のインストールを行います。
Arduinoのセットアップ方法については、以下の記事にて詳しく説明しています。
Arduino IDEでの言語プログラミングも勉強したい方は、プログラミングの流れを理解しておいてください。
以下の記事にて、プログラミングから動作確認までの流れを詳しく説明しています。
mBlockでプログラミングする場合は、ArduinoIDEのインストールは不要です。
パソコンにスクラッチベースのビジュアルプログラミングツール「mBlock」のインストールを行います。
以下の記事にて詳しく説明しています。
ArduinoIDEでプログラミングする場合は、mBlockのインストールは不要です。
電子部品とジャンパーワイヤの差し込みだけで配線が可能です。
専用開発ソフトウェア「Arduino IDE」を使います。
私が作成したプログラムをコピペして使ってください。
Arduino IDEプログラミングの基本操作については、こちらの記事にて詳しく説明しています。
mBlockでプログラミングする場合は、ArduinoIDEプログラミングは不要です。
スクラッチベースのビジュアルプログラミングツールmBlockを使ってプログラムを作成します
プログラム内容については、後述するプログラミング例を参考にしてください。
ArduinoIDEでプログラミングする場合は、mBlockプログラミングは不要です。
プログラムが完成したら動作確認を行います。
- ディスプレイ上段に「アナログ入力値(0~1023)」、下段に「検出温度」が表示されるか?
- サーミスタを指で掴んで、体温レベルまで温度が上昇するか?
- サーミスタから指を離すと室温レベルまで温度が低下するか?
サーミスタを使った温度検出回路で使うもの
今回は、LCDディスプレイをI2C通信で制御する方法を紹介した記事の一部配線変更にて対応可能な内容です。
I2C通信を使ったLCDディスプレイ表示が初めての方は、こちらの記事から読んでいただくことをおすすめします。
- パソコン
- Arduino本体
- USBケーブル
- ブレッドボード
- サーミスタ
- 抵抗器(10kΩ)
- LCD1602モジュール
- I2Cモジュール
- ジャンパー線(オスーメス)×4本
- ジャンパー線(オスーオス)×3本
今回はELEGOO社のスーパースターターキットに含まれる部品で作ることができますが、Arduino裏面のショート対策としてクリアケースも併せて準備することをおすすめします。
【おすすめ】コスパ最強のArduinoキットの中間グレードです!
パソコン
プログラムを作成するために必要です。
プログラム制御の演算はArduino側で行うため、パソコンのSPECは一般的なモデルで十分対応可能です。
パソコンのOSはWindows、Macどちらでも対応可能です。
Arduino本体【キット】
基本的なエディション「Arduino Uno」の互換機である、ELEGOO社のUNO R3を使用しています。
Arduino本体裏面のショート対策に、別売りのクリアケースの購入をおすすめしています。
各ソケットの役割など、Arduino本体の機能について以下の記事にて詳しく説明しています。
USBケーブル【キット】
パソコンとArduinoを接続してプログラムデータのやり取りをするために必要です。
ブレッドボード【キット】
たくさんの穴が開いていて、部品の端子を穴に差し込むだけで電気的に接続が可能な板です。
説明図は30列のショート版ですが、スーパースターターキットに含まれる63列タイプでも機能は同じです。
ブレッドボードだけの購入も可能です。
サーミスタ(温度センサー)【キット】
サーミスタは、温度が変わると内部の抵抗値が変化する電子部品です。
Arduinoのアナログ入力ソケットに接続することで、温度変化をアナログ入力値変化に変換することができます。
抵抗器(10kΩ)【キット】
10kΩの抵抗を1本使用し、サーミスタに直列接続します。
抵抗を接続するのは、Arduino本体にサーミスタが検出した温度変化=電圧変化をアナログ値として入力させるためです。
今回使用するサーミスタの抵抗値変化を利用するには、分圧回路が必要となります。
この分圧回路を作るために、この10kΩ抵抗器を用います。
LCD1602モジュール【キット】
液晶ディスプレイ「LCD(Liquid Crystal Display)」モジュールになります。
数字や文字などを表示させることが可能です。
I2Cモジュール
I2Cを使ってLCDを制御するために必要なモジュールです。
電源線2本と通信線2本の合計4本の配線だけで、LCDを制御することが可能になります。
I2Cモジュールはキットに含まれないため、別途購入が必要です。
ジャンパー線(オスーメス)【キット】
オス-メスジャンパー線を4本使用します。
I2CシリアルインターフェースボードとArduino本体を接続させるために使用します。
ジャンパー線(オスーオス)【キット】
ジャンパー線を3本使用します。
Arduino本体とブレッドボードの接続や、ブレッドボードの共通電源ライン(GNDまたは5V)からブレッドボード内の配線系統穴に差し込んで接続するのに使います。
スターターキットに含まれる機器に関しては、以下の記事にて詳しく紹介しています。
サーミスタを使った検出温度表示回路の配線方法
ここからは、各機器間の配線方法について解説します。
上図が配線説明図となりますので、これと同じ配線をすれば完成します。
機器が故障するおそれがあるので、接続するプラスマイナス極性には十分注意して配線してください。
機器故障させないためにも、USBケーブルを抜いた「通電OFF」状態にて配線を行ってください
プログラミングのやり方
本記事では、以下に示す「Arduino IDEプログラミング」と「mBlockプログラミング」の2通りのプログラミング方法について解説しています。
いずれか1つのプログラミング方法を用いることで、本LESSONの動作を行うことが可能です。
ArduinoIDE:文字列による命令語形式
mBlock:スクラッチベースのビジュアル形式
文字列を使わないmBlockの方が、直感的で分かりやすく小学生におすすめのプログラミング方法になります。
mBlockを使ってプログラミングをする方は、mBlockの説明まで読み飛ばしてください。
プログラミング初心者の方は、ビジュアルプログラミングがおすすめです!
LiquidCrystal_I2Cライブラリのインストール
ArduinoIDEを使用した文字列プログラミングを行うためには、LiquidCrystal_I2Cライブラリのダウンロードとインストール作業が必要となります。
LiquidCrystal_I2Cライブラリのダウンロードとインストール方法を解説します。
mBlockでプログラミングをする場合は、本ライブラリインストール作業は不要です。
「Download ZIP」をクリックして、ZIPファイルをダウンロードします。
ArduinoIDEを開き、「スケッチ」⇒「ライブラリをインクルード」⇒「.ZIP形式のライブラリをインストール…」の順に選択して、STEP3でダウンロードしたZIPファイルを選択。
インストールが行われ、ライブラリインストール作業が完了となります。
Arduino IDEプログラミング
Arduino IDEとは統合開発ソフトウェアで、C言語のような文字列を用いたプログラミング方法です。
プログラミングするにあたり、ある程度の命令語を知っておく必要があります。
Arduino IDEのインストール方法については、以下の記事で詳しく説明しています。
日本語版のArduino公式リファレンスが記載されているので、関数を調べるときに重宝します!(私も所有しています)
プログラミング方法
Arduino IDEを使って、文字列プログラミングを行います。
Arduino IDEを使ったプログラミング~動作確認方法については、以下の記事で詳細説明しています。
Arduino IDEプログラム
/* 作品名:LESSON22 */
/* 作成者:せでぃあ https://cediablog.com */
/* サーミスタを使った温度計測 */
// ライブラリのインクルード
#include <LiquidCrystal_I2C.h>
// LiquidCrystal_I2C型変数の宣言
LiquidCrystal_I2C lcd(0x27, 16, 2); // 0x27のアドレス,16列2行のLCDを使用
// 変数の宣言
const float B = 3950; //サーミスタのB定数(温度変化に対する抵抗値の変化定数)
const float T0 = 298.15; //摂氏25度のときのケルビン温度
const float R0 = 10000; //摂氏25度のときのサーミスタ抵抗値
const float R1 = 10000; //分圧用抵抗の抵抗値
float analogval = 0; //アナログ入力ピンA0の入力値(0~1023)
float thvolt = 0; //分圧した電圧値の格納変数
float RT = 0; //サーミスタ抵抗値の格納変数
float tempK = 0; //ケルビン温度の格納変数
float tempC = 0; //摂氏温度の格納変数
void setup() {
//プログラム起動時1回だけ処理される回路
lcd.init(); // LCDの初期化
lcd.backlight(); // LCDバックライトの点灯
}
void loop() {
//プログラム起動後ループ処理される回路
lcd.clear(); //LCD表示クリア
lcd.setCursor(0, 0); //上段1列目にカーソルを移動
lcd.print("ANALOG:"); //LCDディスプレイに「analog:」と表示させる
lcd.setCursor(0, 1); //下段1列目にカーソルを移動
lcd.print("TEMP:"); //LCDディスプレイに「temp:」と表示させる
lcd.setCursor(12, 1); //下段13列目にカーソルを移動
lcd.print("C"); //LCDディスプレイに「C」と表示させる
analogval = analogRead(A0); //アナログ入力ピンA0入力値(0~1023)を変数に格納
thvolt = (analogval * 5) / 1023; //分圧した電圧値を算出
RT = R1 * (5 / thvolt - 1); //サーミスタの抵抗値を算出
tempK = 1 / (1 / B * log(RT / R0) + (1 / T0)); //ケルビン温度を算出
tempC = (tempK - 273.15); //ケルビン温度を摂氏温度に変換
lcd.setCursor(8, 0); //上段9列目にカーソルを移動
lcd.print(String(analogval).toInt()); //LCDディスプレイにアナログ入力値を表示させる
lcd.setCursor(6, 1); //下段7列目にカーソルを移動
lcd.print(tempC); //LCDディスプレイに摂氏温度を表示させる
delay(300); //0.3秒ウェイト
}
上記がLCDディスプレイへのサーミスタを使った計測温度表示プログラムになります。
Arduino IDEのプログラム画面にコピーアンドペーストすることで、動作確認まで進めることができます。
各プログラム列の右側にプログラム内容をコメント記入してありますので参考にしてください。
LiquidCristal_I2Cライブラリのインストールを忘れずに行ってください。
命令語の解説
今回のプログラムで使用した命令文について、解説します。
変数のデータ型指定
変数のデータ型を指定するものです。
今回はピンソケット番号を代入するので整数を扱う「int型」を指定します。
データ型 | 説明 | 扱える範囲 |
---|---|---|
int | 2バイトの整数を代入可能。 | -32768~32767 |
long | 4バイトの整数を代入可能 | -2,147,483,648~2,147,483,647 |
float | 4バイトの小数を代入可能。 | 3.4028235×1038~-3.4028235×1038 |
char | 1バイトの値を代入可能。文字列の代入に利用されます。 | -128~127 |
boolean | 0または1のみ代入可能。フラグのON-OFFなどに利用されます。 | 0,1 |
log
計算式は「ln」なのに、なぜ「log」なの?って思った方もいらっしゃるのではないでしょうか?
実は、log関数は自然対数「ln」の命令語になります。
ちなみに、常用対数は「log10」という関数を使います。
今回は自然対数「ln」を使うので、プログラムでは「log」を使います。
delay(時間)
()内で指定した時間(単位はmsec)だけ、プログラム実行を待たせます。
LiquidCrystal_I2Cライブラリの説明
今回はLCD1602の制御をするために、「LiquidCrystal_I2Cライブラリ」を使用します。
このライブラリを使うだけで、簡単にLCD表示を制御できます。
LiquidCrystal_I2Cライブラリの読み出し
プログラム冒頭の宣言部にてLiquidCrystalライブラリを読み出します。
#include <LiquidCrystal_I2C.h>
LiquidCrystal型変数の指定
プログラム冒頭の宣言部にてLiquidCrystal_I2C型の変数を定義します。
LiquidCrystal_I2C lcd(I2Cアドレス, 桁数, 行数)
変数「lcd」は例であり、任意の変数文字列を指定してください。
init()
LCDの表示内容をクリアし、カーソルを左上に移動させます。
lcd型変数.init
clear()
LCDの表示内容をクリアします。
lcd型変数.clear()
setCursor(桁 , 行)
カーソル位置を指定します。テキスト表示開始位置を指定することができます。
lcd型変数.setCursor(桁、行)
桁は左端が「0」、行は上段が「0=1行目」になります。
print(“表示させたい文字列”)
LCDに文字列を表示させます。
lcd型変数.print(“表示させたい文字列”)
backlight()
LCDバックライトを点灯させます。
lcd型変数.backlignt()
プログラミング初心者の方に、おすすめなArduinoの参考書を紹介しています!
mBlockプログラミング
ここからは、mBlockを使ったプログラムの作り方を解説します。
- デバイスにArduino Uno R3を追加する。
- 接続モードを「アップロードモードON」にする。
- mBlockプログラムを作成する。
- プログラムをArduino本体に転送する。
これらの基本操作方法については、こちらの記事を参照してください。
動画を参考にプログラミングしてみてください。
I2Cを使ったLCD制御ブロックの追加方法
LCDを制御(LCD画面クリア、カーソル位置を指定、LCDへの文字列表示など)するために必要な、専用ブロックを追加する必要があります。
mBlockを開いて、拡張ボタンをクリックします。
検索窓に「i2c」と入力します。
I2Cを使ったLCD制御用の拡張ブロックを追加します。
I2Cを使ったLCD制御ブロックが追加されます。
mBlockを使ったプログラム内容
今回は「アップロードモード オン」でのプログラム作成例を紹介しています。
プログラム開始条件が「Arduino Unoが起動したとき」になっている点に注意してください。
以下のプログラムが動作プログラムになります。
tempKの計算式は、複数のカッコが入れ子になっているため注意が必要です。
上記計算式をT=の形に変換して計算しています。
つまり、右辺の逆数を算出する式を作ります。
動画を見ていただくと理解がしやすくなります!
mBlockのArduino専用ブロックについては、こちらの記事にて詳しく説明しています。
動作確認方法
- ディスプレイ上段に「アナログ入力値(0~1023)」、下段に「検出温度」が表示されるか?
- サーミスタを指でつまんで、体温レベルまで温度が上昇するか?
- サーミスタから指を離すと室温レベルまで温度が低下するか?
上記項目について確認していきましょう。
ディスプレイ上段に「アナログ入力値(0~1023)」、下段に「検出温度」が表示されるか?
プログラムの演算が開始されたら、LCDディスプレイ上段に「ANALOG:(0~1023の値)」、下段に「TEMP:(算出温度)C」が表示されていることを確認してください。
LCDディスプレイのバックライトが点灯状態であることを併せて確認してください。
サーミスタを指でつまんで、体温レベルまで温度が上昇するか?
サーミスタ(先端の黒い部分)を指でつまんで、表示される温度が体温レベルまで変化することを確認してください。
35~36℃付近になると思いますが、大きく外れた数値の場合は計算式プログラムが間違っていないか確認してください。
上段のアナログ入力値は、検出温度に比例して増減する傾向になります。
サーミスタから指を離すと室温レベルまで温度が低下するか?
サーミスタから指を離して、温度が室温レベルまで変化するか確認してください。
サーミスタの抵抗値は緩やかに変化するため、室温レベルに落ち着くまでしばらく待ってみてください。
アナログ値は、分圧抵抗で消費する電圧を表示するためサーミスタの抵抗が低下すると値が上昇します。
計算式が分かればサーミスタを使った温度計測はかんたん!(まとめ)
- NTCサーミスタは、測定温度が高くなると抵抗値が下がる。
- サーミスタの抵抗値は、分圧回路を使って算出する。
- 計算式により、サーミスタの抵抗値を計測温度に変換できる。
計算式さえ分かってしまえば、サーミスタを使った温度計算は難しくないことが分かります。
分圧回路の考え方も、2つの抵抗分の割合に応じた電圧配分をしているだけと考えると難しくないと思います。
配線もシンプルなので、あなたもサーミスタを使った温度計測にチャレンジしてみてくださいね!
小学生のお子様には断然、ビジュアルプログラミングがおすすめです!
mBlockはブロックのドラッグアンドドロップで簡単にプログラミングができます!
小学生のプログラミング学習におすすめな、mBlockが使えるプログラミングロボットを紹介しています。
最後まで読んでいただき、ありがとうございました。
分圧回路の考え方は明るさセンサ(CdSセル)を使った例が参考になります。
温湿度センサDHT11を使った温湿度表示プログラミングを紹介しています。
子供の成長を育む!小学生のお子様にぴったりなプログラミング教室が見つかるように厳選しました!
Arduinoスクラッチプログラミングのおすすめ参考書について詳しく説明しています。
Arduinoプログラミング(スクラッチも)を使った電子工作を紹介しています。
コメント