×

为Nerdy Stats设置一个带有PiTFT显示器的Pi-hole

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

分享资料个

描述

最近,我发布了一个完整的教程,告诉您如何在整个网络上设置 Pi-hole 以进行全网广告拦截今天,我将通过向您展示如何使用PADD将显示添加到您的设置中以进行监控和统计来对此进行一些扩展

你需要什么

对于本指南,您需要运行我们在原始指南中使用的@klutchell的 balenaCloud项目上的 Pi-hole 该项目已经包含了我们设置和运行显示所需的所有附加软件组件。如果您还没有用这个项目设置您的 Raspberry Pi,请转到并完成指南,然后返回,我们可以继续进行显示设置。

接下来,我们将需要某种用于 Raspberry Pi 的显示器。在原始教程中,我使用了 Raspberry Pi 3B+,因此我使用的是Adafruit PiTFT 3.5” 这是一种相当常见的显示器,可从几个不同的供应商处获得,因此如果您需要的话应该不会太难获得。除了Adafruit 本身,还可以看看Pimoroni PiSupplyDigi-Key

 
Adafruit PiTFT 3.5
Adafruit PiTFT 3.5"
 

虽然这个项目没有严格要求,但我想要一个漂亮的案例来展示我桌上的设备。我在 Thingiverse 上找到了arcmattPi TFT plus Console Case ,它旨在将 Pi 和 Adafruit 屏幕一起放置在一个整洁的小型 3D 打印外壳中。

 
pYYBAGOuN_qAJT7WAACtjveHIJE553.png
3D 打印前在 Cura 中布置的外壳部件
 

该案例有一个很酷的功能,您可以暂停打印并在恢复之前插入一些固定的 M2.5 螺母。这意味着您在组装外壳部件时可以获得非常好的和安全的固定装置。此外,该设计还包括用于打印底座的选项,该底座包括用于冷却 Pi 的风扇(如果需要)。

 
poYBAGOuN_2AaAkbAAMWZsB79WU601.jpg
使用我的 Ender 3 进行 3D 打印
 

对于我自己的项目,我决定打印包含 40 毫米风扇空间的模型。为此,您需要获得一个 5V 风扇,然后您可以使用与 Pi 相同的电源驱动该风扇。

如果您无法使用 3D 打印机,请查看 Pimoroni 的Pibow PiTFT+ ,它也可从Adafruit获得

如果您有兴趣观看案例构建,我们于 2019 年 3 月 1 日在我们的Twitch 频道@balenaio上直播了该案例的组装和软件安装。它已存档在我们的YouTube 频道上,也包含在下面。

 

显示配置

既然您已经按照我们的原始指南进行操作,那么启用统计信息显示几乎没有什么可做的了。

Pi-hole 项目已经包含PADD软件,但只有当它检测到连接到系统的 PiTFT 显示器时才会启用。因此,要启动并运行它,我们只需要在 balenaCloud 仪表板中添加几个配置变量,告诉系统加载屏幕驱动程序并设置正确的分辨率。

以下所有值都应在 balenaCloud的设备配置中设置。

 
pYYBAGOuOACACYwMAAA-5-lOMM8052.png
 

在您设置这些配置变量并重新启动设备后,软件应该会检测到显示器并自动启用 PADD 输出。您应该得到如下所示的输出。

微调

现在显示器已启动并运行,我们可以对输出进行一些微调,以使其利用完整的显示器并看起来更好一些。

由于控制台默认使用小字体,因此输出非常压缩。我们可以通过在设备上编辑文件来更改字体大小以扩展输出。/mnt/boot/cmdline.txt

 
poYBAGOuOAKAFbwxAABCa4qBq0A535.png
 

编辑此文件以包含fbcon=font:VGA8x16rootwait;之后 确保您在它们之间保持一定距离。

 
poYBAGOuOAWAVEDpAAAlTKXJMXA911.png
 

保存您的更改并重新启动,然后您应该会在显示屏上看到如下所示的内容。

 
pYYBAGOuOAiAGHdeAAJM-p6y0TU370.jpg
 

这在可读性方面要好一些,但遗憾的是现在输出对于我们的显示来说太大了,前几行已经被截掉了。我在上面的配置部分提到 HDMI 输出被复制(通过fbcp)到 PiTFT 显示器。为了在显示器上获得更多线条,我们可以以稍高的分辨率驱动它。这样做的缺点是像素映射将不再是 1:1,因此显示效果不会那么清晰,但好处是整个输出将适合屏幕。

为此,我们需要将垂直分辨率从320增加到368,从而为我们提供额外的 3 行显示输出。更改RESIN_HOST_CONFIG_hdmi_cvt480 368 60 1 0 0 0,注意分辨率的变化。

最后一次重新启动后,您应该会得到如下所示的输出。

 
pYYBAGOuOAyAaUjTAAJkPYuvIDM699.jpg
 

这就是这个项目。对于未来的一点补充,我计划实施显示背光超时,并在您需要查看信息时利用触摸屏将其唤醒。当它发生时,这将被推送到同一个项目回购,所以确保你保持最新!


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

评论(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:'为Nerdy Stats设置一个带有PiTFT显示器的Pi-hole',//标题 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);