前回、mbedとDHT11を使って、取得した温湿度をlcdに表示させました。
その時の記事↓
やること
今回は、lcdにも表示させつつ、PCにシリアル通信でデータを送り、PC上で表示させてみたいと思います。
環境
Windows10 Pro バージョン1809 64bit
概要
次はPythonかProcessingでシリアル通信して表示させたいのですが、まずはPCのシリアル通信ソフトで試してみたいと思います。
今回はwindowsで行っているので、TeraTermを用います。
結線
前回と同じです。
表1 : DHT11とmbedの接続
DHT11 | mbed | 備考 |
---|---|---|
電源(赤色) | VOUT | 3.3V |
センサー出力(緑色) | 23pin | なし |
GND(黒色) | GND | 0V |
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」にします。
すると、左側に揃って表示されます。
以上(^^)