Main Content

このページは機械翻訳を使用して翻訳されました。元の英語を参照するには、ここをクリックします。

Arduino または ESP8266 を使用した一括更新

この例では、Wi-Fi® ネットワークに接続された Arduino® MKR1000 ボードまたは ESP8266 ボードを使用して、Wi-Fi 信号強度を継続的に収集し、 ThingSpeak™チャネルを一括更新方法を示します。

Bulk-Write JSON Data API を使用してデータをバッチとして収集し、 ThingSpeakチャネルに送信できます。この方法により、デバイスの電力使用量が節減されます。この例では、Arduino MKR1000 ボードを使用して、15 秒に 1 回データを収集し、2 分に 1チャネルを更新します。Arduino MKR1000 および ESP8266 ボードにはリアルタイム クロックがないため、一括更新メッセージに相対タイムスタンプを使用できます。

設定

  1. 新しいチャネルでデータの収集に示すようにチャネルを作成します。

  2. Arduino MKR1000 ボードを使用している場合は、ライブラリWiFi101.hおよびSPI.hを Arduino スケッチに含めます。ESP8266 ボードを使用している場合は、ライブラリEthernetClient.hおよびESP8266WiFi.hを Arduino スケッチに含めます

コード

1) まず、ハードウェアに適切なライブラリを含めます。

// #include<EthernetClient.h> //Uncomment this library to work with ESP8266
// #include<ESP8266WiFi.h> //Uncomment this library to work with ESP8266

#include<SPI.h> // Comment this to work with ESP8266 board
#include<WiFi101.h> // Comment this to work with ESP8266 board

2) JSON データを保持するためにjsonBufferを初期化します。

char jsonBuffer[500] = "["; // Initialize the jsonBuffer to hold data

3) Wi-Fi 認証情報を定義して Arduino ボードをネットワークに接続し、Wi-Fi クライアント ライブラリを初期化します。

char ssid[] = "YOUR-NETWORK-SSID"; //  Your network SSID (name)
char pass[] = "YOUR-NETWORK-PWD"; // Your network password
WiFiClient client; // Initialize the Wi-Fi client library

4) ThingSpeakサーバーを定義します。

char server[] = "api.thingspeak.com"; // ThingSpeak Server

5) 最終接続時刻と最終更新時刻を追跡する他のグローバル変数を定義します。また、データを更新する時間間隔を定義し、データを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

6) setupメソッドを使用してシリアル データ転送を初期化し、Wi-Fi ネットワークに接続します。

void setup() {
  Serial.begin(9600);
  // Attempt to connect to Wi-Fi network
  while (WiFi.status() != WL_CONNECTED) {
    Serial.print("Attempting to connect to SSID: ");
    Serial.println(ssid);
    WiFi.begin(ssid, pass);  // Connect to WPA/WPA2 network. Change this line if using open or WEP network
    delay(10000);  // Wait 10 seconds to connect
  }
  Serial.println("Connected to Wi-Fi");
  printWiFiStatus(); // Print Wi-Fi connection information
}

7) loopメソッドで、 updatesJsonメソッドを呼び出して、 jsonBuffer を1 秒ごとにデータで更新します。

void loop() {
  // If update time has reached 1 second, then update the jsonBuffer
  if (millis() - lastUpdateTime >=  updateInterval) {
    updatesJson(jsonBuffer);
  }
}

8) updatesJsonメソッドを定義して、 jsonBufferをデータで継続的に更新します。Arduino MKR1000 にはリアルタイム クロックがないため、 'delta_t'パラメーターを使用して、連続するメッセージ間の相対タイムスタンプを秒単位で定義します。デバイスにリアルタイム クロックがある場合は、絶対タイムスタンプを使用できます。'delta_t'パラメーターを'created_at'パラメーターに置き換えます。Bulk-Write JSON Dataで説明されている形式の JSON としてメッセージをフォーマットします。httpRequestメソッドを呼び出して、2 分ごとにThingSpeakにデータを送信します。

// Updates the josnBuffer with data
void updatesJson(char* jsonBuffer){
  /* JSON format for updates parameter in the API
   *  This example uses the relative timestamp as it uses the "delta_t". 
   *  You can also provide the absolute timestamp using the "created_at" parameter instead of "delta_t".
   *  "[{\"delta_t\":0,\"field1\":-70},{\"delta_t\":3,\"field1\":-66}]"
   */
  // Format the jsonBuffer as noted above
  strcat(jsonBuffer,"{\"delta_t\":");
  unsigned long deltaT = (millis() - lastUpdateTime)/1000;
  size_t lengthT = String(deltaT).length();
  char temp[4];
  String(deltaT).toCharArray(temp,lengthT+1);
  strcat(jsonBuffer,temp);
  strcat(jsonBuffer,",");
  long rssi = WiFi.RSSI(); 
  strcat(jsonBuffer, "\"field1\":");
  lengthT = String(rssi).length();
  String(rssi).toCharArray(temp,lengthT+1);
  strcat(jsonBuffer,temp);
  strcat(jsonBuffer,"},");
  // If posting interval time has reached 2 minutes, update the ThingSpeak channel with your data
  if (millis() - lastConnectionTime >=  postingInterval) {
        size_t len = strlen(jsonBuffer);
        jsonBuffer[len-1] = ']';
        httpRequest(jsonBuffer);
  }
  lastUpdateTime = millis(); // Update the last update time
}

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

// Updates the ThingSpeakchannel with data
void httpRequest(char* jsonBuffer) {
  /* JSON format for data buffer in the API
   *  This example uses the relative timestamp as it uses the "delta_t".
   *  You can also provide the absolute timestamp using the "created_at" parameter instead of "delta_t".
   *  "{\"write_api_key\":\"YOUR-CHANNEL-WRITEAPIKEY\",\"updates\":[{\"delta_t\":0,\"field1\":-60},{\"delta_t\":15,\"field1\":200},{\"delta_t\":15,\"field1\":-66}]
   */
  // Format the data buffer as noted above
  char data[500] = "{\"write_api_key\":\"YOUR-CHANNEL-WRITEAPIKEY\",\"updates\":"; // Replace YOUR-CHANNEL-WRITEAPIKEY with your ThingSpeak channel write API key
  strcat(data,jsonBuffer);
  strcat(data,"}");
  // Close any connection before sending a new request
  client.stop();
  String data_length = String(strlen(data)+1); //Compute the data buffer length
  Serial.println(data);
  // POST data to ThingSpeak
  if (client.connect(server, 80)) {
    client.println("POST /channels/YOUR-CHANNEL-ID/bulk_update.json HTTP/1.1"); // Replace YOUR-CHANNEL-ID with your ThingSpeak channel ID
    client.println("Host: api.thingspeak.com");
    client.println("User-Agent: mw.doc.bulk-update (Arduino ESP8266)");
    client.println("Connection: close");
    client.println("Content-Type: application/json");
    client.println("Content-Length: "+data_length);
    client.println();
    client.println(data);
  }
  else {
    Serial.println("Failure: Failed to connect to ThingSpeak");
  }
  delay(250); //Wait to receive the response
  client.parseFloat();
  String resp = String(client.parseInt());
  Serial.println("Response code:"+resp); // Print the response code. 202 indicates that the server has accepted the response
  jsonBuffer[0] = '['; //Reinitialize the jsonBuffer for next batch of data
  jsonBuffer[1] = '\0';
  lastConnectionTime = millis(); //Update the last conenction time
}

10) printWiFiStatusメソッドを定義して、デバイスの IP アドレスと信号強度を出力します。

void printWiFiStatus() {
  // Print the SSID of the network you're attached to:
  Serial.print("SSID: ");
  Serial.println(WiFi.SSID());

  // Print your device IP address:
  IPAddress ip = WiFi.localIP();
  Serial.print("IP Address: ");
  Serial.println(ip);

  // Print the received signal strength:
  long rssi = WiFi.RSSI();
  Serial.print("signal strength (RSSI):");
  Serial.print(rssi);
  Serial.println(" dBm");
}

関連する例

詳細