Arduino は現在の温度と湿度のリアルタイム音声ブロードキャストを実装します

    ここ最近気温が非常に高く、重慶では44℃を超え、私の住んでいる杭州でも気象記録があり最高気温41.8℃を記録したので、思いつきで簡単に作ってみました。現在の測定温度を音声でブロードキャストし、現在の温度を確認します。温度は何度ですか?

    たまたま私の手元に温湿度測定モジュールDHT11があるのですが、このモジュールは専用のデジタルモジュール取得技術と温湿度センシング技術を採用しており、非常に信頼性が高く、長期安定性に優れた製品となっています。センサーには抵抗湿度検知素子と NTC 温度測定素子が含まれており、高性能 8 ビット マイクロコントローラーに接続されています。したがって、この製品は、優れた品質、超高速応答、強力な抗干渉能力、および高いコストパフォーマンスという利点を備えています。各 DHT11 センサーは、非常に正確な湿度校正チャンバーで校正されます。校正係数はプログラムの形式で OTP メモリに保存され、これらの校正係数は検出信号の処理中にセンサーで呼び出されます。単線シリアルインターフェイスにより、システム統合が簡単かつ迅速に行えます。超小型サイズ、極めて低い消費電力、信号伝送距離は20メートル以上に達します。重要なのは、価格が非常に安く、特定の宝物で3元未満で購入でき、送料も無料であることです。

    さて、ゴシップの話はやめましょう。音声ブロードキャスト モジュールには LU-ASR01 が使用されています。LU-ASR01 はオフライン インテリジェント音声認識モジュールですが、音声ブロードキャスト モジュールとしても非常に優れています。

    ハードウェアは、Arduino UNO、DHT11 温度および湿度測定モジュール、LU-ASR01 オフライン インテリジェント音声認識モジュール、および数本の DuPont ケーブルです。

    ハードウェア接続方法: Arduino は依然として TX ポートと RX ポートを使用するハードウェア シリアル通信を使用します。LU-ASR01 はデータ送信用のソフト TX として IO6 ポートを使用し、データ受信用のソフト RX として IO7 ポートを使用します。Arduino は LU-ASR01 に 5V 電源を供給し (下図の赤と黒の 2 本のワイヤー)、Arduino の TX は LU-ASR01 の IO7 ポート (ソフト RX) に接続され、Arduino の RX は LU-ASR01 の IO6 ポート (ソフト TX ) に接続されます。 , DHT11の1ピン(電源正極)はArduinoの3.3Vに接続されており(DHT11は3.3Vまたは5Vでも動作可能)、4ピン(グランド)はArduinoのグランドに接続され、2ピン(DATA)はArduinoのD12に接続されています。接続図は次のとおりです。

     プログラムの作成を簡素化するために、Arduino 側のプログラムは DHT11 データを読み取るための単純なライブラリ ファイル DHT.h を呼び出します。ライブラリ ファイルは Web サイトからダウンロードできます: https://github.com/markruys/arduino-DHT 、ダウンロードは完全に無料です。はい、登録やログインなどの必要はありません。Webページを開いた後、緑色のボックス「コード」をクリックしてドロップダウンし、最後の項目「ZIPをダウンロード」をクリックします。Web インターフェイスを次の図に示します。

    通信には今でも3バイトメッセージを使用していますが(詳しくは以前私が書いた「Arduinoで簡易メッセージによるシリアル通信実現の試み」を参照してください)、今回はArduinoからLU-ASR01コマンドに送信するメッセージ2つ、メッセージ1つをカスタマイズしてみました。は温度データを送信するメッセージであり、フォーマットは次のように定義されます。

        最初のバイト: 0x23 (10 進数で 35) 温度データを送信します

        バイト 2: 温度の整数部分

        バイト 3: 温度の小数点以下 2 桁

    第 2 条は湿度データを送信するためのメッセージであり、フォーマットは次のように定義されます。

        最初のバイト: 0x24 (10 進数で 36) 湿度データを送信します

        バイト 2: 湿度の整数部分

        バイト 3: 湿度の小数点以下 2 桁

    また、LU-ASR01からArduinoに送信するメッセージコマンドを定義し、現在の温度または湿度をArduinoに送信するよう要求するメッセージフォーマットを以下のように定義します。

        最初のバイト: 0x25 (10 進数で 37) 現在の温度または湿度の送信を要求します

        バイト 2: 未使用

        3 番目のバイト: =1 には温度の送信が必要、=2 には湿度の送信が必要

    電源投入時に「現在温度」を呼び出し、LU-ASR01が温度データ要求メッセージを送信し、Arduinoがそれを受信したDHT11の温度値を読み取ってLU-ASR01に送信し、LU-ASR01が温度データを受信して​​ブロードキャストします。現在の気温は○○度です。」「現在の湿度」を呼び出して湿度レポートを取得することもできます。

    Arduino 側の完全なプログラムは次のとおりです。

/*

   このプログラムはDHT11を通じて現在の温度と湿度を取得し、ASR01とシリアル通信で接続し、ASR01からブロードキャストを行います。

   現在の温度と湿度。

   通信メッセージ長は3バイト、メッセージフォーマットは以下のとおりです。

   1バイト目:コマンド番号 2バイト目、3バイト目:データ

   このプログラムのメッセージは 3 つのコマンドを使用します。

   温度メッセージの送信: 数値: 0x23 (バイト 1)、バイト 2 の温度整数部分、バイト 3 の温度小数点以下 2 桁

   湿度メッセージの送信: 数値: 0x24 (バ​​イト 1)、バイト 2 湿度整数部、バイト 3 湿度小数点以下 2 桁

   温度と湿度のメッセージ送信要求の受信: 番号: 0x25 (バイト 1)、バイト 2 は使用されません、バイト 3 =1 温度、=2 湿度

*/

#include "DHT.h"

DHT dht;

#define MLEN 3 //メッセージ長を 3 として定義します

const int DHTPin = 12; // DHTPin に接続されているピンを D12 として定義します

unsigned char Txbyte[MLEN]; //シリアルポートによって送信される文字データ、長さは MLEN

unsigned char Rxbyte[MLEN]; //シリアルポートによって読み取られた文字データ、長さは MLEN

float thtmp; //

//初期化

void setup() {

  Serial.begin(9600); //シリアルポートのボーレートを9600に設定します

  pinMode(DHTPin, INPUT); //DHTPinを設定します    

  dht.setup(DHTPin); // DHT11 データ送信用のピンを設定します

}

//メッセージ送信サブルーチン

//パラメータ txb は送信するメッセージ データ、n はメッセージ長です

void txmss(unsigned char txb[],int n){

  int i;

  for(i=0;i<n;++i){

    Serial.write(txb[i]);

    遅延(2);  

  }

}

// メッセージ受信サブルーチン、戻り値はメッセージが正常に受信された場合は true、それ以外の場合は false

// パラメータ rxb は返されたメッセージ データ、n はメッセージの長さ

bool rxmss(unsigned char rxb[],int n){

int i,dn; //dn はタイムアウト カウンタです

  for (i=0; i<n; ++i) {

    dn=0; //タイムアウトカウント変数をリセットします

    while(1){ //  

      if (dn<=50){ //タイムアウトがない場合、バイトの読み取りを待機する最大時間を 50ms に設定します

        if(Serial.available() > 0){ //シリアルバッファにデータがある場合

          rxb[i]=Serial.read(); // バイトを読み取ります

          Break; //while(1) ループから抜け出す

        }

        else{ //シリアル ポート バッファにデータがなく、タイムアウトがない場合、タイムアウト カウンタは +1 になります

          遅延(1);

          dn+=1; //タイムアウトカウンター+1

        }

      }

      else return false; //タイムアウトを受信すると、rxmss関数は終了し、falseを返します

    }

  }

  return true; // 通常は n バイトを受け取り、関数 rxmss は true を返します

}

//メインプログラム

void ループ() {

  late(dht.getMinimumSamplingPeriod()); //DHT11の最小サンプリング周期を取得

  if (Serial.available() > 0){ //シリアルバッファにデータがある場合

    if (rxmss(Rxbyte,MLEN)){ //メッセージが正常に受信された場合 (つまり、3 バイトのデータが配列 Rxbyte に受信された場合)

      if(Rxbyte[0]==0x25) { //受信した Rxbyte[0] が 0x25 の場合、温度と湿度のコマンドを送信する必要があります

        if(Rxbyte[2]==1){ //送信する必要があるのは温度です

          // メッセージを入力します

          Txbyte[0]=0x23; //コマンドコード 0x23 は温度データの送信を意味します

          thtmp=(float) dht.getTemperature(); //DHT11から温度を読み取る

          Txbyte[1]=(int) thtmp; //温度の整数部分は Txbyte[1] に格納されます

          Txbyte[2]=(int) (thtmp-Txbyte[1]*100); //温度の小数点以下 2 桁が Txbyte[2] に格納されます

          txmss(Txbyte,MLEN); //メッセージ送信、温度データをLU-ASR01に送信

        }

        if(Rxbyte[2]==2){ //送信する必要があるのは湿度です

          // メッセージを入力します

          Txbyte[0]=0x24; //コマンドコード 0x24 は温度データの送信を意味します

          thtmp=(float) dht.getHumidity(); //DHT11から湿度を読み取る

          Txbyte[1]=(int) thtmp; //湿度の整数部分が Txbyte[1] に格納されます

          Txbyte[2]=(int) (thtmp-Txbyte[1]*100); //湿度の小数点以下 2 桁が Txbyte[2] に格納されます

          txmss(Txbyte,MLEN); //メッセージ送信、湿度データをLU-ASR01に送信

        }

      }

    }

  }

}

    LU-ASR01 は引き続き「Tianwen ブロック」のグラフィカル プログラミング プラットフォームを採用しています。以下は「Tianwen ブロック」の完全なプログラムです。

     終わってすぐに外に持ち出してテストしてみたら、いきなり45度まで上がり、暑すぎてすぐにテストを終了してエアコンの効いた部屋に逃げ込みました(笑)

私のネット上での名前は「Mr.Unforgiveness」です。CSDN に掲載されている記事はすべて私のオリジナル作品であり、CSDN ウェブサイトにのみ掲載されています。他のウェブサイトへの転載は私の許可を得ていません。

おすすめ

転載: blog.csdn.net/m0_61543203/article/details/126368384