Датчик давления Arduino пропускает заметки в мелодии C ++ - PullRequest
0 голосов
/ 22 февраля 2019

Код предназначен для следующего: когда вы нажимаете, он продолжает воспроизводить ноту [0], пока вы не перестанете оказывать на нее давление.Затем, когда вы в следующий раз нажмете на него, будет воспроизводиться нота [1], пока вы не перестанете нажимать на нее.Следующее нажатие воспроизводит ноту [2] до тех пор, пока вы не перестанете нажимать на нее и так далее.(note [] = mariomelody [])

Кто-нибудь знает, почему он может работать неправильно?

Я получаю разные заметки каждый раз, когда кладу, нажимаю, но япришел к выводу, что он продолжает пропускать заметки.

Мой код:

int buttonPin = 12;
int buzzerPin = 8;

int ledPin = 7;
int pressurePin = A0;

void setup()
{
  // put your setup code here, to run once:
  pinMode(ledPin, OUTPUT);
  pinMode(buzzerPin, OUTPUT);
}


void loop()
{
  // put your main code here, to run repeatedly:

  for (int i = 0; i < sizeof(mariomelody) / sizeof(mariomelody[0]); i++)
  {
     while (analogRead(pressurePin) < 200)
    {
      digitalWrite(ledPin, LOW);
    }
    while (analogRead(pressurePin) > 250)
    {
      digitalWrite(ledPin, HIGH);
      tone(buzzerPin, mariomelody[i], 20);
    }
  }

mariomelody - это просто массив целых чисел для частот, которые производят правильный звук.Массив на 110% не проблема ...

РЕДАКТИРОВАТЬ:

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

1 Ответ

0 голосов
/ 22 февраля 2019

Вы увеличиваете свой счетчик, когда analogRead () возвращает что-то между 200 и 250 без воспроизведения ноты.Чтобы исправить это, используйте одинаковое пороговое значение для обоих вызовов (т. Е. Проверьте> 200 и <= 200 вместо> 200 и <250). </p>

Другая возможная проблема заключается в том, что ваш датчик давления подпрыгивает.Вы можете обернуть свои analogRead () в функции, как показано ниже, чтобы предотвратить это:

void read_dbnc_low(int pin)
{
  while (1) {
    if (analogRead(pin) < 200) {
      delay(1); // 1ms

      if (analogRead(pin) < 200) {
        delay(1);  // 1ms

        if (analogRead(pin) < 200) {
          return;
        }
      }
    }
  }
}

void read_dbnc_high(int pin)
{
  while (1) {
    if (analogRead(pin) >= 200) {
      delay(1); // 1ms

      if (analogRead(pin) >= 200) {
        delay(1);  // 1ms

        if (analogRead(pin) >= 200) {
          return;
        }
      }
    }
  }
}

и изменить цикл for:

for (int i = 0; i < sizeof(mariomelody) / sizeof(mariomelody[0]); i++)
{
  read_dbnc_low(pressurePin);
  digitalWrite(ledPin, LOW);
  read_dbnc_high(pressurePin);
  digitalWrite(ledPin, HIGH);
  tone(buzzerPin, mariomelody[i], 20);
}
...