c++ - 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 一直亮着。
解决方案
当 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);
}
推荐阅读
- html - 如何在柔性显示中居中图像?
- amazon-web-services - 即使在添加 ICMP 入站规则后也无法 PING EC2 实例
- python - 使用 sqlalchemy 从 Python 连接 MySQL,mysql+mysqldb 适用于 Windows+Ubuntu 但不适用于 RHEL
- php - sitemap_index.xml 正在重定向到 404 页面
- swift - Xcode 问题 AppDelegate 与 Firebase - 'NSPersistentCloudKitContainer'
- contiki-process - 如何在节点之间共享数据
- linux - 如何处理一行bash命令中的多个引号?
- scala - Spark / Scala - RDD填充最后一个非空值
- sql - 想要在使用聚合函数时添加第三列,不属于 group by
- html - Django 并排显示 2 个表格