前回、mbedとDHT11を使って、取得した温湿度をlcdに表示させました。

その時の記事↓

やること

今回は、lcdにも表示させつつ、PCにシリアル通信でデータを送り、PC上で表示させてみたいと思います。

環境

Windows10 Pro バージョン1809 64bit

概要

次はPythonかProcessingでシリアル通信して表示させたいのですが、まずはPCのシリアル通信ソフトで試してみたいと思います。

今回はwindowsで行っているので、TeraTermを用います。

結線

前回と同じです。

表1 : DHT11とmbedの接続

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

mbedのプログラム

#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)

//シリアル通信の初期設定
Serial pc(USBTX, USBRX); // tx, rx

//LED1の初期設定
PwmOut led1(LED1); //pwm出力

//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に表示
    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); //整数の精度なので、小数点以下は出さない

    //teratermに表示
    pc.printf("Temp is %2.0f C\n",temp_ave); //整数の精度なので、小数点以下は出さない
    pc.printf("Humi is %2.0f %%\n\n",humi_ave); //整数の精度なので、小数点以下は出さない
    }

//main関数
int main(){

    lcd.cls();
    lcd.locate(0,0);  //lcdの表示消去
    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=0.1; //アベレージが取れたらLED1点灯。眩しくてうざいのでpwmで暗くした
                }
            } 
        else{
            led1=0;
            }
        }
    }

前回のコードからあまり変わりませんが、シリアル通信に関する部分を追加しています。

コメントも少し変えています。

具体的には以下の部分です。

//シリアル通信の初期設定

Serial pc(USBTX, USBRX); // tx, rx
//teratermに表示

pc.printf("Temp is %2.0f C\n",temp_ave); //整数の精度なので、小数点以下は出さない
pc.printf("Humi is %2.0f %%\n\n",humi_ave); //整数の精度なので、小数点以下は出さない

また、シリアル通信には関係ないですが、アベレージ値が取れたときに光らせているLED1が眩しかったので、PWMで調光しています(暗くしています)。

//LED1の初期設定

PwmOut led1(LED1); //pwm出力
led1=0.1; //アベレージが取れたらLED1点灯。眩しくてうざいのでpwmで暗くした

TeraTerm側

windowsのデバイスマネージャーでmbedが接続されているCOMポートを確認します。

mbedをUSB接続すると、デバイスマネージャー上で、例えば「COM4」のように表示されます。

TeraTermを開き、COMポートを選択します。他はそのままでOKです。

mbedにプログラムを書き込んであれば、通信が開始されTeraTermの画面に表示されますが、横にずれて表示されることがあります。

そんな時は上のメニューバーから「設定」→「端末」を選択し、端末の表示設定で改行コード項の受信(R)を「LF」にします。

すると、左側に揃って表示されます。

以上(^^)