Arduino からの ESP8266 Wi-Fi モジュールの基本操作

Arduino からの ESP8266 Wi-Fi モジュールの基本操作

Arduino からの ESP8266 Wi-Fi モジュールの基本操作

エスプレッシフ 最初のモジュールを市場に投入 無線LAN 統合された ESP8266 Y·エル ファームウェア AT コマンドを使用してそれを処理する方法について、私たちユーザーが興味を持っていたのは、それをアセンブリに統合することでした。 マイクロコントローラー そして問題は(かつての)闇を知ることに帰着した ESP8266 ATコマンドテーブル、栄養補給のニーズ、または ESP8266ファームウェアアップデート.

目次

    その後、プログラムを作成するための代替手段がすぐに登場しました。 ESP8266 およびモジュールの実装 無線LAN 非常に異なるフォーマットであるため、別の懸念が生じました。 どの ESP8266 Wi-Fi モジュールを選択するか さまざまなアンテナ (外部アンテナを含む) の範囲、またはアセンブリへのこれらの新しいモジュールの物理的な統合に応じて異なります。

    確かに、これらすべての変化により、最も基本的な側面、つまり企業の最も基本的な管理に重点が置かれていない可能性があります。 ESP8266 Wi-Fi モジュール。 でも 極性.es の使用に関する情報を見つけることができます。 ESP8266 の動作を一般的な方法で説明することを目的としたアプリケーションがいくつかあります。 ESP8266 Wi-Fi モジュール 特に記事での AT コマンドの使用 ESP8266 Wi-Fi モジュールを使用して Arduino から HTTP クエリを作成するライブラリ、読者の感想によると、 ESP8266 独自の実装を実行します。

    を操作するための基本的な操作について話し合います。 ESP8266 そして、一般的な解決策を提案することは、いくつかの非常に異なる部分からなる目的です。記事の内容を理解するために、次の索引がガイドとして役立ちます。

    シリアルポートを介してコンピュータからESP8266 Wi-Fiモジュールを制御します

    お皿から Arduinoの そしてあなたの IDE の動作を監視することが可能です。 ESP8266 Wi-Fi モジュール、送信します ESP8266 AT コマンド 答えを見てください。ただし、ターミナル タイプのアプリケーションを使用してコンピュータから実行する方がはるかに便利です。

    CuteCom を使用してシリアル ポート経由で ESP8266 Wi-Fi モジュールをテストする

    どの板かによる Arduinoの 使用すると、ハードウェア シリアル ポートが XNUMX つしか使用できない場合があり、送受信に少し不便が加わります。コンピュータや一部のマザーボードからのシリアル通信アプリケーションでは、通信速度の変更がより快適になります。 Arduinoの (および状況によっては) シリアル通信の高速度、特に最新バージョンのデフォルト速度である 115200 ボーはサポートされていません。 ファームウェア.

    上の 監視に使用するプログラム ESP8266 シリアルポートを使用する、ニーズや好みに応じて選択できるものがたくさんあります。最近はクラシックをよく使うようになりました キュートコム (上のスクリーンショットにあるもの) 特定のことを繰り返すのが私にとって非常に快適だからです。 ESP8266 Wi-Fi モジュール AT の注文 プロジェクトのテスト中。

    シリアル コンソールとして機能するプログラムについては、いくつかの推奨事項がここですでに示されています。たとえば、次のような話をするとき、 コンピューターから UART シリアル デバイスを制御するための PuTTY. PUTTY優れたアプリケーションであることに加えて、ほとんどのデスクトップ オペレーティング システムで利用できます。さらに、 PUTTY シリアル ポートと インターネット プロトコル ファミリ (TCP/IP)、上で動作するものを含む TLSは、設定とその使用に慣れるまでに費やした (わずかな) 時間を十分に返済してくれる一般的なツールになります。

    PuTTY を使用してシリアル ポート経由で ESP8266 Wi-Fi モジュールをテストする

    シリアル通信ソフトウェアに加えて、 接続する ESP8266 Wi-Fi モジュール ポートへ USB パソコンにもコンバーターが必要です USB シリーズへ TTL。ソフトウェアの場合と同様に、いくつかのバージョンがあり、それらはポートを変換するためにのみ使用されます。 USB シリアルポート上で TTL (XNUMX ユーロから入手可能) から、さまざまなプロトコルをエミュレートできるもの (たとえば、 SPI o I2C).

    シリアル コンソールとして機能するプログラムと同様に、コンピュータと通信するためのハードウェア USB 論理回路(だけではありません)を使用して、 ESP8266) マイクロ制御アプリケーション開発者の作業では一般的なツールとなるため、できるだけ早くツールボックスに入れて作業する価値があります。 ESP8266 Wi-Fi モジュール 手に入れる絶好のチャンスです。

    ESP8266 Wi-Fi モジュールを監視するための USB UART シリアル通信用のハードウェア

    コンバーター USB a UART TTL を使用する回路の動作を監視するためにも使用できます。 ESP8266これを行うには、監視したい出力を、高速ダイオード ( 1N4148、たとえば)と抵抗(たとえば 2K2)を互いに並列に接続します。このようなセットアップは、ハードウェア シリアル スニファーのように機能します。

    USB UART TTL コンバータを使用して Arduino に接続された ESP8266 のスニファーの例

    上の画像のスニッファーは確かに初歩的なものではありますが (特に、次のような機能はありません) バッファ) でアセンブリの動作を監視するには十分です。 Arduinoの Y·エル ESP8266.

    以前のスキームからスニファーを削除すると、 接続方法を示す回路図 ESP8266 Wi-Fi モジュール 皿に Arduinoの。 3V3 での給電に加えて、集積回路のリセット ピンとアクティベーション ピンをハイ レベル (イネーブル) に接続する必要があります。もちろん、一方の RX ピンはもう一方の TX ピンに接続する必要があります。

    前の図を簡略化するために、プレートが表されています Arduinoの 3V3 で電力が供給されており、シリアル ポートの電圧も 3V3 であると想定されます。を使用する場合は、 マイクロコントローラー 損傷しないように、シリアル ポートの信号レベル (通常は 5 V) を変更する必要があります。 ESP8266、 使う レベルコンバータ 以下の図のようなものです。この回路は、多くの市販の既製モジュール実装で頻繁に見られます。

    ESP5 WiFiモジュールおよびArduino用の3Vから3V8266信号レベルコンバータ

    ESP8266ファームウェアをアップデートする

    ラス ESP8266 AT コマンド、その終了、モジュールのデフォルト速度... のバージョンによって異なります。 ESP8266ファームウェア。すべてのモジュールで同じバージョンを使用し、可能であれば最新バージョンであることを確認することが最善です。

    残念ながら、ほとんどの ESP8266 Wi-Fi モジュール モデル 4Mbit しかないため、最新バージョンをインストールできません。インストールできるファームウェアの最新 (公式) バージョン ESP8266 Wi-Fi モジュール 4 Mbit (ほとんど) のバージョンは 0.9.4 で、これにはバージョン 0.2 が含まれます。 ESP8266 AT コマンド.

    要約すると、ファームウェアを更新するには以下が必要です。

    1. 対応するファームウェアバージョンをダウンロードする。 ザ 4 M ビットのメモリを備えたモジュールの最新 (公式) バージョン。Github の Espressif フォルダーにあります。。 で エスプレシフのウェブサイト ファームウェアの最新バージョンをダウンロードできますが、ファームウェアがインストールされているモジュールに十分なメモリがあることを確認することが非常に重要です。

    2. 最新バージョンのファームウェアインストールツールをダウンロードします。。 私のお気に入りは エスプツール に書かれているのは Python , そのため、どのプラットフォームでも動作します。ダウンロードするだけでなく、次の方法でインストールすることもできます。 pip install esptool (o pip2 o python -m pip…)。もちろん、 エスプレッシフ 独自のツールも提供していますが、現在は Windows でのみ利用可能です。

    3. ダウンロードしたファイルを準備する;それらをアクセス可能なフォルダーに解凍し、必要に応じてツールを実行可能にします。 エスプツール、私の場合、 GNU / Linuxの、と chmod +x esptool

    4. コンバータを使用してモジュールをコンピュータに接続します USB UART TTL 3V3で動作します または、5 V で動作する場合はレベルコンバータを使用します。電源に加えて、コンバータの TX を RX に接続する必要があります。 USB UART TTL、RX から TX、GPIO0 を低レベル (GND) に、おそらく GPIO2 を高レベルにします (私のテストでは、低レベルでの接続と切断の両方で機能しました)。モジュールに GPIO15 接続が空いている場合 (ESP-12 で発生するように)、ロー レベルに接続する必要があります。通常、動作中はハイレベルになるRESETは、録音を開始する前に接続してデバイスをリセットする必要がある場合があるため、未接続のままにするか、抵抗(たとえば10K)を使用してハイレベルに接続することができます。低いレベルまで。
      モジュールの電源を入れるとアップデートできるようになりますが、 接続エラーが表示された場合はリセットが必要となります RESET をローレベルで一瞬接続し、その後更新プロセスのためにオンエアのまま (接続せずに) 残します。
      モジュールには、 半アンペア消費のピーク (一部のユーザーによると最大 600 mA) そのため、特にファームウェアを更新する場合は、この消費量に対応できる電源を使用することが重要です。

      接続 Wi-Fi モジュール ESP8266 ESP-01 から USB UART TTL コンバータへのファームウェアのアップデート

    5. ツールを実行してファームウェアを更新する。私の場合、ステップ 3 のツールとファームウェアのドキュメントを同じフォルダーに保存したので、コンソールから実行します。
      cd ~/Datos/firmwareESP8266 (ツールとファームウェアを含むフォルダーに変更)
      ./esptool.py --baud 115200 --port /dev/ttyUSB0 write_flash \
      0x00000 ./boot_v1.1.bin \
      0x01000 ./user1.bin \
      0x7C000 ./esp_init_data_default.bin \
      0x7E000 ./blank.bin

      --baud の速度を設定します ESP8266 (私の場合は 115200 ボー) --port 接続先のシリアル ポート (私の場合、エミュレートされた最初の USB)。ファームウェアを構成するさまざまなドキュメントが失われます write_flash 先頭にアドレスがあり、更新ペイロードを含む user1.bin ドキュメントが続きます。

      Wi-Fi ESP8266 ファームウェア アップデート esptool コンソール キャプチャ

    ESP8266 Wi-Fi モジュールにコマンドを送信します

    を制御するには、 ESP8266 コンピュータから始める必要があります アプリを構成する そのためには、①コンバータが接続されているポートを選択するだけで十分です。 USB UART TTL、 何かのようなもの /dev/USB0 GNU/Linux および同様のもの、またはそのようなもの COM6 Windowsの場合、②速度を選択します。 ESP8266、おそらく 115200 ボー、③ パリティまたはハンドシェイクなしで 8 データ ビットと XNUMX ストップ ビットを設定、④ 行末に応じて設定 ファームウェア、ほとんどの場合 CR+LF。

    USB UART TTL コンバータを使用して ESP8266 Wi-Fi モジュールを監視するように CuteCom を設定する

    USB UART TTL コンバータを使用して ESP8266 Wi-Fi モジュールを監視するように PuTTY を構成する

    アプリケーションが設定されると (または、必要に応じて保存され、選択されると)、 接続を開く (上記の例のスクリーンショットでは、それぞれ「デバイスを開く」と「開く」 キュートコム y PUTTY)そして、への注文の送信を開始できます ESP8266.

    でわかるように、 ESP8266 ATコマンドテーブル、アクティブ化、非アクティブ化、値の設定、およびその参照の形式は非常に予測可能ですが、一般に、それらをすべて覚えるのは簡単ではなく、おそらく参照するには手元に用意する必要があります。

    の方法 enviar ATの注文 al ESP8266 Wi-Fi モジュール から Arduinoの とても簡単です: ① 通信を設定します Serial.begin(115200); (または、複数のハードウェア シリアル ポートを備えたボードでは Serial1、Serial2…)、② 形式を使用してコマンドを送信します。 Serial.print(orden+"\r\n");

    上の例は、 ESP8266 Wi-Fi モジュール AT の注文 から Arduinoの。この場合に図示されているのは、 AT+CWJAP、アクセス ポイントに接続するために使用されます。このコマンドは引数としてアクセス ポイント識別子 (SSID) とキーを両方引用符で囲み、オブジェクトになります。 Srtring エスケープ コード (\")。注文を完了するには、次を使用します \r\n に相当する CR y LF.

    シリアル ポートは常に次のように識別されるわけではないことに注意してください。 Serial (特定のプレートでは、 Serial1, Serial2…) 使用されるポート オブジェクトは、マクロに割り当てることによって定義されています。 PUERTO_SERIE。使用されているボードの種類を検出すると、シリアル ポートの選択に少しのインテリジェンスが追加される可能性があります。後で、タイプを確認する方法について説明します。 Arduinoの。残りの定義は、定数値の繰り返し (および間違い) を避け、変更を容易にするために、定数値に「名前」を付けることができる通常の定義です。

    上記の例では、 ESP8266 Wi-Fi モジュール 示されたアクセスポイントに接続していますが、以前にすでに接続されていましたか?接続は機能しましたか?これを知るには、何が起こっているのかを「聞く」必要があります。 ESP8266

    ESP8266 Wi-Fiモジュールからデータを受信します

    上で説明したデータ スニファをコンピュータに接続すると、どのような情報が得られるかを確認できます。 Arduinoの に送信しました ESP8266 そして彼の反応。から読む Arduinoの その中の情報を処理するには、次の方法で検出する必要があります。 Serial.available() データが到着したかどうか、到着した場合はそれをロードします Serial.read()。次の例は、からの応答を読み取る方法を示しています。 AT+CWJAP?、アクセス ポイントへの接続があるかどうかを報告します。

    お皿の上のように Arduinoの宇野 (その他の場合でも) シリアル モニターを開くとプログラムがリセットされ、シリアル コンソールで確認するために使用できます。 Arduinoの あなたが送信する情報 ESP8266 以下の画像のスクリーンショットが示すように。

    Arduino から ESP8266 Wi-Fi モジュールからデータを受信します。基本的な例

    ESP8266 Wi-Fi モジュールから送信された応答を分析する

    届く情報を読み取る方法はすでに見てきました。 Arduinoの から ESP8266。あなたが対処しなければならない問題は、いつ到着し始めるか、到着するまでにどれくらい時間がかかるか、どのくらいの長さになるかがわからないことです...そして、担当者からの応答を待つのはあまり効率的ではありません。 ESP8266 をさせずに受信されます マイクロコントローラー その間に他のタスクを実行します。

    この状況に対処する簡単な方法は次のとおりです。 受け取ったデータを反復して具体的な答えを探す これにより、たとえば、受信したテキストの検索を続行するかどうか、およびメッセージから到着した情報に基づいてどのようなアクションを実行するかを決定するインジケーター (フラグまたはブール変数) がアクティブになります。 ESP8266. 応答が届くまでの間 マイクロコントローラー 他のタスクに専念できるたとえば、センサーからデータを受信して​​処理します。

    ESP8266から受信した情報内のテキストを検索します。

    からのテキストを検索するには、 ESP8266 かもしれない 受け取った各手紙と、探しているメッセージに対応する手紙を比較します。。比較する文字を指すカウンター (またはポインター) を使用する必要があります。から到着したキャラクターの場合、 ESP8266 メッセージ内で検査されているものと同じである場合、カウンタは進み、異なる場合は初期化されます。

    最後に到達したことを知るために、検索されたメッセージの次の文字が参照されます。この文字はゼロになります (\0) または、メッセージの長さが保存されているため、カウンターと比較することで、比較が終了したかどうかを確認できるため、 ESP8266 Wi-Fi モジュール 必要なメッセージを送信しました。

    次の例では、次のコマンドを使用します AT+CWLAP これにより、アクセス ポイントのリストが返され、その中で「wifi Polaridad.es」という名前のものが検索されます。最後の文字がゼロであることを検証することを選択しましたが、 バッファ 検索されたテキストを保存するだけで、その長さはわかっています。また、そのような数の正しい文字を受信したかどうかをチェックすることもできます。とともに LED製品 ピン 2 に接続すると、予期したテキストが見つかったことが報告されます。

    前の例のコードでは、次の方法も見ることができます。 ボードの種類に応じてシリアル ポートを選択します Arduinoの 使用済み。この例では、プロジェクトに XNUMX 種類のボードがあることを前提としています。 Arduinoの宇野Arduino メガ 2560Arduinoのレオナルド。一緒に作業する場合は、 Arduinoの宇野 それは使われるでしょう Serial それ以外の場合 Serial1.

    皿を使って作業する場合 Arduinoのレオナルド 同じ方法を使用してプログラムを停止し、コンソール (コンソールに関連付けられたシリアル ポート) を待つことができます。 Serial) 利用可能です。

    ESP8266 応答内のさまざまなテキストを検索します

    前の例のコードは、送信された情報内のテキストを検索するために使用されます。 ESP8266 ただし、応答には操作に応じて異なる情報が含まれる場合があります。次の例の簡単なケースから始めるとします。 MCU ESP8266 es OK 操作が正しく実行された場合と、 ERROR それ以外の場合は、注文と同様に AT+CWJAP?、これは、 ESP8266 Wi-Fi モジュール すでにアクセスポイントに接続されています。

    同じメソッドのこの新しい実装では、複数の考えられるメッセージと一致するものを検索するため、メッセージから受信した応答に応じてさまざまなアクションを選択できます。 ESP8266をオンにするだけです。 LED製品 対応しています。

    応答を受け取るまでにかかる時間を制限する

    これまでのところ、関連する問題については言及されていません。 操作が失敗したとみなされるまでの最大待機時間 (タイムアウト)。何らかの理由で、 ESP8266 Wi-Fi モジュール、アクセス ポイントを備えたモジュール、インターネットを備えたアクセス ポイント、またはたとえば仮想サーバーが利用できない場合、プログラムはある時点でブロックされて無期限に待機する可能性があるため、そのような状況に対する応答を明確にする必要があります。最大待機時間はアプリケーション全体に対して設定できます。通常、その場合はより「寛大」になります。または、操作ごとに個別の待機時間をプログラムすることもできます。

    (少なくとも) 一定の時間が経過したことを確認するには 通常、アカウントが開始された瞬間の「時間」が現在の「時間」から減算され、その差が望ましい制限よりも大きいことが検証されます。。この「時間」はリアルタイムである必要はありません。通常は、開始から経過した間隔に対応します。 MCU 時間を数え始めます。重要なのは絶対時間ではなく経過時間であるため、これはプログラムには影響しません。

    通常、特定の間隔が経過したかどうかを確認するには、次のタイプの式が使用されます。

    可変 milisegundos_al_empezar の値が含まれています millis() 実行中の特定の瞬間の時間を計測するため、その名前が「クロノメーター」という言葉を指すことは珍しいことではありません。変数 intervalo_de_tiempo 前の式を true にする最大ミリ秒数が含まれます。つまり、タイムアウトを表します。通常、これは定数 (またはマクロ) であり、前述の場合と同様に、名前に「TIMEOUT」という単語が含まれることがよくあります。非常に短い間隔で作業する場合は、次のように使用できます。 micros() 代わりに millis() (ミリ秒ではなくマイクロ秒)ただし、一般的ではなく、精度もはるかに低くなります。

    長整数 Arduinoの (unsigned long) は 4 バイト (32 ビット) を占めるため、表現できる最大値は 4294967295 (2 から始まるため、32 の XNUMX 乗マイナス XNUMX) になります。皿の上に Arduinoの 継続的に実行している間、ミリ秒カウンターは約 50 日ごとにリセット (ゼロに戻ります) します。符号なしデータ型で減算する場合、同じ動作が再現される (カウンターを反転する) ため、タイムアウトを無期限に制御することが可能です。

    上記のコードは、 タイムアウト制限の非常に基本的な実装 前の例に関してマークされた行を組み込んでいます。タイムアウト検証は、から到着したデータを処理した後に実行されるため、 ESP8266 Wi-Fi モジュールの場合、受信に課せられた待ち時間より長くかかっても、操作は成功したと見なされます。

    複数のATコマンドで定義された複雑なオペレーションを実行する

    を利用するアプリケーションの目的の参照例を取得するには、 ESP8266 Wi-Fi モジュール、そうだと仮定してください Web サービスを通じてアクセスされるデータベースに情報を保存する 温度を追跡するため。次のコードは、一定の時間間隔ごとにアナログ入力に接続されたセンサーを読み取り、平均値を計算し、より長い時間間隔の後にそれを Web サーバーに送信します (スタイル IoT)を通して リクエスト HTTP (投稿、取得…).

    この温度記録の例では、Web サーバーに XNUMX 分ごとにアクセスします。可用性は特に高くありませんが、この提案は機能すると予想されますが、より高い記録頻度が必要な場合は、他のリソースを実装する必要があります。 データバッファ 送信を待っています、サーバーが参加できるときに複数を送信し、サーバーが利用できないときのためにそれらを保存します。データを記録する必要がある頻度がさらに高い場合は、プロトコルの代替として他のタイプのプロトコルを提案する必要があります。 HTTP または交換することさえ TCP によって UDP 一部のデータを失っても、ほとんどのデータを必要な速度で送信できるようになります。

    温度を送信するために実行されるタスクを構成する操作は次のとおりです。

    • Wi-Fiモジュールをリセットする
    • 現在のアクセス ポイントから切断します (デフォルトの接続が存在する場合)
    • 設定を行います。例では、接続モード(シンプル)と Wi-Fi 通信での役割(ステーション)を設定する必要があると仮定します。
    • アクセスポイントに接続する
    • 接続が正しいことを確認します (実際には、これがエントリ ポイントです) 接続がない場合は、プロセスを最初から開始します
    • サーバーに接続する
    • リクエストを送信する HTTP 保存されるデータと一緒に

    操作の順序は (操作は同じですが) 必ずしもこのとおりである必要はなく、各ステップでいくつかの操作が必要になる場合があります。 ESP8266 AT コマンドたとえば、上記の構成には次の XNUMX つが必要です。 AT+CIPMUX=0 y AT+CWMODE=1.

    ESP8266 での操作を表すデータ構造

    前の例では、非常に基本的な方法ではありますが、問題に対する一般的な解決策がすでに提案されています。 考えられる応答とそれぞれの場合に実行する必要があるアクションを保存するデータ構造を使用する;アクションを送信し、応答を待ち、応答の意味に従って続行します。それぞれの複雑な操作には複数の操作が必要となるため、 ESP8266 AT コマンド、データ構造は、後続または前の操作と他の操作をリンクする必要があり、その操作は、オブジェクトの応答に応じてそれぞれの場合に実行する必要があります。 ESP8266.

    前の例では、メッセージは、 ESP8266 そしてそれは成功またはエラーとして解釈されました。受け取ったすべてのテキストの受信 (および分析) に加えて、 一般的な最小限度にするために、メッセージの完了にも注意することをお勧めします。 言い換えれば、 ESP8266 Wi-Fi モジュール 新たな注文を受けるため。このようにして、たとえば「Wi-Fi 利用可能」と呼ぶことができる状態への変化は、アクセス ポイントの名前を受信し、テキストを受信することになる可能性があります。 ERROR またはテキスト OK ということになります ESP8266 応答が完了したので、次の応答を送信できます ESP8266へのATコマンド.

    上記のコードではベクトル (operacion) 完全なタスクを形成する連続操作のテキストを保存します。 XNUMX次元配列が使用されます(mensaje) 分析された XNUMX つの応答。上で説明したように、応答の正誤を表すメッセージに加えて、応答の終了を表すメッセージを探す必要があります。すべての操作で同じ数の可能な答えが得られるわけではありません。応答が少ない場合は、分析に必要なサイクル数を最小限に抑える空のメッセージを使用できます (それでも、これは最適な方法ではありません)。論理的には、すべての可能性がすべてではない場合でも、すべての動作可能性を含めるために、求められる応答の最小数 (この例では XNUMX つ) が必要になります。

    可能な答えについて話すとき、この例は、任意の形式のデータをサーバーから受信する場合にはあまり役に立たないことがすでにわかります。 ESP8266 Wi-Fi モジュール、しかし問題は、 で使用するコンテキストでは、 マイクロコントローラー それは普通ではありません。最も一般的なのは、接続されているセンサーによって収集されたデータを送信したり、制御するアクチュエーターをどうするかに関する情報を受信したりすることです。非常に貴重な情報であり、非常に正確に予測できます。

    前のデータ構造では、分析される可能な応答を表現するために行われるのと同じように、それぞれの場合に実行する必要がある操作を決定するために XNUMX 次元行列も使用されます (siguiente_operacion)。具体的には、次の XNUMX 種類のメッセージに応答することを選択しました。 ① 任意のテキスト (LITERAL) Wi-Fi アクセスポイントとサーバーに接続されているかどうかを確認するため、② プロセスのエラーを検出するためのテキスト (FALLO) および ③ 操作が正常に完了したことを示すテキスト (ACIERTO).

    最後に、諦めるまでの最大待機時間を設定するベクトルがさらに XNUMX つあります (timeout) を指定して (configuracion) 応答を待たずに操作が終了した場合 (ESPERAR_RESPUESTA)と通信終了を示すメッセージが表示されます。この最後のベクトルは、メモリを節約する方法の例を示しており、構成バイトのビットと連携してさまざまな状態を示します。

    最初の ESP8266 AT コマンド データ構造の場合、常に応答が期待されます。応答は、成功メッセージまたはエラー メッセージである可能性があります。エラーが発生すると、モジュールが再起動されて再び開始され、メッセージが操作が正しいことを示している場合は、次の操作に進みます。

    サーバーに接続すると、パターンが変わります。この場合、①送信するデータパケットの長さを送信し、②リクエストを作成する必要があります。 HTTP 固定テキストに、サーバーに保存するために送信される (温度の) 値を加えたもの。このデータの作成は出荷ごとに行われ、XNUMX回(長さ通知)またはXNUMX回(リクエスト送信)に分ける必要があります。 HTTP)で ESP8266AT注文。操作が分割された最後の部分のみが応答を待ちます。

    この場合、問題なく動作します (モジュールがビジーであることを警告する可能性があります) が、データの長さが長くなると、データ ブロックをより小さな部分に分割する必要があり、待機の実装が必要になる場合もあります。温度の読み取りとともに行われ、データを埋めることなくモジュールにデータを送信する時間を与えます。 バッファ.

    すでに説明した他のマクロとともに、上記のコード例は、応答を待つかどうか、および該当する場合は応答が終了したことを示すメッセージを指定するためのさまざまな状態がどのように定義されるかを示しています。

    コード内のさまざまなポイントで操作が送信されます (平均温度を送信するとき、操作の待機時間を超えたとき、現在の操作が正常に完了したときなど) が、その方法は次のとおりです。グローバルに確立されており、マクロが定義されています ENVIAR_OPERACION 配送に関わるステップをグループ化します。

    以下は例のメインプログラムのコードです。最も外部のタスクは、平均を計算するために温度をサンプリングするタスクであり、一定期間ごとに、 ESP8266 Wi-Fi モジュール。各操作が送信されると、応答が分析されて、次の操作がどれであるか、または情報を送信するタスクが完了したかどうかが判断されます。

    論理的には、前のコードでいくつかの最適化アクションを実行できますが、これは、どのように最適化するかを理解するための例です。 ESP8266 一般的に、いくつかの側面に注目する価値があります。最初の側面はデータ構造です。論理的なことは次のようです プログラミング言語のデータ構造を使用します (struct) 処理中の情報を表すESP8266 AT コマンド そして分析されるメッセージ。

    構造体を使用します (struct) サンプル配列 (配列に基づく) の代わりにデータを保存することは簡単であり、より洗練されたコードになる可能性がありますが、結果の改善を意味するものではありません。の使用によってもたらされる真の代替案 struct 以下で説明するように実装することです。 「内部」データを含む構造体の変数長 彼らが参照しているものです。この方法では、たとえば、操作で分析するために固定数の応答を用意する必要がなくなります。

    このアプローチは、ソリューションを実装する最良の方法であることを示唆していますが、欠点は、 動的メモリ割り当てを使用します。これは、 マイクロコントローラー 実行時に使用されるメモリの量を慎重に測定する必要がありますコンパイラはこれについて警告することがほとんどできず、プログラムの実行に致命的な結果をもたらすメモリ (またはスタック) を使い果たす可能性がある程度あるためです。

    コードを最適化する際に、大量のテキストを使用するこのタイプのプログラムでは、次のことを覚えておくと興味深いでしょう。 メモリスペースを節約できる SRAM テキスト文字列をプログラムメモリに保存する (フラッシュ) マクロを使用して F()。次のスクリーンショットでは、通常のテキストの使用とマクロの使用による、別のプログラムと動的メモリ分散を確認できます。 F().

    プログラムメモリ(フラッシュ)に保存されたテキストを使用したArduinoコード例
    SRAM 内のテキストを使用した Arduino コードの例

    から届く情報に応じて実行されるアクションに関しては、 ESP8266 Wi-Fi モジュールコードからのメッセージをチェックし、受信した内容に応じていずれかを実行する代わりに、このデータ構造に保存できます。 ステータスインジケーターの代わりに各タスクを実行する関数へのポインター (フラグ) は、アプリケーションが管理する責任がある特定の状態 (たとえば、メイン ループ内) を警告します。

    以下は、リクエストのデータを格納する構造体の例です。 ESP8266 (データ型 operacion_esp8266) とその応答 (データ型 respuesta_esp8266).

    操作を表す構造体 (サーバーに送信されるデータ) ESP8266 Wi-Fi モジュール) 応答が定義される構造と、操作の構造に対する応答の構造を指します。 最初に両方を宣言する必要があります、新しいデータ型を定義してから、その内容を定義します。

    前の例では、それを含むプログラムが、 ステータスインジケータこれは、その値によって示される XNUMX つまたは他の操作の実行を担当するコードからアクセスできる変数に対応する必要があります。の応答の場合 ESP8266 特定のテキストが分析されると、状態は対応する応答の構造を示す値になります。

    前に述べたように、ステータスインジケーターを置き換えるか補完する別の選択肢は次のとおりです。 参照構造体に関数を格納する (ポインタ) からの応答で特定のテキストが見つかったときに呼び出されます。 ESP8266 Wi-Fi モジュール.

    前の例では、からの応答を処理するために使用されるデータ構造に追加されています。 ESP8266 Wi-Fi モジュール 型のデータを返す (想定される) 関数へのポインタ float (アナログ読み取り値の重み付けされた値である可能性があります) であり、引数として XNUMX バイトが提供されます (XNUMX バイト unsigned char これは、アナログ入力が読み取られるピンであり、仮想統合の ENABLE をアクティブにするピンである可能性があります)。

    開発中 MCU大規模システムの開発スタイルとは対照的に、アセンブリを制御するアプリケーションの (グローバル) 動作を定義するときにグローバル変数を使用することはそれほど珍しいことではありません。そのため、このタイプの定義を見つけることは特に珍しいことではありません。パラメータを持たず、値を返さない関数として、次のようなものです。 void (*accion)();

    このデータ表現方法を使用する場合は、次のようにします。 struct 可変長データの場合は、動的にメモリを割り当てる必要があります。 malloc() (o new()、オブジェクトが使用されている場合)、割り当てられたメモリ量をパラメータとして使用し、予約されているメモリ領域の先頭へのポインタを返します。と sizeof() 保存されている型に使用される要素の数を掛けると、必要なメモリの量を求めることができます。これを使用した例と使用しない例を以下のスクリーンショットに示します。 malloc();最初のケースではプログラムが使用するメモリに注意してください。この関数を含むライブラリをロードする必要があります。

    Arduinoでのmallocによるメモリ割り当ての例

    Arduinoでmallocを使用しないテキスト割り当ての例

    での操作の場合、 ESP8266 Wi-Fi モジュール プログラムの実行を通じて変化するため、使用されていないメモリを解放する必要があります。 free() (o delete()、オブジェクトの場合)。コンパイラ (GCC) はメモリの分割を避けるためにプログラムを最適化しますが、静的に割り当てられたメモリを使用する場合ほどパフォーマンスは最適化されません。

    この例 (両方の実装) ではあまり意味がありませんが、操作を一般化して他のケースに適用できるようにするために、次の点に注意する必要があります。 データの送信は常に同じプロトコルを繰り返します。送信されるバイト数を通知し、インジケーター (>) を待ってデータを送信します。.

    この例では一度だけ使用されている (リクエスト全体が XNUMX つのパケットで行われる) ため、あまり有用とは思えませんが、一般に、同じ操作で複数の送信を実行する必要がある場合があります。大量のデータが送信されるため、メモリのオーバーフローを避けるために断片化する必要があります。 ESP8266.

    この動作を実装するには、接続の最後の XNUMX つの要素を使用して、データが送信されるたびにデータに対応する値が入力されるようにすることができます。最初の場合は送信されたバイト数、XNUMX 番目の場合は (リクエストの一部が送信されます。

    送信する必要があるさまざまな要素の割り当てと送信を繰り返すために、ベクトルに格納できます。この新しいベクトルは、これまでのように最後の操作ではなく、複雑な操作の終了を決定するものになります。

    1コメント

    コメントユーザー
    ดูบอลสด

    このテーマについては、明らかに多くのことを知る必要があります。 私はあなたが作ったすべてのポイントが好きです

    コメントを投稿

    見逃したかもしれません