Main Content

Esta página se ha traducido mediante traducción automática. Haga clic aquí para ver la versión original en inglés.

Actualización masiva de un canal ThingSpeak utilizando un tablero de fotones de partículas

Este ejemplo muestra cómo utilizar una placa de partículas de fotones conectada a una red Wi-Fi® para actualizar de forma masiva un canal ThingSpeak™. Puede utilizar la API Bulk-Write JSON Data para recopilar datos en un lote y enviarlos a los canales de ThingSpeak. Al utilizar la actualización masiva, puede reducir el consumo de energía de sus dispositivos. En este ejemplo, recopila datos cada 15 segundos y actualiza su canal una vez cada 2 minutos utilizando un tablero de partículas y fotones. Dado que Particle Photon viene con un reloj en tiempo real, puede utilizar la marca de tiempo absoluta para mensajes de actualización masiva.

Configuración

1) Cree un canal, como se muestra en Collect Data in a New Channel.

Código

1) Defina un límite de un día para sincronizar la hora desde Particle Cloud.

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

2) Inicialice el búfer data para contener los datos.

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

3) Inicialice la biblioteca del cliente TCP.

TCPClient client; // Initialize the TCP client library

4) Defina el servidor ThingSpeak, la clave API de escritura de su canal y el ID de su canal.

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) Cree variables globales que rastreen la hora de la última conexión y la hora de la última actualización. Luego defina intervalos de tiempo para actualizar los datos y publíquelos en 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) No modifique el método predeterminado setup .

void setup() {
}

7) Utilice el método loop para llamar al método updateData para actualizar el búfer data con datos una vez cada 15 segundos. Además, solicite la sincronización horaria desde Particle Cloud una vez al día.

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) Defina el método updateData para actualizar continuamente el búfer data con datos. Dado que Particle Photon tiene un reloj de tiempo real incorporado, puede utilizar el tiempo absoluto en la llamada API. Utilice el parámetro time_format=absolute para definir marcas de tiempo absolutas entre mensajes sucesivos. Si su dispositivo no tiene un reloj en tiempo real, puede utilizar una marca de tiempo relativa. Para utilizar marcas de tiempo relativas, reemplace time_format=absolute con time_format=relative. Formatee los mensajes en formato CSV como se menciona en Bulk-Write JSON Data. Llame al método httpRequest para enviar datos a ThingSpeak cada dos minutos.

// 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) Defina el método httpRequest para enviar datos a ThingSpeak e imprimir el código de respuesta del servidor. El código de respuesta 202 indica que el servidor ha aceptado la solicitud y está procesando los datos.

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

Ejemplos relacionados

Más acerca de