使用粒子光子板批量更新 ThingSpeak 通道
此示例展示如何使用连接到 Wi-Fi® 网络的粒子光子板批量更新 ThingSpeak™ 通道。您可以使用 Bulk-Write JSON Data API 批量收集数据并发送到 ThingSpeak 通道。通过使用批量更新,您可以减少设备的功耗。在此示例中,您使用粒子光子板每 15 秒收集一次数据,每 2 分钟更新一次通道。由于 Particle Photon 带有实时时钟,因此您可以使用绝对时间戳来发送批量更新消息。
设置
1) 创建通道,如在新通道中收集数据所示。
代码
1) 定义一天的限制来从粒子云同步时间。
#define ONE_DAY_MILLIS (24 * 60 * 60 * 1000) // Define 1 day limit for time synchronization unsigned long lastSync = millis();
2) 初始化 data 缓冲区来保存数据。
char data[800] = ""; // Initialize the data buffer
3) 初始化 TCP 客户端库。
TCPClient client; // Initialize the TCP client library
4) 定义 ThingSpeak 服务器、您的通道写入 API 密钥以及您的通道 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) 创建跟踪上次连接时间和上次更新时间的全局变量。然后定义时间间隔来更新数据,并将数据发布到 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) 不要修改默认的 setup 方法。
void setup() {
}
7) 使用 loop 方法调用 updateData 方法每 15 秒用数据更新一次 data 缓冲区。另外,每天向 Particle Cloud 请求一次时间同步。
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) 定义 updateData 方法,用数据不断更新 data 缓冲区。由于 Particle Photon 具有内置实时时钟,因此您可以在 API 调用中使用绝对时间。使用 time_format=absolute 参数定义连续消息之间的绝对时间戳。如果您的设备没有实时时钟,您可以使用相对时间戳。要使用相对时间戳,请将 time_format=absolute 替换为 time_format=relative。按照 Bulk-Write JSON Data 中所述将消息格式化为 CSV 格式。调用 httpRequest 方法每两分钟向 ThingSpeak 发送数据。
// 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) 定义 httpRequest 方法向 ThingSpeak 发送数据,并打印服务器的响应代码。响应代码 202 表示服务器已经接受请求并正在处理数据。
// 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.
}