ひさびさにmbedを引っ張り出してきました。
いつも間が空くので忘れてしまってググりながらやるのですが、この記事も参考にできるように載せます。
やること
温湿度センサーDHT11を使って、温湿度を取得し、キャラクタlcdに表示してみます。
mbedにはLPC1768を使用します。
DHT11は扱いが簡単なモジュールタイプを使います。
注意点
DHT11は安くてお手軽で良いのですが、出力が整数(温度も湿度も)です。小数点以下の値は出ず、0になります。例えば20.4℃でも20.0℃となります。
上位のDHT22でしたら、0.1の桁まで出るようです(持ってないので未確認です)
ライブラリには、lcdを動かすにはTextLCD、DHT11を動かすにはDHTをそれぞれインポートしました。
lcdの接続はライブラリに載っている接続と違いますので注意してください(使いたいデジタルピンと重なっていたので変更しました)
DHTはそのままです。
DHTの電源範囲は3.3V〜5.5Vですが、今回は3.3V入力としました。温度計を隣において、5V入力だと3.3V入力時よりもちょっと温度が高くでまして、温度計より乖離が大きくなったので「きっと」3.3V用のライブラリだろうと進めました笑(ライブラリはしっかり見ていません笑)
結線
mbedのpinは「mbed ピンアサイン」で検索すると出てきます。
接続は以下の表1のようにしました。
表1 : DHT11とmbedの接続
DHT11 | mbed | 備考 |
---|---|---|
電源(赤色) | VOUT | 3.3V |
センサー出力(緑色) | 23pin | なし |
GND(黒色) | GND | 0V |
プログラムの説明
プログラム中にコメントを入れていますのでざっくりと説明します。
仕様をみると、DHT11は2秒以上でサンプリングするようですが、見ているとだいたい1秒間隔ぐらいで温湿度を取得して値をくれていそうです。しかし、取得に失敗することもあるようなので、失敗しなかった時に値をもらうようにします。
タイマー割り込みで、10秒おきにlcdの表示を更新してます。
取得値そのままでも値がバタつくことはなかったのですが、気休めで11回の平均値をlcdには表示しています。
#include "mbed.h"
#include "TextLCD.h"
#include "DHT.h"
//lcdの設定
TextLCD lcd(p10, p12, p15, p16, p29, p30); // RS(4), E(6), D4(11), D5(12), D6(13), D7(14), GND R/W(5)
//LED1を使うので定義
DigitalOut led1(LED1);
//DHT11関係設定
DHT sensor(p23,DHT11); //sense:p23 Vcc:VOUT(3.3V) GND:GND
float temp_data = 0;
float humi_data = 0;
float temp_sum = 0;
float humi_sum = 0;
int c = 0;
float temp_ave = 0;
float humi_ave = 0;
Ticker flipper;
int err;
//Ticker 繰り返しタイマー割り込み
//割り込みの時にlcdに表示
void flip(){
lcd.locate(0,0);
lcd.printf("Temp is %2.0f C",temp_ave); //整数の精度なので、小数点以下は出さない
lcd.locate(0,1);
lcd.printf("Humi is %2.0f %%",humi_ave); //整数の精度なので、小数点以下は出さない
}
//メイン関数
int main(){
lcd.cls(); //lcdの表示消去
lcd.locate(0,0);
lcd.printf("Temp and Humi \nSensor");
wait(1); //安定するまでしばし休み
lcd.cls();
flipper.attach(&flip,10); //タイマー割り込み動き出す。10秒ごとに割り込みでvoid flip()に飛ぶ。
while(1){
err = sensor.readData();
if (err == 0){ //err=0は,データが取れたということ。
temp_data = sensor.ReadTemperature(CELCIUS);
humi_data = sensor.ReadHumidity();
temp_sum = temp_sum + temp_data;
humi_sum = humi_sum + humi_data;
c++;
if(c==10){
temp_ave = temp_sum/11;
humi_ave = humi_sum/11;
temp_sum = 0;
humi_sum = 0;
c=0;
led1=1; //アベレージ値が取れたら、LED1点灯
}
}
else{
led1=0;
}
}
}
今後
次はPCとシリアル通信して、温湿度グラフを書いてみたいと思います(願望。できるかは別として笑)
PC側のシリアル通信とグラフ描画はProcessingかPythonでやってみたいと思います(^^)