WROOM-02で温湿度計をネットに送るのは、既に多くの事例が公開されていて、私もそれらの情報を参考にさせていただいて、Ambient に送ってグラフ化することで一応満足していたのですが、単体で動作させている時に、その時点のデータを見たいと思って、LCDディスプレイを接続して見ました。
16文字✖️2行のLCDが310円!
お試しということで、接続が簡単なI2C対応で廉価なLCDディスプレイを探しました。
Amazon に 16文字✖️2行のLCDディスプレイが 190円、シリアルインターフェースアダプタが120円(どちらも送料込み)というのがありましたのでそれを購入。
構成
- ESPr Developer (スイッチサイエンス)
- 温湿度センサー(DHT11)
- HD44780 1602 LCD ディスプレイモジュール 16×2キャラクタ (HiLetgo)
- IIC/I2C/TWI/SPI シリアル インタフェース ボード モジュール (HiLetgo)
- ブレッドボード
- ジャンパーワイヤー
- プルアップ抵抗
LCDとボードは半田付けが必要です。
LCDのSDAは4番、SCLは5番端子に接続しました。(プルアップ抵抗は10KΩとありましたが、手元にあった24KΩで代用)
スクリプト
プログラムは次のとおり。
#include <Ambient.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <ESP8266WiFi.h>
#include "DHT.h"
#define DHTPIN 2
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);
LiquidCrystal_I2C lcd(0x27, 16, 2);
#define ssid "YOUR WiFi SSID" // WiFiのSSID をセット
#define password "YOUR WiFi PASSWORD" // WiFiのパスワード をセット
#define channelId <YOUR CHANNEL> // Ambientのチャネル番号
#define writeKey "YOUR WRITE KEY FOR AMBIENT" // Ambient の書き込みキーをセット
WiFiClient client;
Ambient ambient;
void setupWiFi() {
Serial.println(); Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println();
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}
void setup() {
Serial.begin(9600);
Serial.println("DHT11 test!");
dht.begin();
setupWiFi();
ambient.begin(channelId, writeKey, &client);
lcd.init();
lcd.backlight();
}
void loop() {
float t = dht.readTemperature();
float h = dht.readHumidity();
if (isnan(h) || isnan(t)) {
Serial.println("Failed to read from DHT sensor!");
return;
}
Serial.print("Temperature: ");
Serial.print(t);
Serial.println(" *C ");
Serial.print("Humidity: ");
Serial.print(h);
Serial.println(" %\t");
ambient.set(1, t);
ambient.set(2, h);
lcd.clear();
lcd.setCursor(1,0);
if (ambient.send()) {
lcd.print("Data sent!");
} else {
lcd.print("Data send NG.");
}
lcd.setCursor(1,1);
lcd.print(" to Ambient.");
delay(5000);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("\xb5\xdd\xc4\xde"); // 「オンド」
lcd.print(": ");
lcd.print(t);
lcd.print("\xdf"); // 上付きの○
lcd.print("C");
lcd.setCursor(0, 1);
lcd.print("\xbc\xc2\xc4\xde"); // 「シツド」
lcd.print(": ");
lcd.print(h);
lcd.print("%");
delay(20000);
}
意に反して1文字しか表示されなかった時は
Arduino nano など、WROOM-02 より処理速度が速いものなどで使うと、この LCD は1文字しか表示されなかったりすることがあります。処理が遅くて追いつかないようです。
そんな時は、次のオマジナイを先にやっておけば、全部表示されるようになります。
(Amazon のカスタマーレビューにありました。)
#define printIIC(args) Wire.write(args)
inline size_t LiquidCrystal_I2C::write(uint8_t value) {
send(value, Rs);
return 1;
}
雑感
DHT11は安くて買いやすいのですが、精度が良くないので目安程度です。