Hier ist die Regestrierung und Einrichtung bei ThingSpeak beschrieben. Bei ThingSpeak gibt es die Möglichkeit einen einzelnen Wert hochzuladen oder mehrere Werte durch ein JSON-Patch. In der nächsten Abbildung wird gezeigt, wie man einen einzelnen Wert auf ThingSpeak hochlädt.

Für den Lichtsensor ist die BH1750FVI Library nötig. Wenn der Sensor Initialisiert wurde, kann man den Lichtwert mit der Objektmethode readLightLevel einlesen. Daraufhin wird sich mit dem Wlan verbunden. Da hier mit dem erstellten Channel von ThingSpeak gearbeitet wird, wird er Wert am Ende des URL-Links als Query-Parameter hinzugefügt und somit auch miti dem GET-Request hochgeladen.

void measureAndUploadSingleValue()
{
  unsigned int luxValue = lightMeter.readLightLevel();
  connectToWifi();
  HTTPClient httpClient;
  String address = "http://api.thingspeak.com/update?api_key=3GJ2Z7R6882OH85D&field1=" + String(luxValue);
  httpClient.begin(address);
  int responseHttpCode = httpClient.GET();
  Serial.printf("Tried to upload lux value %i, server response is: %i \n", luxValue, responseHttpCode);
  httpClient.end();
  blinkLed();
}
Darauf wird durch den seriellen Monitor geprüft, ob dies erfolgreich war.

Bevor der JSON-Patch erstellt wird (für die Übermittlung mehrere Daten), muss der HTTP-Request erzeugt werden und überprüft werden, wie viele Inhalte der Speicher besitzt. Außerdem wird eine Zeitangabe übermittelt, da bei diesen Daten die Zeitangabe wichtig für das Diagramm ist. 

//Synchronisierung der Uhrzeit per NTP mit dem Server. Um die Zeitzone zu berücksichtigen, wird die Zeit anschließend 8 Stunden zurückgerechnet.
time_t getTimeFromServer()
{
  configTime(10 * 3600, 0, "pool.ntp.org", "time.nist.gov");
  time_t checkTime = time(nullptr);
  waitUntilTimeIsSet();
  time_t now = time(nullptr);
  now = now - 8 * 3600;
  return now;
}

//Warten, is die Zeit vom Server gesetzt ist.
//Es wird überprüft, ob das eingestellte Jahr größer als 2018 ist (> 118, da tm_year die Jahre ab 1900 angeibt), um fehlerhafte/default gesetzte Werte zu verhindern.
void waitUntilTimeIsSet()
{
  time_t checkTime = time(nullptr);
  while(true)
  {
    if(checkTime)
    {
      tm localtm = *localtime(&checkTime);
      if(local_tm.tm_year > 118)
      {
        break;
      }
    }
    checkTime = time(nullptr);
  }
}

Die Lichtwerte werden nun an den ThingSpeak-Server gesendet. Die Werte werden per HTTP-POST-Request an den Server gesendet. Dazu wird ein JSON-Patch erstellt und im Body des Requests versendet. Anschließend wird die Serverantwort geprüft. Bei Erfolg wird der Speicher gelöscht, indem der Initialisierungskey und der Counter auf null gesetzt wird.

void postBulkDataToThingspeak(time_t now)
{
  unsigned int counter;
  EEPROM.get(0 + sizeof(unsigned int), counter);
  HTTPClient httpClient;
  httpClient.begin("http://api.thingspeak.com/channels/743129/bulk_update.json");
  httpClient.addHeader("Content-Type", "application/json");
  int responseHttpCode = httpClient.POST(createJsonPatch(counter, now));

  if(responseHttpCode >= 200 && responseHttpCode < 300)
  {
    Serial.println("Data successfully sent to server, deleting local data now.");
    EEPROM.put(0 + sizeof(unsigned int), 0);
    EEPROM.commit();
  }
  else
  {
    Serial.printf("Error inrHTTP Request: %i \n", responseHttpCode);
    Serial.println(httpClient.getString());
  }
  httpClient.end()
}

Wie ein JSON-Patch erstellt wird, ist im nächsten Kapitel zu sehen.


Zuletzt geändert: Donnerstag, 3. Februar 2022, 14:04