Страница 1 из 3

Звуковой контроль событий

Добавлено: 21.06.2022{, 19:45}
Igor
Блок основан на станрдатной библиотеке Tone()
Используется именно пассивный пьезодинамик, либо обычный но подключать желательно через транзистор, в крайнем случае если динамик маломощный достаточно резистора в разрыв цепи.
Это первая версия, так что после допиливания будет описание в самом блоке, а пока что здесь.
Подключение к любому пину - в параметрах 1 пункт указываем пин.
Можно подключать несколько динамиков к одному пину, и так же несколько на разные пины.
Далее в параметрах pause_note - это пауза между нотами (не злоупотреблять так как используется delay())
Ну и Size_note - это длительность звучания ноты (об этом еще чуть позже)
Входы
En- понятно что при 1 он работает
Вход Time в миллисекундах определяет через какое время повторится мелодия при наличии на входе EN 1
Можно задать разное время для каждого динамика даже если они на одном пине.

Дальше чуть сложнее.
Вы можете создать свою мелодию или набор из нот!
Для этого нужно отредактировать блок
В функции deсlare в самом начале указаны все ноты -например #define NOTE_C1 33 где С1 нота а 33 ее частота
Далее ниже находим
int melody[] = {
NOTE_C4, NOTE_E5, NOTE_A3, NOTE_D5, NOTE_B2 ,NOTE_C4
};
Тут мы вставляем нужные ноты, и не забываем про количество, через запятую, точно так как я скопировал
Потом находим ниже
int noteDurations[] = {
4, 4, 4, 4, 4, 4
};
Видим что у нас 6 нот, и цифра означает длительность звучания каждой ноты, можно поиграться, 2- длинно, 8 -коротко
Если у вас больше 6 нот добавляем циферки через запятую

и последнее находим в цикле loop строчку

for (int thisNote = 0; thisNote < 6; thisNote++) {
и меняем цифру 6 на количество ваших нот

Вроде все, вот сам блок и пример на 6 нот
Buzzer_my_(Code_-_Basic).ubi
(319.51 КБ) 72 скачивания

Обновление - блок от Андрея(Dryundel)
Без delay(), правда логика другая
Пост viewtopic.php?f=70&t=8094&p=115462#p115492 и viewtopic.php?f=70&t=8094&p=115462#p115497
Описание внутри блока
Мелодия_(Code_-_Basic).ubi
(68.8 КБ) 57 скачиваний
Обновление_2
В блоке добавлен Вход - количество раз проигранных мелодий при подаче короткого импульса на вход En
MelodyC_(Code_-_Basic).ubi
(102.69 КБ) 68 скачиваний

Звуковой контроль событий

Добавлено: 21.06.2022{, 21:21}
Dryundel
Igor, пожалуй стоит избавится от delay() в коде. В противном случае, пока будет играть мелодия ардуинка будет висеть.

Звуковой контроль событий

Добавлено: 21.06.2022{, 21:25}
Igor
Dryundel писал(а):
21.06.2022{, 21:21}
ожалуй стоит избавится от delay() в коде. В противном случае, пока будет играть мелодия ардуинка будет висеть.
Полностью согласен, от первого delay избавился на millis, а вот между нотами как ни пытался - не получается - не играет

Звуковой контроль событий

Добавлено: 21.06.2022{, 21:31}
Dryundel
Igor писал(а):
21.06.2022{, 21:25}
а вот между нотами как ни пытался - не получается - не играет
Думаем, изучаем и все получится.
Иначе кроме музыкальной шкатулки из блока ничего не получится. :)

Отправлено спустя 5 минут 15 секунд:
Igor, Почитай для начала:

https://alexgyver.ru/lessons/how-to-sketch/

Звуковой контроль событий

Добавлено: 21.06.2022{, 22:09}
Igor
Dryundel писал(а):
21.06.2022{, 21:37}
Почитай для начала:
Почитал, но не понял как вот в этом скетче избавится от delay ?

Код: Выделить всё

/*
  Melody

  Plays a melody

  circuit:
  - 8 ohm speaker on digital pin 8

  created 21 Jan 2010
  modified 30 Aug 2011
  by Tom Igoe

  This example code is in the public domain.

  https://www.arduino.cc/en/Tutorial/BuiltInExamples/toneMelody
*/

#include "pitches.h"

// notes in the melody:
int melody[] = {
  NOTE_C4, NOTE_G3, NOTE_G3, NOTE_A3, NOTE_G3, 0, NOTE_B3, NOTE_C4
};

// note durations: 4 = quarter note, 8 = eighth note, etc.:
int noteDurations[] = {
  4, 8, 8, 4, 4, 4, 4, 4
};

void setup() {
  // iterate over the notes of the melody:
  for (int thisNote = 0; thisNote < 8; thisNote++) {

    // to calculate the note duration, take one second divided by the note type.
    //e.g. quarter note = 1000 / 4, eighth note = 1000/8, etc.
    int noteDuration = 1000 / noteDurations[thisNote];
    tone(8, melody[thisNote], noteDuration);

    // to distinguish the notes, set a minimum time between them.
    // the note's duration + 30% seems to work well:
    int pauseBetweenNotes = noteDuration * 1.30;
    delay(pauseBetweenNotes);
    // stop the tone playing:
    noTone(8);
  }
}

void loop() {
  // no need to repeat the melody.
}
как только ни пробовал - звук прекращается

Звуковой контроль событий

Добавлено: 21.06.2022{, 23:04}
Dryundel
Igor писал(а):
21.06.2022{, 22:09}
Почитал, но не понял как вот в этом скетче избавится от delay ?
Ну да, здесь кроме таймера, надо надо понимать что такое цикл for.
И для того что бы заработало надо избавиться и от цикла.
Вместо этого поместить исполняемый код в тело таймера, а перебор элементов массивов осуществлять в конце и при достижении последнего сбрасывать.
Ах да, надо ещё разобраться с массивами. :)

Звуковой контроль событий

Добавлено: 22.06.2022{, 02:56}
Igor
Dryundel, Конечно буду разбираться, А что великая проблема что изредка в цикле бывает задержка на 600 мс? Для моего проекта который мониторит датчики раз в 1-2-3 сек не вижу проблем, но вы все равно правы!
Может сделаете пример из того кода выше как избавится от делай?

Звуковой контроль событий

Добавлено: 22.06.2022{, 08:37}
Dryundel
Igor писал(а):
22.06.2022{, 02:56}
А что великая проблема что изредка в цикле бывает задержка на 600 мс? Для моего проекта который мониторит датчики раз в 1-2-3 сек не вижу проблем....
Вы же вроде выложили готовый блок для общего пользования, а не только для своего проекта. Другие пытаются доверять тому что лежит в репозитории. Для разработок есть другой раздел.
Igor писал(а):
22.06.2022{, 02:56}
Может сделаете пример из того кода выше как избавится от делай?
Ок, чуть позже.

Звуковой контроль событий

Добавлено: 22.06.2022{, 17:58}
Igor
Dryundel писал(а):
22.06.2022{, 08:37}
Bы же вроде выложили готовый блок для общего пользования, а не только для своего проекта. Другие пытаются доверять тому что лежит в репозитории.
Так блок вполне рабочий, конечно делай зло, можно и вообще убрать, но получится некрасивое звучание.
Я вроде обозначил что блок не для воспроизведения мелодий, а для оповещения звуком каких либо событий.
Например сработал триггер 1 - сработал первый блок с мелодией из трех нот, сработал триггер 2 - сработал второй блок с мелодией из трех других нот, delay между тремя нотами = 2 *100мс =200 мс. И это причем вызывается совсем не в каждом цикле основной программы, а только при определенном условии. Даже если на входе EN будет постоянно 1 то блок будет срабатывать только через время указанное на входе Time, тут используется millis, все остальное время работает основная программа.
Конечно если в данной версии блока создать мелодию из 200 нот то основной цикл программы затормозится надолго, но повторюсь - этот блок для озвучки разными мелодиями разных событий. А не просто пи пи как в штатном блоке.
Если получится избавится от delay в этом скетче мы будем признательны! Кстати тот скетч который разместил выше не полный, там только основная программа, а еще надо файл pitches.h - полный скетч из которого я сделал блок в arduino IDE - примеры -digital - ToneMelody
PS. ecoins почему делают свои боблиотеки - потому что в стандартных часто используется delay, так что многие и не подозревают что в их программе присутствует delay

Звуковой контроль событий

Добавлено: 22.06.2022{, 19:40}
Dryundel
Короче, как то так.

Все настройки делаются из параметров пользователя.
Кроме того, мелодия собирается в одну строку. Так мне показалось удобнее выставлять длительность каждой ноты.
.
Мелодия для Buzzer.jpg
Мелодия для Buzzer.jpg (3.57 КБ) 1508 просмотров
Мелодия для Buzzer.flp
(110.68 КБ) 85 скачиваний
.
Блок Melody без delay()
Предназначен для проигрывания мелодий через пьезодинамик.
При коротком импульсе на входе Jingle мелодия прозвучит один раз.
При постоянном высоком уровне будет проигрывание "по кругу"

В настройках блока необходимо:
- Выбрать пин подключения пьезодинамика
- Настроить длительность такта (пауза между нотами)
- Указать количество нот в мелодии
- Составить из нот и их длительности мелодию
- Для паузы, вместо ноты используйте 0 и длительность 1
- Вместо нот допустимо писать частоту в герцах (целых) Например: 740, 2, 880, 2

Длительность ноты указывается делителем. Например 1/2 - это 2, а 1/4 - это 4.
Мелодия составляется по следующему принципу: Нота, Длительность, Нота, Длительность и так далее.
(через запятую)
Обозначение нот буквенное английское (не немецкое ! )

Пример NOTE_C4, 2, NOTE_D4, 2, NOTE_E4, 2, NOTE_F4, 2, NOTE_G4, 2, NOTE_A4, 2, NOTE_B4, 2
Что соответствует - До, Ре, Ми, Фа, Соль, Ля, Си четвертой октавы, двойка после ноты это длительность 1/2
Доступны так же диезы. К примеру NOTE_DS3 - это "Ре диез" третьей октавы. Всего 8 октав.

Список всех доступных нот в описании блока.

Звуковой контроль событий

Добавлено: 22.06.2022{, 19:56}
Igor
Вот спасибо, чуть позже посмотрю, возможно это то что надо! Можно либо удалить эту тему, а лучше дополнить первый пост

Звуковой контроль событий

Добавлено: 22.06.2022{, 20:12}
Anydy
Dryundel, Андрей, размести свой блок в первом посте...конечно под своим именем...тему удалять не нужно, я позже подредактирую.....она может многим пригодится!

Звуковой контроль событий

Добавлено: 22.06.2022{, 21:34}
Dryundel
Ну и что бы не скучно было тестировать... :)

Мелодия Ёлочка.

NOTE_C4, 4, NOTE_A4, 4, NOTE_A4, 4, NOTE_G4, 4, NOTE_A4, 4, NOTE_F4, 4, NOTE_C4, 4, NOTE_C4, 4, NOTE_C4, 4, NOTE_A4, 4, NOTE_A4, 4, NOTE_AS4, 4, NOTE_G4, 4, NOTE_C5, 2, 0, 1, NOTE_C5, 4, NOTE_D4, 4, NOTE_D4, 4, NOTE_AS4, 4, NOTE_AS4, 4, NOTE_A4, 4, NOTE_G4, 4, NOTE_F4, 4, NOTE_C4, 4, NOTE_A4, 4, NOTE_A4, 4, NOTE_G4, 4, NOTE_A4, 4, NOTE_F4, 1, 0, 1

30 нот
Длительность такта 300 мс

Звуковой контроль событий

Добавлено: 26.06.2022{, 04:48}
Igor
Dryundel, Вообще не понятна логика работы вашего блока, например в пустом проекте все нормально, но мне надо чтобы мелодия проиграла три раза. Использую генератор и счетчик. В пустом проекте то же нормально. Но стоит перенести это все в средний проект - начинается ерунда - уже играет не 3 раза а полтора, и ноты играет сначала семь, потом еще 3, потом 5, потом 2.
А если в крупный проект так еще хуже - длительность звучания нот увеличивается и сколько я не пытался настраивать так и не добился нужного.
Кстати почему вы избавились от цикла for? Там вроде же все прозрачно - прошел цикл в 8 нот, все сыграли с заданными настройками и нет зависимости от размера программы и времени выполнения основного цикла loop

Звуковой контроль событий

Добавлено: 26.06.2022{, 09:04}
Dryundel
Igor писал(а):
26.06.2022{, 04:48}
в пустом проекте все нормально, но мне надо чтобы мелодия проиграла три раза. Использую генератор и счетчик.
И что Вы считаете этим счётчиком? Время по всей видимости?
Igor писал(а):
26.06.2022{, 04:48}
Вообще не понятна логика работы вашего блока
Igor писал(а):
26.06.2022{, 04:48}
Кстати почему вы избавились от цикла for? Там вроде же все прозрачно
Логика работы перебора нот, точно такая же как и в цикле for. Только не мешает работе основного цикла loop.
В изначальном примере цикл for являлся блокирующим а delay находился в теле этого цикла и без него цикл работать не будет. Точней будет, но очень быстро. А именно delay и задавал паузу между нотами, точней паузу между началом звучания нот.
Igor писал(а):
26.06.2022{, 04:48}
Но стоит перенести это все в средний проект - начинается ерунда
Ерунда может начинаться вопервых в том случае, если пауза меньше чем длина ноты. К примеру 4 - это 1/4 секунды = 250 мс. Поэтому паузу надо ставить чуть больше.
Igor писал(а):
26.06.2022{, 04:48}
длительность звучания нот увеличивается и сколько я не пытался настраивать так и не добился нужного.
Длительность нот не должна увеличиваться, она задана функцией tone, а вот паузе может мешать необоснованно длинный основной цикл.
Igor писал(а):
26.06.2022{, 04:48}
нет зависимости от размера программы и времени выполнения основного цикла loop
Когда нибудь и Вы дойдёте до осознания важности максимально сокращать время выполнения основного цикла, если не оставите изучение программирования на С++ :)
А пока почитайте это:
viewtopic.php?f=187&t=7583

Отправлено спустя 33 минуты 23 секунды:
Igor писал(а):
26.06.2022{, 04:48}
мне надо чтобы мелодия проиграла три раза.
Изначально такой задачи не стояло. Для этого надо просто допилить блок. Считать надо не время, а количество раз проигрывания, ибо жёсткие тайминги для AVR это утопия.

Отправлено спустя 9 минут 9 секунд:
Igor писал(а):
26.06.2022{, 04:48}
Вообще не понятна логика работы вашего блока
Попробуйте разобраться с логикой кода в блоке. Там всего то строчек 10.

Звуковой контроль событий

Добавлено: 27.06.2022{, 10:35}
Dryundel
Igor писал(а):
26.06.2022{, 04:48}
мне надо чтобы мелодия проиграла три раза.
Dryundel писал(а):
26.06.2022{, 09:46}
Изначально такой задачи не стояло. Для этого надо просто допилить блок.
Igor, а надо ли что то допилить и усложнять алгоритм?
Гораздо проще и логичнее составить мелодию из трех одинаковых фрагментов.

Звуковой контроль событий

Добавлено: 28.06.2022{, 08:22}
Igor
Dryundel писал(а):
27.06.2022{, 10:35}
Гораздо проще и логичнее составить мелодию из трех одинаковых фрагментов.
Согласен, если три фрагмента из пяти нот то проще сделать так.
Но хотелось бы иметь отдельный вход где указывается количество повторений.
Планируется создать несколько блоков с разными мелодиями, для начала 2 блока.
Алгоритм такой - температура больше на 2 градуса - первый блок играет 3 раза, больше на 10 градусов - играет 7 раз, больше на 15 градусов играет 15 раз, больше на 20 градусов - играет постоянно.
То же самое только на понижение температуры. -2, -10, -15, -20 градусов, но уже срабатывает другой блок с другой мелодией.
Либо настройки через меню - режим 0 - не играет совсем, режим 1 - 3 раза, режим 2 - 7 раз, режим 3 - 15 раз, режим 4 - постоянно.
Вот экспериментировал со скетчем но так и не добился нужного, посмотрите где косяк?
СпойлерПоказать
buzzer_korot.flp
(137.23 КБ) 37 скачиваний

Звуковой контроль событий

Добавлено: 28.06.2022{, 09:02}
Dryundel
Igor писал(а):
28.06.2022{, 08:22}
Алгоритм такой - температура больше на 2 градуса - первый блок играет 3 раза, больше на 10 градусов - играет 7 раз, больше на 15 градусов играет 15 раз, больше на 20 градусов - играет постоянно.
А может вложить чуть больше фантазии?
Вы что, будете сидеть и считать количество проигрышей?
Мне кажется логичнее сделать разные мелодии и тональности. Нот выше крыши.
1. Пи-лим
2. Тртам-парам
3. Па-ра-па-ба-бам
4. Та-та-рам-да-рам-дам-Та-та-рам-да-рам-дам....
...
Ладно, сделаем вход количества проигрышей.

Звуковой контроль событий

Добавлено: 28.06.2022{, 11:32}
Dryundel
Igor писал(а):
28.06.2022{, 08:22}
Вот экспериментировал со скетчем но так и не добился нужного, посмотрите где косяк?
Косяк в логике.
Надо как то так:
buzzer_NEW.jpg
buzzer_NEW.jpg (4.73 КБ) 1094 просмотра
buzzer_NEW.flp
(149.09 КБ) 46 скачиваний

Звуковой контроль событий

Добавлено: 28.06.2022{, 12:36}
Igor
Dryundel, Спасибо, то что надо, я тоже думал флаги прикрутить, но знаний не хватило. будем дальше изучать С++
Вот пример на FLprog как постоянно с генератора через триггер играть мелодию 5 раз подряд с задержкой в конце каждого проигрыша. Настройки подбираются индивидуально!
buzzer_test_new.flp
(160.51 КБ) 42 скачивания
Отправлено спустя 10 минут 9 секунд:
Dryundel, И еще вопрос нельзя ли сделать длительность такта еще меньше чем 100мс? Ноты то можно а вот паузы уже не получается.

Отправлено спустя 5 минут 50 секунд:
PS.Хотя нет - все получается, нужно только подобрать длительность! Теперь этот блок можно использовать в разных проектах. Еще его можно клонировать и сделать несколько блоков с разными мелодиями!