// пины соленоидов #define SOLENOID_1_PIN 0 #define SOLENOID_2_PIN 1 #define SOLENOID_3_PIN 2 #define SOLENOID_4_PIN 3 #define SOLENOID_5_PIN 4 #define SOLENOID_6_PIN 5 #define SOLENOID_7_PIN 6 // пин кнопки #define BUTTON_PIN 7 // массив пинов соленоидов int solenoids[] = {SOLENOID_1_PIN, SOLENOID_2_PIN, SOLENOID_3_PIN, SOLENOID_4_PIN, SOLENOID_5_PIN, SOLENOID_6_PIN, SOLENOID_7_PIN}; // мелодия в формате RTTTL unsigned char melodyRTTTL[] = "Impossible:d=16,o=5,b=100:32d,32d#,32d,32d#,32d,32d#," "32d,32d#,32d,32d,32d#,32e,32f,32f#,32g,g,8p,g,8p,a#,p," "c6,p,g,8p,g,8p,f,p,f#,p,g,8p,g,8p,a#,p,c6,p,g,8p,g,8p," "f,p,f#,p,a#,g,2d,32p,a#,g,2c#,32p,a#,g,2c,p,a#4,c"; // вычисление размера массива при компиляции const int N = sizeof(melodyRTTTL) / sizeof(char); // имя мелодии char name[12]; // длительность ноты по умолчанию char duration[8]; // октава по умолчанию char octave[8]; // темп / скорость в минуту char bpm[8]; char melodyNotes[N]; int melodyNotesInt[N]; void setup() { // открываем Serial-порт Serial.begin(9600); // назначаем пины соленоидов в режиме выхода for (int i = 0; i < 7; i++) { pinMode(solenoids[i], OUTPUT); } } void loop() { // если нажата кнопка if (!digitalRead(BUTTON_PIN)) { // парсим мелодию RTTTL if (parsingMelody()) { // если парсинг мелодии формата RTTTL прошёл успешно // выводим имя мелодии Serial.println("Parsing is OK"); Serial.println(name); // выводим длительность мелодии по умолчанию Serial.println(duration); // выводим октаву мелодии по умолчани Serial.println(octave); // выводим темп мелодии Serial.println(bpm); // длина массива мелодии нот int len = strlen(melodyNotes); // Serial.println(melodyNotes); // преобразуем ноты в числовые значения parsingIntNotes(); // играем музыку соленоидами playSolenoids(len); } else { Serial.println("Error"); } } } // парсинг мелодии формата RTTTL bool parsingMelody() { int i = 0; int j = 0; // поиск названия мелодии while (melodyRTTTL[i] != ':') { name[j++] = melodyRTTTL[i++]; if(j > 12) { return false; } } // пропуск «:» i++; name[j] = '\0'; // поиск длительности ноты j = 0; while (melodyRTTTL[i] != ',') { duration[j++] = melodyRTTTL[i++]; if(j > 4) { return false; } } // пропуск «,» i++; duration[j] = '\0'; // поиск октавы j = 0; while (melodyRTTTL[i] != ',') { octave[j++] = melodyRTTTL[i++]; if(j > 4) { return false; } } // пропуск «,» i++; octave[j] = '\0'; // поиск темпа мелодии j = 0; while (melodyRTTTL[i] != ':') { bpm[j++] = melodyRTTTL[i++]; if(j > 5) { return false; } } // пропуск «:» i++; bpm[j] = '\0'; // запись мелодии нот j = 0; while (melodyRTTTL[i] != '\0') { if (isalpha(melodyRTTTL[i])) { melodyNotes[j++] = melodyRTTTL[i++]; } else { i++; } } melodyNotes[j] = '\0'; return true; } // функция преобразование буквенных нот мелодии: d, e, f, g, a, b, p // в числовые значения от 0 до 7 void parsingIntNotes() { int i = 0; int j = 0; while (melodyNotes[i] != '\0') { if (melodyNotes[i] == 'c') { melodyNotesInt[j++] = 0; } else if (melodyNotes[i] == 'd') { melodyNotesInt[j++] = 1; } else if (melodyNotes[i] == 'e') { melodyNotesInt[j++] = 2; } else if (melodyNotes[i] == 'f') { melodyNotesInt[j++] = 3; } else if (melodyNotes[i] == 'g') { melodyNotesInt[j++] = 4; } else if (melodyNotes[i] == 'a') { melodyNotesInt[j++] = 5; } else if (melodyNotes[i] == 'b') { melodyNotesInt[j++] = 6; } else if (melodyNotes[i] == 'p') { melodyNotesInt[j++] = 8; } i++; } } void playSolenoids(int len) { for(int i = 0; i < len; i++) { int speed = 100; Serial.println(melodyNotesInt[i]); digitalWrite(solenoids[melodyNotesInt[i]], HIGH); delay(speed); digitalWrite(solenoids[melodyNotesInt[i]], LOW); delay(speed); } }