SMS温度返信
コンポーネントと消耗品
> |
| × | 1 | |||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 |
このプロジェクトについて
こんにちは。このプロジェクトは、はるかに大きなプロジェクトの一部です。この部分で多くの問題が発生し、最終的に解決策を見つけたので、コミュニティと共有して、プロジェクトで役立つことを願っています。
プロジェクトの説明
SMSをArduinoに送信して、自宅の気温を取得します。
ソフトウェア
SIM800Lモジュールには、「Seeeduino_GPRS-master」ライブラリを使用しました。 MEGAで動作できるようにするには、「sim800.h」ライブラリの次の行を変更する必要がありました。
#define SIM800_TX_PIN 8#define SIM800_RX_PIN 7
... TX_PIN10およびRX_PIN11に。ライブラリを「SoftwareSerial」からメガシリアルポートの1つ、つまりSerial3に変更するのは難しすぎたため、簡単に解決できました。
問題
基本的に、私のコードは、「DHT.h」と「Seeeduino_GPRS-master」の2つのライブラリからサンプルをカットアンドペーストします。私が抱えていた問題は、「gprs.h」の例では、事前に定義されたメッセージを引用符で囲む方法しか示されていないことでした。温度センサーから可変浮動小数点値を送信する方法がわかりませんでした。これは、私が試した他のライブラリ「GPRS_SIM900-master」と「SIM800L-master」にも当てはまりました。
問題を解決するためにWEBで例を検索するのに何週間も費やしましたが、何も見つかりませんでした。同じテーマのフォーラム投稿を見つけました。答えが得られなかった貧しい失われた魂のために、この投稿を見つけていただければ幸いです。
答え
float値をStringに変換してから、StringをChar配列に変換します-簡単です!
コードスニペット
MyString =String(temp、0); // floatをStringMyStringに変換=(MyString + "Degrees C"); //文字列をcharに変換開始ここから開始//長さ(ヌルターミネータに1文字追加)int str_len =MyString.length()+ 1; //文字配列(バッファ)を準備しますchar char_array [str_len]; // MyString.toCharArray(char_array、str_len); //文字列をcharに変換しますendheregprs.sendSMS( "04 +++++++ + "、char_array); //電話番号とテキストを定義します。
配線
simモジュールに電力を供給するためにULTRAFIRE18650バッテリーを使用しました。後で、回路に電圧レギュレータを追加します。このチュートリアルを参照してください。
参考資料
- http://www.ayomaonline.com/programming/quickstart-sim800-sim800l-with-arduino/
- https://www.sparkfun.com/datasheets/Sensors/Temperature/DHT22.pdf
ライブラリ
- https://github.com/Seeed-Studio/Seeeduino_GPRS
- https://github.com/adafruit/DHT-sensor-library
コード
- DHT_SIMPosting.ino
DHT_SIMPosting.ino Arduino
SMSの送信「InTemp」は温度とArduinoの応答を度Cで要求します。//さまざまなDHT湿度/温度センサーのテストスケッチの例// ladyada、public domain#include "DHT.h" #define DHTPIN2 //接続しているデジタルピン#defineDHTTYPE DHT22 // DHT 22(AM2302)、AM2321 //#define DHTTYPE DHT21 // DHT 21(AM2301)//センサーのピン1(左側)を+ 5V //センサーのピン2をDHTPINに接続します//センサーのピン4(右側)をGROUNDに接続します// 10K抵抗をピン2(データ)からピン1(電源)に接続しますセンサー// DHTセンサーを初期化します。DHTdht(DHTPIN、DHTTYPE); #include#include #define TIMEOUT 5000GPRS gprs; bool ITemp =false; float temp; String MyString; #define LED_PIN 13bool ledStatus; // SIM800charからのシリアル出力の最後の行を保持する変数currentLine [500] =""; int currentLineIndex =0; //メッセージ通知が見つかった場合はtrueに設定され、セリアの次の行l出力は実際のSMSメッセージですcontentboolnextLineIsMessage =false; void Reply()//関数はここから始まります{Serial.println( "GPRS-SMSテストを送信..."); gprs.preInit(); delay(1000); while(0!=gprs.init()){delay(1000); Serial.print( "初期エラー\ r \ n"); } Serial.println( "初期化に成功し、SMSメッセージの送信を開始します..."); if(ITemp ==true){float t =dht.readTemperature(); temp =t; ITemp =false; } MyString =String(temp、0); // floatをStringに変換しますMyString =(MyString + "Degrees C"); //文字列をcharに変換しますここから始まります//長さ(ヌルターミネータに1文字余分に)int str_len =MyString.length()+ 1; //文字配列(バッファ)を準備しますchar char_array [str_len]; // MyString.toCharArray(char_array、str_len);にコピーします//文字列をcharに変換しますここで終了gprs.sendSMS( "04 ++++++++"、char_array); //電話番号とテキストを定義します//関数はここで終了します} void setup(){Serial.begin(9600); Serial.println( "DHTxxテスト!"); dht.begin(); gprs.preInit(); delay(1000); while(0!=gprs.init()){delay(1000); Serial.print( "初期エラー\ r \ n"); //後でNextionHMIホームページにSIMエラーを表示} // SMSモードをASCIIに設定if(0!=gprs.sendCmdAndWaitForResp( "AT + CMGF =1 \ r \ n"、 "OK"、TIMEOUT)){ERROR( "エラー:CNMI");戻る; } //新しいSMSメッセージ表示のリッスンを開始if(0!=gprs.sendCmdAndWaitForResp( "AT + CNMI =1,2,0,0,0 \ r \ n"、 "OK"、TIMEOUT)){ERROR( "エラー:CNMI ");戻る; } Serial.println( "Init success");} void loop(){//測定の合間に数秒待ちます。 delay(2000); //温度または湿度の読み取りには約250ミリ秒かかります! //センサーの読み取り値も最大2秒古い場合があります '古い'(非常に遅いセンサー)float h =dht.readHumidity(); //温度を摂氏(デフォルト)として読み取りますfloat t =dht.readTemperature(); Serial.print( "湿度:"); Serial.print(h); Serial.println( "%\ t"); Serial.print( "温度:"); Serial.print(t); Serial.println( "* C"); SIM();} void SIM(){//現在のステータスをLEDピンに書き込むdigitalWrite(LED_PIN、ledStatus); Serial.println( "SMSを探しています"); // SIM800からのシリアル出力がある場合if(gprs.serialSIM800.available()){char lastCharRead =gprs.serialSIM800.read(); //シリアル出力から\ rまたは\ n(行の終わりを示す)に達するまで各文字を読み取りますif(lastCharRead =='\ r' || lastCharRead =='\ n'){String lastLine =String(currentLine); //最後の行が+ CMTを読み取った場合、新しいSMSメッセージ表示が受信されました。 //したがって、次の行はメッセージの内容です。 if(lastLine.startsWith( "+ CMT:")){Serial.println(lastLine); nextLineIsMessage =true; } else if(lastLine.length()> 0){if(nextLineIsMessage){Serial.println(lastLine); //メッセージコンテンツを読み取り、SMSコンテンツに従ってステータスを設定しますif(lastLine.indexOf( "InTemp")> =0){Serial.println( "InTemp"); ITemp =true;返事 (); // ledStatus =1; // Serial.println( "Turn ON the Light"); //} else if(lastLine.indexOf( "LED OFF")> =0){// ledStatus =0; // Serial.println( "Turn OFF the Light"); } nextLineIsMessage =false; }} //読み取りの次の行のchar配列をクリアしますfor(int i =0; i
回路図
製造プロセス