Main Content

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

Massenaktualisierung eines ThingSpeak Kanals mit einem Particle Photon Board

Dieses Beispiel zeigt, wie Sie ein mit einem Wi-Fi®-Netzwerk verbundenes Particle Photon-Board verwenden, um einen ThingSpeak™ -Kanal in großen Mengen zu aktualisieren. Sie können die Bulk-Write JSON Data API verwenden, um Daten in einem Stapel zu sammeln und an ThingSpeak Kanäle zu senden. Durch die Massenaktualisierung können Sie den Stromverbrauch Ihrer Geräte reduzieren. In diesem Beispiel sammeln Sie alle 15 Sekunden Daten und aktualisieren Ihren Kanal alle 2 Minuten mithilfe eines Particle Photon Boards. Da das Particle Photon über eine Echtzeituhr verfügt, können Sie den absoluten Zeitstempel für Massenaktualisierungsnachrichten verwenden.

Aufstellen

1) Erstellen Sie einen Kanal, wie in Collect Data in a New Channel gezeigt.

Code

1) Definieren Sie ein Tageslimit für die Synchronisierung der Zeit aus der Partikelwolke.

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

2) Initialisieren Sie den data- Puffer, um die Daten zu speichern.

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

3) Initialisieren Sie die TCP-Client-Bibliothek.

TCPClient client; // Initialize the TCP client library

4) Definieren Sie den ThingSpeak Server, Ihren Kanal-Schreib-API-Schlüssel und Ihre Kanal-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.

5) Erstellen Sie globale Variablen, die die letzte Verbindungszeit und die letzte Aktualisierungszeit verfolgen. Definieren Sie dann 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.
size_t state = 0; // Keep note of first time the updateData() is called.

6) Ändern Sie nicht die Standardmethode setup .

void setup() {
}

7) Verwenden Sie die Methode loop , um die Methode updateData aufzurufen, um den Puffer data alle 15 Sekunden mit Daten zu aktualisieren. Fordern Sie außerdem einmal täglich eine Zeitsynchronisierung von der Partikelwolke an.

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

8) Definieren Sie die updateData- Methode, um den data- Puffer kontinuierlich mit Daten zu aktualisieren. Da Particle Photon über eine integrierte Echtzeituhr verfügt, können Sie im API-Aufruf die absolute Zeit verwenden. Verwenden Sie den Parameter time_format=absolute , um absolute Zeitstempel zwischen aufeinanderfolgenden Nachrichten zu definieren. Wenn Ihr Gerät nicht über eine Echtzeituhr verfügt, können Sie einen relativen Zeitstempel verwenden. Um relative Zeitstempel zu verwenden, ersetzen Sie time_format=absolute durch time_format=relative. Formatieren Sie die Nachrichten im CSV-Format, wie in Bulk-Write JSON Data beschrieben. Rufen Sie die Methode httpRequest auf, um alle zwei Minuten Daten an ThingSpeak zu senden.

// 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)); // Data to post to field 1.
    strcat(data,"%2C");
    randNumber = random(1,300);
    strcat(data,String(randNumber)); // Data to post to field 2.
    strcat(data,"%2C%2C%2C%2C%2C%2C%2C%2C"); //Include commas after fields 2-8 and lattitude for 8 commas.
    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.
}

9) Definieren Sie die Methode httpRequest , um Daten an ThingSpeak zu senden und den Antwortcode vom Server zu drucken. Der Antwortcode 202 zeigt an, dass der Server die Anfrage angenommen hat und die Daten verarbeitet.

// 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));
    // 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.
}

Verwandte Beispiele

Mehr über