×

电子纸巴士时刻表智能设备开源设计

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

370217

分享资料个

描述

概述

这个项目的目的是制作一个简单的智能设备,它可以真正改善你的早晨并减轻你的压力。我为我的女朋友开发了这个解决方案,她每天都使用公共交通工具,并且在记忆时间表、路线规划和准时方面遇到困难。这个简单的设备可以帮助任何使用公共交通工具的人检查他们最常用的公交线路的预计到达时间,并让用户保持更新。为了尽可能减少维护,该设备由锂离子电池供电,每 10 分钟唤醒一次以更新其表格,该表格显示在电子纸显示屏上,几乎可以减少功耗。

poYBAGOS5mmACPNzAAFVZYN_640020.jpg
智能巴士时刻表的所有荣耀。
 

硬件布线和低功耗技巧

通过使用 TTGO T5 esp32 epaper 模块,由于它是内置的,因此无需接线。确保购买带有正确连接器的锂离子电池,这样它就可以即插即用。您应该采取一些小技巧来降低威廉希尔官方网站 板的功耗。当你插上电源并打开电源开关时,你会看到天线附近有一个绿色的 LED 灯亮起;这个 led 直接连接到 3.3v 导轨,所以它会一直亮着,并且会消耗一些能量。要解决此问题,只需拿起烙铁并将其取下即可。

pYYBAGOS5myATi8dAACBC7admO4873.jpg
在这里,led 已被拆焊。
 

软件

项目的软件方面才是真正的事情发生的地方。该程序的流程是唤醒、连接到硬编码的 Wi-Fi 网络、连接到公共交通 API、在显示屏上打印结果并进入睡眠状态。

为了方便起见,我构建了一个struct busTable来保存行号、ETA 和一个指示预测是否正确的实时变量。

数据通过requestTo方法从 API 中提取。通过提供停靠点编号,API 返回一个包含时间表信息的 JSON 数组。正在解析此数组,数据填充 busTable 对象。

void requestTo(String stopN, busTable *table){
    client.begin("https://gpa.madbob.org/query.php?stop="+stopN);
    if(client.GET()>0){
        String payload = client.getString();
        DynamicJsonDocument doc(1500);
        deserializeJson(doc, payload);
        uint8_t arraySize = doc.size();
        for(uint8_t i = 0; i            String line = doc[i]["line"];
            String hour = doc[i]["hour"];
            bool realtime = doc[i]["realtime"]=="true"?1:0;
            table[i].line = line;
            table[i].hour = hour;
            table[i].realtime = realtime;
        }
    }
    client.end();
};>

printBusLine()方法中,在 busTable 数组中搜索特定的行号。然后将匹配的公交车打印在显示屏上:如果预测正确则为粗体,否则为普通。如果没有找到数据,则打印NO SERVICE 。

void printBusLine(String line, String endstop, int pos, busTable* table){
    display.setFont(&BOLD_FONT);
    display.setCursor(2,pos);
    display.print(endstop);
    display.setCursor(150,pos);
    int bus_n = 0;
    for(int i = 0; i < 9; i++){
        if(table[i].line == line){
            bus_n ++;
            if(table[i].realtime){
                display.setFont(&BOLD_FONT);
            }else{
                display.setFont(&DEFAULT_FONT);
            }
            if(bus_n < 4) display.print(table[i].hour+" ");
        }
    }
    if(bus_n ==0){
        display.setFont(&DEFAULT_FONT);
        display.print("NO SERVICE");
    }
}

要在你所在的城市使用它,你必须找到一个免费的公共交通 API 并从中提取数据。

为了低功耗运行,所有代码都在setup()中运行,并通过PowerOff()方法关闭。此方法关闭显示控制器,使定时器唤醒 10 分钟,然后使 MCU 进入深度睡眠。

void PowerOff(){
    display.update();
    display.powerDown();
    esp_sleep_enable_timer_wakeup(6e8);
    delay(10);
    esp_deep_sleep_start();
}

组装

为了让它看起来不那么古怪,我设计了一个简单的 3D 打印外壳,您可以根据自己的需要对其进行修改。

 

poYBAGOS5neAa7iKAAG0d9-XXLw921.jpg
 

 

接下来的发展

如果你喜欢这个项目并且想自己构建它,你可以在下面找到我的代码库和我的案例的所有 3D 文件。我想检查一下电池能用多久;我会用我的进一步测试更新你。

 


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

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