LCDに現在の温度・湿度を表示する

Arduino Nano を使用して、DHT11 温湿度センサから現在の温度と湿度を読み取り、16x2 のキャラクタLCD に表示します。

DHT11 温湿度センサ

DHT11 センサは抵抗式湿度センサと NTC (Negative Temperature Coefficient) thermistor で構成されています。

DHT11 に加えて、DHT22 もあるが、DHT11 とは若干仕様が異なります。

  • DHT11 は 0°C〜50°C の温度(精度 ±2.0°C)、湿度 20%~90%(精度 ±5%)を測定できる。
  • DHT22 は -40°C〜80°C の温度(精度 ±0.5°C)、湿度 0%~100%(精度 ±2%)を測定できる。
  • DHT11のサンプリングレートは 1Hz、DHT22のサンプリングレートは 0.5Hz です。

DHT22 はより広い範囲を測定でき、精度も高くなります。

モジュールを使っているが、センサとの違いは、LED インジケータ、プルアップ抵抗やバイパスコンデンサが内蔵されていることです。センサーを直接使用する場合、通常は出力ピンに 10KΩ プルアップ抵抗を追加する必要があります。

alt

DHT11 センサモジュールには、3 つのピンがあります。

  • VCC: センサーに電力を供給する。Arduino の 5V または 3.3V ピンに接続する。
  • DAT: データ出力。デジタルピンに接続する。
  • GND: グランドピン。

LCD に測定値を表示する

I2C LCD モジュールを使用します。LCD の裏側に I2C LCD アダプタがはんだ付けられています。このアダプタを使えば、SCLSDA ピンだけで LCD を制御できます。

alt

  • SCL: I2C クロック。Arduino Nano の A5 ピンに接続する。
  • SDA: I2C データ入出力。Arduino Nano の A4 ピンに接続する。

Arduino サンプルコード

DHT sensor libraryLiquidCrystal_I2C ライブラリを使っています。

DHT11 を D7 ピンに接続しているので、DHTPIN を 7 に指定します。

#include <DHT.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

#define DHTPIN 7
#define DHTTYPE DHT11

#if defined(ARDUINO) && ARDUINO >= 100
#define printByte(args)  write(args);
#else
#define printByte(args)  print(args,BYTE);
#endif

LiquidCrystal_I2C lcd(0x27, 16, 2);  // set the I2C address of the 16x2 LCD to 0x27

DHT dht(DHTPIN, DHTTYPE);

void setup()
{
  dht.begin();
  lcd.init();

  lcd.backlight();
  delay(300);
  lcd.noBacklight();

  lcd.home();
}


void loop()
{
  float h = dht.readHumidity();
  float t = dht.readTemperature();

  lcd.setCursor(0, 0);
  lcd.print("Temp: ");
  lcd.print(t);
  // hexadecimal escape sequence \xdf followed by the character C
  lcd.print("\xdf""C");  // degree Celsius

  lcd.setCursor(0, 1);
  lcd.print("RH: ");
  lcd.print(h);
  lcd.print("\x25");  // percent

  delay(5000);
}

カスタムキャラクタの作成

LCD に表示される各キャラクタは 5x8 のピクセルグリッドで構成されています。

以下は HTML の <canvas> 要素で描かれた 5x8 のピクセルグリッドです。 任意のピクセルをクリックして、create ボタンをクリックすると、キャラクタの 16 進数データが生成されます。

hex:

LCD にカスタムキャラクタを表示するには、 生成した 16 進数データから uint8_t 型の配列を作成:

uint8_t heart[8] = {0x00,0x0a,0x1f,0x1f,0x0e,0x04,0x00,0x00};

setup()createChar() 関数を使用してカスタムキャラクタを作成する。

lcd.createChar(0, heart);

loop() 関数でカスタムキャラクタを表示するには、printByte() を呼び出して、キャラクタの番号を渡す。

lcd.printByte(0);

alt

Tags:

Updated: