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