今回は、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表示は更新せず、変わったときだけ更新するようにしてみよう。
コメントを残す