×

由电池供电的点击记录器构建

消耗积分:0 | 格式:zip | 大小:0.00 MB | 2023-07-11

张敏

分享资料个

描述

你有没有想过记录你的点击?无论您是在数数、为您的马拉松比赛计时还是只是为了好玩,我都在不到十分钟的时间内完成了这个很酷的小项目。我使用连接到按钮的 Hexabitz uSD 卡模块 (H1BR60),并由纽扣电池座模块 (H04R20) 供电。点击愉快!

poYBAGOpc72ADdGlAA2hUjeBO94837.jpg
 
1 / 2
 

它是什么?

这个项目是一个电池供电的点击记录器。您将获得有关点击的视觉指示和美元卡日志。它使用 2 节串联的 CR2032 纽扣锂电池供电。他们应该持续几个小时。当然,你也可以使用其他类型的电池,但我只是把它们放在身边,想用在一些很酷的地方:) 

预计硬件构建时间:5 分钟 

预计软件开发时间:5 分钟

代码说明:

这个项目代码很简单。我定义了一个按钮和一个基于事件的日志。该按钮有两个事件回调:一个在点击时触发,另一个在3 秒按下时触发单击回调会增加一个 SRAM 变量,并在每次单击时使指示灯 LED 闪烁。每计数 10 次,LED 就会闪烁 1 秒。 

定义按钮并将其链接到它的回调,如下所示:

AddPortButton(MOMENTARY_NO, P1);               // Define a button connected to port P1
SetButtonEvents(P1, 1, 0, 3, 0, 0, 0, 0, 0);    // Activate a click event and a pressed_for_x event for 3 seconds

接下来,我创建一个基于事件的日志并记录两个变量,即按钮状态和计数器变量:

if ( CreateLog("Click Logger", EVENT, 10, FMT_TAB, FMT_SAMPLE, "Sample @ 10Hz") == H05R0_OK )
{
    LogVar("Click Logger", PORT_BUTTON, P1, "Logger");
    LogVar("Click Logger", MEMORY_DATA_UINT32, (uint32_t)&counter, "Counter");                
    // Do not reset button state after writing the log since we need it to blink LED as well!
    needToDelayButtonStateReset = true;
}

记录在第一次单击按钮时开始,并在PressedForX回调中按下按钮 3 秒时停止。按钮事件也在那里被禁用,因此您不会再看到任何日志或 LED 闪烁。

void buttonClickedCallback(uint8_t port)
{
    ++counter;
    
    if (counter == 1)    StartLog("Click Logger");
    
    if ( counter%10 == 0 ) {
        IND_blink(1000);
    } else {
        IND_blink(200);
    }
    needToDelayButtonStateReset = false;        // Reset button state now
}
void buttonPressedForXCallback(uint8_t port, uint8_t eventType)
{
    // The first PressedForX event we defined in SetButtonEvents was called    
    if (eventType == 1)
    {
        StopLog("Click Logger");
        SetButtonEvents(P1, 0, 0, 0, 0, 0, 0, 0, 0);        
        IND_blink(400); Delay_ms(400); IND_blink(400);
    }
    needToDelayButtonStateReset = false;        // Reset button state now
}

请注意我是如何使用needToDelayButtonStateReset标志来记录按钮状态并同时使用它来闪烁 LED 指示灯的。将此变量设置为false后,按钮状态将在记录后自动重置。以下是基于样本的日志的样子:

 

 
poYBAGOpc8CAWFbGAAA_thGwVd0982.png
 

 

您还可以通过将索引列格式参数替换为 FMT_TIME 来记录时间戳,如下所示:

if ( CreateLog("Click Logger", EVENT, 10, FMT_TAB, FMT_TIME, "Sample @ 10Hz") == H05R0_OK )

你得到这个日志:

 

 
pYYBAGOpc8SAfcAGAAA7bRcTbGg246.png
 

 

 

 

 

 


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

评论(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);