温湿度をFSTN液晶モジュールで表示
温湿度センサ(DHT11)の続きで,温湿度データをFSTN液晶モジュールで表示してみた
フォントをそこそこのサイズにしないと見え難いためu8glibのソースを見ながら適切なフォントを選択
#include "U8glib.h"
#include "DHT.h"
U8GLIB_MINI12864 u8g(10, 9);
DHT dht(2, DHT11);
void draw(float h, float hic) {
u8g.setFont(u8g_font_helvR24);
u8g.setPrintPos(4, 28);
u8g.print(hic);
u8g.setPrintPos(94, 28);
u8g.print("'C");
u8g.setPrintPos(4, 60);
u8g.print(h);
u8g.setPrintPos(94, 60);
u8g.print("%");
}
void setup(void) {
dht.begin();
u8g.setContrast(190);
}
void loop(void) {
// Wait a few seconds between measurements.
delay(2000);
float h = dht.readHumidity();
float t = dht.readTemperature();
if(isnan(h) || isnan(t)) {
Serial.println("Failed to read from DHT sensor!");
return;
}
float hic = dht.computeHeatIndex(t, h, false);
// picture loop
u8g.firstPage();
do {
draw(h, hic);
} while(u8g.nextPage());
}
ところでデータシートを見ると,この温湿度センサ(DHT11)は,やっぱ廉価版のせいか小数点以下のデータはない(上で表示している小数点以下は補正で出てるだけ)
以下抜粋
Data consists of decimal and integral parts.
A complete data transmission is 40bit, and the sensor sends higher data bit first.
Data format: 8bit integral RH data + 8bit decimal RH data + 8bit integral T data + 8bit
decimal T data + 8bit check sum.
If the data transmission is right, the check-sum should be the last 8bit of "8bit integral
RH data + 8bit decimal RH data + 8bit integral T data + 8bit decimal T data".
要約すると,
データは40ビットでMSBから送られてくる
つまり全体は5バイト,最初の2バイトが湿度,次の2バイトが温度でそれぞれ1バイト目が整数部,2バイト目が小数点以下部となる
最後の1バイトはCRC(チェックサム)で1~4バイトを加算した数(オーバーフロー部は捨てる)
そして温湿度センサ(DHT11)の場合は,温湿度の2バイト目の小数点以下が必ず0になっている
湿度は製品で値がまちまちなようなので小数点以下はいらないかなと思うけど,気温はせめて0.5位までは欲しいかなと思うのでちょっと残念(使い場所を考えないといけないな)
次は大気圧センサを追加してみる
大気圧だけでなく温度も取得できるようだ