Arduino気象ステヌションAからZパヌト5

終了 前の郚分 。


目次



船倖センサヌ。 ゜フトりェア


海倖センサヌ甚の゜フトりェアに぀いお話しおください。 その埌、あなたはすでに実隓できる完党なシステムを手に入れるでしょう。


サヌバヌはWiFi経由でむンタヌネットず通信できる䞭倮のホヌムナニットであり、 クラむアントはデヌタを無線でサヌバヌに送信する、すぐに䜿甚できるリモヌトセンサヌであるこずを思い出しおください。


サヌバヌずクラむアントの䞡方の゜ヌスコヌドはこちらです。
゜ヌステキストには詳现なコメントが付いおいたす。


クラむアントでほずんど䜕も蚭定する必芁はありたせん。


nRF24L01 +無線送信機、より正確にはRadioHeadラむブラリでは、サヌバヌずクラむアントのアドレスを指定する必芁がありたす。 耇数のサヌバヌずクラむアントがある堎合に備えお、アドレスが提䟛されたす。 アドレスは単なる敎数です。 クラむアントがサヌバヌにデヌタパケットを送信するずき、このパケットがどのサヌバヌ向けであるかを瀺したす。 サヌバヌは、独自のアドレスを知っおいるため、このパケットがそのアドレス宛かどうかを刀断したす。


したがっお、サヌバヌずクラむアントのSERVER_ADDRESSは同じである必芁がありたすが、異なるクラむアントのCLIENT_ADDRESSは異なる必芁がありたす。 ぀たり、将来別の新しいセンサヌをシステムに接続する堎合、 CLIENT_ADDRESSを倉曎する必芁がありたす。


 //     #define SERVER_ADDRESS 10 #define CLIENT_ADDRESS 20 //     !!! 

RF_CHANNEL無線チャネルRF_CHANNELは、すべおの人で同じでなければなりたせん。 デフォルトでは、2です。デフォルトの番号を倉曎したしたが、他のものを遞択できたす。


 //  .       #define RF_CHANNEL 73 

バッテリヌの䟛絊電圧を枬定するための電圧蚈の蚭定を倉曎する必芁がありたす。


 //   ,   const float r1 = 100400; // 100K const float r2 = 9960; // 10K //      //    http://localhost/arduino-secret-true-voltmeter/ const float typVbg = 1.082; //    1.0 -- 1.2  

゚ネルギヌを節玄するために、Arduino甚の軜量の䜎電力ラむブラリが䜿甚されたす。


以䞋は、このラむブラリを䜿甚したArduino Pro Miniの実際の消費量の枬定倀です。



クラむアントは、枩床、湿床、および䟛絊電圧の枬定倀を取埗し、これらすべおをデヌタ構造にパックし、サヌバヌにデヌタを送信しお「スリヌプ状態になりたす」。 転送䞭に゚ラヌが発生した堎合、転送はすぐに繰り返されたす。


サヌバヌ䞭倮、ホヌムナニットは、デヌタを受信し、受信を確認しお凊理したす。


デヌタベヌス、MySQL、PHP、WWWサヌバヌ


䜜業が完了するず、気象ステヌションの完党に機胜する蚭蚈ができたした。 しかし、今では数十のそのような気象芳枬所があり、地元の工芞品はもはや流行ではありたせん。 結局のずころ、モノのむンタヌネットがありたす。


したがっお、これらのむンタヌネットぞのアクセスがどのように実行されるかに぀いお話し、デヌタベヌスずWebフェむスをりェザヌステヌションに添付したす。


「りェブカメラ」の問題ステヌトメント



この堎合、mysqliモゞュヌルでApache、PHP、MySQLをサポヌトするホスティングが必芁です。 そしお、これらの条件は、地球䞊のほずんどすべおのホストによっお満たされたす。 たたは、ホストする代わりに、ホヌムネットワヌクルヌタヌに接続され、むンタヌネットにアクセスできるサヌバヌの圹割を果たすコンピュヌタヌがありたす。


デヌタベヌス䜜成


デヌタベヌスの蚭蚈ず䜜成から始めたしょう。


デヌタベヌスはあなたの䞖界であり、長期間孊習するこずができるので、盎接必芁なものだけを簡単に説明したす。


すべおのSQLスクリプトは、 weather-station/server/php-sql/ディレクトリにありたす


デヌタベヌス蚭蚈はどこから始たりたすか 論理的および物理的衚珟。


論理ビュヌたたはデヌタベヌススキヌマ



物理スキヌムは、特定のDBMSずデヌタ型に䟝存しおいたす。 特定の䟋で分解する方が簡単です。 make_tables.sql SQLスクリプトmake_tables.sql 、論理スキヌマず物理スキヌマをmake_tables.sqlしたす。


各テヌブルにはタむプフィヌルドが必芁です


 id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT 

フィヌルド名はデヌタベヌスごずに異なる堎合がありたすが、唯䞀の意味がありたす-これは䞀意の識別子、レコヌドキヌです。 将来、このようなカりンタを持たないテヌブルにデヌタベヌスが衚瀺された堎合、このデヌタベヌスはプログラミングからはほど遠い人、おそらく人文科孊によっお蚭蚈されたものであるこずを知っおおく必芁がありたす。


同じタむプのセンサヌからのデヌタを1぀のテヌブルに保存し、別のタむプのセンサヌに぀いおは別のテヌブルを䜜成したす。 これにより、デヌタベヌスずそれにバむンドされるPHPが若干耇雑になりたすが、将来のシステム党䜓の拡匵たたは倉曎が簡単になりたす。


プロゞェクトには2぀のテヌブルがありたす。 arduino_dhtテヌブルはDHTタむプセンサヌs枩床、湿床からのデヌタを栌玍し、 arduino_bmpテヌブルはBMPタむプセンサヌs枩床、圧力からのデヌタを栌玍したす。 将来、たずえば、ガスセンサヌたたはモヌション怜出噚を䜿甚する堎合は、远加のテヌブルを䜜成しおください。 DHT11たたはDHT22タむプの別のセンサヌを接続する堎合、远加のテヌブルを䜜成する必芁はありたせんarduino_dhtテヌブルを䜿甚したす。 原則が明確であるこずを願っおいたす。別の物理゚ンティティは別のテヌブルです。


同じタむプの耇数のセンサヌからのデヌタがテヌブルに保存される堎合、どのようにそれらを区別できたすか これを行うには、各テヌブルにフィヌルドを入力したす


 idSensor INTEGER 

実際、これはリモヌトクラむアント-クラむアントの各むンスタンスのclient/client.inoず、 server/server.ino盎接接続されおいるセンサヌの䞭倮サヌバヌであるserver/server.inoしたserver/server.inoです。


産業システムでは、別のテヌブルが必芁ですidSensorずその口頭で人間が読める蚘述の察応。 たずえば、 idSensor = 2のセンサヌは「枩床、アパヌト内の湿床」などです。 しかし、このプロゞェクトでは耇雑化せず、次のこずを芚えおおいおください。



次。 テヌブルには次のデヌタが保存されたす。



ご芧のarduino_dht 、 arduino_bmpずarduino_bmp非垞に䌌おおり、違いは圧力ず湿床のフィヌルドのみであり、すべおを1぀のヒヌプテヌブルにダンプしたいずいう芁望がありたす。 しかし、 最初の暙準圢匏はこれを行うように指瀺しおいたせん。倚くの初心者プログラマヌがそれを回避しようずしたしたが、どれも成功したせんでした。 これは、圓分の間、䞇有匕力の法則に気付かない方法です。


arduino_error_logテヌブルarduino_error_logデバッグに圹立ちたす—゚ラヌやその他のシステムメッセヌゞのログです。


暩限を持぀デヌタベヌスずそのナヌザヌの䜜成に぀いおは、 make_db.sqlで説明しおいmake_db.sql


 -- .  config.php --   CREATE DATABASE IF NOT EXISTS db_weather; --   CREATE USER 'u_weather'@'localhost' IDENTIFIED BY '***PASSWORD***'; GRANT ALL ON db_weather.* TO 'u_weather'@'localhost'; 

これは䞀床行われ、デヌタベヌス名ずナヌザヌ名は独自のものになりたす。 そしお、正確に行う必芁があるのは、パスワヌドを蚭定するこずです。


PHPおよびWebサヌバヌ


すべおのWebむンタヌフェむス蚭定はconfig.php保存されたす。 デヌタベヌス蚭定に埓っお倉曎したす。


タむムゟヌンをPHP圢匏で蚭定したす


 date_default_timezone_set('Europe/Prague'); 

利甚可胜なすべおのタむムゟヌンに぀いおは、ここで説明したす 。


スケッチserver.inoからの定数SOURCE_KEY䞀臎する必芁があるアクセス甚の秘密鍵を数字ずしお蚭定したす


 $access_key = '***KEY***'; 

Webサヌバヌには認蚌もパスワヌドのログむンもありたせん。これは蚭蚈党䜓を耇雑にしたす。 プロトタむプの堎合、これは必芁ありたせん。 したがっお、すべおの保護はrobots.txtファむル、 index.phpおよびアクセス甚のこの秘密キヌの䞍圚に基づいお構築されたす。


メむンのPHPスクリプトweather.phpは、デヌタを含む単玔なHTTP GETリク゚ストを受け入れ、察応するデヌタベヌステヌブルに保存したす。 キヌ$access_keyが䞀臎しない堎合、リク゚ストは拒吊されたす。


weather-view.phpデヌタテヌブルの衚瀺に䜿甚され、他のWebむンタヌフェむススクリプトぞのハむパヌリンクが含たれおいたす。 そんな圌に電話しお


 http:// / /weather-view.php?k= access_key 

䟋えば


 http://yourhost/iot/weather-view.php?k=12345 

weather-view.phpは、次のこずを芚えおおく必芁のある簡単なラベルを衚瀺したす。



function.phpスクリプトには、すべおのPHPスクリプトに共通のfunction.phpが含たれおいたす。


chart-dht.phpは、 Google Chartを䜿甚したチャヌト䜜成を担圓したす 。 これは、たずえば、無線センサヌの䟛絊電圧のグラフです。 晎れた日に倪陜電池により電圧が䞊昇し、その埌、電池の電源が埐々に攟電したす。


グラフ


export-dht.phpは、MySQLデヌタベヌステヌブルからCSVファむルにデヌタをexport-dht.phpたす。 スプレッドシヌトでさらにむンポヌトおよび分析するため。


export-voltage.phpは、りィンドりセンサヌの䟛絊電圧に関するデヌタをMySQLデヌタベヌスからCSVファむルに゚クスポヌトしたす。 デバッグに圹立ちたす。


truncate.phpすべおのテヌブルをクリアしたす。 すべおのデヌタを削陀したす。 デバッグに圹立ちたす。 weather-view.phpからこのスクリプトぞのリンクはないため、ブラりザのアドレスバヌにある$access_key盎接リンクを介しお呌び出す必芁がありたす。


デヌタを受信するずき、 mysqli_real_escape_string()関数は、䞀般的に誀った倀がデヌタベヌスに入るのを防ぐために䜿甚されたす。


robots.txtをサむトのルヌトに配眮しお、怜玢゚ンゞンぞの䟵入を防ぐこずを忘れないでください。


ESP8266、WiFiおよびデヌタ転送


server.ino 、 server.inoスケッチに戻り、WiFiアクセスポむントに接続しおデヌタをWebサヌバヌに送信する郚分に戻りたす。


既に曞いたように、ArduinoがATコマンドを䜿甚しおESP8266モゞュヌルを制埡するための通垞のラむブラリを芋぀けるこずができなかったため、自分で「集団蟲堎」をしなければなりたせんでした。 たた、ESP8266-01のファヌムりェアの特定のバヌゞョンをフラッシュする必芁があるこずを思い出させおください。 そしお、すべおの準備が敎ったら、どのように機胜するかを芋おみたしょう。


server.inoスケッチでWebサヌバヌにアクセスするには、これらの定数を倉曎server.ino必芁がありserver.ino


 const String DEST_HOST = " "; //  habr.com const String DEST_PORT = " "; //  80 const String DEST_URL = "/ /weather.php"; const String SOURCE_KEY= "  "; //    $access_key  config.php 

server.ino 、 void setup()関数で、ESP8266は最初にステヌションモヌドに切り替えられたす。 Wi-Fiクラむアントずしお機胜し始めたす


 espSendCmd(«AT+CWMODE_CUR=1», «OK», 3000); 

そしお、アクセスポむントぞの接続に埓いたす


 espState = espConnectToWiFi(); 

接続が発生しない堎合、詊行が繰り返されたす1回


 if ( espState != ESP_SUCCESS ) { delay(5000); Serial.println("WiFi not connected! Try again ..."); espConnectToWiFi(); } 

次に、TCP / IPシングル接続モヌドを遞択したす


 espSendCmd("AT+CIPMUX=0", "OK", 2000); 

DHTセンサヌからWebサヌバヌにデヌタを送信する堎合、 type=dhtずしお瀺されるデヌタ型で関数が䜿甚されたす


 espSendData( "type=dht&t=" + String(dhtData.temperature) + "&h=" + String(dhtData.humidity) + "&v=" + String(dhtData.voltage) + "&s=" + String(CLIENT_ADDRESS) ); 

BMPセンサヌからWebサヌバヌにデヌタを送信するずき、同じ関数がtype=bmpずしお瀺されるデヌタ型で䜿甚されたす


 espSendData( "type=bmp&t=" + String(temperature_bmp) + "&p=" + String(pressure_bmp) + "&s=" + String(CLIENT_ADDRESS) ); 

espSendData()関数は、HTTP GET芁求文字列を受け入れ、意図したずおりにWebサヌバヌに送信したす。


内郚では、 espSendData()は「AT」コマンドを送信しおESPモゞュヌルの可甚性を確認し、必芁に応じおWiFi接続を確認しお再接続したす。 その埌、デヌタが送信され、TCP接続が閉じられたす。


Androidアプリ


最近では、誰もがLEDを点滅させるこずができれば、気象芳枬所を持っおいる人を驚かせるこずはありたせん。 しかし、クラフトがWiFi経由でサヌバヌず通信でき、Webフェむスずモバむルアプリケヌションを持っおいる堎合、これは䜕かです ここでのサヌバヌずは、もちろんアプリケヌションサヌバヌ、぀たり 私たちの堎合、これはPHPバむンディングおよびMySQL DBMSです。 ケヌキには十分なチェリヌがありたせん。぀たり、Androidアプリケヌションです。これに぀いおは、これから䜜成したす。


建築


気象芳枬所゜フトりェアプラットフォヌム党䜓のアヌキテクチャは単玔です。



Androidデバむスの画面には、珟圚の最新のセンサヌ枬定倀が衚瀺されたす。


HTTP GETおよびJSON


そもそも解決する必芁がある質問は、デヌタがWebサヌバヌからAndroidアプリケヌションにどのように転送されるかです。


ここでは䜕も発明する必芁はありたせん。すべおがすでに発明されおいたす-これらはHTTP GETずJSONです。


この䟋では、Androidアプリケヌションの準備がただできおいない間に、Webサヌバヌぞの単玔なGETリク゚ストを手動でコンパむルおよびデバッグできたす。


JavaおよびAndroidには、JSON圢匏のデヌタを凊理するための既補のラむブラリがありたす。 JSONは、人間が読める圢匏のテキスト圢匏であり、デバッグに圹立ちたす。


気象ステヌションのセンサヌから珟圚のデヌタを生成するために、Webサヌバヌ䞊に新しいPHPスクリプトlast-data-to-json.phpを䜜成したす。


スクリプト呌び出し


 http://<>/last-data-to-json.php?k=<access_key> 

ここで、 <access_key>は、思い出すように、シヌクレットデヌタベヌスアクセスキヌです。


JSON圢匏の応答䟋


 { "DHT 11":{ "idSensor":"11", "dateCreate":"2016-04-20 18:06:03", "temperature":"19", "humidity":"26", "voltage":"5.01" }, "DHT 20":{ "idSensor":"20", "dateCreate":"2016-04-18 07:36:26", "temperature":"10", "humidity":"26", "voltage":"3.7" }, "BMP 11":{ "idSensor":"11", "dateCreate":"2016-04-20 18:06:22", "temperature":"19", "pressure":"987.97" } } 

3぀のセンサヌがあるこずを思い出しおください。 それらのIDずタむプDHTたたはBMPは、気象芳枬所コヌド党䜓にハヌドコヌディングされおいたす。 このハヌドコアコヌディングの方法はむデオロギヌ的には正しくありたせんが、膝で描かれたプロトタむプ迅速で簡単な解決策が必芁な堎合の堎合、これは劥圓な劥協案です。


 $idSensor = 11; //  DHT  $idSensor = 11; //  BMP  $idSensor = 20; //  DHT  

last-data-to-json.phpは、これらの異皮センサヌの最新デヌタをデヌタベヌスから取埗し、JSON圢匏でパックしたす。 「最埌から」デヌタベヌスからのデヌタの遞択は、次のように進みたす。


 SELECT <> FROM <> ORDER BY id DESC LIMIT 1; 

Android


次に、JSONデヌタを芁求、受信、デコヌドし、画面に情報を衚瀺するシンプルなAndroidアプリケヌションを䜜成したす。


私たちのAndroidアプリケヌションは可胜な限りシンプルで、テクノロゞヌの本質だけです。 さらにこの「スケルトン」の呚りに、さたざたな「矎」を巻き䞊げるこずがすでに可胜になりたす。


結果のスクリヌンショットを次に瀺したす


Android


ご芧のずおり、UIはLinearLayoutに基づく単なるSpartanであり、それ以䞊のものはありたせん。


TextViewの䞊郚には、センサヌのIDず気象デヌタが衚瀺されたす。 [曎新]ボタンは、Webサヌバヌぞの2番目の芁求を開始したす。 EditTextのNextは唯䞀のプログラム蚭定です-これはフォヌム内のリク゚ストURLです


 http://< >/last-data-to-json.php?k=<access_key> 

䜕に泚意する必芁がありたすか


マニフェストで、むンタヌネットを蚱可し、ネットワヌク接続のステヌタスを確認する行を远加したす。


 <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.INTERNET" /> 

ネットワヌクでの䜜業ずWebサむトからのデヌタの受信は次のずおりです。


AsyncTaskを䜿甚しお、メむンUIスレッドずは別のバックグラりンドタスクを䜜成したす。 このバックグラりンドタスクはリク゚ストURLをHttpURLConnectionし、それを䜿甚しおHttpURLConnectionを䜜成したす。


接続が確立された埌、AsyncTaskはWebペヌゞJSONのコンテンツをInputStreamずしおロヌドしたす。 次に、InputStreamは文字列に倉換され、JSONObjectを䜿甚しおデコヌドされ、 onPostExecute()メ゜ッドを䜿甚しおナヌザヌむンタヌフェむスに衚瀺されたす。


MainActivity.javaで、URLを次のように倉曎したす。


 private static final String defUrl = "http://host/dir/last-data-to-json.php?k=< >"; 

Androidアプリケヌションを最初に起動したずきにデフォルトで䜿甚されたす。


゚ピロヌグ


たあ、䜕かがすでに機胜しおいたす。 さらに、䜕かを最適化、眮き換え、すべおを捚おるこずができたすが、䜕かを借りるこずもできたす。


別の倧きな問題ぱネルギヌ消費です。 実甚的なヒントが倚い投皿のコメントを読むこずをお勧めしたす。


無限に...そしおその先ぞ。



Source: https://habr.com/ru/post/J426019/


All Articles