Massenaktualisierung eines ThingSpeak-Kanals mithilfe einer Partikelphotonenplatine
Dieses Beispiel zeigt, wie Sie mithilfe einer mit einem Wi-Fi®-Netzwerk verbundenen Particle Photon-Platine eine Massenaktualisierung eines ThingSpeak™-Kanals durchführen. Sie können die API Bulk-Write JSON Data verwenden, um Daten in einem Stapel zu sammeln und an ThingSpeak-Kanäle zu senden. Durch die Verwendung von Massenaktualisierungen können Sie den Stromverbrauch Ihrer Geräte reduzieren. In diesem Beispiel erfassen Sie alle 15 Sekunden Daten und aktualisieren Ihren Kanal alle 2 Minuten mithilfe einer Particle Photon-Platine. Da das Particle Photon mit einer Echtzeituhr ausgestattet ist, können Sie den absoluten Zeitstempel für Massenaktualisierungsnachrichten verwenden.
Aufstellen
1) Erstellen Sie einen Kanal, wie unter Daten in einem neuen Kanal sammeln gezeigt.
Code
1) Definieren Sie ein eintägiges Limit für die Synchronisierungszeit 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-Clientbibliothek.
TCPClient client; // Initialize the TCP client library
4) Definieren Sie den ThingSpeak-Server, Ihren API-Schlüssel zum Schreiben des Kanals 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 zur Aktualisierung 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 und 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 Methode updateData, um den Puffer data 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 auszudrucken. Der Antwortcode 202 zeigt an, dass der Server die Anfrage akzeptiert 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.
}