Es geht um die Gesamtbeschleunigung von kurzen Erschütterungen, gemessen mit einem Beschleunigungssensor. Auf WOKWI durch ein Schiebepotentiometer ersetzt. Hier für's Prinzip mit nur drei Schwellenwerten, später sollen es sechs sein. Beim Überschreiten von einem der drei Schwellenwerte soll nur die entsprechende LED kurz aufleuchten, die anderen nicht. Das funktioniert, aber nur, wenn man den Schieberegler sehr schnell bewegt, andernfalls bleibt die gelbe LED an, oder auch eine andere. Wo liegt der Fehler? Danke!
const int pinAccel = A0; // simulierte Gesamtbeschleunigung
const int pinsLED[] = {11, 12, 13}; // gelb, orange, rot
const int threshold0 = 300;
const int threshold1 = 600;
const int threshold2 = 900;
const unsigned long timeWait = 150;
const unsigned long timeLEDOn = 300;
int mAV_EMA = 0;
int previousThreshold = -1;
unsigned long timerStart;
unsigned long timerLED;
void setup()
{
Serial.begin(9600);
for (byte i = 0; i < 3; i++)
{
pinMode(pinsLED[i], OUTPUT);
}
}
void loop()
{
unsigned long timeNow = millis();
mAV_EMA = analogRead(pinAccel);
int threshold = detectThreshold(mAV_EMA);
if (threshold >= 0) // falls 0 überschritten
{
previousThreshold = threshold; // kann 0, 1 oder 2 sein
timerStart = timeNow;//millis(); // Zeitpunkt merken
while ((millis() - timerStart) < timeWait) // warten
{
mAV_EMA = analogRead(pinAccel);
threshold = detectThreshold(mAV_EMA);
if (threshold > previousThreshold) // gibt es einen Höheren?
{
previousThreshold = threshold; // falls ja, merken
timerStart = timeNow; // Zeitpunkt merken
}
}
Serial.print("Warten vorbei "); Serial.println(previousThreshold);
digitalWrite(pinsLED[previousThreshold], HIGH); // nach Ablauf der Wartezeit nur die entsprechende LED einschalten
timerLED = timeNow; // Zeitpunkt merken
}
if ((millis() - timerLED) >= timeLEDOn) // nach Ablauf der LED-an-Zeit wieder ausschalten
{
digitalWrite(pinsLED[previousThreshold], LOW);
}
delay(10);
}
int detectThreshold(int accel)
{
if (mAV_EMA >= threshold2) return 2;
if (mAV_EMA >= threshold1) return 1;
if (mAV_EMA >= threshold0) return 0;
return -1;
}