Проект 9. Гитара
Мы сделаем особую гитару, где воспроизводимый звук будет задаваться датчиком расстояния. Передвигая одну руку перед датчиком и нажимая кнопку проигрывания другой рукой, мы сможем воспроизводить самые разные мелодии.
Программирование:
Вложенные ветвления: if else
Практика
Сделать гитару, работающую следующим образом: при нажатии кнопки на Keypad воспроизводится звук, частота которого зависит от значения датчика расстояния. Частота звука должна соответствовать определённой ноте.
Нота | Частота ноты |
- | noTone |
До | 523 |
Ре | 587 |
Ми | 659 |
Фа | 698 |
Соль | 784 |
Ля | 880 |
Си | 980 |
Игра на гитаре осуществляется с помощью движения руки вдоль датчика расстояния и нажатия кнопок на KeyPad.
Например: если расстояние больше 20см, проигрывать ноту “до”. Если расстояние от 18см до 20см проигрывать ноту “ре” и т.д.
Дополнительное задание
Добавьте в программу извлечение промежуточных нот (диез, бемоль), которые будут извлекаться по нажатию другой кнопки на Keypad, но привязаны к тем же значениям в сантиметрах, что и базовая нота.
нота |
частота ноты по октавам |
вторая |
третья |
четвёртая |
- |
notone |
до |
523 |
1046 |
2093 |
ре |
587 |
1174 |
2349 |
ми |
659 |
1318 |
2637 |
фа |
698 |
1396 |
2739 |
соль |
784 |
1568 |
3136 |
ля |
880 |
1720 |
3440 |
си |
980 |
1975 |
3951 |
Решение
Мы рекомендуем сначала освоить материал и попробовать сделать программу самостоятельно! А потом проверить себя, посмотрев наш вариант решения:
Основная программа
#include <Eryoma.h>
Eryoma eryoma;
void setup() {
pinMode(A14, OUTPUT);
eryoma.setupConnector(ePort4, Keypad);
eryoma.setupConnector(ePort2, Ultrasonic);
}
void loop() {
int buttonD1 = eryoma.read(ePort4, D1);
int distance = eryoma.read(ePort2);
if (distance > 27 && buttonD1 == 0) tone(A14, 523);
else if (distance > 25 && buttonD1 == 0) tone(A14, 587);
else if (distance > 23 && buttonD1 == 0) tone(A14, 659);
else if (distance > 21 && buttonD1 == 0) tone(A14, 698);
else if (distance > 19 && buttonD1 == 0) tone(A14, 784);
else if (distance > 17 && buttonD1 == 0) tone(A14, 880);
else if (distance > 15 && buttonD1 == 0) tone(A14, 988);
else noTone(A14);
delay(50);
}
Дополнительное задание
#include <Eryoma.h>
Eryoma eryoma;
void setup() {
pinMode(A14, OUTPUT);
eryoma.setupConnector(ePort4, Keypad);
eryoma.setupConnector(ePort2, Ultrasonic);
}
void loop() {
int buttonD1 = eryoma.read(ePort4, D1);
int buttonD0 = eryoma.read(ePort4, D0);
int distance = eryoma.read(ePort2);
if (buttonD1 == 0 || buttonD0 == 0) {
if (buttonD1 == 0) {
if (distance > 27) tone(A14, 523);
else if (distance > 25) tone(A14, 587);
else if (distance > 23) tone(A14, 659);
else if (distance > 21) tone(A14, 698);
else if (distance > 19) tone(A14, 784);
else if (distance > 17) tone(A14, 880);
else if (distance > 15) tone(A14, 988);
else noTone(A14);
}
if (buttonD0 == 0) {
if (distance > 27) tone(A14, 554);
else if (distance > 25) tone(A14, 622);
else if (distance > 21) tone(A14, 740);
else if (distance > 19) tone(A14, 831);
else if (distance > 19) tone(A14, 932);
else noTone(A14);
}
} else {
noTone(A14);
}
delay(50);
}