×

适合3.7电子纸显示器的时钟

消耗积分:0 | 格式:zip | 大小:0.03 MB | 2023-02-03

分享资料个

描述

加速

电子纸屏幕特别适合显示时间较长后才发生变化的内容。所以我认为时钟非常适合这款 3.7" 电子纸显示器。

注意:该软件处于 BETA 阶段,被认为是第一个运行的版本。我分享它是为了让您可以扩展、改进它或使用它的一部分,并使其与非常相似的项目兼容。

通过 SPI 接口连接到 ESP32 的显示器由GxEPD2 库驱动,字体由 U8g2_for_Adafruit_GFX 库提供,其方法在 GxEPD2 的图片循环(分页绘图)中工作。

时间信息从设置中的公共 ntp (网络时间协议)服务器接收,然后复制到 updateTime() 中名为 timeinfo 的时间结构(struct tm)。诚然,我在编程方面的知识为零,因此可以更有效、更智能地对时间同步进行编程。我使用 strftime 函数为时、分和秒生成三个字符串,然后将它们转换回整数。一旦开始,此时的秒数就会从时钟通常等待的分钟数中减去,直到它将时间更新为下一分钟并刷新显示。这意味着假设时间正好是 11:11:50,时钟只会等待 10 秒,然后切换到下一分钟。

这是几秒钟的样子:

 

char timeSek[3];
strftime(timeSek,3, "%S", &timeinfo);
int s = atoi(timeSek);
startMillis -= s * 1000;

 

此外,时间以 12 小时格式的表达式表示除了默认情况下以 24 小时格式显示的完整小时数)。0点和12点都印成“Twelfe o'clock”。当然,您必须使 Words(int h, int m) 函数中的数字和单词适应您的语言。为了将时间信息转换为字符串,我使用 sprintf()连接数字和其他单词并将它们保存到全局 char 数组(在范围内初始化包含时间短语的 char 数组会更好吗?)。然而,数字需要很大的闪存大小。

例子:

 

else if (m <= 30){
sprintf(words,"%s past%s", nums[m], nums[h % 12]);
} 

 

显示文本的实际功能与 GxEPD2 库的示例非常相似。请注意,文本始终位于中间,而 y 坐标是字符的底部(例如“g”向下超出该 y 坐标)。由于我后来决定实现字体在两种不同大小之间切换,具体取决于时间的表达时间,部分窗口将始终设置为涵盖字体大小和显示的完整宽度的大小。如 showClock() 所示,我确保部分窗口的坐标是八的倍数。我不确定哪些坐标必须符合此规则,这就是为什么我将所有坐标四舍五入为 8 的倍数(请看下面的代码)。字体 (const uin8_t) 作为指针传递给函数 void showText(char name[], const uint8_t *font)。

坐标 (0, 0) 在左上角。Y 从上到下递增。

在显示时钟()中:

 

int px = rx - r;//middlepoint-radius
px = px - (px % 8);//round down to multiple of eight 
int py = ry - r;
py = py - (py % 8);  
int pw = r*2;pw = pw - (pw % 8) + 8 * 2;//roundupint 
ph = r*2;ph = ph - (ph % 8) + 8 * 2;

 

如果您的面板不支持部分刷新,请将该行更改为 display.setFullWindow()。为了清洁显示器,这种完全刷新每隔一小时就会发生一次。

为了打印模拟时钟,我使用了 sin() 和 cos() 。所有参数均采用径向单位。例如,分钟时钟指针每分钟移动 1/30 π ,相当于 6 度 = 360 度/60。该库使绘制直线和圆成为可能。

时钟指针末端的坐标:

 

const float pi = PI
float ah = (float)h * 1/6.0000000 * pi + (float)m * (1/360.0000000 * pi);
float am = m * 1/30.00000000 * pi; 
int shx = round(sin(ah) * ((float)r-8) / 1.600);
int shy = round(cos(ah) * ((float)r-8) / 1.600);
int smx = round(sin(am) * ((float)r-8));
int smy = round(cos(am) * ((float)r-8));

 

我试图使 showClock 函数具有可扩展性,因此至少在某种程度上您应该能够更改圆形时钟的位置和半径。

当然,这个项目可以用另一个与 GxEPD2 库兼容的电子纸面板来制作。

我认为这个项目的结果非常好。但是,在软件方面还有很多需要改进的地方。更好的解决方案还应该具有深度睡眠功能。结合需要很少能量的电子纸技术,时钟可以在电池上运行很长时间。

我希望我能给你一些启发。

------许可:------------------------------------

辛格杰姆

GNU 许可证:查看所有原始代码:GxEPD2:https://github.com/ZinggJM/GxEPD2。提供使用和修改示例的库 GxEPD2 的作者

https://github.com/ZinggJM/GxEPD2/blob/master/LICENSE

---------------------------------------------- ------

奥利弗·克劳斯

BSD 许可证:查看所有原始代码:https://github.com/olikraus/U8g2_for_Adafruit_GFX。U8g2 字体库的作者。参见确切的 c。注意事项:

https://github.com/olikraus/U8g2_for_Adafruit_GFX/blob/master/LICENSE

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

评论(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.lene-v.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:'适合3.7电子纸显示器的时钟',//标题 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.lene-v.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);