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Ω プルアップ抵抗を追加する必要があります。
DHT11 センサモジュールには、3 つのピンがあります。
- VCC: センサーに電力を供給する。Arduino の 5V または 3.3V ピンに接続する。
- DAT: データ出力。デジタルピンに接続する。
- GND: グランドピン。
LCD に測定値を表示する
I2C LCD モジュールを使用します。LCD の裏側に I2C LCD アダプタがはんだ付けられています。このアダプタを使えば、SCL
と SDA
ピンだけで LCD を制御できます。
- SCL: I2C クロック。Arduino Nano の
A5
ピンに接続する。 - SDA: I2C データ入出力。Arduino Nano の
A4
ピンに接続する。
Arduino サンプルコード
DHT sensor library と LiquidCrystal_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);