今回は、Arduinoで温度と湿度をLCDに表示する方法を紹介します。測定方法は、温湿度センサとサーミスタによる2通りの方法について説明します。LCDの使用方法については、以前の記事(ArduinoでSTEM教育-基礎編:LCD)を参照してください。
目次
使用する部品一覧
使用する部品は図のとおりです。これらの部品は、すべて「ELEGOO Arduino用のMega2560スタータキット」に含まれています。
- Arduino MEGA2560 R3 …1個
- 830穴 ブレッドボード …1個
- LCD1602モジュール …1個
- ポテンショメータ(10kΩ) …1個
- 温湿度センサDHT11 …1個
- サーミスタ …1個
- 10kΩ抵抗 …1個
- ジャンパワイヤ(オス-オス) …18個
- ジャンパワイヤ(オス-メス) …3個
DHT11温度湿度センサの特徴や取り扱い方法
今回は、DHT11という温度湿度センサを使用します。このモジュールは、温度と湿度をデジタル信号で出力します。モジュールの端子は3本あります。左から順に、通信・電源・GNDという構成です。このセンサー用のライブラリを使用することで、プログラムコードを短く簡単に作成できるという利点があります。

サーミスタの特徴や取り扱い方法
サーミスタは、温度で抵抗が大きく変化する抵抗です。NTC(負の温度係数)とPTC(正の温度係数)の2種類あります。一般的に、温度測定にはNTCセンサが使用されます。サーミスタを使用して得られる情報は電圧値なので、サーミスタの温度特性をデータシートから読み取って、演算するプログラムを書く必要があります。モジュールと比較すると、演算コードを自作する必要があるため、手間がかかりますが、安価で小さな回路を作成できるという利点があります。

回路図
まず、DHT11センサの接続について説明します。V端子は5V、G端子はGND、S端子はD2端子に接続します。
次に、サーミスタの接続について説明します。サーミスタは、片方を5Vに接続し、もう片方は10kΩ抵抗に接続します。10kΩ抵抗のもう片方は、GNDに接続します。そして、サーミスタと抵抗の中間部(抵抗分圧値)をA0端子に接続します。
このような構成にすることで、温度が高くなるとサーミスタ抵抗が小さくなるため、抵抗分圧値が大きくなります。温度が低い場合はその逆となります。

配線図
ブレッドボードを使用した配線は図のとおりになります。

組立完成写真
実際に組み立てた写真です。同じようにできましたか?

プログラム
最初に、DHT11用のライブラリ(dht_nonblocking.h)を#includeで読み込みます。また、センサーのタイプを#defineで定義します。次に、センサーで使用する通信ピンとサーミスタで使用するピンの番号を定義します。読み込んだセンサのライブラリのDHT_nonblockingクラスを使用するための準備をします。mesure_enviroment関数は、DHTセンサの測定結果を取得できる場合はTrueを返し、そうでない場合はFalseを返します。
メインループの冒頭で、サーミスタの電圧値を温度変換する計算方法を記述します。analogRead()でサーミスタの電圧値をアナログ入力端子から読み取ります。そして、その結果をもとに、絶対温度に変換したあと、セルシウス温度に変換します。
次に、LCDに表示する文字を記述します。if文でDHTセンサの測定結果が利用できるかどうかを判別し、利用できる場合は温度と湿度をLCDに表示します。そうでない場合は、サーミスタで測定した温度を表示します。
//www.stemship.com
//2019.10.12
#include <LiquidCrystal.h>
#include <dht_nonblocking.h>
#define DHT_SENSOR_TYPE DHT_TYPE_11
static const int DHT_SENSOR_PIN = 2;
static const int THERM_PIN = 0;
// BS E D4 D5 D6 D7
LiquidCrystal lcd(7, 8, 9, 10, 11, 12);
DHT_nonblocking dht_sensor( DHT_SENSOR_PIN, DHT_SENSOR_TYPE );
void setup( )
{
lcd.begin(16, 2);
}
static bool measure_environment( float *temperature, float *humidity )
{
static unsigned long measurement_timestamp = millis( );
/* Measure once every four seconds. */
if( millis( ) - measurement_timestamp > 3000ul )
{
if( dht_sensor.measure( temperature, humidity ) == true )
{
measurement_timestamp = millis( );
return( true );
}
}
return( false );
}
void loop( )
{
//DHT-sensor
float temperature;
float humidity;
//Thermistor
int tempReading = analogRead(THERM_PIN);
double tempK = log(10000.0 * ((1024.0 / tempReading - 1)));
tempK = 1 / (0.001129148 + (0.000234125 + (0.0000000876741 * tempK * tempK )) * tempK ); // Temp Kelvin
float tempC = tempK - 273.15; // Convert Kelvin to Celcius
/* Measure temperature and humidity. If the functions returns
true, then a measurement is available. */
if( measure_environment( &temperature, &humidity ) == true )
{
// Display Temperature in C
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Temp C ");
lcd.setCursor(6, 0);
lcd.print(temperature);
// Display Humidity in %
lcd.setCursor(0, 1);
lcd.print("Humid % ");
lcd.setCursor(6, 1);
lcd.print(humidity);
delay(2000);
}
else
{
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("By Thermistor");
lcd.setCursor(0, 1);
lcd.print("Temp C ");
lcd.setCursor(6, 1);
lcd.print(tempC);
delay(10);
}
}
動かしてみよう
プログラムを書き込んで、実際に動かしてみてください。
今回学んだポイント
- HTCモジュールは、ライブラリを使用することで、温度と湿度をプログラム上で簡単に扱うことができる。
- HTCモジュールとArduinoの通信は、デジタル線1本のみのため、I/Fを簡素化できる。
- サーミスタを温度計として使用するには、サーミスタの温度特性を理解して、取得電圧値から温度に変換する必要がある。
- サーミスタの電圧値は、analogRead()関数を使用することで読み取ることができる。
改造してみよう
もう少し理解を深めるために、自分で改造してみてください。
- HTCセンサとサーミスタの測定温度差をLCDに表示してみよう。
- 測定温度や湿度が前回測定値と変わらないときは、LCD表示は更新せず、変わったときだけ更新するようにしてみよう。
コメントを残す