Main Content

Diese Seite wurde mithilfe maschineller Übersetzung übersetzt. Klicken Sie hier, um die neueste Version auf Englisch zu sehen.

Massenaktualisierung mit einem Arduino oder einem ESP8266

Dieses Beispiel zeigt, wie Sie entweder eine Arduino® MKR1000-Karte oder eine ESP8266-Karte verwenden, die mit einem Wi-Fi®-Netzwerk verbunden ist, um kontinuierlich die Wi-Fi-Signalstärke zu erfassen und einen ThingSpeak™ -Kanal in großen Mengen zu aktualisieren.

Sie können die Bulk-Write JSON Data- API verwenden, um Daten als Stapel zu sammeln und an ThingSpeak Kanäle zu senden. Diese Strategie reduziert den Stromverbrauch Ihrer Geräte. In diesem Beispiel erfassen Sie alle 15 Sekunden Daten und aktualisieren Ihren Kanal alle 2 Minuten mithilfe einer Arduino MKR1000-Karte. Da der Arduino MKR1000 und das ESP8266-Board über keine Echtzeituhr verfügen, können Sie den relativen Zeitstempel für Bulk-Update-Nachrichten verwenden.

Aufstellen

  1. Erstellen Sie einen Kanal wie in Sammeln Sie Daten in einem neuen Kanal gezeigt.

  2. Wenn Sie ein Arduino MKR1000-Board verwenden, fügen Sie die Bibliotheken WiFi101.h und SPI.h in Ihre Arduino-Skizze ein. Wenn Sie ein ESP8266-Board verwenden, fügen Sie die Bibliotheken EthernetClient.h und ESP8266WiFi.h in Ihre Arduino-Skizze ein

Code

1) Beginnen Sie damit, die entsprechenden Bibliotheken für Ihre Hardware einzubinden.

// #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) Initialisieren Sie jsonBuffer , um die JSON-Daten zu speichern.

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

3) Definieren Sie die WLAN-Anmeldeinformationen, um Ihr Arduino-Board mit dem Netzwerk zu verbinden, und initialisieren Sie die WLAN-Client-Bibliothek.

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) Definieren Sie den ThingSpeak Server.

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

5) Definieren Sie andere globale Variablen, die die letzte Verbindungszeit und die letzte Aktualisierungszeit verfolgen. Definieren Sie außerdem Zeitintervalle zum Aktualisieren der Daten und veröffentlichen Sie die Daten in 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) Verwenden Sie die Methode setup , um die serielle Datenübertragung zu initialisieren und eine Verbindung zum Wi-Fi-Netzwerk herzustellen.

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) Rufen Sie in der Methode loop die Methode updatesJson auf, um jsonBuffer einmal pro Sekunde mit Daten zu aktualisieren.

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

8) Definieren Sie die updatesJson- Methode, um jsonBuffer kontinuierlich mit Daten zu aktualisieren. Da der Arduino MKR1000 über keine Echtzeituhr verfügt, verwenden Sie den Parameter 'delta_t' , um einen relativen Zeitstempel in Sekunden zwischen aufeinanderfolgenden Nachrichten zu definieren. Wenn Ihr Gerät über eine Echtzeituhr verfügt, können Sie einen absoluten Zeitstempel verwenden. Ersetzen Sie den Parameter 'delta_t' durch den Parameter 'created_at' . Formatieren Sie die Nachrichten als JSON in einem in Bulk-Write JSON Data genannten Format. Rufen Sie die Methode httpRequest auf, um alle 2 Minuten Daten an ThingSpeak zu senden.

// 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) Definieren Sie die Methode httpRequest , um Daten an ThingSpeak zu senden und den Antwortcode vom Server zu drucken. Ein Antwortcode 202 zeigt an, dass der Server die Anforderung zur Verarbeitung angenommen hat.

// 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) Definieren Sie die printWiFiStatus -Methode zum Drucken der IP-Adresse und Signalstärke Ihres Geräts.

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");
}

Verwandte Beispiele

Mehr über