Тема 6.2: Использование зуммера
Мелодический плеер
Цель: Придумать и реализовать проект, использующий зуммер.
Например:
Это может быть пианино, на клавиши которого вы нажимаете, чтобы издать звук.
Это может быть проигрыватель мелодий, где мелодия выбирается случайным образом (нажатие кнопки выбирает новую) или с помощью потенциометра (музыку можно найти в Интернете).
Название мелодии или ноты может отображаться на ЖК-экране.


https://drive.google.com/file/d/1h52qEsCvYIcns38A_slLI28jQmZBYSH8/view?usp=sharing
include
// Определяем пины для LCD
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
// Определяем пины для зуммера и потенциометра
const int buzzerPin = 9;
const int potPin = A0;
// Определяем данные для мелодий
const int songCount = 4; // количество мелодий
char* songs[] = {
“eeggegg eeggefcd”, // Упрощённая мелодия “Crazy Frog”
“ccggaag ffeeddc ggffeed ggffeed ccggaag ffeeddc”, // Twinkle Twinkle Little Star
“ggagcB ggaBcd gggedc B”, // Happy Birthday
“eefggfedccdeedd eefggfedccdedc” // Ode to Joy
};
int* beats[] = {
new int[16]{1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
new int[42]{1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
new int[25]{2, 1, 1, 2, 1, 1, 2, 1, 1, 1, 1, 1, 2, 1, 1, 2, 1, 1, 2, 1, 1, 1, 1, 1, 1},
new int[32]{1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}
};
int songLengths[] = {16, 42, 25, 32};
char* songNames[] = {“Crazy Frog”, “Twinkle Twinkle”, “Happy Birthday”, “Ode to Joy”};
int tempo = 150;
// Определяем пользовательские символы
byte armsDown[8] = {0b00100, 0b01010, 0b00100, 0b00100, 0b01110, 0b10101, 0b00100, 0b01010};
byte armsUp[8] = {0b00100, 0b01010, 0b00100, 0b10101, 0b01110, 0b00100, 0b00100, 0b01010};
int lastSongIndex = -1;
void setup() {
pinMode(buzzerPin, OUTPUT);
pinMode(potPin, INPUT);
lcd.begin(16, 2);
// Определяем пользовательские символы
lcd.createChar(3, armsDown);
lcd.createChar(4, armsUp);
}
void loop() {
// Выбираем мелодию на основе значения потенциометра
int potValue = analogRead(potPin);
int songIndex = map(potValue, 0, 1023, 0, songCount – 1);
// Проверяем, изменилась ли выбранная мелодия
if (songIndex != lastSongIndex) {
lastSongIndex = songIndex;
char* selectedSong = songs[songIndex];
int* selectedBeats = beats[songIndex];
int selectedLength = songLengths[songIndex];
char* selectedName = songNames[songIndex];
// Отображаем название мелодии на LCD
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(selectedName);
delay(2000); // отображаем название мелодии в течение 2 секунд
lcd.setCursor(15, 0);
lcd.write(3);
delay(400);
lcd.setCursor(15, 0);
lcd.write(4);
// Воспроизводим выбранную мелодию
for (int i = 0; i < selectedLength; i++) {
int duration = selectedBeats[i] * tempo;
if (selectedSong[i] == ' ') {
delay(duration);
} else {
tone(buzzerPin, frequency(selectedSong[i]), duration);
lcd.setCursor(i % 16, 1);
lcd.print(selectedSong[i]);
delay(duration);
}
delay(tempo / 100); // короткая пауза между нотами
}
noTone(buzzerPin); // останавливаем тон
}
}
int frequency(char note) {
char names[] = { ‘c’, ‘d’, ‘e’, ‘f’, ‘g’, ‘a’, ‘b’, ‘C’ };
int frequencies[] = { 262, 294, 330, 349, 392, 440, 494, 523 };
for (int i = 0; i < 8; i++) {
if (names[i] == note) {
return frequencies[i];
}
}
return 0;
}