#include <MusicBuzzer.h>
#include <LiquidCrystal_I2C.h>
#define I2C_ADDR 0x27
#define LCD_COLUMNS 16
#define LCD_LINES 2
#define BUZZER 7
#define JOY_BUTTON 6
#define BUTTON_EXIT 5
#define JOY_VERTICAL A0
//SoftwareSerial mySerial(10, 11);
LiquidCrystal_I2C lcd(I2C_ADDR, LCD_COLUMNS, LCD_LINES);
int upButtonIsPressed;
int downButtonIsPressed;
int selectButtonIsPressed;
int exitButtonIsPressed;
int joyVal;
bool buttonPressed = false;
// Indexes of menu items
const int SONGS = 0;
const int ABOUT = 1;
// Indexes of songs
const int TETRIS = 0;
const int TAKE_ON_ME = 1;
const int PINK_PANTHER = 2;
const int NEVER_GONNA = 3;
const int FIRST_SONG = 0;
const int LAST_SONG = 10;
int firstSongIndex = 0;
int lastSongIndex = 3;
int menuMode = true;
int songsMode = false;
int aboutMode = false;
int selectedItem = 0;
const String menuItems[] = {"Songs", "About"};
const String songs[] = {
"Tetris", "Take On Me", "Pink Panther", "Doom", "Zelda",
"Star Wars", "Godfather", "Harry Potter", "Happy Bir", "Best Song",
};
String availableSongs[] = {"Tetris", "Take On Me"};
int songsFirstIndex = 0;
int songsLastIndex = 3;
int indexOfCurrentSong = 0;
void setup() {
pinMode(JOY_VERTICAL, INPUT);
pinMode(JOY_BUTTON, INPUT_PULLUP);
pinMode(BUTTON_EXIT, INPUT_PULLUP);
Serial.begin(9600);
music.init(BUZZER);
lcd.init();
lcd.backlight();
}
void loop() {
//intro();
displayMenu();
while (menuMode) {
upButtonIsPressed = returnJoystickValue() == "up";
downButtonIsPressed = returnJoystickValue() == "down";
selectButtonIsPressed = !digitalRead(JOY_BUTTON);
if (selectButtonIsPressed) {
if (selectedItem == SONGS) {
displaySongs();
songsMode = true;
}
else if (selectedItem == ABOUT) {
displayAbout();
aboutMode = true;
}
menuMode = false;
}
if (upButtonIsPressed || downButtonIsPressed) {
if (selectedItem == 0) {
selectedItem = 1;
}
else {
selectedItem = 0;
}
displayMenu();
}
delay(50);
}
while (aboutMode) {
exitButtonIsPressed = !digitalRead(BUTTON_EXIT);
if (exitButtonIsPressed) {
displayMenu();
menuMode = true;
aboutMode = false;
}
}
while (songsMode) {
upButtonIsPressed = returnJoystickValue() == "up";
downButtonIsPressed = returnJoystickValue() == "down";
selectButtonIsPressed = !digitalRead(JOY_BUTTON);
exitButtonIsPressed = !digitalRead(BUTTON_EXIT);
if (selectButtonIsPressed) {
displayCurrentSong();
switch(selectedItem) {
case TETRIS:
music.tetris();
break;
/*
case TAKE_ON_ME:
music.takeonme();
break;
case PINK_PANTHER:
music.pinkpanther();
break;
case NEVER_GONNA:
music.nevergonnagiveyouup();
break;
*/
}
displaySongs();
}
else if (exitButtonIsPressed) {
displayMenu();
menuMode = true;
songsMode = false;
}
// Handle logic for up and down
else if (upButtonIsPressed) {
selectedItem -= 1;
if (selectedItem == FIRST_SONG - 1) {
selectedItem = LAST_SONG - 1;
}
updateAvailableSongs("up");
displaySongs();
}
else if (downButtonIsPressed) {
selectedItem += 1;
if (selectedItem == LAST_SONG) {
selectedItem = FIRST_SONG;
}
updateAvailableSongs("down");
displaySongs();
}
delay(50);
}
}
int indexOfSong(String arr[], String target) {
for (int i = 0; i < LAST_SONG; i++) {
if (arr[i] == target) {
return i;
}
}
return -1; // Target not found
}
String returnJoystickValue() {
String res = "";
joyVal = analogRead(JOY_VERTICAL);
buttonPressed = !digitalRead(JOY_BUTTON);
if (joyVal < 400) {
res = "down";
}
else if (joyVal > 800) {
res = "up";
}
return res;
}
void intro() {
lcd.setCursor(0, 0);
lcd.print("== MP3 PLAYER ==");
lcd.setCursor(0, 1);
lcd.print("================");
delay(500);
tone(BUZZER, 1000);
delay(300);
tone(BUZZER, 1500);
delay(300);
tone(BUZZER, 2000);
delay(300);
tone(BUZZER, 2500);
delay(2000);
noTone(BUZZER);
}
void displayMenu() {
lcd.clear();
for (int i = 0; i < 2; i++) {
lcd.setCursor(5, i);
lcd.println(menuItems[i]);
if (selectedItem == i) {
lcd.print("<");
}
}
}
void displayAbout() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Plain MP3 player");
lcd.setCursor(0, 1);
lcd.print("by Jakub Plechac");
}
void displaySongs() {
lcd.clear();
for (int i = 0; i <= 2; i++) {
lcd.setCursor(0, i);
lcd.println(availableSongs[i]);
if (i == 0) {
lcd.print("<");
}
}
}
void displayCurrentSong() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Playing: ");
lcd.setCursor(0, 1);
lcd.print(songs[selectedItem]);
}
void updateAvailableSongs(String way) {
availableSongs[0] = songs[selectedItem];
if (way == "up") {
availableSongs[1] = songs[selectedItem - 1];
}
else if (way == "down") {
availableSongs[1] = songs[selectedItem + 1];
}
}