×

如何连接压电蜂鸣器/扬声器以便在按下按钮时播放铃铛

消耗积分:0 | 格式:zip | 大小:0.27 MB | 2022-11-01

123

分享资料个

描述

专为使用 beta 6.0(2021 年 11 月 4 日发布)而设计的项目。创建于 2022 年 1 月 6 日

在这个项目中,我们将学习如何连接压电蜂鸣器/扬声器,以便在按下按钮时播放铃铛。

如果您没有按钮,该项目应该很容易修改以删除按钮。

Meadow.Foundation是一个在 Meadow 上使用 .NET 快速轻松地构建连接事物的平台。它由Wilderness Labs 创建,完全开源并由 Wilderness Labs 社区维护。

如果您是使用 Meadow 的新手,我建议您通过控制板载 RGB LED 项目来使用 Meadow 入门,以正确设置您的开发环境。

第 1 步 - 组装威廉希尔官方网站

连接所有组件,如下面的 Fritzing 图中所示:

 

pYYBAGNfLgeAKkHzAAHlmWSaax8490.png
 

 

注意压电扬声器威廉希尔官方网站 上使用的电阻器。这会降低音量。电阻越高,音量越低。

第 2 步 - 创建 Meadow 应用程序项目

在适用于 Windows 或 macOS 的 Visual Studio 2019 或 2022 中创建新的MeadowApplication项目。

第 3 步 - 编写代码

这是从 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 毫秒是一个节拍。

第 4 步 - 运行项目

单击Visual Studio中的“运行”按钮。它应该像以下视频一样工作:

 

 


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

评论(0)
发评论

下载排行榜

全部0条评论

快来发表一下你的评论吧 !

'+ '

'+ '

'+ ''+ '
'+ ''+ ''+ '
'+ ''+ '' ); $.get('/article/vipdownload/aid/'+webid,function(data){ if(data.code ==5){ $(pop_this).attr('href',"/login/index.html"); return false } if(data.code == 2){ //跳转到VIP升级页面 window.location.href="//m.obk20.com/vip/index?aid=" + webid return false } //是会员 if (data.code > 0) { $('body').append(htmlSetNormalDownload); var getWidth=$("#poplayer").width(); $("#poplayer").css("margin-left","-"+getWidth/2+"px"); $('#tips').html(data.msg) $('.download_confirm').click(function(){ $('#dialog').remove(); }) } else { var down_url = $('#vipdownload').attr('data-url'); isBindAnalysisForm(pop_this, down_url, 1) } }); }); //是否开通VIP $.get('/article/vipdownload/aid/'+webid,function(data){ if(data.code == 2 || data.code ==5){ //跳转到VIP升级页面 $('#vipdownload>span').text("开通VIP 免费下载") return false }else{ // 待续费 if(data.code == 3) { vipExpiredInfo.ifVipExpired = true vipExpiredInfo.vipExpiredDate = data.data.endoftime } $('#vipdownload .icon-vip-tips').remove() $('#vipdownload>span').text("VIP免积分下载") } }); }).on("click",".download_cancel",function(){ $('#dialog').remove(); }) var setWeixinShare={};//定义默认的微信分享信息,页面如果要自定义分享,直接更改此变量即可 if(window.navigator.userAgent.toLowerCase().match(/MicroMessenger/i) == 'micromessenger'){ var d={ title:'如何连接压电蜂鸣器/扬声器以便在按下按钮时播放铃铛',//标题 desc:$('[name=description]').attr("content"), //描述 imgUrl:'https://'+location.host+'/static/images/ele-logo.png',// 分享图标,默认是logo link:'',//链接 type:'',// 分享类型,music、video或link,不填默认为link dataUrl:'',//如果type是music或video,则要提供数据链接,默认为空 success:'', // 用户确认分享后执行的回调函数 cancel:''// 用户取消分享后执行的回调函数 } setWeixinShare=$.extend(d,setWeixinShare); $.ajax({ url:"//www.obk20.com/app/wechat/index.php?s=Home/ShareConfig/index", data:"share_url="+encodeURIComponent(location.href)+"&format=jsonp&domain=m", type:'get', dataType:'jsonp', success:function(res){ if(res.status!="successed"){ return false; } $.getScript('https://res.wx.qq.com/open/js/jweixin-1.0.0.js',function(result,status){ if(status!="success"){ return false; } var getWxCfg=res.data; wx.config({ //debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。 appId:getWxCfg.appId, // 必填,公众号的唯一标识 timestamp:getWxCfg.timestamp, // 必填,生成签名的时间戳 nonceStr:getWxCfg.nonceStr, // 必填,生成签名的随机串 signature:getWxCfg.signature,// 必填,签名,见附录1 jsApiList:['onMenuShareTimeline','onMenuShareAppMessage','onMenuShareQQ','onMenuShareWeibo','onMenuShareQZone'] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2 }); wx.ready(function(){ //获取“分享到朋友圈”按钮点击状态及自定义分享内容接口 wx.onMenuShareTimeline({ title: setWeixinShare.title, // 分享标题 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享给朋友”按钮点击状态及自定义分享内容接口 wx.onMenuShareAppMessage({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 type: setWeixinShare.type, // 分享类型,music、video或link,不填默认为link dataUrl: setWeixinShare.dataUrl, // 如果type是music或video,则要提供数据链接,默认为空 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到QQ”按钮点击状态及自定义分享内容接口 wx.onMenuShareQQ({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到腾讯微博”按钮点击状态及自定义分享内容接口 wx.onMenuShareWeibo({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到QQ空间”按钮点击状态及自定义分享内容接口 wx.onMenuShareQZone({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); }); }); } }); } function openX_ad(posterid, htmlid, width, height) { if ($(htmlid).length > 0) { var randomnumber = Math.random(); var now_url = encodeURIComponent(window.location.href); var ga = document.createElement('iframe'); ga.src = 'https://www1.elecfans.com/www/delivery/myafr.php?target=_blank&cb=' + randomnumber + '&zoneid=' + posterid+'&prefer='+now_url; ga.width = width; ga.height = height; ga.frameBorder = 0; ga.scrolling = 'no'; var s = $(htmlid).append(ga); } } openX_ad(828, '#berry-300', 300, 250);