注釈

こんにちは、SunFounderのRaspberry Pi & Arduino & ESP32愛好家コミュニティへようこそ!Facebook上でRaspberry Pi、Arduino、ESP32についてもっと深く掘り下げ、他の愛好家と交流しましょう。

参加する理由は?

  • エキスパートサポート:コミュニティやチームの助けを借りて、販売後の問題や技術的な課題を解決します。

  • 学び&共有:ヒントやチュートリアルを交換してスキルを向上させましょう。

  • 独占的なプレビュー:新製品の発表や先行プレビューに早期アクセスしましょう。

  • 特別割引:最新製品の独占割引をお楽しみください。

  • 祭りのプロモーションとギフト:ギフトや祝日のプロモーションに参加しましょう。

👉 私たちと一緒に探索し、創造する準備はできていますか?[ ここ]をクリックして今すぐ参加しましょう!

WiFi制御LED(アクセスポイント)

このプロジェクトでは、Webインターフェースを通じてLEDライトを制御することができます。ArduinoボードはWiFiアクセスポイントとして機能し、独自のローカルネットワークを作成します。そのネットワークにWebブラウザで接続すると、ボードのピン13に接続されたLEDをオン/オフするオプションが表示されます。プロジェクトは、シリアルモニターを通じてLEDの状態をリアルタイムでフィードバックし、デバッグと操作の流れを容易に理解できるようにします。

1. コードのアップロード

elite-explorer-kit-main\r4_new_feature\01-wifi_ap のパス下にある 01-wifi_ap.ino ファイルを開くか、このコードを Arduino IDE にコピーします。

注釈

Wi-Fi®サポートは、Arduino UNO R4 Coreに付属の内蔵 WiFiS3 ライブラリを通じて有効になります。コアをインストールすると、 WiFiS3 ライブラリも自動的にインストールされます。

arduino_secrets.h を作成または変更し、 SECRET_SSIDSECRET_PASS をWi-Fiアクセスポイントの名前とパスワードに置き換えます。ファイルには次のように記載されている必要があります:

//arduino_secrets.h header file
#define SECRET_SSID "yournetwork"
#define SECRET_PASS "yourpassword"

2. コードの説明

  1. 必要なライブラリのインポート

    Wi-Fi機能のための WiFiS3 ライブラリと、パスワードなどの機密データのための arduino_secrets.h をインポートします。

    #include "WiFiS3.h"
    #include "arduino_secrets.h"
    
  2. 設定と変数の初期化

    Wi-Fi SSID、パスワード、キーインデックスを定義すると共に、LEDピンとWi-Fiステータスを初期化します。

    char ssid[] = SECRET_SSID;
    char pass[] = SECRET_PASS;
    int keyIndex = 0;
    int led =  LED_BUILTIN;
    int status = WL_IDLE_STATUS;
    WiFiServer server(80);
    
  3. setup() 関数

    シリアル通信を初期化し、Wi-Fiモジュールを設定します。

    void setup() {
    
      // ... setup code ...
      // Create access point
      status = WiFi.beginAP(ssid, pass);
      // ... error handling ...
      // start the web server on port 80
      server.begin();
    }
    

    また、uno R4 wifiのファームウェアが最新であるかどうかを確認します。最新版でない場合は、アップグレードの促進が表示されます。ファームウェアのアップグレードについては、 UNO R4 WiFiボードのラジオモジュールファームウェアの更新 を参照してください。

    ...
    String fv = WiFi.firmwareVersion();
    if (fv < WIFI_FIRMWARE_LATEST_VERSION) {
        Serial.println("Please upgrade the firmware");
    }
    ...
    

    ArduinoのデフォルトIPを変更するために、以下のコードを修正することも検討してください。

    WiFi.config(IPAddress(192,48,56,2));
    
  4. メイン loop() 関数

    Arduinoのコードにおける loop() 関数はいくつかの重要な操作を行います。具体的には以下のような操作です:

    1. アクセスポイントへのデバイスの接続または切断のチェック。

    2. HTTPリクエストを行うクライアントの受信待ち。

    3. クライアントのデータの読み取りと、そのデータに基づいたアクションの実行(例えば、LEDのオン/オフ)。

    ここで、これらのステップをより理解しやすくするために、 loop() 関数を詳しく見ていきましょう。

    1. Wi-Fiステータスのチェック

      コードは最初にWi-Fiのステータスが変わったかどうかをチェックします。デバイスが接続または切断された場合、シリアルモニターにそれに応じた情報が表示されます。

      if (status != WiFi.status()) {
        status = WiFi.status();
        if (status == WL_AP_CONNECTED) {
          Serial.println("Device connected to AP");
        } else {
          Serial.println("Device disconnected from AP");
        }
      }
      
    2. クライアントの受信待ち

      WiFiClient client = server.available(); はクライアントの受信待ちを行います。

      WiFiClient client = server.available();
      
    3. クライアントリクエストの処理

      クライアントの受信待ちを行い、HTMLウェブページを提供します。ユーザーが提供されたウェブページ上の「Click here to turn the LED on」または「Click here to turn the LED off」というリンクをクリックすると、ArduinoサーバーにHTTP GETリクエストが送信されます。具体的には、LEDを点灯させるためのURL「http://yourAddress/H」と、LEDを消灯させるためのURL「http://yourAddress/L」にアクセスされます。

      WiFiClient client = server.available();
      if (client) {
        // ...
        client.println("HTTP/1.1 200 OK");
        client.println("Content-type:text/html");
        client.println();
        client.print("<p style=\"font-size:7vw;\">Click <a href=\"/H\">here</a> turn the LED on<br></p>");
        client.print("<p style=\"font-size:7vw;\">Click <a href=\"/L\">here</a> turn the LED off<br></p>");
        // ...
      }
      

      ArduinoのコードはこれらのGETリクエストを受信します。受信したテキスト行(HTTPヘッダー)の最後に GET /H と検出した場合、ピン13に接続されたLEDをHIGHに設定し、LEDを点灯させます。同様に、 GET /L と検出した場合、LEDをLOWに設定し、LEDを消灯させます。

      while (client.connected()) {            // loop while the client's connected
        delayMicroseconds(10);                // This is required for the Arduino Nano RP2040 Connect - otherwise it will loop so fast that SPI will never be served.
        if (client.available()) {             // if there's bytes to read from the client,
          char c = client.read();             // read a byte, then
          Serial.write(c);                    // print it out to the serial monitor
          if (c == '\n') {                    // if the byte is a newline character
            ...
            }
            else {      // if you got a newline, then clear currentLine:
              currentLine = "";
            }
          }
          else if (c != '\r') {    // if you got anything else but a carriage return character,
            currentLine += c;      // add it to the end of the currentLine
          }
      
          // Check to see if the client request was "GET /H" or "GET /L":
          if (currentLine.endsWith("GET /H")) {
            digitalWrite(led, HIGH);               // GET /H turns the LED on
          }
          if (currentLine.endsWith("GET /L")) {
            digitalWrite(led, LOW);                // GET /L turns the LED off
          }
        }
      

参照