Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

Particle Photon ボードを使用してデータを継続的に収集し、ThingSpeak チャネルを一括更新

この例では、Wi-Fi® ネットワークに接続された Particle Photon ボードを使用して ThingSpeak™ チャネルを一括更新する方法を説明します。チャネル フィードの一括更新API を使用してバッチ内のデータを収集し、ThingSpeak チャネルに送信することができます。この処理により、デバイスの電力使用量が節減されます。この例では、Particle Photon ボードを使用して 15 秒ごとにデータを収集し、2 分に 1 回チャネルを更新します。Particle Photon にはリアルタイム クロックが付属しているため、一括更新メッセージに絶対タイムスタンプを使用できます。

 チャネル フィードを一括更新する Particle コード

  1. 新しいチャネルでデータの収集での説明に従ってチャネルを作成します。

  2. 1 日の制限を定義して、Particle Cloud の時間と同期します。

    #define ONE_DAY_MILLIS (24 * 60 * 60 * 1000) // Define 1 day limit for time synchronization
    unsigned long lastSync = millis();

  3. データを格納する data バッファーを初期化します。

    char data[800] = ""; // Initialize the data buffer

  4. TCP クライアント ライブラリを初期化します。

    TCPClient client; // Initialize the TCP client library
    

  5. ThingSpeak サーバー、チャネルの Write API キー、およびチャネル ID を定義します。

    String server = "api.thingspeak.com"; // ThingSpeak Server
    String WriteAPIKey = "YOUR-CHANNEL-WRITEAPIKEY"; // Replace YOUR-CHANNEL-WRITEAPIKEY with your channel write API key
    String ChannelID = "YOUR-CHANNEL-ID"; // Replace YOUR-CHANNEL-ID with your channel ID
    

  6. 他のグローバル変数を定義して、最終接続日時と最終更新日時を追跡します。また、データを更新する時間間隔を定義し、データを ThingSpeak にポストします。

    /* Collect data once every 15 seconds and post data to ThingSpeak channel once every 2 minutes */
    unsigned long lastConnectionTime = 0; // Track the last connection time
    unsigned long lastUpdateTime = 0; // Track the last update time
    const unsigned long postingInterval = 120L * 1000L; // Post data every 2 minutes
    const unsigned long updateInterval = 15L * 1000L; // Update once every 15 seconds
    size_t state = 0; // Keep note of first time the updateData() is called
    

  7. 既定の setup メソッドは変更しないでください。

    void setup() {
    }

  8. updateData メソッドを呼び出して 15 秒に 1 回 data バッファーのデータを更新するために、loop メソッドをオーバーライドします。さらに、毎日 1 回、Particle Cloud との時間の同期を要求します。

    void loop() {
        // If update time has reached 15 seconds, then update the data buffer
        if (millis() - lastUpdateTime >= updateInterval) {
          updateData();
      }
        // If last time synchronization is more than one day
        if (millis() - lastSync > ONE_DAY_MILLIS) {
        // Request time synchronization from the Particle Cloud
        Particle.syncTime();
        lastSync = millis();
      }
    }

  9. data バッファーのデータを継続的に更新するために、updateData メソッドを定義します。Particle Photon にはリアルタイム クロックが組み込まれているため、time_format=absolute パラメーターを使用して、連続するメッセージ間に絶対タイムスタンプを定義できます。デバイスにリアルタイム クロックがない場合は、相対タイムスタンプを使用できます。time_format=absolutetime_format=relative に置き換えます。チャネル フィードの一括更新に説明されている CSV 形式で、メッセージを書式設定します。2 分ごとに httpRequest メソッドを呼び出して、データを ThingSpeak に送信します。

    // Update the data buffer
    void updateData(){
        /* CSV format to bulk update
       *  This function uses the absolute timestamp as it uses the "time_format=absolute" parameter. If your device does not have a real-time clock, 
       *  you can also provide the relative timestamp in seconds using the "time_format=relative" parameter.
       */
        if(state==0){
            strcpy(data,"write_api_key="+WriteAPIKey+"&time_format=absolute&updates=");
        }
        strcat(data,String(Time.local())); // Absolute time stamp
        strcat(data,"%2C"); // URL encoding for ","
        long randNumber = random(1,300);
        strcat(data,String(randNumber)); // Mock data to post to field1
        strcat(data,"%2C");
        randNumber = random(1,300);
        strcat(data,String(randNumber)); // Mock data to post to field2
        strcat(data,"%2C%2C%2C%2C%2C%2C%2C%2C");
        randNumber = random(1,300);
        strcat(data,String(randNumber)); // Mock data to post to longitude
        strcat(data,"%2C%7C"); // URL encoding for ",|". End with | at the end of a message
        state = 1; 
        // If posting interval time has reached 2 minutes, then update the ThingSpeak channel with your data
        if (millis() - lastConnectionTime >= postingInterval) {
            state = 0;
            size_t len = strlen(data);
            data[len-3] = '\0'; // Remove the | from the last message
            httpRequest(data); // Call httpRequest to send the data to ThingSpeak
            data[0] = '\0'; // Reinitialise the data buffer
        }
        lastUpdateTime = millis(); // Update the last update time
    }

  10. ThingSpeak にデータを送信し、サーバーからの応答コードを出力するために、httpRequest メソッドを定義します。応答コード 202 は、サーバーで要求が受け入れられたこと、およびそのデータが処理されることを示します。

    // Update the ThingSpeakchannel with data
    void httpRequest(char* csvBuffer) {
         /* CSV format to bulk update
          * This function posts the data to ThingSpeak server
       */
        // Compute the data buffer length
        String data_length = String(strlen(csvBuffer)+1);
        // Close any connection before sending a new request
        client.stop();
        // POST data to ThingSpeak
        if (client.connect(server, 80)) {
            client.println("POST /channels/"+ChannelID+"/bulk_update HTTP/1.1");
            client.println("Host: "+server);
            client.println("User-Agent: mw.doc.bulk-update (Particle Photon)");
            client.println("Connection: close");
            client.println("Content-Type: application/x-www-form-urlencoded");
            client.println("Content-Length: "+data_length);
            client.println();
            client.println(csvBuffer);
        }
        else {
            Particle.publish("Failure","Failed to update ThingSpeak channel");
        }
        delay(1000); // Wait to receive the response
        client.parseFloat();
        String resp = String(client.parseInt());
        Particle.publish("Response code",resp); // Print the response code. 202 indicates that the server has accepted the response
        lastConnectionTime = millis(); // Update the last conenction time
    }

関連する例

詳細