/*
Wokwi: https://wokwi.com/projects/407469487863527425
Forum: https://forum.arduino.cc/t/mehrere-schwellenwerte-und-led-anzeige/1295931
Wowki (State Machine): https://wokwi.com/projects/406583203546521601
2024/08/28
ec2021
*/
// ASE Edgar Bonet concept
const int pinAccel = A0; // simulierte Gesamtbeschleunigung
const int pinsLED[] = {11, 12, 13}; // gelb, orange, rot
const unsigned long timeLEDOn = 300;
struct ledType {
byte pin;
byte state;
unsigned long startTime;
void on(unsigned long start) {
digitalWrite(pin, HIGH);
startTime = start;
state = HIGH;
};
void off() {
digitalWrite(pin, LOW);
state = LOW;
};
void autoOff(unsigned long actTime) {
if (!state) return;
if (actTime - startTime > timeLEDOn) {
off();
}
};
};
ledType leds[] = {
{11, LOW, 0},
{12, LOW, 0},
{13, LOW, 0}
};
const int noOfLeds = sizeof(leds) / sizeof(ledType);
const int threshold0 = 300;
const int threshold1 = 600;
const int threshold2 = 900;
const unsigned long timeWait = 150;
enum {START, WAIT, STOP} state;
int previousThreshold = -1;
unsigned long timerStart;
void setup()
{
Serial.begin(9600);
for (auto led : leds)
{
pinMode(led.pin, OUTPUT);
}
}
void loop()
{
unsigned long timeNow = millis();
int mAV_EMA = analogRead(pinAccel); // float für Beschleunigungssensor
int threshold = detectThreshold(mAV_EMA);
switch (state)
{
case START:
if (threshold >= 0) // falls 0 überschritten
{
previousThreshold = threshold; // kann 0, 1 oder 2 sein
timerStart = timeNow; // Zeitpunkt merken
state = WAIT; // in loop() sofort zu WAIT
}
break; // ab in den loop()
case WAIT:
if (threshold > previousThreshold) // gibt es einen Höheren?
{
previousThreshold = threshold; // falls ja, merken
timerStart = timeNow; // Zeitpunkt merken
}
if (timeNow - timerStart >= timeWait) // Wartezeit vorbei?
{
switchLedOn(previousThreshold, timeNow);
state = START; // in loop() sofort zu START
}
break; // ab in den loop()
}
handleLeds();
delay(10);
}
int detectThreshold(float mAVEMA)
{
if (mAVEMA >= threshold2) return 2;
if (mAVEMA >= threshold1) return 1;
if (mAVEMA >= threshold0) return 0;
return -1;
}
void switchLedOn(int No, unsigned long startTime) {
if (No > -1 && No < noOfLeds) {
leds[No].on(startTime); // nur die entsprechende LED einschalten
}
}
void handleLeds() {
for (auto led : leds)
{
led.autoOff(millis());
}
}