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
Erstellen Sie einen Kanal wie in Sammeln Sie Daten in einem neuen Kanal gezeigt.
Wenn Sie ein Arduino MKR1000-Board verwenden, fügen Sie die Bibliotheken
WiFi101.h
undSPI.h
in Ihre Arduino-Skizze ein. Wenn Sie ein ESP8266-Board verwenden, fügen Sie die BibliothekenEthernetClient.h
undESP8266WiFi.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
- Massenaktualisierung eines ThingSpeak Kanals mit einem Particle Photon Board
- Massenaktualisierung mit einem Raspberry Pi-Board