//Einfügen der benötigten Bibliotheken
#include <Wire.h>
#include <Adafruit_MotorShield.h>
#include <BH1750.h>

// Einstellungen, mit denen die Messung angepasst werden kann.
int imax = 200; // Variable für Gesamtzahl der Messung definieren
int j = 1; // Schrittweite des Motors zwischen den Messungen definieren

// Einstellungen, die nicht geändert werden dürfen
Adafruit_MotorShield AFMS = Adafruit_MotorShield(); // Objekt fuer Motorshield erzeugen
Adafruit_StepperMotor *myStepper = AFMS.getStepper(200, 1); // Schrittmotor an Motor Port #2 (M1 und M2)
BH1750 lightMeter;
int i;                  // Variable für Zählung der Messungen definieren
uint16_t lux;           //Definition der Variablen Lux als Zahlenvariable zur Speicherung der Intensität
char usr_input = 0;     //Definition des usr_input als beliebige Eingabe

void setup() {

  AFMS.begin();                                       // Motorshield Objekt starten
  myStepper->setSpeed(10);                            // Schrittmotor Geschwindigkeit festlegen
  Serial.begin(9600);                                 // Serielle Kommuikation starten
  Wire.begin();                                       // Initialisiere die Wire library
  lightMeter.begin(BH1750::CONTINUOUS_HIGH_RES_MODE); // Einstellen der Genauigkeit des Lichtsensors

}

void loop() {                         // Hauptschleife

  if (Serial.available() > 0) {       // Wurde ein Zeichen in die Konsole eingegeben?

    usr_input = Serial.read();        // Zuweisen des eingegebenen Zeichens zu usr_input.

    if ((usr_input == 's')) {         // Starten der Messung, sobald "s" als Zeichen eingegeben wird.

      for (i = 1; i < imax; i++) {    // Schleife zum Zählen der Messwerte, bis die Maximalanzahl erreicht ist.
        lux = lightMeter.readLightLevel();              // Zuweisen der Intensität zur variablen lux
        Serial.print(i);                                // Die Nummer der Messung wird ausgegeben
        Serial.print(";");                              // ; wird als Trennzeichen ausgegeben
        Serial.println(lux);                            // und die gemessene Helligkeit wird am seriellen Monitor ausgegeben.
        myStepper->step(j, FORWARD, MICROSTEP);         // Der Motor fährt j-Schritte nach vorne im Microstep-Modus
        delay(50);                                      // Delay von 50 ms, vor der nächsten Messung
      }

      myStepper->step(j * imax, BACKWARD, SINGLE);      // Der Messwagen wird wieder zur Ausgangsposition zurückgefahren.
      usr_input == '0';                                 // Zurücksetzen der Variable usr_input, um neue Eingaben aufnehmen zu können
    }
    if ((usr_input == 'b')) {                           // Falls ein "b" (backward) als Zeichen eingegeben wurde
      myStepper->step(50, BACKWARD, SINGLE);            // fahre den Wagen 50 Schritte rückwärts
    }
    if ((usr_input == 'f')) {                           // Falls ein "f" (forward) als Zeichen eingegeben wurde
      myStepper->step(50, FORWARD, SINGLE);             // fahre den Wagen 50 Schritte vorwärts
    }
  }
}
