継続する。 前の部分 。
目次:
- パート1.要件。 鉄の選択。 一般的なスキーム
- パート2.ソフトウェア。 中央ユニット、鉄
- パート3.セントラルユニット、ソフトウェア
- パート4.ウィンドウセンサー
- パート5. MySQL、PHP、WWW、Android
中央ユニット。 ソフトウェア
最後に、私たちはプログラマにとって最も難しい部分に来ました-彼がそこで何をしたかを人間の言葉で説明するために。
サーバーのソースコードは、インデントを含めて約1300行ですが、これは怖くないはずです。 ソーステキストには詳細なコメントが記載されていますが、この点に関しては、私のソースが他のどのソースよりもよく説明されていると言っても、私は誤解しません。 ソースコードの直接のコメントには、モジュールを接続するためのすべてのピン配置と、外部ドキュメントへのすべての必要なリンクがあります。 秘密は簡単です-私は「プレイの過程で」自分自身のために絶えずコメントを書いたので、ドキュメンテーションで問題を経験しませんでした。
私が書いたように、すべてのモジュールを手元に置かずに開始できます。 たとえば、無線モジュールまたはESP8266がなくても起動できます。 BMP180気圧センサーも欠落している可能性があります。 後で追加します。 確かに、この場合、欠落しているブロックとの対話を担当するコードのセクションをスケッチで個別にコメントする必要があるかもしれませんが、ほとんどの場合これは必要ありません。 主なものは、少なくとも何かが集まって稼いだということです。それから続けるのがもっと楽しいです。
具体的には、ストーリーのこの時点では、ウィンドウレス(外部)モジュールはまだ組み立てられておらず、データベースを備えた独自のWebサーバーもありません。
- 無線モジュールnRF24L01 +
- WiFiモジュールESP8266。
それでも、モジュールのプログラミングと操作で最も問題があるので、おそらくESP8266から始めます。 その理由は、モジュール自体とそのファームウェアのさまざまなパフォーマンスにあります。
標準のATファームウェアを書いたので、いくつかの欠点があります。
- まだ湿っている(2016年現在)
- ATコマンドを使用してESP8266モジュールを制御するArduinoの通常のライブラリを見つけることができなかったため、自分で「集団農場」をしなければなりませんでした。
別のライブラリでESP8266のコードを発行しませんでしたが、必要な関数を書いただけなので、スケッチは非常に長く出ました。 さらに、必要な機能のみを実装しました。 ATコマンドを使用したESPのプログラミングはすべて、最終的に文字列の解析とコマンド間の遅延の設定に限定されます。
サーバー(中央モジュール)server.inoのソースコードは、こちらで検索してダウンロードできます 。
次に、ESP8266のfirmware/AT23-SDK101-nocloud.bin
し、好奇心の強い人向けのドキュメントは同じディレクトリにあります。 示されたファームウェアをフラッシュすることにより、私のスケッチが意図したとおりにWiFiで動作することを確認できます。 私は他のATファームウェアを試していない。 事実、私はなんとか「高度な」 非 ATファームウェアを見つけ、その作成に少しでも参加することができました。これは私たちの目的にぴったりです( ここではesp-linkです )。 ただし、これが頻繁に発生するため、現在のバージョンの気象観測所での作業が完了した後にすべてが発生したため、すべてをそのままにすることにしました。
そのため、最初に指定されたATファームウェアをフラッシュする必要があります。 ここでは複雑なことは何もありませんが、単純なこともありません。 これを行う方法は、ネットワーク上のどこで( ESP8266)ファームウェアに接続して更新するかについて多く説明されています 。
私のUSB-TTLコンバーターには十分な電流がなく、USBポートが絶えず落ちたので(これはターンです!)、「Arduino as a simple USB-to-Serial TTL converter」方法を使用して、ファームウェアのモジュールを電気的に接続しました。
Linuxで作業しているので、 esptool.py
ていesptool.py
。 ファームウェアの利便性のために、スイッチを備えた小さな補助ボード(ここでは説明しません)を「nakolhozil」します。
フラッシュ後、ポート速度を57600に設定する必要があります(SoftSerialの場合、115200のポート速度は大きく、安定した動作を保証しないため)
AT+UART_DEF=57600,8,1,0,0
次に、標準のArduino IDEライブラリをわずかに変更する必要があります。つまり、ファイルarduino/hardware/arduino/avr/libraries/SoftwareSerial/SoftwareSerial.h
で対応する行を
#define _SS_MAX_RX_BUFF 128 // RX buffer size
ファイルarduino/hardware/arduino/avr/cores/arduino/HardwareSerial.h
、対応する行を
#define SERIAL_TX_BUFFER_SIZE 128 #define SERIAL_RX_BUFFER_SIZE 128
そして、ファイルarduino/hardware/arduino/avr/cores/arduino/USBAPI.h
で対応する行を
#define SERIAL_BUFFER_SIZE 128
厳密に言えば、これは間違っています。なぜなら Arduino SDKを更新すると、これらのファイルは上書きされる可能性が高く、すべての修正を再度繰り返す必要があります。 科学では、指定された値を操作する(可能であれば)独自のライブラリを作成する必要がありますが、これは万人向けではありません。
いずれにせよ、予備的な操作は終わりました。
ここで、中央ユニット(サーバー) server.inoのコードに直接渡します。
最初の行では、WiFiポイントのアクセス設定を変更する必要があります
const String SSID = "..."; const String PASSWORD = "...";
Webサーバーでの作業については、後で詳しく説明します。
以下は(コメント化された)デバッグ定義です。
//#define DEBUG //#define DEBUG_RF //#define DEBUG_ESP //#define DEBUG_LOG_SD
何か問題が発生した場合は、いつでもコメントを解除し、スケッチを再コンパイルしてリロードし、コンソールでより多くのデバッグ情報を取得するか、SDカード上のファイルに書き込みます。 そして、必要なものだけをコメント解除できます。 たとえば、モジュールnRF24L01 +? 次に、DEBUG_RFのみのコメントを外します。
次に、ピンアウト、初期化、および周辺全体の詳細な説明を含む広範なコメントがあります。
ここで、nRF24L01 +の無線チャネル番号を変更できます
#define RF_CHANNEL 73
次に、 void setup()
があります。これは、そこの詳細なコメントから明らかになります。 それでは、 void loop()
、Webサーバーを操作するためのコードはまだ考慮されていません。
スケッチを埋めると、中央ユニットが表示され、何かが表示されますが、すぐには表示されませんが、10分後に値DELAY_LOCAL_SENSOR
ます。 もちろん変更できます。
ディスプレイには、室温と湿度(DHT11センサーからのデータ)および気圧(BMP180から)が表示されます。
以下の機能は、LCD 16×4の表示を担当します。
void lcdClearRow(int row) // , void lcdPrintOutdoor(int temperature, int humidity, float voltage) // , void lcdPrintHome(int temperature, int humidity, int pressure) void lcdPrintInfo(char info[LCD_MAX_COLS]) void lcdPrintStatus() void lcdPrintLastSensorTime()
LCD1604ディスプレイのデザインは次のとおりです。
最初の(上部)行には、路上の天気を示すように設計された定型化されたアイコン(歩く人)が印刷されます(通りに出て行き、通りを下ります)。 自分でアイコンを思いついたので、(5x8ピクセルに収まる)より良いアイデアがあれば、コメントで(バイト配列として)指定できます。 HD44780 LCDモジュール用のカスタムキャラクタージェネレーターでピクセルアートを練習できます。 同じ行に、ウィンドウモジュールの電圧が印刷されます。
2行目は「家の天気」と気圧を表示します。 家のアイコンは標準であり、誰でも理解できます。
3行目では、 lcdPrintLastSensorTime()
は、センサーの最後の読み取り値が取得された時点から経過した時間(秒単位)を、それぞれ通りに、カンマで区切って家に出力します。 気象ステーションが昨日の天気を表示しないことを確実に知るのに役立ちます。 実際、これはデバッグ情報であり、最終バージョンで削除できます。
また、画面の最後の4行目では、 lcdPrintStatus()
関数を使用して、ステータス情報が印刷されます。
- sはローカル圧力センサーです
- eはESP8266モジュールです
- 私はWiFi接続です
- wはWebサーバーの可用性です
- l-SDカード上のログファイル
これらの従来の各文字の後にプラスまたはマイナス記号が表示されます。これは、対応するモジュールの動作にエラーがないか、エラーがないことを意味します。
鉄を選択するという質問に戻り、グラフィックLCD1よりもテキストLCD1604ディスプレイを選択することの利点について説明します。 実際には、ほとんどの場合、さまざまな売り手から購入したLCD1604モジュールは同じであり、接続が予測可能で、プログラムが簡単です。 グラフィックディスプレイについては言えないことですが、グラフィックディスプレイ上でより多くを描画して表示できます。 数メートルの距離からの画像の読みやすさは、テキスト表示の方が良いです。はい、グラフィック表示ではより大きなフォントを作成できますが、それでどれくらいの大きさに収まりますか?
次。 スケッチに記入し、すべてが正常に機能することを確認したら、Arduino Megaマザーボードを外部電源に再接続できます。 または、そのままにして、コンピュータのUSBに接続して、デバッグコンソールでこのすべての美しさを確認します。
すべてのブロックを組み立てていない場合は、不要なコードをコメントアウトできます。 繰り返しますが、このように動作するはずですが、コンソールにエラーメッセージが表示されるだけです。 これを回避する方法は?
たとえば、BMP180大気圧センサーを購入していません。 server.inoスケッチで、対応するライブラリの接続を担当する行を探します。この場合は、
#include <Wire.h> #include <Adafruit_Sensor.h> #include <Adafruit_BMP085_U.h>
このブロックについてコメントします。
次に、Arduino IDEで、(ファームウェアではなく)コードのコンパイルを開始し、コンパイラーが誓う行を調べます。 これらの行についてコメントします。 コードが正常に収集されるまで、エラーなしで操作が繰り返されます。 編集する前に、スケッチのコピーを作成して、晴れた中国から適切なセンサーが到着したときに、すべての操作を繰り返さないようにすることをお勧めします。
使用されるライブラリへのリンクは、ソースコードに記載されています。 そのようなリンクがない場合は、標準のArduino IDEライブラリが使用されました。
念のため、使用したすべてのライブラリ(標準ライブラリを除く) は、librarysディレクトリに格納されています 。 厳密に言えば、これは間違っています。 ライブラリの最新バージョンを公式リポジトリ(バグ修正、新機能付き)からダウンロードする必要がありますが、見つけにくい場合は、既に削除されているか、古いバージョンがサポートされていないため、この場合にのみ、使用したすべてのライブラリを保存しました。
トランスデューサーの組み立てが続くため、この部分は混ざらないように短くなりました。