ESP-WROOM-02 とDHT11の温湿度計(Ambient)にLCDモニターを付ける


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Ωで代用)

スクリプト

 プログラムは次のとおり。

WROOM
#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 のカスタマーレビューにありました。)

omajinai
#define printIIC(args) Wire.write(args) 
inline size_t LiquidCrystal_I2C::write(uint8_t value) {
  send(value, Rs);
  return 1;
}

雑感

 DHT11は安くて買いやすいのですが、精度が良くないので目安程度です。