Тема 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;
}