検索コード

レッスン20/31:DHT11の温度と湿度をLCD画面に表示する

レッスン20/31:DHT11の温度と湿度をLCD画面に表示する

このチュートリアルでは、DHT11温湿度センサーとI2C対応LCD1602ディスプレイを組み合わせて、コンパクトな環境モニタリングステーションを作成する方法を説明します。シリアルモニターから生のセンサーデータを読み取る代わりに、16x2文字画面に温度と湿度のライブ表示を表示する方法を学びます。このプロジェクトは、デスクトップ用ウェザーステーション、小型温室モニターの構築、またはホームオートメーションプロジェクトへのローカル表示の追加に最適です。I2Cインターフェースにより配線が簡素化され、初心者にも取り組みやすく、経験豊富なメーカーにとっても迅速に追加できるプロジェクトです。

LCD_sunFounder

この知識を活用して構築できる実用的なアイデアをいくつか紹介します:

  • 現在の部屋の状態を表示するデスクトップ用ウェザーステーション。
  • 爬虫類や植物のテラリウム用のコンパクトディスプレイ。
  • サーバールームやワークショップ環境用のローカル表示。
  • より複雑なホームオートメーションシステム用のベースモジュール。

ハードウェアと部品

このプロジェクトを構築するには、以下の部品が必要です:

  • Arduino Uno(または互換ボード)
  • I2Cインターフェースモジュール付きLCD1602ディスプレイ
  • DHT11温湿度センサー
  • 4.7kΩまたは10kΩのプルアップ抵抗(ベアDHT11センサーを使用する場合)
  • ジャンパーワイヤー
  • ブレッドボード(接続を容易にするためのオプション)

I2C LCD1602の理解

LCD1602は、16列2行の一般的な文字表示ディスプレイです。ディスプレイの背面に半田付けされた「I2C」モジュールが、そのシンプルさの鍵です。このモジュールは、LCDのパラレルインターフェースをシリアルI2Cインターフェースに変換し、データ用に2本(SDAとSCL)、電源用に2本(VCCとGND)のワイヤーのみを必要とします。これにより、Arduinoで必要なピン数が大幅に削減され、他のセンサーやアクチュエーター用に多くのピンを残すことができます。このモジュールには、テキストが確実に表示されるようにするために重要な、ディスプレイのコントラストを調整するための小型ポテンショメータも含まれています。モジュールのI2Cアドレスは、ボード上の小さな半田ジャンパー(A0、A1、A2)を使用して変更でき、複数のI2Cデバイスが同じバス上に共存できます。

配線ガイド

LCD1602_wiring_DHT11_nopcb_bb

以下の図に示すようにコンポーネントを接続します。I2C LCDはArduinoのI2Cピンを使用し、DHT11センサーはデジタルピンを使用します。

LCD1602-I2Cの場合:

  • VCCをArduinoの5V
  • GNDをArduinoのGND
  • SDAをArduinoのA4
  • SCLをArduinoのA5

DHT11センサーの場合:

  • VCC(ピン1)をArduinoの5V
  • Data(ピン2)をArduinoのデジタルピン2へ(5Vへの10kΩプルアップ抵抗付き)
  • NC(ピン3) - 接続なし
  • GND(ピン4)をArduinoのGND

(ビデオの25:16で)

ライブラリのセットアップ

このプロジェクトには2つのライブラリが必要です。Wire.hライブラリは標準のArduinoインストールの一部です。LiquidCrystal_I2Cライブラリとdht11ライブラリをインストールする必要があります。ビデオでは、それらのインストール方法を説明しています。ライブラリは、ビデオの説明にあるリンクまたはRobojaxウェブサイトからダウンロードできます。ダウンロード後、Arduino IDEでSketch > Include Library > Add .ZIP Library...に移動し、ダウンロードしたファイルを選択してインストールできます。(ビデオの06:16で)

LCDのI2Cアドレスの確認

ディスプレイを使用する前に、そのI2Cアドレスを確認する必要があります。最も一般的なアドレスは0x27または0x3Fですが、異なる場合があります。それを見つけるには、I2Cスキャナースケッチを使用できます。これは、I2Cバスをスキャンして、見つかったアドレスをシリアルモニターに報告する簡単なプログラムです。スキャナーコードをアップロードし、9600ボーでシリアルモニターを開くと、LCDのアドレスが表示されます。(ビデオの08:11で)

コードの説明

このセクションでは、ユーザーが設定可能なコードの主要部分について説明します。完全なプログラムは、記事の下からダウンロードできます。

コードは、必要なライブラリを含め、使用するピンとオブジェクトを定義することから始まります。

// GetHubからのヘッダーファイル: https://github.com/adidax/dht11
#include <dht11.h>
dht11 DHT11; // DHT11のオブジェクトを作成
#define dhtpin 2 // DHT11に接続するピンを設定

// LCD1602-I2Cの設定開始
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// 16文字2行表示用にLCDアドレスを0x3Fに設定
LiquidCrystal_I2C lcd(0x3F, 16, 2);
// LCD1602-I2Cの設定終了

これらは、セットアップ用に設定する最も重要な行です:

  • #define dhtpin 2:これは、DHT11センサーのデータピンに接続されたArduinoピンを定義します。別のピンを使用する場合は、数字の2を変更します。
  • LiquidCrystal_I2C lcd(0x3F, 16, 2);:この行はLCDオブジェクトを作成します。最初のパラメータ0x3Fは、前の手順で見つけたI2Cアドレスです。162は、ディスプレイの列数と行数を定義します。スキャナーで異なるアドレス(例:0x27)が見つかった場合は、アドレスを更新します。

このコードは、カスタム関数getTemp()を使用して温度を読み取り、異なる単位に変換します。これは、コードをさまざまなアプリケーションで再利用可能にする強力な機能です。

float getTemp(char type) {
    float temp = (float)DHT11.temperature;//温度を取得
  if(type =='F')
  {
    return temp * 1.8 + 32;//華氏に変換
  }else if(type =='K')
  {
    return temp + 274.15;//ケルビンに変換
  }else{
   return temp; 
  }  
}

この関数を使用するには、希望する単位を表す1文字の引数を指定して呼び出します。たとえば、getTemp('C')は摂氏で温度を返し、getTemp('F')は華氏で、getTemp('K')はケルビンで返します。この関数はDHT11センサーから生の温度を読み取り、必要な変換式を適用します。これにより、センサー読み取りロジックを書き直すことなく、メインのloop()で表示単位を簡単に変更できます。メインループは、lcd.setCursor()およびlcd.print()関数を使用して、値が画面のどこに表示されるかを制御し、温度と湿度をLCDに出力します。

度記号の表示

標準のHD44780 LCD文字セットには、専用の度記号(°)は含まれていません。これを表示するには、LCDのROMから文字の10進値を使用してlcd.write()関数を使用する必要があります。度記号の場合、この値は223です。コードでは、lcd.print((char)223);を使用して温度値の後に記号を出力することでこれを示しています。(ビデオの30:16)

ライブプロジェクトデモ

コードがアップロードされると、ディスプレイは起動メッセージを表示した後、クリアして現在の温度と湿度を表示します。ディスプレイの1行目には「LCD1602 DHT11」というテキストが表示され、2行目には摂氏の温度、その後に度記号と「C」、次に華氏の温度、その後に度記号と「F」が表示されます。湿度値はシリアルモニターに出力されます。ビデオのデモでは、センサーを手に持つとディスプレイが0.5秒ごとに更新され、周囲の環境条件を正確に反映していることが示されています。(ビデオの29:42)

ポテンショメータからの電圧をLCDに表示することは、レッスン20/31:LCD1602に電圧を表示するで説明されています。

同じLCDを使用して超音波センサーからの距離を表示することは、レッスン20/31:ArduinoでLCD1602を使用して温度、電圧、距離を表示する| Robojaxで説明されています。

このビデオからの関連プロジェクト

チャプター

  • [00:00] LCD1602の紹介とプロジェクト概要
  • [01:30] LCD1602ハードウェアとI2Cモジュールの説明
  • [02:47] LCDコントラストの調整
  • [03:14] LCDピン配置とI2Cアドレス設定
  • [05:28] LCD1602の配線図
  • [06:16] LiquidCrystal_I2Cライブラリのインストール
  • [08:11] スキャナーでI2Cアドレスを見つける
  • [09:28] LCDにテキストを出力する基本コード
  • [11:10] 例:点滅カーソルとカスタム文字
  • [13:46] カスタム文字の作成と使用
  • [18:51] シリアル表示の例
  • [23:16] LCDでのテキストのスクロール
  • [24:36] DHT11センサーコードとLCDの組み合わせ
  • [30:16] 度記号の表示
  • [32:03] 温度から小数点を削除する
  • [33:00] ポテンショメータからの電圧をLCDに表示する
  • [35:56] 超音波センサーからの距離を表示する

画像

LCD1602_wiring_DHT11_nopcb_bb
LCD1602_wiring_DHT11_nopcb_bb
LCD_sunFounder
LCD_sunFounder
911-Lesson 20/31: Displaying Temperature and humidity from DHT11 on LCD screen
言語: C++
/*
Lesson 20/31: Displaying Temperature and humidity from DHT11 on  LCD screen
Get this code and watch video Download and resource page https://robojax.com/RJT603
YouTube video https://www.youtube.com/watch?v=NXAswOc_2zg
 

 * This is the Arduino code for  DHT11 module to read temperature and humidity
 * This code can display temperature in:
 * C is used to get Celsius
 * F is used to get Fahrenheit
 * K is used for Kelvin

 *  * 
 * Written by Ahmad Shamshiri for Robojax
 * on Jan 04, 2018
 * Robojax.com

   Please watch video instruction here https://youtu.be/0XMLnCYkvbE
 This code is available at http://robojax.com/course1/?vid=lecture11
 
with over 100 lectures Free On  YouTube Watch it here http://robojax.com/L/?id=338
Get the code for the course: http://robojax.com/L/?id=339 

  
 * This code is "AS IS" without warranty or liability. Free to be used as long as you keep this note intact.* 
 * This code has been download from Robojax.com
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.
 */

// header file from GetHub: https://github.com/adidax/dht11
#include <dht11.h>

dht11 DHT11; // create object of DHT11
#define dhtpin 2 // set the pin to connect to DHT11

// start of settings for LCD1602-I2C
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Set the LCD address to 0x3F for a 16 chars and 2 line display
LiquidCrystal_I2C lcd(0x3F, 16, 2);
// end of settings for LCD1602-I2C


void setup() {
    Serial.begin(9600);// setting up serial monitor

  // initialize the LCD, 
  lcd.begin();
  // Turn on the blacklight and print a message.
  lcd.backlight();
  lcd.clear();
  lcd.setCursor (0,0); //
  lcd.print("DHT11 Sensor"); 
  delay(2000);
}

void loop() {
	//Robojax Step By Step Arduino Course YouTube Watch it here http://robojax.com/L/?id=338
  DHT11.read(dhtpin);// initialize the reading
  int humidity = DHT11.humidity;// get humidity

  lcd.clear();// clear previous values from screen
  lcd.setCursor (0,0); //character zero, line 1
  lcd.print("LCD1602 DHT11"); // print text 

  // print distance in degrees C
  lcd.setCursor (0,1); //character 0, line 2
  lcd.print(getTemp('C'));// print Temperature Celsius
  lcd.setCursor (4,1); //character 5, line 2 
  lcd.print((char)223);// print degree 
  lcd.setCursor (5,1); //character 6, line 2 
  lcd.print("C");// print C
  
   // print distance degrees F
  lcd.setCursor (7,1); //character 8, line 2
  lcd.print(getTemp('F'));// print distance in cm
  lcd.setCursor (13,1); //character 14, line 2 
  lcd.print((char)223);// print degree 
  lcd.setCursor (14,1); //character 16, line 2 
  lcd.print("F");// print F 
  
  
  //code for Robojax.com video
   Serial.print(getTemp('C'));
   Serial.print("C ");
   Serial.print(getTemp('F'));
   Serial.print("F ");
   Serial.print(getTemp('K'));
   Serial.print("K ");
   Serial.print(" humidity:");
   Serial.print (humidity);
   Serial.print("% ");
   Serial.println();
 delay(500);
}


/*
 * getTemp(char type)
 * type character of upper case 
 * C is used to get Celsius
 * F is used to get Fahrenheit
 * K is used for Kelvin
 */
float getTemp(char type) {
	//Robojax Step By Step Arduino Course YouTube Watch it here http://robojax.com/L/?id=338	
    float temp = (float)DHT11.temperature;//get temp
  if(type =='F')
  {
    return temp * 1.8 + 32;// convert to Fahrenheit
  }else if(type =='K')
  {
    return temp + 274.15;// convert to Kelvin
  }else{
   return temp; 
  }
  
}

リソースと参考文献

ファイル📁

Arduinoライブラリ(zip)

ユーザーマニュアル