как создать вот такой вот цикл if (someVariable > 50 * на протяжении 50 милисекунд*) { // do something here } просто у меня стоит фоторезистор, положение ХАЙ где то около 1010, в то время когда на него светит лазерная указка, но в промежутках бывают вспышки, длина их где то 10 милисекунд но фоторезистор улавливает их, что крайне не желательно...
Код (Text): const int SENS_PIN = A0; const int SENS_THRESHOLD = 1000; const int SENS_PERIOD = 50; bool sens_state = false; unsigned long timer = 0; void setup() { Serial.begin(9600); //pinMode(A0, INPUT); // do we really need this ? } void loop() { if (sens_state) { if (analogRead(SENS_PIN)>SENS_THRESHOLD) { if ((millis()-timer)>SENS_PERIOD) { Serial.println("OMG!!! Anybody... SOS!!!"); } else { Serial.println("Warning! We're under attack!"); } } else { Serial.println("Oh, they've missed :phew:"); sens_state = false; } } if (!sens_state) // not an if-else branch, on purpose! { timer = millis(); // save the time when the world is at peace sens_state = (analogRead(SENS_PIN)>SENS_THRESHOLD); } delay(1); // it was a long long loop, let's take a nap }
Debounce иногда можно проще сделать, прадва немного халтурно - просто после первого срабатывания дать паузу той же длительности и после нее еще раз проверить. Хотя для шумного сенсора и честный ардуиновский debounce не сработает, придется интегрировать сигнал по времени.
Именно интегрировать сигнал по времени или достаточно недовычисленного (то есть без деления на ширину окна) скользящего среднего?
А это неважно, вы просто определяете интегральную величину из соображений удобства и минимума вычислений. Все равно в итоге получается неравенство, которое можно умножить на любую константу >0 .