arduino - 你怎么能让arduino从sd卡播放wav文件?
问题描述
我的朋友有这个问题,想用一个带有距离传感器的arduino来检测一定范围内的移动物体,并根据物体是否在移动区域的后半部分从SD卡播放两种不同的声音,或在前半部分。我们面临的问题是我们需要将 SD 卡连接到 arduino,但由于我们都没有使用 arduino 先进,我们不确定我们做错了什么。编码:
#include "Arduino.h"
#include "TMRpcm.h"
#include "SD.h"
// Max dist of movement
int d = 450; //Max distance in cm
#if !defined(SD_ChipSelectPin)
#define SD_ChipSelectPin 4
#endif
// Pins for the sensor.
int trig = 11; // Attach Trig of ultrasonic sensor to pin 11
int echo = 10; // Attach Echo of ultrasonic sensor to pin 10
TMRpcm track1;
TMRpcm track2;
void setup() {
if (!SD.begin(SD_ChipSelectPin)) {
Serial.println("SD Card failed!");
// stop if no SD detected
return;
}
track1.play("001.wav");
track1.loop(1);
track2.play("002.wav");
track2.loop(1);
track1.speakerPin = 9;
track2.speakerPin = 9;
}
void loop()
{
long duration, cm;
pinMode(trig, OUTPUT);
digitalWrite(trig, LOW);
delayMicroseconds(2);
digitalWrite(trig, HIGH);
delayMicroseconds(5);
digitalWrite(trig, LOW);
pinMode(echo, INPUT);
duration = pulseIn(echo, HIGH);
cm = microsecondsToCentimeters(duration);
delay(1);
if (cm>(d/2)) { // Play soundtrack 1
track1.setVolume((d-cm)/2.25);
track2.setVolume(0);
}
else { //Play soundtrack 2
track2.setVolume((225-cm)/2.25);
track1.setVolume(0);
}
}
long microsecondsToCentimeters(long microseconds)
{
// The speed of sound is 340 m/s or 29 microseconds per centimeter.
// The ping travels out and back, so to find the distance of the
// object we take half of the distance travelled.
return microseconds / 29 / 2;
}
我们收到的当前错误是:
Arduino: 1.8.5 (Mac OS X), Board:"Arduino/Genuino Uno"
/Users/marinaveldhuizen/Downloads/Marina/Marina.ino:93:8: warning: extra tokens at end of #endif directive
#endif }
^
/Users/marinaveldhuizen/Downloads/Marina/Marina.ino: In function 'void setup()':
/Users/marinaveldhuizen/Downloads/Marina/Marina.ino:20:23: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]
track1.play("001.wav");
^
/Users/marinaveldhuizen/Downloads/Marina/Marina.ino:22:23: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]
track2.play("002.wav");
^
/Users/marinaveldhuizen/Downloads/Marina/Marina.ino: In function 'long int microsecondsToCentimeters(long int)':
Meerdere bibliotheken gevonden voor "SD.h"
Marina:87: error: 'SD_ChipSelectPin' was not declared in this scope
if (!SD.begin(SD_ChipSelectPin)) {
^
/Users/marinaveldhuizen/Downloads/Marina/Marina.ino:90:5: warning: return-statement with no value, in function returning 'long int' [-fpermissive]
return;
^
Marina:111: error: a function-definition is not allowed here before '{' token
void setup() {
^
Marina:186: error: expected '}' at end of input
}
^
Marina:186: error: expected '}' at end of input
Gebruikt: /Users/marinaveldhuizen/Desktop/Arduino.app/Contents/Java/libraries/SD
Niet gebruikt: /Users/marinaveldhuizen/Documents/Arduino/libraries/SD-master
exit status 1
'SD_ChipSelectPin' was not declared in this scope
我觉得我们正确定义了 SD_ChipSelectPin,但是错误一直说它没有声明等。有谁知道如何解决这个问题,以及这段代码中是否还有其他我们可能面临的错误(如果是的话,如何我们能解决它们吗)?
解决方案
我刚刚编译了你的草图没有问题。我认为您安装了多个 SD 库,并且 IDE 感到困惑。尝试从/Users/marinaveldhuizen/Documents/Arduino/libraries/SD-master
Arduino IDE 中删除 SD 库并重新启动。你也可以尝试改变
#if !defined(SD_ChipSelectPin)
#define SD_ChipSelectPin 4
#endif
至
#ifndef SD_ChipSelectPin
#define SD_ChipSelectPin 4
#endif
否则尝试重命名/Users/marinaveldhuizen/Documents/Arduino/
文件夹并重新安装 Arduino IDE 和 TMRpcm 库。
推荐阅读
- windows - 从命令提示符设置打印机默认双面打印 - Windows 10
- android - 在 onBindViewHolder 中执行异步方法
- delphi - Delphi XE3:Webbrowser:使用文本填充 setattribute,但使用变量不起作用
- php - jQuery Ajax 仅适用于 while 循环中的第一个结果
- javascript - 插入 html 和更改显示样式属性之间的速度差异
- c# - 我可以让 NullReferenceException 更清楚吗?
- electron - ElectronJS 多显示器
- c# - 尝试使用 Equirectangular Projection 将 2D 坐标转换为 3D 坐标。但是失败了。我究竟做错了什么?
- python - Python:何时处理异常
- java - 返回一个回文字符串,它不是预期的。背后的机制是什么