arduino压力传感器跳过旋律C ++中的注释

时间:2019-02-22 08:50:33

标签: c++ for-loop while-loop arduino

应该执行的代码是:按下时,它会一直演奏音符[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%,不是问题...

编辑:

附加上下文: 我按一下它发出声音,我有点按住它,所以LED仍然亮着,但是声音停止了。当我再按一点时,它会弹出不同的音符,但LED一直亮着。

1 个答案:

答案 0 :(得分:2)

当AnalogRead()返回200到250之间的某个值而不播放音符时,您可以增加计数器。要解决此问题,请在两个通话中使用相同的阈值(即检查> 200和<= 200,而不是> 200和<250)。

另一个可能的问题是压力传感器在弹跳。您可以将您的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);
}