首页 > 解决方案 > arduino 压力传感器跳过旋律 C++ 中的音符

问题描述

代码应该做的是:当您按下时,它会一直播放 note[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 一直亮着。

标签: c++for-loopwhile-looparduino

解决方案


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

另一个可能的问题是您的压力传感器正在弹跳。您可以将您的模拟读取()包装成如下函数以防止这种情况:

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);
}

推荐阅读