Думаем, изучаем и все получится.
Почитал, но не понял как вот в этом скетче избавится от 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.
}
Ну да, здесь кроме таймера, надо надо понимать что такое цикл for.
Вы же вроде выложили готовый блок для общего пользования, а не только для своего проекта. Другие пытаются доверять тому что лежит в репозитории. Для разработок есть другой раздел.
Ок, чуть позже.
Так блок вполне рабочий, конечно делай зло, можно и вообще убрать, но получится некрасивое звучание.
И что Вы считаете этим счётчиком? Время по всей видимости?
Логика работы перебора нот, точно такая же как и в цикле for. Только не мешает работе основного цикла loop.
Ерунда может начинаться вопервых в том случае, если пауза меньше чем длина ноты. К примеру 4 - это 1/4 секунды = 250 мс. Поэтому паузу надо ставить чуть больше.
Длительность нот не должна увеличиваться, она задана функцией tone, а вот паузе может мешать необоснованно длинный основной цикл.
Когда нибудь и Вы дойдёте до осознания важности максимально сокращать время выполнения основного цикла, если не оставите изучение программирования на С++
Изначально такой задачи не стояло. Для этого надо просто допилить блок. Считать надо не время, а количество раз проигрывания, ибо жёсткие тайминги для AVR это утопия.
Попробуйте разобраться с логикой кода в блоке. Там всего то строчек 10.
Igor, а надо ли что то допилить и усложнять алгоритм?
Согласен, если три фрагмента из пяти нот то проще сделать так.
А может вложить чуть больше фантазии?