/*
  Wokwi: https://wokwi.com/projects/407465097953318913
  Forum: https://forum.arduino.cc/t/mehrere-schwellenwerte-und-led-anzeige/1295931

  Wowki (State Machine): https://wokwi.com/projects/406583203546521601

  2024/08/28
  ec2021

*/
const int pinAccel = A0; // simulierte Gesamtbeschleunigung
const int pinsLED[] = {11, 12, 13}; // gelb, orange, rot
const unsigned long timeLEDOn = 300;
const int threshold0 = 300;
const int threshold1 = 600;
const int threshold2 = 900;
const unsigned long timeWait = 150;
int previousThreshold = -1;
unsigned long timerStart;
boolean detectStart = true;
boolean startFound = false;
boolean maximumFound = false;

void setup()
{
  Serial.begin(115200);
  for (byte i = 0; i < 3; i++)
  {
    pinMode(pinsLED[i], OUTPUT);
  }
}

void loop()
{
  unsigned long timeNow = millis();
  int mAV_EMA = analogRead(pinAccel); // float für Beschleunigungssensor
  int threshold = detectThreshold(mAV_EMA);
  // Entspricht dem "START" der State Machine
  if (detectStart && threshold >= 0) // falls 0 erstmalig überschritten
  {
    previousThreshold = threshold; // kann 0, 1 oder 2 sein
    timerStart = timeNow; // Zeitpunkt merken
    startFound = true;
    detectStart = false;
    maximumFound = false;
  }
  // Entspricht dem "WAIT" der State Machine
  if (startFound) {
    if (threshold > previousThreshold) // gibt es einen höheren Wert nach erstmaligem Überschreiten?
    {
      previousThreshold = threshold; // falls ja, merken
      timerStart = timeNow; // Zeitpunkt merken
    }
    if (startFound && timeNow - timerStart >= timeWait) // Wartezeit vorbei?
    {
      digitalWrite(pinsLED[previousThreshold], HIGH); // nur die entsprechende LED einschalten
      timerStart = timeNow; // Einschaltzeitpunkt merken
      startFound = false;
      maximumFound = true;
    }
  }
  // Entspricht dem "STOP" der State Machine
  if (maximumFound && timeNow - timerStart >= timeLEDOn) // LED-an-Zeit vorbei?
  {
    digitalWrite(pinsLED[previousThreshold], LOW); // LED wieder ausschalten
    maximumFound = false;
    detectStart = true;
  }
  delay(10);
}

int detectThreshold(float mAVEMA)
{
  if (mAVEMA >= threshold2) return 2;
  if (mAVEMA >= threshold1) return 1;
  if (mAVEMA >= threshold0) return 0;
  return -1;
}