Arduino压力传感器在旋律C 中跳过音符

arduino pressure sensor skips notes in melody C++

本文关键字:音符 旋律 压力 传感器 Arduino      更新时间:2023-10-16

代码要做的是:当您按下时,它会一直播放音符[0],直到停止对其施加压力为止。比下一次按下它,它会播放注释[1],直到您停止向其施压为止。接下来,按下它会播放注意[2],直到您停止向其施压,依此类推。(注意[] = 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一直点燃。

当alagread()()返回200到250的东西而无需播放音符时,您会增加计数器。要解决此问题,请在两个呼叫上使用相同的阈值(即检查> 200 and&lt; = 200,而不是> 200 and&lt; 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 (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);
}