mbedと温湿度センサーDHT11で温度湿度を取得してlcdに表示

mbed

ひさびさにmbedを引っ張り出してきました。

いつも間が空くので忘れてしまってググりながらやるのですが、この記事も参考にできるように載せます。

やること

温湿度センサーDHT11を使って、温湿度を取得し、キャラクタlcdに表示してみます。

mbedにはLPC1768を使用します。

DHT11は扱いが簡単なモジュールタイプを使います。

mbed NXP LPC1768
mbed NXP LPC1768がモニタアクセサリストアでいつでもお買い得。当日お急ぎ便対象商品は、当日お届け可能です。アマゾン配送商品は、通常配送無料(一部除く)。
DHT11温湿度モジュール(Temperature and Humidity Sensor): マイコン関連 秋月電子通商-電子部品・ネット通販
電子部品,通販,販売,半導体,IC,マイコン,電子工作DHT11温湿度モジュール(Temperature and Humidity Sensor)秋月電子通商 電子部品通信販売
LCDキャラクタディスプレイモジュール 16×2行 バックライト付白抜き: ディスプレイ・表示器 秋月電子通商-電子部品・ネット通販
電子部品,通販,販売,半導体,IC,マイコン,電子工作LCDキャラクタディスプレイモジュール 16×2行 バックライト付白抜き秋月電子通商 電子部品通信販売

注意点

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の接続

DHT11mbed備考
電源(赤色)VOUT3.3V
センサー出力(緑色)23pinなし
GND(黒色)GND0V

プログラムの説明

プログラム中にコメントを入れていますのでざっくりと説明します。

仕様をみると、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でやってみたいと思います(^^)

コメント

タイトルとURLをコピーしました