Bevor mit der eigentlichen Programmierung begonnen werden kann, ist zunächst diese Anleitung zu befolgen, damit Programme auf das NodeMCU-Board übertragen werden können.

Nun müssen Board und Sensor initialisiert werden, sodass die Kommunikation mit dem Sensor über I2C fehlerfrei stattfinden kann. Dafür benötigen wir folgende zwei Bibliotheken, welche mit include-Befehlen am Anfang des Sketches inkludiert werden:

#include <Wire.h> (erlaubt die Kommunikation mit I2C-Geräten und stellt entsprechende Funktionen bereit)

#include <BH1750.h> (Bibliothek für das BH1750 Sensor-Board, hier zum Download)

#include <EEPROM.h>  Um die GET- und PUT-Methoden für den internen Speicher.

#include <ESP8266WiFi.h> Zum Herstellen einer Wlan-Verbindung.

#include <ESP8266HTTPClient.h> Zum Herstellen von HTTP-Requests.

Runtergeladene (nicht standardmäßig enthaltene) Bibliotheken müssen im Bibliothhek-Ordner (C:\Users\YourUsername\Documents\Arduino\libraries) entpackt abgelegt werden, um inkludiert werden zu können. Alternativ kann über "Sketch"->"Bibliothek einbinden"->".ZIP-Bibliothek hinzufügen..." die Bibliothek direkt im .ZIP-Format eingebunden werden.


Wir legen die Methode initBoardAndSensor an, welche Funktionen der eben eingefügten Bibliotheken nutzt, um das Auslesen des Sensors über die serielle I2C-Schnittstelle zu ermöglichen. Im folgenden Code-Ausschnitt wird der serielle Monitor, der interne Speicher, die I2C-Schnittstelle und der Lichtsensor initialisiert. Die I2C-Schnittstelle ist über den D1 und D2 Pin angesteuert.

void initBoardAndSensor()
{
  Serial.begin(9600);
  EEPROM.begin(512);
  Wire.begin(D2, D1);
  lightMeter.begin(BH1750::CONTINUOUS_HIGH_RES_MODE);
  Serial.println();
}

In der folgenden Abbildung wird der Programmablauf gezeigt, damit in den folgenden Kapitel auf die einzelnen Funktion eingegangen werden kann.

#include <Wire.h>
#include <EEPROM.h>
#include <BH1750.h>
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>

//Lichtsensor
BH1750 lightMeter;
const unsigned int INIT_DONE_KEY = 22;

//WLAN Einstellungen
const String WLAN_NAME = "NAME";
const String WLAN_PASSWORT = "PW";

//Abstand zwischen Lichtmessungen (in Mikrosekunden)
const unsigned int SLEEPTIME = 15e6 * 60;

//Nach jeder Messung direkt hochladen?
const boolean = INSTANT_UPLOAD = false;

//Anzahl zwischengespeicherte Werte, bevor sie zum Server hochgeladen werden
const unsigned int MAX_LOCAL_VALUES = 4;

//Hauptstruktur des Programmes, wird bei jedem Zyklus (Lichtmessung) ausgeführt.
//Je nachdem, ob die Werte direkt hochgeladen oder zwischengespeichert werden sollen, werden andere Funktionen aufgerufen.
void setup()
{
  initBoardAndSensor();

  if(INSTANT_UPLOAD)
  {
    measureAndUpladDingleValue();
  }
  else
  {
    initMemoryIfNeeded();
    measureAndStoreNewLightValue();
    printStoredLightValues();
    if(isMaxLocalDataReached())
    {
      uploadBulkAndDeleteStoredData();
    }
  }
  ESP.deepSleep(SLEEPTIME);
}

Anschließend wird der Controller für 15 Minuten "schlafen" gelegt.

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