ARDUINO Вопрос по поводу паузы кода.

vortexRC

✩✩✩✩✩✩✩
31 Окт 2019
11
6
Здравствуйте. Вновь возник вопрос по поводу коддинга ардуинки. Есть задача: "Проиграть мелодию, когда значение с датчика ниже, чем 20". Написал код, в принципе работает, но хочется избавиться от delay. Посмотрел много видео про миллис, но не смог интегрировать его в мой код. Подскажите, пожалуйста, как убрать из этого кода delay? Поскольку датчик очень много раз в секунду выдает значения, то если убрать задержку, мелодия не проиграется(при срабатывании датчика удара значение становиться ниже 20 на несколько миллисекунд, затем опять возвращается к значению больше 20, и мелодия не успевает даже начать проигрываться, она длительностью 2 секунды).

#include <SoftwareSerial.h>
#include <DFPlayer_Mini_Mp3.h>
SoftwareSerial mySerial(10, 11);
int udar = analogRead(A3);

void setup () {
Serial.begin (9600);
mySerial.begin (9600);
mp3_set_serial (mySerial);
mp3_set_volume (5);
}

void loop () {
Serial.println (udar);
if (udar < 20) {
mp3_play(1);
delay (2000);
udar = 21;
}

}
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,263
1,301
Москва
все так же. Делаем флаг, о том, что мелодия запущена, и если флаг стоит, то заново не запускаем. Флаг держим 2 секунды . ну или 2.5 как захочешь
 

vortexRC

✩✩✩✩✩✩✩
31 Окт 2019
11
6
все так же. Делаем флаг, о том, что мелодия запущена, и если флаг стоит, то заново не запускаем. Флаг держим 2 секунды . ну или 2.5 как захочешь
Приятно, что есть человек у которого можно что-то узнать и посоветоваться) Спасибо за отзывчивость. А как держать флаг? Как его применять я научился, дальше разберусь)
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,263
1,301
Москва
как то так. куда udar = 21; сунуть сам смотри, я не очень понимаю смысл вот этого int udar = analogRead(A3); ну присвоишь ты его один раз (если сработает, хотя наверное сработает).

C++:
bool flag=false;
uint32_t play_time=0;

void loop () {

Serial.println (udar);

if (udar < 20) {
if (!flag){
mp3_play(1);
flag=true;
play_time=millis();
}
udar = 21;
if ((millis()-play_time)>2000)flag=false;
}

}