DIY硬件番茄钟

DIY硬件番茄钟

多图预警,约需流量10M。

起因

番茄工作法曾经在我搞信息学竞赛的过程中极大地增加了我的时间利用效率。
在大一下学期开始的一段时间里,我逐渐发现自己的工作效率在降低。同时而来的还有因为时间利用不充分带来的焦虑感。我也曾经尝试使用之前的番茄工作法,后来发现效果并没有那么显著了,一个重要的原因是,之前的OI需要使用电脑,使用电脑的过程正是工作的过程,于是在电脑上运行的计时软件就成为了控制工作和休息的助手,在这个过程中没有distraction。但大学的工作在电脑上做的其实属于少数,很多事情要静心地用纸笔来做,如果摆一个电脑放在面前,只运行一个计时器,实际上是一个很分心的事情。
那放在手机上可以吗?这样的手机APP也有,我也尝试过很多款,但都没有之前那种效果了。经过分析,我认为原因在于手机APP虽然能计时,但都没能实现将实时的计时信息(还剩几分钟)展示在屏幕上——这对于提醒专注是很重要的。如果要做到展示在屏幕上,就需要阻止手机休眠,保持屏幕常亮,亮三四个小时手机就没电了。
所以一个实体的番茄钟似乎是一个必然的选择。
如果是这样的呢?
Snipaste_2019-07-20_13-10-09
如图,一个秒表。事实上这个挂在淘宝上,我买了一个,然而根本用不上。最大的障碍是,它的按键是有响声的而且特别大,想在图书馆或者自习室用这种东西是不可能的。
还有一点,就是它只是单纯的计时,并不能导出计时的记录,从而也不能实现每日的工作时间统计。而这个统计对于动力的培养,个人认为是很重要的,是之前OI番茄钟之所以效果显著的一个重要原因。
根据上面的分析,我们需要一个番茄钟,满足:

  1. 绝对不能分心
  2. 弱提醒
  3. 实现工作记录的导出

满足这三点的已有产品不存在。所以有了折腾的理由了(

材料

DIY这次玩个彻底的。所有相关的硬件都自己来拼接。
不过核心问题是,单片机选哪个?屏幕选什么样的?

屏幕相中了墨水屏——特点:完全无打扰(不发光);保持上一屏幕不变不需耗电。其实也是出于对这个技术的兴趣。
然后感受了一下,墨水屏真的比其他屏幕贵多了。而且找一个开源的可以DIY的硬件套装很难。

单片机也不能乱选。比如树莓派,虽然很强大,但耗电量有点无法控制。固定几百mA的走电速度,跟开机的手机差不多。这样做出来充一次电撑不了多久。

还有一个需要考虑的因素是,对墨水屏的原生支持有没有。如果没有,不一定能做成。还要看文档是不是详细。

最终买了这个:

Snipaste_2019-07-20_13-37-13

没错,核心是一块esp8266。天生就是WiFi模块,也可以编程,功耗还有控制的方法。一般的esp8266只要10~20块,这个这么贵,是因为还板载了墨水屏的主控。

效果:

IMG_20190325_233418

官方给的例程特别强,是一个运行在esp8266上的web服务器,让esp8266连接上电脑的热点,电脑访问设在上面的服务器,就能看到一个十分友好的上传图片的界面。通过浏览器选择图片上传,还会自动对图片黑白处理,然后Steinberg抖动处理(二值化),然后上传到esp8266,显示在墨水屏上。这么复杂的操作,大部分是在浏览器端处理的,是一个js文件,十分厉害。
我不需要这么多,只需用它显示二值化图片矩阵的逻辑就可以了。读代码把这部分拽出来,调试了好久。然后还自己用mspaint把Monospace字体转化成了可以用的形式整合进了代码里。

弱提醒就是振动了。如果没有计概实验班做的那个工程项目的经验,我还真不知道这个怎么搞。实际上就是,单片机输出引脚的电压是可以在单片机里通过代码控制的,如果将这个引脚连接到一个外设上,就可以通过代码控制外设的启动和停止。然后去淘了一堆觉得可能会用到的东西:

Snipaste_2019-07-20_13-25-09

然后按照说明书把线连接一下,发现真的可以用(
然后振动就OK了,可以在代码里直接call一个函数来实现。做这个过程就感受到写代码确实可以实现很多东西((

中间出现了一些波折,第一块墨水屏就这么坏了??惨:

IMG_20190516_213116

下面的是第一块墨水屏,已经不能正常使用,症状是刷新无力,残影严重,看不清字。
最后问客服,发现是例程代码有bug,导致墨水屏长时间上电烧坏。我???

---

找客服有点心虚,因为那个排线不小心撕坏了一点(
但是排线是后来撕坏的,和墨水屏的症状应该无关。算了不找了QAQ
换了第二块墨水屏是图上上面那块,也算不错,升级了版本,刷新速度快了。

网络和服务器

esp8266可以连接固定SSID和密码的WiFi,不过我们需要的不只是这个。
学校的WiFi是没有密码的,但是连接以后需要认证才能访问外网。
所以思路就是连接到WiFi后,还要模拟一个POST请求到认证网关,实现模拟登录。

认证的地址是https://its.pku.edu.cn/..
所以大问题就来了,这是一个HTTPS的网站。所以还要在esp8266上实现SSL工具链。如果我自己来的话估计一个学期的空闲时间是做不完了。。不过事实上是有的,而且用起来也还算方便。但是有一些工程上的问题还是需要攻关的。

我们可以直接内置可信的its.pku.edu.cn的证书,不过更好的方式是内置CA的证书,然后用esp8266内置的证书链验证能力来验证,这样之后换证书了可以不用更新。这个在连接guozz.cn的短效LetsEncrypt证书的时候更重要,否则每三个月就要做一次更新。

SSL证书是有时效性的,但esp8266没有时钟保持的能力,所以需要在第一次连接的时候从网络获取标准时间(从NTP服务器获取,网上可以找到专门为esp8266写的代码,再次感叹esp8266社区的完善),但这就有悖论了:为了连接到外网,需要正确的本地时间验证网关证书,然而为了获得正确的本地时间,又需要先连接到外网……怎么破?方法是使用内网的NTP服务器:ntp.pku.edu.cn,这个服务器不需要登录网关也可以使用。

然后理论上连接到guozz.cn也没什么区别,但实际上却并没有那么简单。原因是这个板子带的库里的加密方式里面似乎没有ECDSA,GCM之类的,而我之前的服务器配置里面禁用了纯RSA之类的,导致板子直接出现无法connect的情况。最后设置了一下nginx。设置的方法网上有,搜esp8266 nginx相关的关键词就可以。

配套的记录数据库、web端和统计数据展示功能,在某一天的下午连续奋战三个小时写完,界面大概长这个样子:
Snipaste_2019-07-20_14-23-00

数据库使用sqlite3,这个数据统计功能每张柱状图只需要一个sql查询就可以完成,大概长这个样子:

SELECT date, SUM(duration) FROM record WHERE type = ? AND date > ? - 15 GROUP BY date;
SELECT date, SUM(duration) FROM record WHERE type = ? AND date > ? - 7 * 5 AND (? - date) % 7 = 0 GROUP BY date;

供电和节电

先说节点。本来esp8266的节电功能是很强大的,因为其有多个节电模式,如Modem Sleep, Light Sleep和Deep Sleep。然而,没想到这部分是我花最多时间,最终也没能成功的部分。通过官方的文档,我只能实现Modem Sleep,而Deep Sleep由于一个重要的引脚(GPIO16,RTC时钟引脚,用于定时RESET)被微雪占用了所以已经无法使用,Light Sleep理论上可以但实际上根本不能按照想象中的方式运作,不得已只能放弃。

供电有过多种想法。比如用手机供电——OTG对充线,但实际使用却发现OTG设备的存在导致安卓设备不能休眠,手机不久就会电量耗尽。

最终选择自己DIY可以嵌入进设备中的移动电源。

IMG_20190511_144112

如图,一个简单的充电宝,拆开是这样子的。一个3.3v升5v模块,一个18650锂电池。去淘了一个16340锂电池,750mA,然后和升压模块一起塞进盒子里就完成了。
最终的用电量很大很大,(买了一个usb电流表)平稳电流接近30mA。这里有一个奇怪的问题,如果是插在电脑上,如图,就只有15mA,但是插在移动电源上就是30mA,所有的移动电源都是这样的,十分奇怪。

IMG_20190524_102205

总结

最终的成品已经离我的期待相差甚远,比如

  1. 耗电量异常的大。
  2. 不知道代码的哪里出bug了,偶尔突然就自己重启!然后没有上传的记录就丢了,很烦人,根本不知道哪里出了错,就连debug的过程都是谜一样的。总之还是自己不懂硬件,以及这个小板子只有40K内存,还要维护https连接,随时可能会爆。

但是反正可以用了。

主要的限制还是动手能力太弱。做出来的东西比较厚比较丑,而且耗电量的问题根本无从下手。有做类似东西的dalao(如https://forum.51nb.com/forum.php?mod=viewthread&tid=1900040&extra=&page=1 )人家都是自己打PCB板,自己焊接,自己3D打印外壳的,可惜我没有这个精力折腾了QAQ

做一个这个东西占据了我整个学期大量的空闲时间,甚至不知道有了它能帮我多充分利用的时间能不能抵偿我的损失QwQ

题图是现在的样子。初代大概长这样:
IMG_20190720_144514