Звуковой контроль событий
Правила форума
Рекомендации по размещению блоков:
Автор блока создает подробное описание блока, отличие от подобных(если есть на данный момент).Сложные блоки очень желательно с примерами.
При выходе новых версий редактирует/дополняет свой первый пост с указанием даты, версии, причины.
В каждой теме обсуждается только выложенный автором блок - баги, возможность (или предложение) доработки и прочие хотелки.
Свои блоки, переработанные, с другими библиотеками, протоколами и т.д.- размещаем либо сами отдельно, либо обсуждаем и дорабатываем в форуме Разработка блоков.
Пользователи улучшив блок автора и проверив его работоспособность - могут обратиться к автору или модераторам с просьбой добавить их версию блока в первое сообщение темы.
Рекомендации по размещению блоков:
Автор блока создает подробное описание блока, отличие от подобных(если есть на данный момент).Сложные блоки очень желательно с примерами.
При выходе новых версий редактирует/дополняет свой первый пост с указанием даты, версии, причины.
В каждой теме обсуждается только выложенный автором блок - баги, возможность (или предложение) доработки и прочие хотелки.
Свои блоки, переработанные, с другими библиотеками, протоколами и т.д.- размещаем либо сами отдельно, либо обсуждаем и дорабатываем в форуме Разработка блоков.
Пользователи улучшив блок автора и проверив его работоспособность - могут обратиться к автору или модераторам с просьбой добавить их версию блока в первое сообщение темы.
Звуковой контроль событий
Блок основан на станрдатной библиотеке 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 нот
Обновление - блок от Андрея(Dryundel)
Без delay(), правда логика другая
Пост viewtopic.php?f=70&t=8094&p=115462#p115492 и viewtopic.php?f=70&t=8094&p=115462#p115497
Описание внутри блока Обновление_2
В блоке добавлен Вход - количество раз проигранных мелодий при подаче короткого импульса на вход En
Используется именно пассивный пьезодинамик, либо обычный но подключать желательно через транзистор, в крайнем случае если динамик маломощный достаточно резистора в разрыв цепи.
Это первая версия, так что после допиливания будет описание в самом блоке, а пока что здесь.
Подключение к любому пину - в параметрах 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 нот
Обновление - блок от Андрея(Dryundel)
Без delay(), правда логика другая
Пост viewtopic.php?f=70&t=8094&p=115462#p115492 и viewtopic.php?f=70&t=8094&p=115462#p115497
Описание внутри блока Обновление_2
В блоке добавлен Вход - количество раз проигранных мелодий при подаче короткого импульса на вход En
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Последний раз редактировалось Igor 28 июн 2022, 12:30, всего редактировалось 5 раз.
- Dryundel
- Полковник
- Сообщения: 2411
- Зарегистрирован: 22 май 2017, 23:15
- Откуда: Ярославль
- Имя: Андрей
- Поблагодарили: 18 раз
Звуковой контроль событий
[ref]Igor[/ref], пожалуй стоит избавится от delay() в коде. В противном случае, пока будет играть мелодия ардуинка будет висеть.
Звуковой контроль событий
Полностью согласен, от первого delay избавился на millis, а вот между нотами как ни пытался - не получается - не играетDryundel писал(а): 21 июн 2022, 21:21 ожалуй стоит избавится от delay() в коде. В противном случае, пока будет играть мелодия ардуинка будет висеть.
- Dryundel
- Полковник
- Сообщения: 2411
- Зарегистрирован: 22 май 2017, 23:15
- Откуда: Ярославль
- Имя: Андрей
- Поблагодарили: 18 раз
Звуковой контроль событий
Думаем, изучаем и все получится.
Иначе кроме музыкальной шкатулки из блока ничего не получится.

Отправлено спустя 5 минут 15 секунд:
[ref]Igor[/ref], Почитай для начала:
https://alexgyver.ru/lessons/how-to-sketch/
Звуковой контроль событий
Почитал, но не понял как вот в этом скетче избавится от 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.
}
- Dryundel
- Полковник
- Сообщения: 2411
- Зарегистрирован: 22 май 2017, 23:15
- Откуда: Ярославль
- Имя: Андрей
- Поблагодарили: 18 раз
Звуковой контроль событий
Ну да, здесь кроме таймера, надо надо понимать что такое цикл for.
И для того что бы заработало надо избавиться и от цикла.
Вместо этого поместить исполняемый код в тело таймера, а перебор элементов массивов осуществлять в конце и при достижении последнего сбрасывать.
Ах да, надо ещё разобраться с массивами.

Звуковой контроль событий
[ref=#ff8000]Dryundel[/ref], Конечно буду разбираться, А что великая проблема что изредка в цикле бывает задержка на 600 мс? Для моего проекта который мониторит датчики раз в 1-2-3 сек не вижу проблем, но вы все равно правы!
Может сделаете пример из того кода выше как избавится от делай?
Может сделаете пример из того кода выше как избавится от делай?
- Dryundel
- Полковник
- Сообщения: 2411
- Зарегистрирован: 22 май 2017, 23:15
- Откуда: Ярославль
- Имя: Андрей
- Поблагодарили: 18 раз
Звуковой контроль событий
Вы же вроде выложили готовый блок для общего пользования, а не только для своего проекта. Другие пытаются доверять тому что лежит в репозитории. Для разработок есть другой раздел.Igor писал(а): 22 июн 2022, 02:56 А что великая проблема что изредка в цикле бывает задержка на 600 мс? Для моего проекта который мониторит датчики раз в 1-2-3 сек не вижу проблем....
Ок, чуть позже.
Звуковой контроль событий
Так блок вполне рабочий, конечно делай зло, можно и вообще убрать, но получится некрасивое звучание.Dryundel писал(а): 22 июн 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
- Dryundel
- Полковник
- Сообщения: 2411
- Зарегистрирован: 22 май 2017, 23:15
- Откуда: Ярославль
- Имя: Андрей
- Поблагодарили: 18 раз
Звуковой контроль событий
Короче, как то так.
Все настройки делаются из параметров пользователя.
Кроме того, мелодия собирается в одну строку. Так мне показалось удобнее выставлять длительность каждой ноты.
. .
Блок 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 октав.
Список всех доступных нот в описании блока.
Все настройки делаются из параметров пользователя.
Кроме того, мелодия собирается в одну строку. Так мне показалось удобнее выставлять длительность каждой ноты.
. .
Блок 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 октав.
Список всех доступных нот в описании блока.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Звуковой контроль событий
Вот спасибо, чуть позже посмотрю, возможно это то что надо! Можно либо удалить эту тему, а лучше дополнить первый пост
Звуковой контроль событий
[ref=#ff8000]Dryundel[/ref], Андрей, размести свой блок в первом посте...конечно под своим именем...тему удалять не нужно, я позже подредактирую.....она может многим пригодится!
- Dryundel
- Полковник
- Сообщения: 2411
- Зарегистрирован: 22 май 2017, 23:15
- Откуда: Ярославль
- Имя: Андрей
- Поблагодарили: 18 раз
Звуковой контроль событий
Ну и что бы не скучно было тестировать...
Мелодия Ёлочка.
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 мс

Мелодия Ёлочка.
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 мс
Звуковой контроль событий
[ref=#ff8000]Dryundel[/ref], Вообще не понятна логика работы вашего блока, например в пустом проекте все нормально, но мне надо чтобы мелодия проиграла три раза. Использую генератор и счетчик. В пустом проекте то же нормально. Но стоит перенести это все в средний проект - начинается ерунда - уже играет не 3 раза а полтора, и ноты играет сначала семь, потом еще 3, потом 5, потом 2.
А если в крупный проект так еще хуже - длительность звучания нот увеличивается и сколько я не пытался настраивать так и не добился нужного.
Кстати почему вы избавились от цикла for? Там вроде же все прозрачно - прошел цикл в 8 нот, все сыграли с заданными настройками и нет зависимости от размера программы и времени выполнения основного цикла loop
А если в крупный проект так еще хуже - длительность звучания нот увеличивается и сколько я не пытался настраивать так и не добился нужного.
Кстати почему вы избавились от цикла for? Там вроде же все прозрачно - прошел цикл в 8 нот, все сыграли с заданными настройками и нет зависимости от размера программы и времени выполнения основного цикла loop
- Dryundel
- Полковник
- Сообщения: 2411
- Зарегистрирован: 22 май 2017, 23:15
- Откуда: Ярославль
- Имя: Андрей
- Поблагодарили: 18 раз
Звуковой контроль событий
И что Вы считаете этим счётчиком? Время по всей видимости?Igor писал(а): 26 июн 2022, 04:48 в пустом проекте все нормально, но мне надо чтобы мелодия проиграла три раза. Использую генератор и счетчик.
Логика работы перебора нот, точно такая же как и в цикле for. Только не мешает работе основного цикла loop.Igor писал(а): 26 июн 2022, 04:48 Кстати почему вы избавились от цикла for? Там вроде же все прозрачно
В изначальном примере цикл for являлся блокирующим а delay находился в теле этого цикла и без него цикл работать не будет. Точней будет, но очень быстро. А именно delay и задавал паузу между нотами, точней паузу между началом звучания нот.
Ерунда может начинаться вопервых в том случае, если пауза меньше чем длина ноты. К примеру 4 - это 1/4 секунды = 250 мс. Поэтому паузу надо ставить чуть больше.
Длительность нот не должна увеличиваться, она задана функцией tone, а вот паузе может мешать необоснованно длинный основной цикл.Igor писал(а): 26 июн 2022, 04:48 длительность звучания нот увеличивается и сколько я не пытался настраивать так и не добился нужного.
Когда нибудь и Вы дойдёте до осознания важности максимально сокращать время выполнения основного цикла, если не оставите изучение программирования на С++Igor писал(а): 26 июн 2022, 04:48 нет зависимости от размера программы и времени выполнения основного цикла loop

А пока почитайте это:
viewtopic.php?f=187&t=7583
Отправлено спустя 33 минуты 23 секунды:
Изначально такой задачи не стояло. Для этого надо просто допилить блок. Считать надо не время, а количество раз проигрывания, ибо жёсткие тайминги для AVR это утопия.
Отправлено спустя 9 минут 9 секунд:
Попробуйте разобраться с логикой кода в блоке. Там всего то строчек 10.
- Dryundel
- Полковник
- Сообщения: 2411
- Зарегистрирован: 22 май 2017, 23:15
- Откуда: Ярославль
- Имя: Андрей
- Поблагодарили: 18 раз
Звуковой контроль событий
[ref]Igor[/ref], а надо ли что то допилить и усложнять алгоритм?Dryundel писал(а): 26 июн 2022, 09:46 Изначально такой задачи не стояло. Для этого надо просто допилить блок.
Гораздо проще и логичнее составить мелодию из трех одинаковых фрагментов.
Звуковой контроль событий
Согласен, если три фрагмента из пяти нот то проще сделать так.Dryundel писал(а): 27 июн 2022, 10:35 Гораздо проще и логичнее составить мелодию из трех одинаковых фрагментов.
Но хотелось бы иметь отдельный вход где указывается количество повторений.
Планируется создать несколько блоков с разными мелодиями, для начала 2 блока.
Алгоритм такой - температура больше на 2 градуса - первый блок играет 3 раза, больше на 10 градусов - играет 7 раз, больше на 15 градусов играет 15 раз, больше на 20 градусов - играет постоянно.
То же самое только на понижение температуры. -2, -10, -15, -20 градусов, но уже срабатывает другой блок с другой мелодией.
Либо настройки через меню - режим 0 - не играет совсем, режим 1 - 3 раза, режим 2 - 7 раз, режим 3 - 15 раз, режим 4 - постоянно.
Вот экспериментировал со скетчем но так и не добился нужного, посмотрите где косяк?
[spoiler] [/spoiler]
У вас нет необходимых прав для просмотра вложений в этом сообщении.
- Dryundel
- Полковник
- Сообщения: 2411
- Зарегистрирован: 22 май 2017, 23:15
- Откуда: Ярославль
- Имя: Андрей
- Поблагодарили: 18 раз
Звуковой контроль событий
А может вложить чуть больше фантазии?Igor писал(а): 28 июн 2022, 08:22 Алгоритм такой - температура больше на 2 градуса - первый блок играет 3 раза, больше на 10 градусов - играет 7 раз, больше на 15 градусов играет 15 раз, больше на 20 градусов - играет постоянно.
Вы что, будете сидеть и считать количество проигрышей?
Мне кажется логичнее сделать разные мелодии и тональности. Нот выше крыши.
1. Пи-лим
2. Тртам-парам
3. Па-ра-па-ба-бам
4. Та-та-рам-да-рам-дам-Та-та-рам-да-рам-дам....
...
Ладно, сделаем вход количества проигрышей.
- Dryundel
- Полковник
- Сообщения: 2411
- Зарегистрирован: 22 май 2017, 23:15
- Откуда: Ярославль
- Имя: Андрей
- Поблагодарили: 18 раз
Звуковой контроль событий
Косяк в логике.Igor писал(а): 28 июн 2022, 08:22 Вот экспериментировал со скетчем но так и не добился нужного, посмотрите где косяк?
Надо как то так:
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Звуковой контроль событий
[ref=#ff8000]Dryundel[/ref], Спасибо, то что надо, я тоже думал флаги прикрутить, но знаний не хватило. будем дальше изучать С++
Вот пример на FLprog как постоянно с генератора через триггер играть мелодию 5 раз подряд с задержкой в конце каждого проигрыша. Настройки подбираются индивидуально! Отправлено спустя 10 минут 9 секунд:
[ref=#ff8000]Dryundel[/ref], И еще вопрос нельзя ли сделать длительность такта еще меньше чем 100мс? Ноты то можно а вот паузы уже не получается.
Отправлено спустя 5 минут 50 секунд:
PS.Хотя нет - все получается, нужно только подобрать длительность! Теперь этот блок можно использовать в разных проектах. Еще его можно клонировать и сделать несколько блоков с разными мелодиями!
Вот пример на FLprog как постоянно с генератора через триггер играть мелодию 5 раз подряд с задержкой в конце каждого проигрыша. Настройки подбираются индивидуально! Отправлено спустя 10 минут 9 секунд:
[ref=#ff8000]Dryundel[/ref], И еще вопрос нельзя ли сделать длительность такта еще меньше чем 100мс? Ноты то можно а вот паузы уже не получается.
Отправлено спустя 5 минут 50 секунд:
PS.Хотя нет - все получается, нужно только подобрать длительность! Теперь этот блок можно использовать в разных проектах. Еще его можно клонировать и сделать несколько блоков с разными мелодиями!
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 2 гостя