#include <LiquidCrystal_I2C.h>
#include "pitches.h"
#define SONG_COUNT 6 // кількість пісень
// Масив покажчиків на функції пісень
void Song1(); //Super Mario
void Song2(); //DOOM
void Song3(); //Legend of Zelda
void Song4(); //Christmas
void Song5(); //Simpsons
void Song6(); //Never gonna give you up
typedef void(*SongFunc)();
SongFunc Songs[SONG_COUNT] = { Song1, Song2, Song3, Song4, Song5, Song6 };
// Індекс поточної пісні
volatile int8_t currentSong = 0;
// Флаг для перезапуску пісні
volatile bool songChanged = false;
// Адреса I2C дисплею
#define I2C_ADDR 0x27
// Піни для кнопок та джойстика
#define buzzer 25
#define rewind 26
#define play 27
#define pause 14
#define forward 12
#define joystick_X 34
#define joystick_Y 35
// Створення об'єкта класу LiquidCrystal_I2C з вказаною адресою та розміром
LiquidCrystal_I2C lcd(I2C_ADDR, 20, 4);
//Змінна для зберігання ідентифікатора таска, який створений для відтворення музики
TaskHandle_t MusicPlayerHandle = NULL;
void setup()
{
// Ініціалізація зв'язку через серійний порт
Serial.begin(115200);
Serial.println("Hello, ESP32!");
// Налаштування пінів для кнопок
pinMode(rewind, INPUT_PULLUP);
pinMode(play, INPUT_PULLUP);
pinMode(pause, INPUT_PULLUP);
pinMode(forward, INPUT_PULLUP);
// Ініціалізація дисплею та виведення тексту
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("OoooOOooOOOOOoooooOooOOooooOOoooOOooOOOOOoooooOooOOooooOOoooOOooOOOOOoooooOooOOooooO");
// Створення таска MusicPlayer на нульовому ядрі
xTaskCreatePinnedToCore(MusicPlayer, "MusicPlayer", 10000, NULL, 1, &MusicPlayerHandle, 0);
// Призупинення виконання таска MusicPlayer
vTaskSuspend(MusicPlayerHandle);
// Створення тасків для кнопок та джойстика на першому ядрі
xTaskCreatePinnedToCore(ButtonPlay, "ButtonPlay", 5000, NULL, 1, NULL, 1);
xTaskCreatePinnedToCore(ButtonPause, "ButtonPlay", 5000, NULL, 1, NULL, 1);
xTaskCreatePinnedToCore(ButtonForward, "ButtonForward", 5000, NULL, 1, NULL, 1);
xTaskCreatePinnedToCore(ButtonRewind, "ButtonRewind", 5000, NULL, 1, NULL, 1);
xTaskCreatePinnedToCore(Joystick, "Joystick", 5000, NULL, 1, NULL, 1);
}
// Функція відтворення музики
void MusicPlayer(void *pvParameters)
{
while (true)
{
// Якщо пісня змінилась кнопкою, скидаємо флаг і переходимо на нову
if(songChanged)
{
songChanged = false;
continue; // починаємо нову пісню одразу
}
// Виклик поточної пісні
Songs[currentSong]();
}
}
// Функція для обробки натискання кнопки "Play"
void ButtonPlay(void *pvParameters)
{
while (true)
{
if (!digitalRead(play))
{
// Відновлення виконання таска MusicPlayer
vTaskResume(MusicPlayerHandle);
Serial.println("Play");
// Затримка для уникнення вібрації контактів та помилок
vTaskDelay(pdMS_TO_TICKS(300));
}
// Затримка для ефективної роботи
vTaskDelay(pdMS_TO_TICKS(10));
}
}
// Функція для обробки натискання кнопки "Pause"
void ButtonPause(void *pvParameters)
{
while (true)
{
if (!digitalRead(pause))
{
// Відновлення виконання таска MusicPlayer
vTaskSuspend(MusicPlayerHandle);
Serial.println("Pause");
// Затримка для уникнення вібрації контактів та помилок
vTaskDelay(pdMS_TO_TICKS(300));
}
// Затримка для ефективної роботи
vTaskDelay(pdMS_TO_TICKS(10));
}
}
// Функція для обробки натискання кнопки "Forward"
void ButtonForward(void *pvParameters)
{
while (true)
{
if (!digitalRead(forward))
{
currentSong++;
if(currentSong > (SONG_COUNT - 1) )
currentSong = 0; // зациклення
songChanged = true; // сигнал таску MusicPlayer
Serial.println("Forward");
// Затримка для уникнення вібрації контактів та помилок
vTaskDelay(pdMS_TO_TICKS(300));
}
// Затримка для ефективної роботи
vTaskDelay(pdMS_TO_TICKS(10));
}
}
// Функція для обробки натискання кнопки "Rewind"
void ButtonRewind(void *pvParameters)
{
while (true)
{
if (!digitalRead(rewind))
{
currentSong--;
if(currentSong < 0) currentSong = SONG_COUNT - 1; // зациклення
songChanged = true; // сигнал таску MusicPlayer
Serial.println("Rewind");
// Затримка для уникнення вібрації контактів та помилок
vTaskDelay(pdMS_TO_TICKS(300));
}
// Затримка для ефективної роботи
vTaskDelay(pdMS_TO_TICKS(10));
}
}
// Функція для керування курсором за допомогою джойстика
void Joystick(void *pvParameters)
{
// Початкові координати курсора
int8_t posX = 10;
int8_t posY = 2;
int8_t lastPosX = posX;
int8_t lastPosY = posY;
int16_t valueX = 0;
int16_t valueY = 0;
// Встановлення курсора на початкову позицію при запуску таска
lcd.setCursor(posX, posY);
lcd.print("X");
while (true)
{
// Зчитування значень з джойстика
valueX = analogRead(joystick_X);
valueY = analogRead(joystick_Y);
// Обробка значень джойстика для переміщення курсора
if (valueX < 100 && posX > 0)
{
Serial.println("Left");
posX--;
}
if (valueX > 4000 && posX < 19)
{
Serial.println("Right");
posX++;
}
if (valueY < 100 && posY < 3)
{
Serial.println("Up");
posY++;
}
if (valueY > 4000 && posY > 0)
{
Serial.println("Down");
posY--;
}
// Оновлення курсора лише при зміні його позиції
if (posX != lastPosX || posY != lastPosY)
{
lcd.setCursor(lastPosX, lastPosY);
lcd.print(" "); // Очищення попередньої позиції курсора
lcd.setCursor(posX, posY);
lcd.print("X"); // Виведення курсора в новій позиції
lastPosX = posX;
lastPosY = posY;
}
// Затримка для ефективної роботи циклу
vTaskDelay(pdMS_TO_TICKS(100));
}
}
// Основна функція loop не використовується, тому що всі дії виконуються в тасках
void loop() {}
// Дороблена для коректного перемикання без зайвої затримки
void Song1()
{
uint16_t notes[] =
{
660, 660, 660, 510, 660, 770, 380, 510, 380, 320, 440, 480,
450, 430, 380, 660, 760, 860, 700, 760, 660, 520, 580, 480,
510, 380, 320, 440, 480, 450, 430, 380, 660, 760, 860, 700,
760, 660, 520, 580, 480, 500, 760, 720, 680, 620, 650, 380,
430, 500, 430, 500, 570, 500, 760, 720, 680, 620, 650, 1020,
1020, 1020, 380, 500, 760, 720, 680, 620, 650, 380, 430, 500,
430, 500, 570, 585, 550, 500
};
uint16_t durations[] =
{
100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 80,
100, 100, 100, 80, 50, 100, 80, 50, 80, 80, 80, 80,
100, 100, 100, 100, 80, 100, 100, 100, 80, 50, 100, 80,
50, 80, 80, 80, 80, 100, 100, 100, 100, 150, 150, 100,
100, 100, 100, 100, 100, 100, 100, 100, 100, 150, 200, 80,
80, 80, 100, 100, 100, 100, 100, 150, 150, 100, 100, 100,
100, 100, 100, 500, 500, 500
};
uint16_t delays[] =
{
150, 300, 300, 100, 300, 550, 575, 450, 400, 500, 300, 330,
150, 300, 200, 200, 150, 300, 150, 350, 300, 150, 150, 500,
450, 400, 500, 300, 330, 150, 300, 200, 200, 150, 300, 150,
350, 300, 150, 150, 500, 300, 100, 150, 150, 300, 300, 150,
150, 300, 150, 100, 220, 300, 100, 150, 150, 300, 300, 300,
150, 300, 300, 300, 100, 150, 150, 300, 300, 150, 150, 300,
150, 100, 420, 450, 420, 360
};
uint8_t size = sizeof(durations) / sizeof(uint16_t);
for(uint8_t note = 0; note < size; note++)
{
if (songChanged)
break;
tone(buzzer, notes[note], durations[note]);
delay(delays[note]);
}
}
void Song2()
{
int melody[] = {
NOTE_E2, NOTE_E2, NOTE_E3, NOTE_E2, NOTE_E2, NOTE_D3, NOTE_E2, NOTE_E2,
NOTE_C3, NOTE_E2, NOTE_E2, NOTE_AS2, NOTE_E2, NOTE_E2, NOTE_B2, NOTE_C3,
NOTE_E2, NOTE_E2, NOTE_E3, NOTE_E2, NOTE_E2, NOTE_D3, NOTE_E2, NOTE_E2,
NOTE_C3, NOTE_E2, NOTE_E2, NOTE_AS2, NOTE_E2, NOTE_E2, NOTE_E3, NOTE_E2, NOTE_E2, NOTE_D3, NOTE_E2, NOTE_E2,
NOTE_C3, NOTE_E2, NOTE_E2, NOTE_AS2, NOTE_E2, NOTE_E2, NOTE_B2, NOTE_C3,
NOTE_E2, NOTE_E2, NOTE_E3, NOTE_E2, NOTE_E2, NOTE_D3, NOTE_E2, NOTE_E2,
NOTE_C3, NOTE_E2, NOTE_E2, NOTE_AS2,NOTE_E2, NOTE_E2, NOTE_E3, NOTE_E2, NOTE_E2, NOTE_D3, NOTE_E2, NOTE_E2,
NOTE_C3, NOTE_E2, NOTE_E2, NOTE_AS2, NOTE_E2, NOTE_E2, NOTE_B2, NOTE_C3,
NOTE_E2, NOTE_E2, NOTE_E3, NOTE_E2, NOTE_E2, NOTE_D3, NOTE_E2, NOTE_E2,
NOTE_C3, NOTE_E2, NOTE_E2, NOTE_AS2,NOTE_E2, NOTE_E2, NOTE_E3, NOTE_E2, NOTE_E2, NOTE_D3, NOTE_E2, NOTE_E2,
NOTE_C3, NOTE_E2, NOTE_E2, NOTE_AS2, NOTE_E2, NOTE_E2, NOTE_B2, NOTE_C3,
NOTE_E2, NOTE_E2, NOTE_E3, NOTE_E2, NOTE_E2, NOTE_D3, NOTE_E2, NOTE_E2,
NOTE_FS3, NOTE_D3, NOTE_B2, NOTE_A3, NOTE_FS3, NOTE_B2, NOTE_D3, NOTE_FS3, NOTE_A3, NOTE_FS3, NOTE_D3, NOTE_B2,
NOTE_E2, NOTE_E2, NOTE_E3, NOTE_E2, NOTE_E2, NOTE_D3, NOTE_E2, NOTE_E2,
NOTE_C3, NOTE_E2, NOTE_E2, NOTE_AS2, NOTE_E2, NOTE_E2, NOTE_B2, NOTE_C3,
NOTE_E2, NOTE_E2, NOTE_E3, NOTE_E2, NOTE_E2, NOTE_D3, NOTE_E2, NOTE_E2,
NOTE_C3, NOTE_E2, NOTE_E2, NOTE_AS2,NOTE_E2, NOTE_E2, NOTE_E3, NOTE_E2, NOTE_E2, NOTE_D3, NOTE_E2, NOTE_E2,
NOTE_C3, NOTE_E2, NOTE_E2, NOTE_AS2, NOTE_E2, NOTE_E2, NOTE_B2, NOTE_C3,
NOTE_E2, NOTE_E2, NOTE_E3, NOTE_E2, NOTE_E2, NOTE_D3, NOTE_E2, NOTE_E2,
NOTE_B3, NOTE_G3, NOTE_E3, NOTE_G3, NOTE_B3, NOTE_E4, NOTE_G3, NOTE_B3, NOTE_E4, NOTE_B3, NOTE_G4, NOTE_B4,
NOTE_A2, NOTE_A2, NOTE_A3, NOTE_A2, NOTE_A2, NOTE_G3, NOTE_A2, NOTE_A2,
NOTE_F3, NOTE_A2, NOTE_A2, NOTE_DS3, NOTE_A2, NOTE_A2, NOTE_E3, NOTE_F3,
NOTE_A2, NOTE_A2, NOTE_A3, NOTE_A2, NOTE_A2, NOTE_G3, NOTE_A2, NOTE_A2,
NOTE_F3, NOTE_A2, NOTE_A2, NOTE_DS3,
NOTE_A2, NOTE_A2, NOTE_A3, NOTE_A2, NOTE_A2, NOTE_G3, NOTE_A2, NOTE_A2,
NOTE_F3, NOTE_A2, NOTE_A2, NOTE_DS3, NOTE_A2, NOTE_A2, NOTE_E3, NOTE_F3,
NOTE_A2, NOTE_A2, NOTE_A3, NOTE_A2, NOTE_A2, NOTE_G3, NOTE_A2, NOTE_A2,
NOTE_A3, NOTE_F3, NOTE_D3, NOTE_A3, NOTE_F3, NOTE_D3, NOTE_C4, NOTE_A3, NOTE_F3, NOTE_A3, NOTE_F3, NOTE_D3,
NOTE_E2, NOTE_E2, NOTE_E3, NOTE_E2, NOTE_E2, NOTE_D3, NOTE_E2, NOTE_E2,
NOTE_C3, NOTE_E2, NOTE_E2, NOTE_AS2, NOTE_E2, NOTE_E2, NOTE_B2, NOTE_C3,
NOTE_E2, NOTE_E2, NOTE_E3, NOTE_E2, NOTE_E2, NOTE_D3, NOTE_E2, NOTE_E2,
NOTE_C3, NOTE_E2, NOTE_E2, NOTE_AS2,
NOTE_E2, NOTE_E2, NOTE_E3, NOTE_E2, NOTE_E2, NOTE_D3, NOTE_E2, NOTE_E2,
NOTE_C3, NOTE_E2, NOTE_E2, NOTE_AS2, NOTE_E2, NOTE_E2, NOTE_B2, NOTE_C3,
NOTE_E2, NOTE_E2, NOTE_E3, NOTE_E2, NOTE_E2, NOTE_D3, NOTE_E2, NOTE_E2,
NOTE_C3, NOTE_E2, NOTE_E2, NOTE_AS2,
NOTE_CS3, NOTE_CS3, NOTE_CS4, NOTE_CS3, NOTE_CS3, NOTE_B3, NOTE_CS3, NOTE_CS3,
NOTE_A3, NOTE_CS3, NOTE_CS3, NOTE_G3, NOTE_CS3, NOTE_CS3, NOTE_GS3, NOTE_A3,
NOTE_B2, NOTE_B2, NOTE_B3, NOTE_B2, NOTE_B2, NOTE_A3, NOTE_B2, NOTE_B2,
NOTE_G3, NOTE_B2, NOTE_B2, NOTE_F3,
NOTE_E2, NOTE_E2, NOTE_E3, NOTE_E2, NOTE_E2, NOTE_D3, NOTE_E2, NOTE_E2,
NOTE_C3, NOTE_E2, NOTE_E2, NOTE_AS2, NOTE_E2, NOTE_E2, NOTE_B2, NOTE_C3,
NOTE_E2, NOTE_E2, NOTE_E3, NOTE_E2, NOTE_E2, NOTE_D3, NOTE_E2, NOTE_E2,
NOTE_B3, NOTE_G3, NOTE_E3, NOTE_G3, NOTE_B3, NOTE_E4, NOTE_G3, NOTE_B3, NOTE_E4, NOTE_B3, NOTE_G4, NOTE_B4,
NOTE_E2, NOTE_E2, NOTE_E3, NOTE_E2, NOTE_E2, NOTE_D3, NOTE_E2, NOTE_E2,
NOTE_C3, NOTE_E2, NOTE_E2, NOTE_AS2, NOTE_E2, NOTE_E2, NOTE_B2, NOTE_C3,
NOTE_E2, NOTE_E2, NOTE_E3, NOTE_E2, NOTE_E2, NOTE_D3, NOTE_E2, NOTE_E2,
NOTE_C3, NOTE_E2, NOTE_E2, NOTE_AS2,
NOTE_E2, NOTE_E2, NOTE_E3, NOTE_E2, NOTE_E2, NOTE_D3, NOTE_E2, NOTE_E2,
NOTE_C3, NOTE_E2, NOTE_E2, NOTE_AS2, NOTE_E2, NOTE_E2, NOTE_B2, NOTE_C3,
NOTE_E2, NOTE_E2, NOTE_E3, NOTE_E2, NOTE_E2, NOTE_D3, NOTE_E2, NOTE_E2,
NOTE_FS3, NOTE_DS3, NOTE_B2, NOTE_FS3, NOTE_DS3, NOTE_B2, NOTE_G3, NOTE_D3, NOTE_B2, NOTE_DS4, NOTE_DS3, NOTE_B2,
NOTE_E2, NOTE_E2, NOTE_E3, NOTE_E2, NOTE_E2, NOTE_D3, NOTE_E2, NOTE_E2,
NOTE_C3, NOTE_E2, NOTE_E2, NOTE_AS2, NOTE_E2, NOTE_E2, NOTE_B2, NOTE_C3,
NOTE_E2, NOTE_E2, NOTE_E3, NOTE_E2, NOTE_E2, NOTE_D3, NOTE_E2, NOTE_E2,
NOTE_C3, NOTE_E2, NOTE_E2, NOTE_AS2,
NOTE_E2, NOTE_E2, NOTE_E3, NOTE_E2, NOTE_E2, NOTE_D3, NOTE_E2, NOTE_E2,
NOTE_C3, NOTE_E2, NOTE_E2, NOTE_AS2, NOTE_E2, NOTE_E2, NOTE_B2, NOTE_C3,
NOTE_E2, NOTE_E2, NOTE_E3, NOTE_E2, NOTE_E2, NOTE_D3, NOTE_E2, NOTE_E2,
NOTE_E4, NOTE_B3, NOTE_G3, NOTE_G4, NOTE_E4, NOTE_G3, NOTE_B3, NOTE_D4, NOTE_E4, NOTE_G4, NOTE_E4, NOTE_G3,
NOTE_E2, NOTE_E2, NOTE_E3, NOTE_E2, NOTE_E2, NOTE_D3, NOTE_E2, NOTE_E2,
NOTE_C3, NOTE_E2, NOTE_E2, NOTE_AS2, NOTE_E2, NOTE_E2, NOTE_B2, NOTE_C3,
NOTE_E2, NOTE_E2, NOTE_E3, NOTE_E2, NOTE_E2, NOTE_D3, NOTE_E2, NOTE_E2,
NOTE_C3, NOTE_E2, NOTE_E2, NOTE_AS2,
NOTE_A2, NOTE_A2, NOTE_A3, NOTE_A2, NOTE_A2, NOTE_G3, NOTE_A2, NOTE_A2,
NOTE_F3, NOTE_A2, NOTE_A2, NOTE_DS3, NOTE_A2, NOTE_A2, NOTE_E3, NOTE_F3,
NOTE_A2, NOTE_A2, NOTE_A3, NOTE_A2, NOTE_A2, NOTE_G3, NOTE_A2, NOTE_A2,
NOTE_A3, NOTE_F3, NOTE_D3, NOTE_A3, NOTE_F3, NOTE_D3, NOTE_C4, NOTE_A3, NOTE_F3, NOTE_A3, NOTE_F3, NOTE_D3,
NOTE_E2, NOTE_E2, NOTE_E3, NOTE_E2, NOTE_E2, NOTE_D3, NOTE_E2, NOTE_E2,
NOTE_C3, NOTE_E2, NOTE_E2, NOTE_AS2, NOTE_E2, NOTE_E2, NOTE_B2, NOTE_C3,
NOTE_E2, NOTE_E2, NOTE_E3, NOTE_E2, NOTE_E2, NOTE_D3, NOTE_E2, NOTE_E2,
NOTE_C3, NOTE_E2, NOTE_E2, NOTE_AS2,
NOTE_E2, NOTE_E2, NOTE_E3, NOTE_E2, NOTE_E2, NOTE_D3, NOTE_E2, NOTE_E2,
NOTE_C3, NOTE_E2, NOTE_E2, NOTE_AS2, NOTE_E2, NOTE_E2, NOTE_B2, NOTE_C3,
NOTE_E2, NOTE_E2, NOTE_E3, NOTE_E2, NOTE_E2, NOTE_D3, NOTE_E2, NOTE_E2,
NOTE_C3, NOTE_E2, NOTE_E2, NOTE_AS2,
NOTE_E2, NOTE_E2, NOTE_E3, NOTE_E2, NOTE_E2, NOTE_D3, NOTE_E2, NOTE_E2,
NOTE_C3, NOTE_E2, NOTE_E2, NOTE_AS2, NOTE_E2, NOTE_E2, NOTE_B2, NOTE_C3,
NOTE_E2, NOTE_E2, NOTE_E3, NOTE_E2, NOTE_E2, NOTE_D3, NOTE_E2, NOTE_E2,
NOTE_C3, NOTE_E2, NOTE_E2, NOTE_AS2,
NOTE_E2, NOTE_E2, NOTE_E3, NOTE_E2, NOTE_E2, NOTE_D3, NOTE_E2, NOTE_E2,
NOTE_C3, NOTE_E2, NOTE_E2, NOTE_AS2, NOTE_E2, NOTE_E2, NOTE_B2, NOTE_C3,
NOTE_E2, NOTE_E2, NOTE_E3, NOTE_E2, NOTE_E2, NOTE_D3, NOTE_E2, NOTE_E2,
NOTE_B3, NOTE_G3, NOTE_E3, NOTE_B2, NOTE_E3, NOTE_G3, NOTE_C4, NOTE_B3, NOTE_G3, NOTE_B3, NOTE_G3, NOTE_E3
};
int durations[] = {
8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 2,
8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 2,
8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 2,
8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8,
16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 2,
8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8,
16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 2,
8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8,
16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 2,
8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 2,
8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 2,
8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8,
16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 2,
8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8,
16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 2,
8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8,
16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 2,
8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8,
16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 2,
8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 2,
8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 2,
8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8,
16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16
}; int size = sizeof(durations) / sizeof(int);
for (int note = 0; note < size; note++)
{
if (songChanged)
break;
int duration = 1000 / durations[note];
tone(buzzer, melody[note], duration);
int pauseBetweenNotes = duration * 1.40;
delay(pauseBetweenNotes);
noTone(buzzer);
}
}
void Song3()
{
int melody[] = {
NOTE_AS4, NOTE_AS4, NOTE_AS4,
NOTE_F5, NOTE_C6,
NOTE_AS5, NOTE_A5, NOTE_G5, NOTE_F6, NOTE_C6,
NOTE_AS5, NOTE_A5, NOTE_G5, NOTE_F6, NOTE_C6,
NOTE_AS5, NOTE_A5, NOTE_AS5, NOTE_G5, NOTE_C5, NOTE_C5, NOTE_C5,
NOTE_F5, NOTE_C6,
NOTE_AS5, NOTE_A5, NOTE_G5, NOTE_F6, NOTE_C6,
NOTE_AS5, NOTE_A5, NOTE_G5, NOTE_F6, NOTE_C6,
NOTE_AS5, NOTE_A5, NOTE_AS5, NOTE_G5, NOTE_C5, NOTE_C5,
NOTE_D5, NOTE_D5, NOTE_AS5, NOTE_A5, NOTE_G5, NOTE_F5,
NOTE_F5, NOTE_G5, NOTE_A5, NOTE_G5, NOTE_D5, NOTE_E5, NOTE_C5, NOTE_C5,
NOTE_D5, NOTE_D5, NOTE_AS5, NOTE_A5, NOTE_G5, NOTE_F5,
NOTE_C6, NOTE_G5, NOTE_G5, 0, NOTE_C5,
NOTE_D5, NOTE_D5, NOTE_AS5, NOTE_A5, NOTE_G5, NOTE_F5,
NOTE_F5, NOTE_G5, NOTE_A5, NOTE_G5, NOTE_D5, NOTE_E5, NOTE_C6, NOTE_C6,
NOTE_F6, NOTE_DS6, NOTE_CS6, NOTE_C6, NOTE_AS5, NOTE_GS5, NOTE_G5, NOTE_F5,
NOTE_C6
};
int durations[] = {
8, 8, 8,
2, 2,
8, 8, 8, 2, 4,
8, 8, 8, 2, 4,
8, 8, 8, 2, 8, 8, 8,
2, 2,
8, 8, 8, 2, 4,
8, 8, 8, 2, 4,
8, 8, 8, 2, 8, 16,
4, 8, 8, 8, 8, 8,
8, 8, 8, 4, 8, 4, 8, 16,
4, 8, 8, 8, 8, 8,
8, 16, 2, 8, 8,
4, 8, 8, 8, 8, 8,
8, 8, 8, 4, 8, 4, 8, 16,
4, 8, 4, 8, 4, 8, 4, 8,
1
}; int16_t size = sizeof(durations) / sizeof(int);
for (int note = 0; note < size; note++)
{
if (songChanged)
break;
int duration = 1000 / durations[note];
tone(buzzer, melody[note], duration);
int pauseBetweenNotes = duration * 1.30;
delay(pauseBetweenNotes);
noTone(buzzer);
}
}
void Song4()
{
int melody[] = {
NOTE_E5, NOTE_E5, NOTE_E5,
NOTE_E5, NOTE_E5, NOTE_E5,
NOTE_E5, NOTE_G5, NOTE_C5, NOTE_D5,
NOTE_E5,
NOTE_F5, NOTE_F5, NOTE_F5, NOTE_F5,
NOTE_F5, NOTE_E5, NOTE_E5, NOTE_E5, NOTE_E5,
NOTE_E5, NOTE_D5, NOTE_D5, NOTE_E5,
NOTE_D5, NOTE_G5
};
int durations[] = {
8, 8, 4,
8, 8, 4,
8, 8, 8, 8,
2,
8, 8, 8, 8,
8, 8, 8, 16, 16,
8, 8, 8, 8,
4, 4
}; int size = sizeof(durations) / sizeof(int);
for (int note = 0; note < size; note++)
{
if (songChanged)
break;
int duration = 1000 / durations[note];
tone(buzzer, melody[note], duration);
int pauseBetweenNotes = duration * 1.5;
delay(pauseBetweenNotes);
noTone(buzzer);
}
}
void Song5()
{
int melody[] = {
NOTE_C4, NOTE_E4, NOTE_FS4, 0, NOTE_A4,
NOTE_G4, NOTE_E4, NOTE_C4, NOTE_A3,
NOTE_FS3, NOTE_FS3, NOTE_FS3, NOTE_G3, 0,
NOTE_FS3, NOTE_FS3, NOTE_FS3, NOTE_G3, NOTE_AS3,
NOTE_B3, 0
};
int durations[] = {
2, 4, 4, 32, 8,
2, 4, 4, 8,
8, 8, 8, 4, 2,
8, 8, 8, 4, 2,
2, 2
}; int size = sizeof(durations) / sizeof(int);
for (int note = 0; note < size; note++)
{
if (songChanged)
break;
int duration = 1000 / durations[note];
tone(buzzer, melody[note], duration);
int pauseBetweenNotes = duration * 1.5;
delay(pauseBetweenNotes);
noTone(buzzer);
}
}
void Song6()
{
int tempo = 114;
int melody[] = {
NOTE_D5, -4, NOTE_E5, -4, NOTE_A4, 4, //1
NOTE_E5, -4, NOTE_FS5, -4, NOTE_A5, 16, NOTE_G5, 16, NOTE_FS5, 8,
NOTE_D5, -4, NOTE_E5, -4, NOTE_A4, 2,
NOTE_A4, 16, NOTE_A4, 16, NOTE_B4, 16, NOTE_D5, 8, NOTE_D5, 16,
NOTE_D5, -4, NOTE_E5, -4, NOTE_A4, 4, //repeat from 1
NOTE_E5, -4, NOTE_FS5, -4, NOTE_A5, 16, NOTE_G5, 16, NOTE_FS5, 8,
NOTE_D5, -4, NOTE_E5, -4, NOTE_A4, 2,
NOTE_A4, 16, NOTE_A4, 16, NOTE_B4, 16, NOTE_D5, 8, NOTE_D5, 16,
0, 4, NOTE_B4, 8, NOTE_CS5, 8, NOTE_D5, 8, NOTE_D5, 8, NOTE_E5, 8, NOTE_CS5, -8,
NOTE_B4, 16, NOTE_A4, 2, 0, 4,
0, 8, NOTE_B4, 8, NOTE_B4, 8, NOTE_CS5, 8, NOTE_D5, 8, NOTE_B4, 4, NOTE_A4, 8, //7
NOTE_A5, 8, 0, 8, NOTE_A5, 8, NOTE_E5, -4, 0, 4,
NOTE_B4, 8, NOTE_B4, 8, NOTE_CS5, 8, NOTE_D5, 8, NOTE_B4, 8, NOTE_D5, 8, NOTE_E5, 8, 0, 8,
0, 8, NOTE_CS5, 8, NOTE_B4, 8, NOTE_A4, -4, 0, 4,
0, 8, NOTE_B4, 8, NOTE_B4, 8, NOTE_CS5, 8, NOTE_D5, 8, NOTE_B4, 8, NOTE_A4, 4,
NOTE_E5, 8, NOTE_E5, 8, NOTE_E5, 8, NOTE_FS5, 8, NOTE_E5, 4, 0, 4,
NOTE_D5, 2, NOTE_E5, 8, NOTE_FS5, 8, NOTE_D5, 8, //13
NOTE_E5, 8, NOTE_E5, 8, NOTE_E5, 8, NOTE_FS5, 8, NOTE_E5, 4, NOTE_A4, 4,
0, 2, NOTE_B4, 8, NOTE_CS5, 8, NOTE_D5, 8, NOTE_B4, 8,
0, 8, NOTE_E5, 8, NOTE_FS5, 8, NOTE_E5, -4, NOTE_A4, 16, NOTE_B4, 16, NOTE_D5, 16, NOTE_B4, 16,
NOTE_FS5, -8, NOTE_FS5, -8, NOTE_E5, -4, NOTE_A4, 16, NOTE_B4, 16, NOTE_D5, 16, NOTE_B4, 16,
NOTE_E5, -8, NOTE_E5, -8, NOTE_D5, -8, NOTE_CS5, 16, NOTE_B4, -8, NOTE_A4, 16, NOTE_B4, 16, NOTE_D5, 16, NOTE_B4, 16, //18
NOTE_D5, 4, NOTE_E5, 8, NOTE_CS5, -8, NOTE_B4, 16, NOTE_A4, 8, NOTE_A4, 8, NOTE_A4, 8,
NOTE_E5, 4, NOTE_D5, 2, NOTE_A4, 16, NOTE_B4, 16, NOTE_D5, 16, NOTE_B4, 16,
NOTE_FS5, -8, NOTE_FS5, -8, NOTE_E5, -4, NOTE_A4, 16, NOTE_B4, 16, NOTE_D5, 16, NOTE_B4, 16,
NOTE_A5, 4, NOTE_CS5, 8, NOTE_D5, -8, NOTE_CS5, 16, NOTE_B4, 8, NOTE_A4, 16, NOTE_B4, 16, NOTE_D5, 16, NOTE_B4, 16,
NOTE_D5, 4, NOTE_E5, 8, NOTE_CS5, -8, NOTE_B4, 16, NOTE_A4, 4, NOTE_A4, 8, //23
NOTE_E5, 4, NOTE_D5, 2, 0, 4,
0, 8, NOTE_B4, 8, NOTE_D5, 8, NOTE_B4, 8, NOTE_D5, 8, NOTE_E5, 4, 0, 8,
0, 8, NOTE_CS5, 8, NOTE_B4, 8, NOTE_A4, -4, 0, 4,
0, 8, NOTE_B4, 8, NOTE_B4, 8, NOTE_CS5, 8, NOTE_D5, 8, NOTE_B4, 8, NOTE_A4, 4,
0, 8, NOTE_A5, 8, NOTE_A5, 8, NOTE_E5, 8, NOTE_FS5, 8, NOTE_E5, 8, NOTE_D5, 8,
0, 8, NOTE_A4, 8, NOTE_B4, 8, NOTE_CS5, 8, NOTE_D5, 8, NOTE_B4, 8, //29
0, 8, NOTE_CS5, 8, NOTE_B4, 8, NOTE_A4, -4, 0, 4,
NOTE_B4, 8, NOTE_B4, 8, NOTE_CS5, 8, NOTE_D5, 8, NOTE_B4, 8, NOTE_A4, 4, 0, 8,
0, 8, NOTE_E5, 8, NOTE_E5, 8, NOTE_FS5, 4, NOTE_E5, -4,
NOTE_D5, 2, NOTE_D5, 8, NOTE_E5, 8, NOTE_FS5, 8, NOTE_E5, 4,
NOTE_E5, 8, NOTE_E5, 8, NOTE_FS5, 8, NOTE_E5, 8, NOTE_A4, 8, NOTE_A4, 4,
0, -4, NOTE_A4, 8, NOTE_B4, 8, NOTE_CS5, 8, NOTE_D5, 8, NOTE_B4, 8, //35
0, 8, NOTE_E5, 8, NOTE_FS5, 8, NOTE_E5, -4, NOTE_A4, 16, NOTE_B4, 16, NOTE_D5, 16, NOTE_B4, 16,
NOTE_FS5, -8, NOTE_FS5, -8, NOTE_E5, -4, NOTE_A4, 16, NOTE_B4, 16, NOTE_D5, 16, NOTE_B4, 16,
NOTE_E5, -8, NOTE_E5, -8, NOTE_D5, -8, NOTE_CS5, 16, NOTE_B4, 8, NOTE_A4, 16, NOTE_B4, 16, NOTE_D5, 16, NOTE_B4, 16,
NOTE_D5, 4, NOTE_E5, 8, NOTE_CS5, -8, NOTE_B4, 16, NOTE_A4, 4, NOTE_A4, 8,
NOTE_E5, 4, NOTE_D5, 2, NOTE_A4, 16, NOTE_B4, 16, NOTE_D5, 16, NOTE_B4, 16, //40
NOTE_FS5, -8, NOTE_FS5, -8, NOTE_E5, -4, NOTE_A4, 16, NOTE_B4, 16, NOTE_D5, 16, NOTE_B4, 16,
NOTE_A5, 4, NOTE_CS5, 8, NOTE_D5, -8, NOTE_CS5, 16, NOTE_B4, 8, NOTE_A4, 16, NOTE_B4, 16, NOTE_D5, 16, NOTE_B4, 16,
NOTE_D5, 4, NOTE_E5, 8, NOTE_CS5, -8, NOTE_B4, 16, NOTE_A4, 4, NOTE_A4, 8,
NOTE_E5, 4, NOTE_D5, 2, NOTE_A4, 16, NOTE_B4, 16, NOTE_D5, 16, NOTE_B4, 16,
NOTE_FS5, -8, NOTE_FS5, -8, NOTE_E5, -4, NOTE_A4, 16, NOTE_B4, 16, NOTE_D5, 16, NOTE_B4, 16, //45
NOTE_A5, 4, NOTE_CS5, 8, NOTE_D5, -8, NOTE_CS5, 16, NOTE_B4, 8, NOTE_A4, 16, NOTE_B4, 16, NOTE_D5, 16, NOTE_B4, 16,
NOTE_D5, 4, NOTE_E5, 8, NOTE_CS5, -8, NOTE_B4, 16, NOTE_A4, 4, NOTE_A4, 8,
NOTE_E5, 4, NOTE_D5, 2, NOTE_A4, 16, NOTE_B4, 16, NOTE_D5, 16, NOTE_B4, 16,
NOTE_FS5, -8, NOTE_FS5, -8, NOTE_E5, -4, NOTE_A4, 16, NOTE_B4, 16, NOTE_D5, 16, NOTE_B4, 16, //45
NOTE_A5, 4, NOTE_CS5, 8, NOTE_D5, -8, NOTE_CS5, 16, NOTE_B4, 8, NOTE_A4, 16, NOTE_B4, 16, NOTE_D5, 16, NOTE_B4, 16,
NOTE_D5, 4, NOTE_E5, 8, NOTE_CS5, -8, NOTE_B4, 16, NOTE_A4, 4, NOTE_A4, 8,
NOTE_E5, 4, NOTE_D5, 2, 0, 4
};
int notes = sizeof(melody) / sizeof(melody[0]) / 2;
int wholenote = (60000 * 4) / tempo;
int divider = 0, noteDuration = 0;
for (int thisNote = 0; thisNote < notes * 2; thisNote = thisNote + 2) {
if (songChanged)
break;
divider = melody[thisNote + 1];
if (divider > 0) {
noteDuration = (wholenote) / divider;
} else if (divider < 0) {
noteDuration = (wholenote) / abs(divider);
noteDuration *= 1.5;
}
tone(buzzer, melody[thisNote], noteDuration * 0.9);
delay(noteDuration);
noTone(buzzer);
}
}Rewind
Play
Forward
Pause