#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,16,2);
#define NOTE_B0 31
#define NOTE_C1 33
#define NOTE_CS1 35
#define NOTE_D1 37
#define NOTE_DS1 39
#define NOTE_E1 41
#define NOTE_F1 44
#define NOTE_FS1 46
#define NOTE_G1 49
#define NOTE_GS1 52
#define NOTE_A1 55
#define NOTE_AS1 58
#define NOTE_B1 62
#define NOTE_C2 65
#define NOTE_CS2 69
#define NOTE_D2 73
#define NOTE_DS2 78
#define NOTE_E2 82
#define NOTE_F2 87
#define NOTE_FS2 93
#define NOTE_G2 98
#define NOTE_GS2 104
#define NOTE_A2 110
#define NOTE_AS2 117
#define NOTE_B2 123
#define NOTE_C3 131
#define NOTE_CS3 139
#define NOTE_D3 147
#define NOTE_DS3 156
#define NOTE_E3 165
#define NOTE_F3 175
#define NOTE_FS3 185
#define NOTE_G3 196
#define NOTE_GS3 208
#define NOTE_A3 220
#define NOTE_AS3 233
#define NOTE_B3 247
#define NOTE_C4 262
#define NOTE_CS4 277
#define NOTE_D4 294
#define NOTE_DS4 311
#define NOTE_E4 330
#define NOTE_F4 349
#define NOTE_FS4 370
#define NOTE_G4 392
#define NOTE_GS4 415
#define NOTE_A4 440
#define NOTE_AS4 466
#define NOTE_B4 494
#define NOTE_C5 523
#define NOTE_CS5 554
#define NOTE_D5 587
#define NOTE_DS5 622
#define NOTE_E5 659
#define NOTE_F5 698
#define NOTE_FS5 740
#define NOTE_G5 784
#define NOTE_GS5 831
#define NOTE_A5 880
#define NOTE_AS5 932
#define NOTE_B5 988
#define NOTE_C6 1047
#define NOTE_CS6 1109
#define NOTE_D6 1175
#define NOTE_DS6 1245
#define NOTE_E6 1319
#define NOTE_F6 1397
#define NOTE_FS6 1480
#define NOTE_G6 1568
#define NOTE_GS6 1661
#define NOTE_A6 1760
#define NOTE_AS6 1865
#define NOTE_B6 1976
#define NOTE_C7 2093
#define NOTE_CS7 2217
#define NOTE_D7 2349
#define NOTE_DS7 2489
#define NOTE_E7 2637
#define NOTE_F7 2794
#define NOTE_FS7 2960
#define NOTE_G7 3136
#define NOTE_GS7 3322
#define NOTE_A7 3520
#define NOTE_AS7 3729
#define NOTE_B7 3951
#define NOTE_C8 4186
#define NOTE_CS8 4435
#define NOTE_D8 4699
#define NOTE_DS8 4978
#define REST 0
// параметри виводу мелодій
int buzzer = 10; // pin 10 pin to use
int divider = 0; // Порярність ноти
int noteDuration = 0; // Продолжительность ноти
int Num_Sound = 0; // Номер поточної пісні
int wholenote = 0; // это вычисляет продолжительность всей ноты в мс
//
int N_Sound_MAX = 3; // Максимальна к-ть мелодій: від 0 до 3, всього 4 мелодії
int tempo[4]={80,120,88, 85}; // Швидкість мелодії
int notes[4]={}; // масив к-тьі нот в мелодіях, у каждой ноты есть два значения (высота и продолжительность), поэтому на каждую ноту приходится четыре байта// sizeof дает количество байтов, каждое значение int состоит из двух байтов (16 бит)
////////////////////////// 0 Star Trek Intro ////////////////////////////////////////////
int melody1[] = {
NOTE_D4, -8, NOTE_G4, 16, NOTE_C5, -4, NOTE_B4, 8, NOTE_G4, -16, NOTE_E4, -16, NOTE_A4, -16, NOTE_D5, 2,
};
////////////////////////// 1 Dart Vader theme (Imperial March) - Star wars ///////////////////////////////
int melody2[] = {
NOTE_A4,-4, NOTE_A4,-4, NOTE_A4,16, NOTE_A4,16, NOTE_A4,16, NOTE_A4,16, NOTE_F4,8, REST,8, NOTE_A4,-4, NOTE_A4,-4, NOTE_A4,16, NOTE_A4,16, NOTE_A4,16, NOTE_A4,16, NOTE_F4,8, REST,8, NOTE_A4,4, NOTE_A4,4, NOTE_A4,4, NOTE_F4,-8, NOTE_C5,16, NOTE_A4,4, NOTE_F4,-8, NOTE_C5,16, NOTE_A4,2, NOTE_E5,4, NOTE_E5,4, NOTE_E5,4, NOTE_F5,-8, NOTE_C5,16, NOTE_A4,4, NOTE_F4,-8, NOTE_C5,16, NOTE_A4,2, NOTE_A5,4, NOTE_A4,-8, NOTE_A4,16, NOTE_A5,4, NOTE_GS5,-8, NOTE_G5,16, NOTE_DS5,16, NOTE_D5,16, NOTE_DS5,8, REST,8, NOTE_A4,8, NOTE_DS5,4, NOTE_D5,-8, NOTE_CS5,16, NOTE_C5,16, NOTE_B4,16, NOTE_C5,16, REST,8, NOTE_F4,8, NOTE_GS4,4, NOTE_F4,-8, NOTE_A4,-16, NOTE_C5,4, NOTE_A4,-8, NOTE_C5,16, NOTE_E5,2, NOTE_A5,4, NOTE_A4,-8, NOTE_A4,16, NOTE_A5,4, NOTE_GS5,-8, NOTE_G5,16, NOTE_DS5,16, NOTE_D5,16, NOTE_DS5,8, REST,8, NOTE_A4,8, NOTE_DS5,4, NOTE_D5,-8, NOTE_CS5,16, NOTE_C5,16, NOTE_B4,16, NOTE_C5,16, REST,8, NOTE_F4,8, NOTE_GS4,4, NOTE_F4,-8, NOTE_A4,-16, NOTE_A4,4, NOTE_F4,-8, NOTE_C5,16, NOTE_A4,2, };
////////////////////////// 2 The Legend of Zelda for the NES ///////////////////////////////
int melody3[] = {
NOTE_AS4,-2, NOTE_F4,8, NOTE_F4,8, NOTE_AS4,8, NOTE_GS4,16, NOTE_FS4,16, NOTE_GS4,-2, NOTE_AS4,-2, NOTE_FS4,8, NOTE_FS4,8, NOTE_AS4,8, NOTE_A4,16, NOTE_G4,16, NOTE_A4,-2, REST,1, NOTE_AS4,4, NOTE_F4,-4, NOTE_AS4,8, NOTE_AS4,16, NOTE_C5,16, NOTE_D5,16, NOTE_DS5,16, NOTE_F5,2, NOTE_F5,8, NOTE_F5,8, NOTE_F5,8, NOTE_FS5,16, NOTE_GS5,16, NOTE_AS5,-2, NOTE_AS5,8, NOTE_AS5,8, NOTE_GS5,8, NOTE_FS5,16, NOTE_GS5,-8, NOTE_FS5,16, NOTE_F5,2, NOTE_F5,4, NOTE_DS5,-8, NOTE_F5,16, NOTE_FS5,2, NOTE_F5,8, NOTE_DS5,8, NOTE_CS5,-8, NOTE_DS5,16, NOTE_F5,2, NOTE_DS5,8, NOTE_CS5,8, NOTE_C5,-8, NOTE_D5,16, NOTE_E5,2, NOTE_G5,8, NOTE_F5,16, NOTE_F4,16, NOTE_F4,16, NOTE_F4,16,NOTE_F4,16,NOTE_F4,16,NOTE_F4,16,NOTE_F4,16,NOTE_F4,8, NOTE_F4,16,NOTE_F4,8, NOTE_AS4,4, NOTE_F4,-4, NOTE_AS4,8, NOTE_AS4,16, NOTE_C5,16, NOTE_D5,16, NOTE_DS5,16, NOTE_F5,2, NOTE_F5,8, NOTE_F5,8, NOTE_F5,8, NOTE_FS5,16, NOTE_GS5,16, NOTE_AS5,-2, NOTE_CS6,4, NOTE_C6,4, NOTE_A5,2, NOTE_F5,4, NOTE_FS5,-2, NOTE_AS5,4, NOTE_A5,4, NOTE_F5,2, NOTE_F5,4, NOTE_FS5,-2, NOTE_AS5,4, NOTE_A5,4, NOTE_F5,2, NOTE_D5,4, NOTE_DS5,-2, NOTE_FS5,4, NOTE_F5,4, NOTE_CS5,2, NOTE_AS4,4, NOTE_C5,-8, NOTE_D5,16, NOTE_E5,2, NOTE_G5,8, NOTE_F5,16, NOTE_F4,16, NOTE_F4,16, NOTE_F4,16,NOTE_F4,16,NOTE_F4,16,NOTE_F4,16,NOTE_F4,16,NOTE_F4,8, NOTE_F4,16,NOTE_F4,8
};
////////////////////////// 3 Game of Thrones ////////////////////////////////////////////////////////////////////////////////////////////
int melody4[] = {
NOTE_G4,8, NOTE_C4,8, NOTE_DS4,16, NOTE_F4,16, NOTE_G4,8, NOTE_C4,8, NOTE_DS4,16, NOTE_F4,16, NOTE_G4,8, NOTE_C4,8, NOTE_DS4,16, NOTE_F4,16, NOTE_G4,8, NOTE_C4,8, NOTE_DS4,16, NOTE_F4,16, NOTE_G4,8, NOTE_C4,8, NOTE_E4,16, NOTE_F4,16, NOTE_G4,8, NOTE_C4,8, NOTE_E4,16, NOTE_F4,16, NOTE_G4,8, NOTE_C4,8, NOTE_E4,16, NOTE_F4,16, NOTE_G4,8, NOTE_C4,8, NOTE_E4,16, NOTE_F4,16, NOTE_G4,-4, NOTE_C4,-4, NOTE_DS4,16, NOTE_F4,16, NOTE_G4,4, NOTE_C4,4, NOTE_DS4,16, NOTE_F4,16, NOTE_D4,-1, NOTE_F4,-4, NOTE_AS3,-4, NOTE_DS4,16, NOTE_D4,16, NOTE_F4,4, NOTE_AS3,-4, NOTE_DS4,16, NOTE_D4,16, NOTE_C4,-1, NOTE_G4,-4, NOTE_C4,-4, NOTE_DS4,16, NOTE_F4,16, NOTE_G4,4, NOTE_C4,4, NOTE_DS4,16, NOTE_F4,16, NOTE_D4,-1, NOTE_F4,-4, NOTE_AS3,-4, NOTE_DS4,16, NOTE_D4,16, NOTE_F4,4, NOTE_AS3,-4, NOTE_DS4,16, NOTE_D4,16, NOTE_C4,-1, NOTE_G4,-4, NOTE_C4,-4, NOTE_DS4,16, NOTE_F4,16, NOTE_G4,4, NOTE_C4,4, NOTE_DS4,16, NOTE_F4,16, NOTE_D4,-2, NOTE_F4,-4, NOTE_AS3,-4, NOTE_D4,-8, NOTE_DS4,-8, NOTE_D4,-8, NOTE_AS3,-8, NOTE_C4,-1, NOTE_C5,-2, NOTE_AS4,-2, NOTE_C4,-2, NOTE_G4,-2, NOTE_DS4,-2, NOTE_DS4,-4, NOTE_F4,-4, NOTE_G4,-1, NOTE_C5,-2, NOTE_AS4,-2, NOTE_C4,-2, NOTE_G4,-2, NOTE_DS4,-2, NOTE_DS4,-4, NOTE_D4,-4, NOTE_C5,8, NOTE_G4,8, NOTE_GS4,16, NOTE_AS4,16, NOTE_C5,8, NOTE_G4,8, NOTE_GS4,16, NOTE_AS4,16, NOTE_C5,8, NOTE_G4,8, NOTE_GS4,16, NOTE_AS4,16, NOTE_C5,8, NOTE_G4,8, NOTE_GS4,16, NOTE_AS4,16, REST,4, NOTE_GS5,16, NOTE_AS5,16, NOTE_C6,8, NOTE_G5,8, NOTE_GS5,16, NOTE_AS5,16, NOTE_C6,8, NOTE_G5,16, NOTE_GS5,16, NOTE_AS5,16, NOTE_C6,8, NOTE_G5,8, NOTE_GS5,16, NOTE_AS5,16,
};
//////////////////////////////////////////////////////////////////////////////////////////////////////////
String melodys_name[] = {"Star Trek Intro","Dart Vader theme","The Legend of Zelda","Game of Thrones"};
//////////////////////////////////////////////////////////////////////////////////////////////////////////
int* melodys[] = {melody1, melody2, melody3, melody4}; //массив типа указателей на массивы разных размеров
//////////////////////////////////////////////////////////////////////////////////////////////////////////
// параметри тригера який з датчиків спрацював перший
unsigned long inputTime1 = 0; // Time when inputPin1 was triggered
unsigned long inputTime2 = 0; // Time when inputPin2 was triggered
unsigned long timeOut = 0;
// параметри датчиків відстані 1 та 2
int trigPin = 11; //Триггер – зеленый проводник
int echoPin = 12; //Эхо – желтый проводник
int trigPin2 = 6; //Триггер – зеленый проводник 2
int echoPin2 = 7; //Эхо – желтый проводник 2
long duration, duration2, cm, cm2;
int Max_duration = 30; // Обмеження максимальної відстані спрацювання
void setup() {
//*************************************************************************************************//
Serial.begin (9600); //Serial Port begin
lcd.init(); // Включаем дисплей
lcd.backlight(); // Включаем подсветку дисплея
notes[0] = sizeof(melody1)/sizeof(melody1[0]) / 2; //розрахунок к-ть нот для мелодії 0
notes[1] = sizeof(melody2)/sizeof(melody2[0]) / 2; // к-ть нот
notes[2] = sizeof(melody3)/sizeof(melody3[0]) / 2; // к-ть нот
notes[3] = sizeof(melody4)/sizeof(melody4[0]) / 2; // к-ть нот
//Инициализирум входы и выходы датчиків
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(trigPin2, OUTPUT);
pinMode(echoPin2, INPUT);
//*************************************************************************************************//
}
void loop()
{
//
if ( cm < cm2 && cm > 10 && cm2 > 10 && inputTime1 == 0) { // If inputPin1 is HIGH and hasn't been triggered before
inputTime1 = millis(); // Record the time when inputPin1 was triggered
timeOut = millis();
}
else if ( cm > 10 && cm2 > 10 && inputTime2 == 0) { // If inputPin2 is HIGH and hasn't been triggered before
inputTime2 = millis(); // Record the time when inputPin2 was triggered
timeOut = millis();
}
if (inputTime1 != 0 && inputTime2 != 0)
{ // If both inputs have been triggered
if (millis() - timeOut > 400) {
if (inputTime1 < inputTime2) { // If inputPin1 was triggered first
//Serial.println("Input 1 was first!"); // активувати процедуру 1
Num_Sound = Num_Sound + 1;
if (Num_Sound > N_Sound_MAX)
{
Num_Sound = 0;
}
LCD_melody(Num_Sound);
//play_melody(Num_Sound);
} else { // If inputPin2 was triggered first
//Serial.println("Input 2 was first!"); // активувати процедуру 2
Num_Sound = Num_Sound - 1;
if (Num_Sound < 0)
{
Num_Sound = N_Sound_MAX;
}
LCD_melody(Num_Sound);
//play_melody(Num_Sound);
}
inputTime1 = 0; // Reset inputTime1 to 0
inputTime2 = 0; // Reset inputTime2 to 0
}
delay(20);
}
/*
*/
delay(10);
}
void play_melody(int N_Sound)
{
wholenote = (60000 * 4) / tempo[N_Sound]; // это вычисляет продолжительность всей ноты в мс
//********** цикл ******
for (int thisNote = 0; thisNote < notes[N_Sound] * 2; thisNote = thisNote + 2)
{
divider = melodys[N_Sound][thisNote + 1]; // вычисляем полярність каждой ноты
if (divider > 0) { // обычная нота, просто играет
noteDuration = (wholenote) / divider; // Продолжительность ноти
}
else if (divider < 0) { // ноты с точками представлены отрицательной продолжительностью!!
noteDuration = (wholenote) / abs(divider);
noteDuration *= 1.5; // увеличивает продолжительность вдвое для нот с точками
}
tone(buzzer, melodys[N_Sound][thisNote], noteDuration * 0.9); // мы играем ноту только 90% длительности, оставляя 10% на паузу
delay(noteDuration);
noTone(buzzer);
//вихід з циклу
if (cm != 0 || cm2 != 0) {
break;
}
}// end for
}
void LCD_melody(int N_Sound)
{
lcd.setCursor(1, 0);
lcd.print("Treck N");
lcd.setCursor(8, 0);
lcd.print(Num_Sound+1);
lcd.setCursor(0, 1);
lcd.print(melodys_name[Num_Sound]);
}
void yield() {
// Датчик срабатывает и генерирует импульсы шириной 10 мкс или больше
// Генерируем короткий LOW импульс, чтобы обеспечить «чистый» импульс HIGH:
// Датчик 1
digitalWrite(trigPin, LOW);
delayMicroseconds(5);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
pinMode(echoPin, INPUT);
duration = pulseIn(echoPin, HIGH);
// Датчик 2
digitalWrite(trigPin2, LOW);
delayMicroseconds(5);
digitalWrite(trigPin2, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin2, LOW);
pinMode(echoPin2, INPUT);
duration2 = pulseIn(echoPin2, HIGH);
// преобразование времени в расстояние
// Датчик 1
cm = (duration/2) / 29.1;
if (cm > Max_duration )
{
cm = 0;
}
// Датчик 2
cm2 = (duration2/2) / 29.1;
if (cm2 > Max_duration )
{
cm2 = 0;
}
Serial.print("N ");
Serial.print(Num_Sound);
Serial.print(" ");
Serial.print(cm);
Serial.print("cm ");
Serial.print(cm2);
Serial.print("cm ");
Serial.println(melodys_name[Num_Sound]);
// Останній рядок println
}