const int pinAccel = A0; // simulierte Gesamtbeschleunigung
const int pinsLED[] = {11, 12, 13}; // gelb (0), orange (1), rot (2)
const int threshold0 = 300;
const int threshold1 = 600;
const int threshold2 = 900;
const unsigned long timeWait = 100;
const unsigned long timeLEDOn = 300;
int mAV_EMA = 0;
bool signalRises = false;
int previousThreshold = -1;
unsigned long timerStart;
unsigned long timerLED;
bool nextImpact = true;

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

void loop()
{
  mAV_EMA = analogRead(pinAccel);
  int threshold = getThreshold(mAV_EMA); // kann 0, 1 oder 2 sein
  if (threshold >= 0 && nextImpact) // falls 0 überschritten
  {
    timerStart = millis(); // Zeitpunkt merken
    nextImpact = false;
    while ((millis() - timerStart) < timeWait) // warten
    {
      mAV_EMA = analogRead(pinAccel);
      threshold = getThreshold(mAV_EMA);
      if (threshold > previousThreshold) // gibt es einen Höheren?
      {
        previousThreshold = threshold; // falls ja, merken
        signalRises = true; // Signal steigt
        timerStart = millis(); // Zeitpunkt merken
      }
      if (((millis() - timerStart) >= timeWait) && signalRises) // nur bei steigendem Signal
      {
        digitalWrite(pinsLED[threshold], HIGH); // nach Ablauf der Wartezeit nur die entsprechende LED einschalten
        timerLED = millis(); // Einschaltzeitpunkt merken
      }
    }
    signalRises = false;
    previousThreshold = threshold;
  }
  if ((millis() - timerLED) >= timeLEDOn) // nach Ablauf der LED-an-Zeit wieder ausschalten
  {
    digitalWrite(pinsLED[previousThreshold], LOW);
    nextImpact = true;
  }
}

int getThreshold(int accel)
{
  if (mAV_EMA >= threshold2) return 2;
  if (mAV_EMA >= threshold1) return 1;
  if (mAV_EMA >= threshold0) return 0;
  return -1;
}