Проект 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);
}