Es existieren zwei Funktionen, die Lichtwerte aufnehmen. Sie unterscheiden sich durch die Frage, ob der Wert direkt hochgeladen werden soll oder erstmal gespeichert werden soll. Durch die Bibliothek BH1750 ist die Aufnahme der Lichtwerte ohne großen Aufwand möglich. 

Die Funktion readLightLevel() nimmt einen Lichtwert auf und speichert diesen in eine Variable.

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();
}

//Die aktuelle Helligkeit wird mittels des initialisierten Lichtsensors aufgenommen.
//Anschließend wird der Wert auf dem permanenten Speicher (EEPROM) abgelegt. Dazu wird er an das Ende angefügt, um keinen vorhandenen Wert zu überschreiben.
//Als Bestätigung wird die LED zum Blinken gebracht.
void measureAndStoreNewLightValue()
{
  unsigned in luxValue = lightMeter.readLightLevel();
  Serial.printf("Measured light: %i lux \n", luxValue);
  unsigned int counter;
  EEPROM.get(0 + sizeof(unsigned int), counter);
  EEPROM.put(0 + sizeof(unsigned int) + sizeof(unsigned int) + counter * sizeof(unsigned int), luxValue);
  EEPROM.put(0 + sizeof(unsigned int), counter + 1);
  EEPROM.commit();
  blinkLed();
}

Die WiFi-Verbindung wird im nächsten Kapitel behandelt.

Durch den Befehl sizeof wird die Größe der einzelnen Messwerte festgelegt. Da der Mikrocontroller einen 1024Byte großen Speicher besitzt, und ein unsigned int 2 Byte groß ist, können wir 512 Messwerte speichern. Im Quellcode ist zu sehen, dass zuerst mithilfe der get-Methode überprüft wird, wie viele Werte denn eingespeichert sind. Darauf werden die Bytes bis zum nächsten freien Speicherplatz hochgezählt und der Lichtwert wird dort gespeichert. Der Counter wird um 1 hochgezählt. Als Bestätitung wird dann eine Led zum Blinken gebracht.

Damit keine zufälligen stehenden Werte geladen werden, wird mittelns eines Keys (Integer) an einer nullten Stelle des Speichers überprüft, ob der Speicher bereits initialisiert wurde. Falls nicht, wird dies getan und der Counter auf 0 gesetzt. So besitzt der Speicher folgende Struktur:

INIT_DONE_KEY | COUNTER | LUX_VALUE_1 | LUX_VALUE_2 | ... | LUX_VALUE_N

void initMemoryIfNeeded()
{
  unsigned int initDone;
  EEPROM.get(0, initDone);
  if(initDone != INIT_DONE_KEY)
  {
    EEPROM.put(0, INIT_DONE_KEY);
    EEPROM.put(0 + sizeof(INIT_DONE_KEY), 0);
    EEPROM.commit();
  }
}
Im Programmablauf ist festgelegt, dass die Daten erst aus dem Speicher hochgeladen werden, wenn dieser voll ist. Danach wird der Initialisierungskey aus dem Speicher gelöscht und der Zähler wird gelöscht.

Zuletzt geändert: Donnerstag, 3. Februar 2022, 13:21