Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Manufacturing Technology >> Производственный процесс

Клавиатура электронного фортепиано с предустановленными композициями

Компоненты и расходные материалы

Arduino UNO
× 1
Стандартный ЖК-экран Adafruit - 16x2, белый на синем
× 1
Кнопочный переключатель SparkFun, 12 мм
× 8
Резистор 220 Ом
× 4
Резистор 560 Ом
× 1
Резистор 1 кОм
× 1
Резистор 4,7 кОм
× 1
Резистор 10 кОм
× 3
Резистор 1 МОм
× 1
Зуммер
× 1
LED (общий)
× 1
Однооборотный потенциометр - 10 кОм
× 1
Перемычки (общие)
× 1
Макет (общий)
× 1

Об этом проекте

Введение

Для начала я должен сообщить вам, что я новичок в мире электроники. У меня приличный опыт программирования, что помогает, но я всегда открыт для новых идей и предложений по любому из проектов, которые я создал.

Недавно я узнал больше о пьезо-зуммере и кодировании, и это мое творение, основанное на том, что я узнал до сих пор. Есть много возможностей для расширения с помощью новых функций или переключателей, которые я планирую сделать позже, но сейчас мы переходим к следующей задаче!

Ниже представлено видео о том, как работает устройство, включая меню предустановленных песен. Признаюсь, технически песни 4 и 5 - это одно и то же, но что я могу сказать, у меня есть желание создавать большие и лучшие вещи, и написание музыкального кода для большего количества песен не было одним из них! Базовое кодирование как для основных циклов, так и для отдельных циклов песни довольно легко адаптировать к вашим собственным идеям, поэтому не стесняйтесь изменять, как считаете нужным.

Посмотрите на это в действии!

Как настроить оборудование

Клавиши пианино ...

Клавишные переключатели пианино были подключены с помощью резисторной лестницы. Резисторы размещены в последовательном порядке, подключая каждый переключатель к источнику питания. Для своего проекта я решил использовать (в омах) 1M, 10k, 4.7K, 1K, 560 и 220. Первый переключатель пианино (слева) подключен к источнику питания, а также к следующему переключателю в цепи. Второй переключатель подключается к самому маленькому резистору, а каждый переключатель после этого подключается к следующему по величине резистору в серии. Последний переключатель заземляет соединение через резистор 10 кОм, а также соединяет все 7 переключателей с выводом A0 «аналогового входа» на Arduino. Основной набросок определяет, какие частоты музыкальных нот связаны с каждой клавишей фортепиано. Для этого проекта я использовал C4, D4, E4, F4, G4, A4 и B4, причем C4 был крайним левым переключателем. Измените значения частоты или добавьте дополнительные переключатели, чтобы полностью настроить свой собственный проект!

ЖК-экран ...

Подключите контакты ЖК-дисплея в соответствии со схемой ниже. Подключите контакт 3 ЖК-дисплея к потенциометру для контроля контрастности экрана. Внешние контакты потенциометра подключены к источнику питания и заземлению для замыкания этой цепи. Вывод 15 ЖК-дисплея подключен к питанию через резистор 220 Ом. Если какой-либо из этих выводов изменится в вашем собственном проекте, обновите код соответствующим образом.

Переключатель меню ...

Подключите переключатель меню к источнику питания и заземлите его через резистор 10 кОм. Этот переключатель также должен быть подключен к контакту 7 на Arduino, чтобы вы могли управлять им с помощью кодирования.

Светодиод ...

Светодиод используется для индикации того, что вы находитесь в «режиме меню» и клавиши пианино отключены. Светодиодный индикатор загорается при нажатии переключателя меню. Подключите анод (плюс) светодиода к контакту 6 Arduino и заземлите светодиод через резистор 220 Ом.

Пьезозуммер ...

Чтобы интегрировать пьезозуммер, просто подключите один конец к контакту 8 Arduino, а другой конец - к заземлению через резистор 220 Ом. Функция «тон» в коде будет искать этот штифт, чтобы сыграть вызванную ноту.

Как работает код

Настройка ...

  • Скетч начинается с импорта библиотек «LiquidCrystal.h» и «pitches.h», чтобы мы могли ссылаться на различные элементы из них позже в коде.
  • Затем код настраивается путем определения имени переключателя меню, определения контактов, входных и выходных, и установки значений частоты для каждой из 7 клавиш фортепиано.
  • Для каждой отдельной песни была создана новая вкладка, чтобы мой код был в некоторой степени организованным и более легким для понимания, а в дальнейшем его можно было расширить. Если вы хотите удалить или добавить больше песен, просто не забудьте также изменить код в основном эскизе «Электронной клавиатуры».

Основной цикл ...

  • Клавиатура начинает с выключенного светодиода и активными всеми клавишами фортепиано.
  • Как только цикл обнаруживает нажатие кнопки меню, он отключает клавиши пианино и включает светодиод, показывая, что вы находитесь в «режиме меню».

Доступ к меню ...

  • Нажмите кнопку меню, чтобы просмотреть текущие песни, и нажмите любую из клавиш пианино, чтобы начать воспроизведение песни, отображаемой на ЖК-экране.
  • ЖК-экран покажет, какая песня воспроизводится в данный момент, а затем вернется в то же место в меню, как только песня закончится. Оттуда вы можете воспроизвести или продолжить просмотр списка доступных песен.
  • Двойной щелчок по кнопке меню перезапустит меню с самого начала.
  • Чтобы вернуться к использованию клавиш пианино, пролистайте оставшиеся песни в меню. Когда ЖК-экран погаснет, а светодиод погаснет, клавиши пианино снова будут работать.

Код

  • Электронная клавиатура
  • Song1
  • Song2
  • Song3
  • Song4
  • Song5
  • pitches.h
Электронная клавиатура Arduino
Основной код
 // Настройка ЖК-экрана, переключателя и светодиодов # include  #include "pitches.h" LiquidCrystal lcd (12, 11, 5, 4, 3, 2); const int LCDswitchPin =7; // определение имени переключателя меню / ЖК-дисплея int LCDswitchState =0; // установить состояние переключателя меню / ЖК-дисплея на выкл. / низкое. prevLCDswitchState =0; int blueLED =6; int LCDswitchCounter =0; // счетчик количества нажатий кнопок меню // (этот код подсчитывает нажатия кнопок меню, отображает их на вашем компьютере, // и начинает с нуля после выхода из «режима меню». В настоящее время не имеет никакого другого эффекта // на этот скетч , но это хорошая отправная точка для расширения проекта // новыми функциями позже // Клавиши музыкальных нот - установка значений частотыint notes [] ={262, 294, 330, 349, 392, 440, 494}; // Установить ноты C, D, E, F, G, A, B //////////////////////////////////// ////////// void setup () {Serial.begin (9600); lcd.begin (16, 2); pinMode (LCDswitchPin, INPUT); pinMode (blueLED, OUTPUT); digitalWrite (blueLED, LOW ); // Светодиод не горит, пока включены клавиши пианино} // завершение настройки ///////////////////////////////// ///////////// void loop () {LCDswitchState =digitalRead (LCDswitchPin); int keyVal =analogRead (A0); Serial.println (keyVal); lcd.noDisplay (); digitalWrite (blueLED, LOW); // Отключаем светодиод каждый раз при запуске основного цикла // ************** НАЧАТЬ "LCDstart" КОГДА НАЖАТА КНОПКА МЕНЮ ******** *** если (LCDswitchState ==HIGH) {digitalWrite (blueLED, HIGH); // Включаем светодиод, чтобы показать, что клавиши пианино отключены и устройство находится в «режиме меню» lcd.display (); lcd.clear (); LCDstart (); } // ********************************************* *********************** ////// ПРИМЕЧАНИЯ КЛАВИАТУРЫ И ЧАСТОТА //////// Используйте созданную вами лестницу резисторов для изменить напряжение каждой кнопки клавиши пианино // 220 Ом =C5 // 560 Ом =D5 // 1 кОм =E5 // и т.д ... if (keyVal ==1023) {tone (8, notes [0]); // C} // конец, если иначе if (keyVal> =990 &keyVal <=1010) {tone (8, notes [1]); // D} // конец else if else if (keyVal> =960 &&keyVal <=980) {tone (8, notes [2]); // E} // конец else if else if (keyVal> =900 &&keyVal <=945) {tone (8, notes [3]); // F} // конец else if else if (keyVal> =650 &&keyVal <=710) {tone (8, notes [4]); // G} // конец else if else if (keyVal> =500 &&keyVal <=550) {tone (8, notes [5]); // A} // конец else if else if (keyVal> =5 &&keyVal <=10) {tone (8, notes [6]); // B} // конец else if else if (keyVal <=1) {// если ни один переключатель не нажат, не воспроизводить тон noTone (8); } // конец else if} // цикл тонального сигнала конечной частоты /////////////////////////////////// //////////////// void LCDstart () {int keyVal =analogRead (A0); LCDswitchState =digitalRead (LCDswitchPin); // проверяем состояние кнопки меню while (LCDswitchState ==LOW) {// продолжаем цикл, пока кнопка меню не нажата LCDswitchState =digitalRead (LCDswitchPin); // проверять состояние кнопки меню каждый раз при запуске цикла // ************* НАЧАТЬ ЦИКЛ НАЗВАНИЯ ПЕСНИ 1 ******************* * if (LCDswitchState ==HIGH) {// если кнопка меню нажата, то ... LCDswitchCounter ++; // устанавливаем количество кнопок равным 1 Serial.print ("количество нажатий кнопки:"); Serial.println (LCDswitchCounter); задержка (300); // мин. время до подсчета добавляет еще 1 Song1title (); lcd.clear (); ломать; } // ************* ELSE SHOW MENU **************** else {// если кнопка меню не нажата, то ... LCDswitchCounter =0; // устанавливаем счетчик кнопок меню на 0 lcd.clear (); lcd.setCursor (0, 0); lcd.print ("КАКАЯ ПЕСНЯ БЫЛА"); lcd.setCursor (0, 1); lcd.print («ВАМ НРАВИТСЯ ИГРАТЬ»); задержка (50); // возврат в основную часть}} // конец while} // конец цикла LCDstart // ************* ПЕСНЯ 1 НАЧИНАЕТСЯ ЦИКЛ ЗДЕСЬ ************* * void Song1title () {int keyVal =analogRead (A0); LCDswitchState =digitalRead (LCDswitchPin); // снова проверяем состояние кнопки меню, пока (LCDswitchState ==LOW) {// продолжаем цикл, пока кнопка меню не нажата LCDswitchState =digitalRead (LCDswitchPin); // снова проверяем состояние кнопки меню // ************* НАЧАТЬ ЦИКЛ НАЗВАНИЯ ПЕСНИ 2 ******************** if ( LCDswitchState ==HIGH) {// если нажата кнопка меню, то ... LCDswitchCounter ++; // устанавливаем количество кнопок равным 2 Serial.print ("количество нажатий кнопки:"); Serial.println (LCDswitchCounter); задержка (300); // мин. время до подсчета добавляет еще 1 Song2title (); lcd.clear (); ломать; } else {// если кнопка меню не нажата int keyVal =analogRead (A0); Serial.println (keyVal); если (keyVal> =2) {digitalWrite (blueLED, LOW); Song1 (); ломать; } // конец, если lcd.clear (); lcd.setCursor (0, 0); lcd.print («СУПЕР МАРИО БРОС»); lcd.setCursor (0, 1); lcd.print («ТЕМАТИЧЕСКАЯ ПЕСНЯ»); задержка (50); }} // завершаем, а песня 1 -> 2} // завершаем цикл Song1title // ************* ЦИКЛ 2 НАЧИНАЕТСЯ ЗДЕСЬ ************* * void Song2title () {int keyVal =analogRead (A0); LCDswitchState =digitalRead (LCDswitchPin); // снова проверяем состояние кнопки меню, пока (LCDswitchState ==LOW) {// продолжаем цикл, пока кнопка меню не нажата LCDswitchState =digitalRead (LCDswitchPin); // снова проверяем состояние кнопки меню // ************* НАЧАТЬ ЦИКЛ НАЗВАНИЯ ПЕСНИ 3 ******************** if ( LCDswitchState ==HIGH) {// если нажата кнопка меню, то ... LCDswitchCounter ++; // устанавливаем количество кнопок на 3 Serial.print ("количество нажатий кнопки:"); Serial.println (LCDswitchCounter); задержка (300); // мин. время до отсчета добавляет еще 1 Song3title (); lcd.clear (); ломать; } else {// если кнопка меню не нажата int keyVal =analogRead (A0); Serial.println (keyVal); если (keyVal> =2) {digitalWrite (blueLED, LOW); Song2 (); ломать; } // конец, если lcd.clear (); lcd.setCursor (0, 0); lcd.print («СУПЕР МАРИО БРОС»); lcd.setCursor (0, 1); lcd.print ("ПОДМИР"); задержка (50); }} // завершаем, а песня 2 -> 3} // завершаем цикл Song2title // ************* ЦИКЛ ПЕСНИ 3 НАЧИНАЕТСЯ ЗДЕСЬ ************* * void Song3title () {int keyVal =analogRead (A0); LCDswitchState =digitalRead (LCDswitchPin); // снова проверяем состояние кнопки меню, пока (LCDswitchState ==LOW) {// продолжаем цикл, пока кнопка меню не нажата LCDswitchState =digitalRead (LCDswitchPin); // снова проверяем состояние кнопки меню // ************* НАЧАТЬ ПЕСНЮ 4 ЗАГОЛОВОК ******************** if ( LCDswitchState ==HIGH) {// если нажата кнопка меню, то ... LCDswitchCounter ++; // устанавливаем количество кнопок на 4 Serial.print ("количество нажатий кнопки:"); Serial.println (LCDswitchCounter); задержка (300); // мин. время до подсчета добавляет еще 1 Song4title (); lcd.clear (); ломать; } else {// если кнопка меню не нажата int keyVal =analogRead (A0); Serial.println (keyVal); если (keyVal> =2) {digitalWrite (blueLED, LOW); Song3 (); ломать; } // конец, если lcd.clear (); lcd.setCursor (0, 0); lcd.print («ДЖЕОПАРДИ»); lcd.setCursor (0, 1); lcd.print («ТЕМАТИЧЕСКАЯ ПЕСНЯ»); задержка (50); }} // конец песни 3 -> 4} // конец цикла Song3title // ************* ЦИКЛ 4 ПЕСНИ НАЧИНАЕТСЯ ЗДЕСЬ ************* * void Song4title () {int keyVal =analogRead (A0); LCDswitchState =digitalRead (LCDswitchPin); // снова проверяем состояние кнопки меню, пока (LCDswitchState ==LOW) {// продолжаем цикл, пока кнопка меню не нажата LCDswitchState =digitalRead (LCDswitchPin); // снова проверяем состояние кнопки меню // ************* НАЧАТЬ ПЕСНЮ 5 ЗАГОЛОВОК ******************** if ( LCDswitchState ==HIGH) {// если нажата кнопка меню, то ... LCDswitchCounter ++; // устанавливаем количество кнопок на 5 Serial.print ("количество нажатий кнопки:"); Serial.println (LCDswitchCounter); задержка (300); // мин. время до отсчета добавляет еще 1 Song5title (); lcd.clear (); ломать; } else {// если кнопка меню не нажата int keyVal =analogRead (A0); Serial.println (keyVal); если (keyVal> =2) {digitalWrite (blueLED, LOW); Song4 (); ломать; } // конец, если lcd.clear (); lcd.setCursor (0, 0); lcd.print («ПЕСНЯ 4»); lcd.setCursor (0, 1); lcd.print («НАЗВАНИЕ ЗДЕСЬ»); задержка (50); }} // конец песни 4 -> 5} // конец цикла Song4title // ************* ЦИКЛ ПЕСНИ 5 НАЧИНАЕТСЯ ЗДЕСЬ ************* * void Song5title () {int keyVal =analogRead (A0); LCDswitchState =digitalRead (LCDswitchPin); // снова проверяем состояние кнопки меню, пока (LCDswitchState ==LOW) {// продолжаем цикл, пока кнопка меню не нажата LCDswitchState =digitalRead (LCDswitchPin); // снова проверяем состояние кнопки меню // ************* НАЧАТЬ ПЕСНЮ 4 ЗАГОЛОВОК ******************** if ( LCDswitchState ==HIGH) {// если кнопка меню нажата, то ... LCDswitchCounter =0; // устанавливаем счетчик кнопок равным 0 Serial.print ("количество нажатий кнопки:"); Serial.println (LCDswitchCounter); задержка (300); // мин. время, пока counts не добавит еще 1 lcd.clear (); } else {// если кнопка меню не нажата int keyVal =analogRead (A0); Serial.println (keyVal); если (keyVal> =2) {digitalWrite (blueLED, LOW); Song5 (); ломать; } // конец, если lcd.clear (); lcd.setCursor (0, 0); lcd.print («ПЕСНЯ 5»); lcd.setCursor (0, 1); lcd.print («НАЗВАНИЕ ЗДЕСЬ»); задержка (50); }} // завершаем, а песня 4 -> 5} // завершаем цикл Song5title 
Song1 Arduino
Код на 1-ю песню. В настоящее время загружена тематическая песня Mario Bros.
 // ***************** ЗДЕСЬ ЗАМЕТКИ К ПЕСНЕ 1 *************** *********** /////////////////////////////////////// ////////////////////////////////////////////////// /////////////////////// ПОЛНОЕ РУКОВОДСТВО ПО СОЗДАНИЮ ПЕСНИ MARIO МОЖНО НАЙТИ ЗДЕСЬ:///////////// ///////////////////// http://www.linuxcircle.com/2013/03/31/playing-mario-bros-tune-with-arduino-and -пьезозуммер / ///////////////////////////////////////////// ////////////////////////////////////////////////// //////// void Song1 () {lcd.clear (); // ноты в мелодии:int melody [] ={NOTE_E7, NOTE_E7, 0, NOTE_E7, 0, NOTE_C7, NOTE_E7, 0, NOTE_G7, 0, 0, 0, NOTE_G6, 0, 0, 0, NOTE_C7, 0, 0, NOTE_G6, 0, 0, NOTE_E6, 0, 0, NOTE_A6, 0, NOTE_B6, 0, NOTE_AS6, NOTE_A6, 0, NOTE_G6, NOTE_E7, NOTE_G7, NOTE_A7, 0, NOTE_F7, NOTE_G7, 0, NOTE_E7, 0, NOTE_C7, NOTE_D7, NOTE_B6, 0, 0, NOTE_C7, 0, 0, NOTE_G6, 0, 0, NOTE_E6, 0, 0, NOTE_A6, 0, NOTE_B6, 0, NOTE_AS6, NOTE_A6, 0, NOTE_G6, NOTE_E7, NOTE_G7 , NOTE_A7, 0, NOTE_F7, NOTE_G7, 0, NOTE_E7, 0, NOTE_C7, NOTE_D7, NOTE_B6, 0, 0}; // длительность нот:4 =четверть, 8 =восьмая нота и т. Д .:int noteDurations [] ={ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 9, 9, 9, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 9, 9, 9, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,}; lcd.setCursor (1, 0); lcd.print («Сейчас играет ...»); lcd.setCursor (0, 1); lcd.print («ПЕСНЯ НА ТЕМУ МАРИО»); int size =sizeof (мелодия) / sizeof (int); for (int thisNote =0; thisNote  
Song2 Arduino
Код для второй песни. В настоящее время загружена песня Mario Bros Underworld.
 // ***************** ПЕСНЯ 2 ЗАМЕТКИ ЗДЕСЬ *************** *********** /////////////////////////////////////// ////////////////////////////////////////////////// /////////////////////// ПОЛНОЕ РУКОВОДСТВО ПО СОЗДАНИЮ ПЕСНИ MARIO МОЖНО НАЙТИ ЗДЕСЬ:///////////// ///////////////////// http://www.linuxcircle.com/2013/03/31/playing-mario-bros-tune-with-arduino-and -пьезозуммер / ///////////////////////////////////////////// ////////////////////////////////////////////////// //////// void Song2 () {lcd.clear (); // ноты в мелодии:int melody [] ={NOTE_C4, NOTE_C5, NOTE_A3, NOTE_A4, NOTE_AS3, NOTE_AS4, 0, 0, NOTE_C4, NOTE_C5, NOTE_A3, NOTE_A4, NOTE_AS3, NOTE_AS4, 0, 0, NOTE_F3, NOTE_F4, NOTE_D3, NOTE_D4, NOTE_DS3, NOTE_DS4, 0, 0, NOTE_F3, NOTE_F4, NOTE_D3, NOTE_D4, NOTE_DS3, NOTE_DS_DS4, 0, 0, 0 NOTE_D4, NOTE_CS4, NOTE_DS4, NOTE_DS4, NOTE_GS3, NOTE_G3, NOTE_CS4, NOTE_C4, NOTE_FS4, NOTE_F4, NOTE_E3, NOTE_AS4, NOTE_A4, NOTE_GS4, NOTE_DS4, NOTE_B3, NOTE_AS3, NOTE_A3, NOTE_GS3, 0, 0, 0}; // длительность нот:4 =четверть, 8 =восьмая нота и т. Д .:int noteDurations [] ={12, 12, 12, 12, 12 , 12, 6, 3, 12, 12, 12, 12, 12, 12, 6, 3, 12, 12, 12, 12, 12, 12, 6, 3, 12, 12, 12, 12, 12, 12 , 6, 6, 18, 18, 18, 6, 6, 6, 6, 6, 6, 18, 18, 18, 18, 18, 18, 10, 10, 10, 10, 10, 10, 3, 3 , 3}; lcd.setCursor (1, 0); lcd.print («Сейчас играет ...»); lcd.setCursor (0, 1); lcd.print («МАРИО ПОДМИРНЫЙ»); int size =sizeof (мелодия) / sizeof (int); for (int thisNote =0; thisNote  
Song3 Arduino
Код для 3-ей песни. В данный момент загружена тема Jeopardy Theme Song.
 // ***************** ЗДЕСЬ ЗАМЕТКИ К ПЕСНЕ 3 **************** ********** void Song3 () {lcd.clear (); // ноты в мелодии:int melody [] ={NOTE_C2, NOTE_F3, NOTE_C3, NOTE_A2, NOTE_A2, NOTE_C3, NOTE_F3, NOTE_C3, NOTE_C3, NOTE_F3, NOTE_C3, NOTE_F3, NOTE_AS3, NOTE_G3, NOTE_F3, NOTE_E3, NOTE_D3, NOTE_CS3, NOTE_C2, NOTE_F3, NOTE_C3, NOTE_A2, NOTE_A2, // повторить строки 1 и 2 NOTE_C3, NOTE_F3, NOTE_G3, NOTE_F3, NOTE_G3, NOTE_F3, NOTE_G3, , NOTE_E3, NOTE_D3, NOTE_CS3, NOTE_C3}; // длительность нот:4 =четверть, 8 =восьмая нота и т. Д .:int noteDurations [] ={4, 4, 4, 8, 8, 4, 4, 2, 4, 4, 4, 4, 3, 8, 8, 8, 8, 8, 4, 4, 4, 8, 8, // повторить строку 1 и 2 4, 4, 2, 4, 8, 8, 4 , 4, 4, 4, 4, 4, 0}; lcd.setCursor (1, 0); lcd.print («Сейчас играет ...»); lcd.setCursor (0, 1); lcd.print («ДЖЕОПАРДИ»); for (int thisNote =0; noteDurations [thisNote]! =0; thisNote ++) {// для вычисления длительности заметки необходимо разделить одну секунду // на тип заметки. //например. четвертная нота =1000/4, восьмая нота =1000/8 и т. д. int noteDuration =2000 / noteDurations [thisNote]; тон (8, мелодия [thisNote], noteDuration * 0,9); // чтобы различать ноты, установите минимальное время между ними. // длительность заметки + 30% кажется подходящей:// int pauseBetweenNotes =noteDuration * 1.30; // задержка (pauseBetweenNotes); задержка (noteDuration); } Song3title (); } // завершаем цикл Song3 
Song4 Arduino
Код для 4-й песни. В настоящее время загружена короткая обычная мелодия.
 // ***************** ЗДЕСЬ ЗАМЕТКИ К ПЕСНЕ 4 *************** *********** void Song4 () {lcd.clear (); // ноты в мелодии:int melody [] ={NOTE_C4, NOTE_G3, NOTE_G3, NOTE_A3, NOTE_G3, 0, NOTE_B3, NOTE_C4 }; // длительность нот:4 =четверть, 8 =восьмая нота и т. д .:int noteDurations [] ={4, 8, 8, 4, 4, 4, 4, 4}; lcd.setCursor (1, 0); lcd.print («Сейчас играет ...»); lcd.setCursor (0, 1); lcd.print («ПЕСНЯ 4 НАЗВАНИЕ»); int thisNote =0; // для расчета длительности ноты необходимо разделить // секунду на тип ноты. //например. четвертная нота =1000/4, восьмая нота =1000/8 и т. д. for (int thisNote =0; thisNote <8; thisNote ++) {// для расчета длительности ноты, разделите одну секунду // на тип ноты. //например. четвертная нота =1000/4, восьмая нота =1000/8 и т. д. int noteDuration =1000 / noteDurations [thisNote]; тон (8, мелодия [thisNote], noteDuration); // чтобы различать ноты, установите минимальное время между ними. // продолжительность заметки + 30% вроде бы работает:int pauseBetweenNotes =noteDuration * 1.30; задержка (pauseBetweenNotes); noTone (8); // останавливаем воспроизведение тона:} // конец forSong4title (); } // завершаем цикл Song4 
Song5 Arduino
Код на 5-ю песню. В настоящее время загружена короткая обычная мелодия.
 // ***************** ЗДЕСЬ ЗАМЕТКИ К ПЕСНЕ 5 *************** *********** void Song5 () {lcd.clear (); // ноты в мелодии:int melody [] ={NOTE_C4, NOTE_G3, NOTE_G3, NOTE_A3, NOTE_G3, 0, NOTE_B3, NOTE_C4 }; // длительность нот:4 =четверть, 8 =восьмая нота и т. д .:int noteDurations [] ={4, 8, 8, 4, 4, 4, 4, 4}; lcd.setCursor (1, 0); lcd.print («Сейчас играет ...»); lcd.setCursor (0, 1); lcd.print («ПЕСНЯ 5 НАЗВАНИЕ»); int thisNote =0; // для расчета длительности ноты необходимо разделить // секунду на тип ноты. //например. четвертная нота =1000/4, восьмая нота =1000/8 и т. д. for (int thisNote =0; thisNote <8; thisNote ++) {// для расчета длительности ноты, разделите одну секунду // на тип ноты. //например. четвертная нота =1000/4, восьмая нота =1000/8 и т. д. int noteDuration =1000 / noteDurations [thisNote]; тон (8, мелодия [thisNote], noteDuration); // чтобы различать ноты, установите минимальное время между ними. // продолжительность заметки + 30% вроде бы работает:int pauseBetweenNotes =noteDuration * 1.30; задержка (pauseBetweenNotes); noTone (8); // останавливаем воспроизведение тона:} // конец forSong5title (); } // завершаем цикл Song5 
pitches.h Arduino
Библиотека нот к песням. Сохраните в той же папке, что и другие наброски клавиатуры / песни.
 // ******************************* ***************** // ** ОПРЕДЕЛЕНИЕ МУЗЫКАЛЬНЫХ ЗАПИСЕЙ // ************************ ************************* # определить NOTE_B0 31 # определить NOTE_C1 33 # определить NOTE_CS1 35 # определить NOTE_D1 37 # определить NOTE_DS1 39 # определить 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 #defin NOTE_CS3 139 #defin NOTE_D3 147 #defin 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 #defin NOTE_AS3 233 #defin NOTE_B3 247 #defin NOTE_C4 262 #defin 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 #defin NOTE_C5 523 # define NOTE_CS5 554 #define NOTE_D5 587 #defin NOTE_DS5 622 #define NOTE_E5 659 # define # NOTE_ define NOTE_FS5 740 #define NOTE_G5 784 # define NOTE_GS5 831 #define NOTE_A5 880 #define NOTE_AS5 932 #defin NOTE_B5 988 #defin NOTE_C6 1047 # define NOTE_CS6 1109 #define NOTE_D6 1175 # define NOTE_DS6 1245 # define NOTE_E6 1319 #define_F6 1397 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 279460 # define # NOTE_FS7 define NOTE_G7 3136 # define NOTE_GS7 3322 # define NOTE_A7 3520 #defin NOTE_AS7 3729 #defin NOTE_B7 3951 #defin NOTE_C8 4186 # define NOTE_CS8 4435 #defin NOTE_D8 4699 #defin NOTE_DS8 4978 

Схема


Производственный процесс

  1. Начало работы с TJBot
  2. Сигнал тревоги для растений, предупреждающий о жажде
  3. Итальянские часы со словами
  4. Arduino + светодиоды + MIDI-клавиатура + MuseScore =Piano Tutor
  5. Простой датчик препятствий с Arduino
  6. Счетчик кВтч Sigfox
  7. Монитор температуры Bluetooth
  8. Мини-стерео радио с RDA5807
  9. Блокировка, управляемая жестами
  10. Измерьте время реакции