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