专为使用 beta 6.0(2021 年 11 月 4 日发布)而设计的项目。创建于 2022 年 1 月 6 日
在这个项目中,我们将学习如何连接压电蜂鸣器/扬声器,以便在按下按钮时播放铃铛。
如果您没有按钮,该项目应该很容易修改以删除按钮。
Meadow.Foundation是一个在 Meadow 上使用 .NET 快速轻松地构建连接事物的平台。它由Wilderness Labs 创建,完全开源并由 Wilderness Labs 社区维护。
如果您是使用 Meadow 的新手,我建议您通过控制板载 RGB LED 项目来使用 Meadow 入门,以正确设置您的开发环境。
连接所有组件,如下面的 Fritzing 图中所示:
注意压电扬声器电路上使用的电阻器。这会降低音量。电阻越高,音量越低。
在适用于 Windows 或 macOS 的 Visual Studio 2019 或 2022 中创建新的MeadowApplication项目。
这是从 Meadow F7 Micro 板的旧样本中获取的,并针对最新的基础课程进行了更新。原始项目在这里:https ://github.com/SuavePirate/Meadow-Piezo-JingleBells
类成员和构造函数:
RgbPwmLed onboardLed;
private IPwmPort pwm;
PiezoSpeaker speaker;
PushButton button;
const string NOTES = "eeeeeeegcdefffffeeeeddedgeeeeeeegcdefffffeeeggfdc ";
readonly int[] BEATS = { 1, 1, 2, 1, 1, 2, 1, 1, 1, 1, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2,
1, 1, 2, 1, 1, 2, 1, 1, 1, 1, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 6, 1};
const int TEMPO = 300;
bool playing = false;
public MeadowApp()
{
Initialize();
PlayNote('c', 50).Wait();
PlayJingleBells().ConfigureAwait(false);
}
初始化扬声器、按钮和板载 LED:
void Initialize()
{
Console.WriteLine("Initialize hardware...");
onboardLed = new RgbPwmLed(device: Device,
redPwmPin: Device.Pins.OnboardLedRed,
greenPwmPin: Device.Pins.OnboardLedGreen,
bluePwmPin: Device.Pins.OnboardLedBlue,
3.3f, 3.3f, 3.3f,
Meadow.Peripherals.Leds.IRgbLed.CommonType.CommonAnode);
pwm = Device.CreatePwmPort(Device.Pins.D04, 100, .5f, true);
speaker = new PiezoSpeaker(pwm);
button = new PushButton(Device, Device.Pins.D01);
button.Clicked += (o, e) => { playing = !playing; };
}
我们使用按钮按下的事件模式,它只是设置一个变量,主歌曲循环查看开始/停止。
您将需要一个功能来播放给定持续时间的音符,我们将使用此功能与音乐同步打开和关闭板载 LED:
private async Task PlayNote(char note, int duration)
{
char[] names = { 'c', 'd', 'e', 'f', 'g', 'a', 'b'};
int[] tones = { 523, 587, 659, 698, 783, 880, 987 };
Color[] colors = { Color.Red, Color.Green, Color.White, Color.Blue, Color.Yellow, Color.Orange, Color.Purple };
// play the tone corresponding to the note name
for (int i = 0; i < names.Length; i++)
{
if (names[i] == note)
{
var tone = tones[i];
onboardLed.SetColor(colors[i], .25f);
onboardLed.IsOn = true;
await speaker.PlayTone(tone, duration);
onboardLed.IsOn = false;
Console.WriteLine($"Playing note {note} tone {tone} for {duration}");
}
}
}
这是播放整首歌曲的功能:
protected async Task PlayJingleBells()
{
while (true)
{
if (playing)
{
Console.WriteLine("Playing jingle bells!");
for (int i = 0; i < NOTES.Length && playing; i++)
{
if (NOTES[i] == ' ')
{
await Task.Delay(BEATS[i] * TEMPO); // rest
}
else
{
await PlayNote(NOTES[i], BEATS[i] * TEMPO);
// pause between notes
await Task.Delay(BEATS[i] * TEMPO / 2);
}
}
Console.WriteLine("From the top!");
}
else
{
// Slow the infinite loop down or the button interrupt breaks
await Task.Delay(TEMPO);
}
}
}
此循环以指定的节拍数播放每个音符并乘以速度。在我们的例子中,300 毫秒是一个节拍。
单击Visual Studio中的“运行”按钮。它应该像以下视频一样工作:
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
全部0条评论
快来发表一下你的评论吧 !