Мелодия на ардуино без «delay»

SVD
Offline
Зарегистрирован: 05.04.2018

Доброго времени суток. Подскажите пожалуйста как можно написать скетч, что бы проигрывалась мелодия при достижении определенного уровня, без DELAY???

#include <hcsr04.h>
#define TRIG_PIN 7
#define ECHO_PIN 8
HCSR04 hcsr04(TRIG_PIN, ECHO_PIN, 20, 4000);
int level_water; // уровень воды в мм.
int stop_level = 35; // уровень при которотом срабатывает звуковой сигнал
int volume_now; // переменная текущего уровня жидкости с датчика
int volume_ratio = 2; // коэфициент объема жидкости, переводит уровень в объем (мл)
int p = 9;
const byte COUNT_NOTES = 39;

int frequences [COUNT_NOTES] = {
  392, 392, 392, 311, 466, 392, 311, 466, 392,
  587, 587, 587, 622, 466, 369, 311, 466, 392,
  784, 392, 392, 784, 739, 698, 659, 622, 659,
  415, 554, 523, 493, 466, 440, 466,
  311, 369, 311, 466, 392
};
int durations [COUNT_NOTES] = {
  350, 350, 350, 250, 100, 350, 250, 100, 700,
  350, 350, 350, 250, 100, 350, 250, 100, 700,
  350, 250, 100, 350, 250, 100, 100, 100, 450,
  150, 350, 250, 100, 100, 100, 450,
  150, 350, 250, 100, 750
};

void setup () {
  pinMode (p, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  hc_sdr ();
  if (level_water <= stop_level) {
    sound ();
  }
}

void hc_sdr () { // функция замера уровня жидкости
  level_water = hcsr04.distanceInMillimeters();
  volume_now = (level_water_max - level_water) * volume_ratio;
  Serial.println(level_water);
}

void sound () {
  for (int i = 0; i <= COUNT_NOTES; i++) {
    tone(p, frequences[i], durations[i] * 2);
    delay (durations[i] * 2);
    noTone(p);
  }
}

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

SVD пишет:

без DELAY???

Других требований нет? Только без delay? Тогда - не вопрос.

Замените строку №48 на такую

for (uint32_t strt = millis(); millis() - strt < durations[i] * 2; );

и будет много щщастья и никаких делэев.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Не идеально но можно так #142

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

У меня карочи!

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

А у меня длинее ;))

SVD
Offline
Зарегистрирован: 05.04.2018

Ок). Подскажите пожалуйста тогда, как сделать так, чтобы при проигрывание мелодии не останавливалась работа программы?

 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Ну это через автоматы Пуха. Но Пух занят, у него облом. :))

sadman41
Offline
Зарегистрирован: 19.10.2016

SVD пишет:

Ок). Подскажите пожалуйста тогда, как сделать так, чтобы при проигрывание мелодии не останавливалась работа программы?

"blink без delay"

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

SVD пишет:

Ок). Подскажите пожалуйста тогда, как сделать так, чтобы при проигрывание мелодии не останавливалась работа программы?

Шо-то я нипонял. Был вопрос, на него был ответ. Конкретный такой ответ прямо в виде работающего кода. И вот смотрю я в свой стакан, а там пусто - спасибы никакой! Но зато уже второй вопрос поступил. Как-то это направильна! Так нидалжно быть!

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

qwone пишет:

А у меня длинее ;))

У моего кота толще. 

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

SVD пишет:

Ок). Подскажите пожалуйста тогда, как сделать так, чтобы при проигрывание мелодии не останавливалась работа программы?

 

 

Я бы сделал на прерывании таймера. 

sadman41
Offline
Зарегистрирован: 19.10.2016

tone() сработает из обработчика?

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

sadman41 пишет:

tone() сработает из обработчика?

Почему нет, если прерывание используется от другого таймера?

sadman41
Offline
Зарегистрирован: 19.10.2016

Просто интересуюсь. Не пищу ардуиной.

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

sadman41 пишет:

Не пищу ардуиной.

А чем пищите?

sadman41
Offline
Зарегистрирован: 19.10.2016

А ничем не пищу. Или баззером активным, если просят.

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

sadman41 пишет:

А ничем не пищу. Или баззером активным, если просят.

А к чему тогда был вопрос?

sadman41
Offline
Зарегистрирован: 19.10.2016

Написал же выше - просто интересуюсь. Вдруг придётся пискнуть.