Глава 8. Библиотека EEPROM
117
void setup()
{pinMode(speakerPin, OUTPUT);}
void loop()
{
for (int i = 0; i < length; i++)
{
if (notes[i] == ' ')
tone(speakerPin,0, beats[i]*tempo* 1000L); // пауза
else
playNote(notes[i], beats[i] * tempo);
}
// пауза между нотами
delay(tempo / 2);
}
delay(3000);
}
8.2.2. Звонок с мелодиями
Проигрывать мелодию через динамик мы уже умеем. Теперь напишем скетч
загрузки мелодий в память EEPROM. Зарезервируем там место для 10 мелодий,
которые сможем проигрывать в нужный момент. Карта адресов памяти будет иметь
следующий вид:
0-9
— указатель на адрес мелодии;
10-511
— место для мелодий.
Каждая мелодия будет представлять следующую последовательность данных:
tempo(2 байта), нота1, длит.1, нота2, длит.2 ,..., нотаN, длит.N, end
где:
tempo
— темп проигрываемой мелодии;
нота1, нота2 ,..., нотаN
— ноты;
длит1, длит2 ,..., длитN
— длительности проигрывания нот;
end
— байт конца мелодии (значение 0).
Запись последовательности нот и длительности их воспроизведения для каждой
мелодии хранятся в массивах. В нашем скетче мы после записи мелодий в память
EEPROM выведем содержимое памяти EEPROM. Фрагмент содержимого скетча
представлен в листинге 8.4. Текст рассмотренного скетча находится в папке
examples/_08_2
сопровождающего книгу электронного архива.
118
Часть III. Практическое применение Arduino
Листинг 8.4
// Использование библиотеки EEPROM
// запись мелодий в EEPROM
// подключение библиотеки EEPROM
#include
// ноты мелодии
String notes[] ={ "ccggaagffeeddc ",
"GECgabCaCg DGECabCDED EFEDGEDC CECaCag gCEDgCEDEFGECDgC "};
// пробел - это пауза
// длительность для каждой ноты и паузы
String beats[]={"1,1,1,1,1,1,2,1,1,1,1,1,1,2,4",
"4,4,4,4,1,1,1,2,1,4,2,4,4,4,4,1,1,1,2,1,4,2,1,1,1,1,2,1,1,4,2,1,
2,1,2,1,1,4,2,1,2,1,2,1,2,1,2,1,1,1,1,1,2,1,4,4,4"} ;
int tempo[]= {300,400};
.........
int addr1=0;
int addr2=10;
void write_melody(int num)
{
EEPROM.write(addr1,addr2); // указатель на мелодию
EEPROM.write(addr2,tempo[num]>>8); // для tempo – 2 байта
addr2++;
EEPROM.write(addr2,tempo[num]);
addr2++;
for(int j=0;j{
EEPROM.write(addr2,notes[num][j]); // нота
addr2++;
EEPROM.write(addr2,beats[num][j*2]); // длительность
addr2++;
Serial.print(notes[num][j]);Serial.print(" ");
Serial.print(beats[num][j*2]-48);Serial.println(" ");
}
// записать 0 - end
EEPROM.write(addr2,0);
addr2++;
addr1++;
}
void setup()
{
.........
for(int i=0;i{write_melody(i);}
Serial.println("end..."); Serial.println("control...");
for(int i=0;i<511;i++)
{
Serial.print(i);Serial.print(" - ");
Do'stlaringiz bilan baham: |