| Предыдущая версия справа и слеваПредыдущая версияСледующая версия | Предыдущая версия |
| products:laboratory_iot_c:exp23 [2024/12/03 21:25] – [Программный код эксперимента] labuser30 | products:laboratory_iot_c:exp23 [2024/12/03 21:32] (текущий) – [Программный код эксперимента] labuser30 |
|---|
| const int tempo = 2000; | const int tempo = 2000; |
| |
| Sound melody[8] = {{a, 8}, {b, 2}, {c, 1}, {d, 8}, {e, 3}, {f, 4}, {g, 6}, {C, 8}}; | Sound melody[8] = {{a, 8}, {b, 2}, {c, 1}, {d, 8}, {e, 3}, {f, 4}, |
| | {g, 6}, {C, 8}}; |
| |
| void setup() { | void setup() { |
| |
| <code arduino [enable_line_numbers="2", start_line_numbers_at="14"]> | <code arduino [enable_line_numbers="2", start_line_numbers_at="14"]> |
| Sound melody[8] = {{a, 8}, {b, 2}, {c, 1}, {d, 8}, {e, 3}, {f, 4}, {g, 6}, {C, 8}}; | Sound melody[8] = {{a, 8}, {b, 2}, {c, 1}, {d, 8}, {e, 3}, {f, 4}, |
| }; | {g, 6}, {C, 8}}; |
| </code> | </code> |
| |
| | С помощью цикла ''for'' проходим по всем элементам мелодии. Обращение к внутренней переменной типа ''struct'' производится с помощью ''.'' и ее имени. |
| | |
| С помощью цикла ''for'' и оператора ''in'' проходим по всем элементам мелодии. Для этого мы использовали оператор ''zip''. Он нужен для одновременного перебора сразу двух массивов и получения их элементов в переменные ''tone'' и ''length''. Так на первой итерации в переменной ''tone'' окажется ''a'', а в ''length'' — ''8''. На второй итерации ''b'' и ''2'' соответственно. | |
| | |
| Здесь внимательный читатель заметит, что ''melody'' не является массивом, а является строкой. Почему же мы говорим о ней как о массиве и работаем как с массивом. Оказывается в Python любую строку можно представить как массив символов и обращаться к ним по индексу, что мы и делаем. | |
| |
| Получив ноту и ее длительность настраиваем частоту и скважность. Нота начинает звучать: | Получив ноту и ее длительность настраиваем частоту и скважность. Нота начинает звучать: |
| <code python [enable_line_numbers="2", start_line_numbers_at="24"]> | <code arduino [enable_line_numbers="2", start_line_numbers_at="24"]> |
| speaker.duty(512) | analogWrite(SPEAKER_PIN, 512); |
| speaker.freq(tones[tone]) | analogWriteFreq(tones[melody[i].note]); |
| </code> | </code> |
| |
| Нота звучит, пока мы ждем время, равное ее длительности. В расчете учитывается темп: | Нота звучит, пока мы ждем время, равное ее длительности. В расчете учитывается темп: |
| <code python [enable_line_numbers="2", start_line_numbers_at="26"]> | <code arduino [enable_line_numbers="2", start_line_numbers_at="26"]> |
| time.sleep(tempo/length) | delay(tempo / melody[i].length); |
| </code> | </code> |
| |
| Чтобы ноты не сливались, мы делаем между ними маленькие паузы. Паузы между нотами также зависят от темпа и длительности ноты, но в 4 раза короче. | Чтобы ноты не сливались, мы делаем между ними маленькие паузы. Паузы между нотами также зависят от темпа и длительности ноты, но в 4 раза короче. |
| <code python [enable_line_numbers="2", start_line_numbers_at="27"]> | <code arduino [enable_line_numbers="2", start_line_numbers_at="27"]> |
| speaker.duty(0) | analogWrite(SPEAKER_PIN, 0); |
| time.sleep(tempo/length/4) | delay(tempo / melody[i].length / 4); |
| </code> | </code> |
| |