Выход из функции или остановка всех действий

Leonid525
Offline
Зарегистрирован: 27.09.2016

Здравствуйте, ради интереса сделал управление Arduino с помощью хлопков. Так вот, есть условие, если после 2 хлопков (типо пароль) было 2 хлопка (это уже какая-то команда, 1 хлопок к примеру, будет вкл. свет) запустить следующий код... 

void buzz(unsigned char pin, word frequencyInHertz, word timeInMilliseconds) // по сути это 
{                                                                            // генератор частоты            
  long delayAmount = (long)(long(1000000) / (long)frequencyInHertz);         // имеет 3 параметра
  long loopTime = (long)(((long)timeInMilliseconds * 500) / delayAmount);    // 1 - пин
  for (long i = 0; i < loopTime; i++)                                      // 2 - частота
  {                                                                          // 3 - длительность
    digitalWrite(pin, HIGH);        // генерируем импульсы нужной частоты  
    delayMicroseconds(delayAmount);
    digitalWrite(pin, LOW);
    delayMicroseconds(delayAmount);
  }
}

Нужно чтоб когда человек повторно хлопнул 2 раза, данный код останавливался. Была идея всунуть проверку на хлопки внутри этого цыкла (который в коде). Но может есть какие-то другие варианты? 

Leonid525
Offline
Зарегистрирован: 27.09.2016

Leonid525 пишет:

Здравствуйте, ради интереса сделал управление Arduino с помощью хлопков. Так вот, есть условие, если после 2 хлопков (типо пароль) было 2 хлопка (это уже какая-то команда, 1 хлопок к примеру, будет вкл. свет) запустить следующий код... 

void buzz(unsigned char pin, word frequencyInHertz, word timeInMilliseconds) // по сути это 
{                                                                            // генератор частоты            
  long delayAmount = (long)(long(1000000) / (long)frequencyInHertz);         // имеет 3 параметра
  long loopTime = (long)(((long)timeInMilliseconds * 500) / delayAmount);    // 1 - пин
  for (long i = 0; i < loopTime; i++)                                      // 2 - частота
  {                                                                          // 3 - длительность
    digitalWrite(pin, HIGH);        // генерируем импульсы нужной частоты  
    delayMicroseconds(delayAmount);
    digitalWrite(pin, LOW);
    delayMicroseconds(delayAmount);
  }
}

Нужно чтоб когда человек повторно хлопнул 2 раза, данный код останавливался. Была идея всунуть проверку на хлопки внутри этого цыкла (который в коде). Но может есть какие-то другие варианты? 

Код выше просто играет имперский марш Star Wars.

Logik
Offline
Зарегистрирован: 05.08.2014

Это пожалуй самвя короткая запись марша из всех возможных. 

Скажите, а где вы изучали неумение програмировать?

Leonid525
Offline
Зарегистрирован: 27.09.2016

Троль?

1) данный код - обрезанная версия, он не будет играть марш.. Если сильно надо, могу скинуть полную версию.

2) писал этот код не я. Его я нашел на 1 англ. сайте.

3) Программирую достаточно долго.. (не на Arduino, с ней я познакомился совсем недавно). Так что тут я с вами поспорю.

4) Если не можете дать ответ на вопрос, зачем собственно пишите? 

strarbit
Offline
Зарегистрирован: 12.06.2016

Если умеете программировать, то без разницы что программировать.

Leonid525 пишет:
 2) писал этот код не я. Его я нашел на 1 англ. сайте.

Отговорка вообще, ни в какие ворота не лезет по сравнению с

Leonid525 пишет:
3) Программирую достаточно долго.. (не на Arduino, с ней я познакомился совсем недавно). Так что тут я с вами поспорю.

 

Leonid525
Offline
Зарегистрирован: 27.09.2016

Почему я не могу взять готовый код марша? У меня не музыкальный слух чтобы его составлять... Весь остальной код я пишу САМ. Так что нет тут оговорки. "Если умеете программировать, то без разницы что программировать" - я говорил иначе? Просто нужно понять все возможности ардуины..

 Уже второй человек пишет не по теме.. Вопрос был совсем другой..  Неожидал такое встетить тут :/ 

 

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

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

----

Конечно видно, что код "Имперского марша" взят с англоязычного сайта, просто потому, что это код забугорного школьника, лет 11 от роду.

Об этом говорит применение делеев. В такой код нельзя вставить ничего.  Начните с первичных понятий автоматного программирования и да придет  к Вам счастье!

----

Над Вам глумятся, и я в том числе, потому, что нормально и коротко ответить на ваш вопрос нельзя.

Ответ, на самом деле, примерно такой:

1. перепешите код марша без делеев, в стиле включения действий по событиям, в данном случае - по событиям времени.

2. параллельно вызывайте функцию считывания других событий (в Вашем случае - хлопков). Время выполнения одного прохода loop() не должно превышать 2-3 мс.

3. Мне совершенно очевидно, что если Вы и поняли слова, которые я написал, то не имеете ни малейшего понятия о том, как это написать.

4. Научить этому (см. выше) в рамках форума, я, лично, не могу.

Leonid525
Offline
Зарегистрирован: 27.09.2016

Спасибо за единственный нормальный ответ, а главное по теме. Буду пробовать.

Возможно я задал вопрос неправильно, или просто не до конца объяснил в чем проблема, но когда начали судить по отрывку не моего кода.. Ладно, не будем об этом. Возможно тут моя вина, что я не написал сразу, откуда я достал этот код..

Logik
Offline
Зарегистрирован: 05.08.2014

Leonid525 пишет:
Возможно я задал вопрос неправильно, или просто не до конца объяснил в чем проблема, но когда начали судить по отрывку не моего кода.. Ладно, не будем об этом. Возможно тут моя вина, что я не написал сразу, откуда я достал этот код..

Чистосердечное признание смягчает вину. Вам wdrakula в общем все верно написал. И делов там было бы чистая фигня (tone в функцию, новую ноту по системному таймеру...), если бы не одна проблема. Слух у человека довольно чувствительный. Из за этого воспроизводить миди (а у Вас именно это делает приведеный код) надо очень точно. Это решаемо, но переписывать надо прилично кода. Показуйте что есть, послушаем марш, может чего и выйдет.

negavoid
Offline
Зарегистрирован: 09.07.2016

Logik пишет:

Из за этого воспроизводить миди (а у Вас именно это делает приведеный код)

Если уж придираться, то код воспроизводит именно синтезированный wav, не midi. :) Ну, разве что представить ардуину в качестве монофонического синтезатора, но прописанные в скетче ноты - всё равно не midi эвенты. Нот в миди может и не быть вообще, а могут вполне быть mid файлы управления фейерверками, петардами, водяными фонтанами, [чем угодно].

Logik
Offline
Зарегистрирован: 05.08.2014

negavoid пишет:

Logik пишет:

Из за этого воспроизводить миди (а у Вас именно это делает приведеный код)

Если уж придираться, то код воспроизводит именно синтезированный wav, не midi. :) 

Так звук, он всегда wav, даже если играем mp3 :) Но воспроизводим то mp3. А в нашем случае именно воспроизводим миди и да, разумеется синтезируем wav. Правда и синтезируем - не совсем точно т.к. генерируем толькомпрямоугольные импульсы без вариантов.

negavoid пишет:

Ну, разве что представить ардуину в качестве монофонического синтезатора,

Именно. 

negavoid пишет:
 Нот в миди может и не быть вообще..

Может не быть,  а могут быть... У нас частный случай, кастрированый по самые пятки, без петард и фонтанов, но с нотами. Но тем не менее это именно миди.

negavoid
Offline
Зарегистрирован: 09.07.2016

Logik пишет:

У нас частный случай, кастрированый по самые пятки, без петард и фонтанов, но с нотами. Но тем не менее это именно миди.

Тогда играющий произведение с тетради пианист - тоже миди. А чё, частный случай :)))

Logik пишет:

А в нашем случае именно воспроизводим миди

Воспроизводит скетч мелодию, по нотам, да ещё и девайс самостоятельно, исполнимым кодом. Это не есть миди. Нет аппаратного интерфейса миди-сигналов, ну да и ладно. Нет программного формата передачи команд, хотя бы чуть совместимого с миди. Да, ардуина используется как синтезатор, но вот именно этот скетч формально не совместим с midi. Единственное, что есть у этого скетча общего с технологией миди - оооочень притянутый к ситуации общий принцип действия (ноты->мелодия), но - тогда и пианист считался бы за миди.
 
Ведь если я возьму, создам файл, к примеру обзову его melody.nota, запихаю туда строку текста типа "E1 H2 G2b D3# A E", а потом наколбашу программку, которая будет его читать и воспроизводить соответствующую мелодию через звуковушку - это будет вовсе никакой не миди (а казалось бы - ноты есть, и звук есть).
 
PS это всё если придираться, а так-то ТСу на это пофигу :)))
Logik
Offline
Зарегистрирован: 05.08.2014

negavoid пишет:

Тогда играющий произведение с тетради пианист - тоже миди. А чё, частный случай :)))

Именно. Устаревшая биологическая версия синтезатора с оптическим вводом данных в формате первой версии )).

Кстати легко доказуемо. Слепым дважды рандомизированым плацебоконтролированым тестом ))) Два черных ящика, в одном - синтезатор, в другом пианист с пианиной, принтер с компом. В оба суем одинаковые флешки с миди файлами. Даем пианисту время распечатать ноты. Надеюсь он справится)) Приглашаем комисию, играют по очереди. Если никто не фальшивит - комисия не прийдет к выводу где кто. Повторяем опыт много раз для надежности. Вывод - пианист тождественен синтезатору в рамках границ опыта (в преф он может и лучше играет))). 

negavoid пишет:

Воспроизводит скетч мелодию, по нотам, да ещё и девайс самостоятельно, исполнимым кодом. Это не есть миди. Нет аппаратного интерфейса миди-сигналов, ну да и ладно. Нет программного формата передачи команд, хотя бы чуть совместимого с миди. Да, ардуина используется как синтезатор, но вот именно этот скетч формально не совместим с midi.
 
То все мелочи, подробности недостойные внимания и сделаные с одной целью - упростить задачу себе и контроллеру.
negavoid пишет:
 у этого скетча общего с технологией миди.... принцип действия (ноты->мелодия), 
Именно так! Ведь именно из принципа действия вытекают основные свойства. Для мидюка это: очень компактная запись, возможность воспроизводить звуки тона и тембра только наличествующие в банке, относительная простота воспроизведения (по сравнению с mp3 просто шара, но сложней вавки) и т.д.
negavoid пишет:
 но - тогда и пианист считался бы за миди.
Ага. Только пианисту говорить не будем )))))
 
 
negavoid пишет:
 Ведь если я возьму, создам файл, к примеру обзову его melody.nota, запихаю туда строку текста типа "E1 H2 G2b D3# A E", а потом наколбашу программку, которая будет его читать и воспроизводить соответствующую мелодию через звуковушку - это будет вовсе никакой не миди (а казалось бы - ноты есть, и звук есть).
 
Будет миди, только оригинального формата. Принцип остался тотже! Конечно с практической точчки зрения немного неудобно, его почти никто не сможет воспроизвести. Но то временные трудности ;)  Вон MP3 VBR тоже сразу не многие умели играть. Потом научились. И может так статся что через время формат станет распостраненным и общепринятым. И ктото зафигарит конвертор который будет делать из *.nota файлы *.smf и обратно. И конвертится будет легко, быстро без потерь качества и необходимости банков звука. А вот в вавку и обратно так не выйдет, принцип представления звука не тот.
 
negavoid пишет:
 PS это всё если придираться, а так-то ТСу на это пофигу :)))

А поговорить? ))))

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Logik, MIDI - это не принцип, MIDI - это стандарт. Поэтому пианист неи разу не MIDI, т.к. у него нет цифрового интерфейса. А даже если бы был, то все равно не удовлетворял бы стандарту.

Logik
Offline
Зарегистрирован: 05.08.2014

У мобилок и планшетов тоже нет midi интерфейса, они не являются midi-устройствами, но это не мешает им играть мидюки. Стандарт для midi устройств - GM, XG, GS др. Описывают от физического уровня до прикладного. Отсутствие физического, канального и пр. нижних уровней никак не влияет на способность воспроизврдить midi. Влияет только на способность взаимодействовать с другими устройствами по стандарту. И очевидно не об этом разговор.  А о том, что нотная запись, что smf, что способ автора имеет один и тот же принцип - представления звукового ряда как последовательности звуков различной тональности из фиксированого и весьма ограниченого набора. И по крайней мере в множестве тонов нотного ряда все три записи эквивалентны, легко преобразовываются друг в друга почти без потерь (потери из-за конечной точности цифр не сравнить с потерями автоматических генераторов midi из wav). Остальные характеристики звуков - громкость, затухание и т.д. каждый описывает как может (например никак), но тут даже в стандартах midi все не просто. 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Мобилки и планшеты умеют воспроизводить MIDI-файлы, но это не делает их MIDI устройствами.

А тот факт, что в стандерте MIDI основная идея позаимствована у нотной записи, совершенно не превращает нотную запись в одну из разновидностей MIDI.

Mr.Privet
Mr.Privet аватар
Offline
Зарегистрирован: 17.11.2015

Димагоги. Я бы на месте ТС сделал с плеером и карточкой памяти. Плеер играет марш, ардуинка слушает хлопки, когда услышала то останавливает запись...

Leonid525
Offline
Зарегистрирован: 27.09.2016

Так и сделал. Это самый удобный вариант.