10154| 11
|
二进制时钟(原型机) |
本帖最后由 nille 于 2014-8-27 13:26 编辑 前几天在makerpapa(创客老爹)搞的活动上,哥们王建伟过来说想做一个二进制的时钟,就是那种一看上去要算半天的时钟。比如有4个灯,第一个表示1,第二个表示2,第三个表示4,第4个表示8。这样的话,如果是2点就第二个灯亮,如果是5点就第一个和第三个灯亮,了解二进制的人都知道4个灯能表示的最大数是15,所以小时用4个灯就可以了。 至于分钟的话就需要6个灯,6个灯最大能表示的数是63。你要是带着这个表上街就能充分体现你程序猿的身份了。当时我立马被这个想法打动了,我说我要用护腕做一个,不但体现身份,还属于可穿戴,到时候撸开袖子开时间,还算半天,太拉风了。建伟同学立刻反驳了我的想法,说他要做个挂着的。最后我们求同存异,决定先把原型搭出来。 器件用的就是DFRobot的Arduino入门套件,里面刚好有10个5mm的LED,数量刚刚好。 先用Fritzing画个接线示意图吧,要不然这么多线,一会就插乱了。完成后的示意图如下所示。 其实就是LED灯的标准接发,正极接Arduino的IO口,负极串电阻接GND,只不过这里重复了10次。套件包里是红黄绿的LED个3个,还有一个全彩LED,这里我把这个全彩LED当作了红色LED使用,在图中我使用白色表示的这个全彩LED。 为了方便观看,我定义上面的LED表示小时,从左到右依次表示1、2、4、8,分别连接Arduino的2、3、4、5引脚。而下面的6个LED表示分钟,从左到右依次表示1、2、4、8、16、32,分别连接Arduino的6、7、8、9、10、11引脚。 如果大家想先验证一下硬件连接是否正确,可以自己写一个Arduino的程序测试一下,这里我就不测试了。完成后的实物图如下。 是不是感觉乱糟糟的一堆,图片中后面的4个LED都快看不见了。接下来就开始程序部分,这里我让计算机直接发送时间给Arduino,Arduino接收到之后再用二进制的方式显示出来。计算机端我用的是processing。 打开processing的软件后,我们在example中找到一个叫Clock的例子。 打开后processing界面如下所示。 这个例子的功能就是获取计算机的时间,然后用钟表的形式显示出来,例子的运行效果如下图所示。 我们就在这个例子的基础上修改一下吧,让它在显示时间的时候顺便把时间通过串行通信发送给Arduino。首先我们要在代码中import 串口的类库,并且定义一个串口对象myPort。
最后在draw函数的末端添加发送时间的代码,为了减少数据的发送频率,我们用一个变量oldMinute来保存当前的分钟数,这样只有分钟数变化的情况下,计算机才会发送一遍时间,发送的内容是一个字母T,加上小时和分钟的数据。T在这里充当了一个数据头的作用,Arduino也只有接收到T之后,才会处理后面的数据。 完成processing的代码后我们来书写Arduino的代码。首先要定义小时和分钟两个变量,还要有一些说明和辅助变量。内容如下 在loop函数中接收数据,只有接收的字母T的时候才处理后面的数据,因为计算机的时间是24小时制,所以数据接收完成后要对小时数做一个判断,当小时数大于12的时候要将其转换的12小时以内。最后调用showTime函数显示二进制时间。 showTime函数实现时间的二进制转换,这里我们用了一个除2将变量右移的技巧,大家都知道数据在计算机里是以二进制的形式存在的,假设5在计算机就存储为00000101,所以要显示5这个数就要点亮第一个和第三个灯,那程序会如何处理呢?首先判断变量是奇数还是偶数,如果是奇数就要点亮第一个灯,实际上就是要判断最后一位是0还是1。判断完成后将变量除2,数据就变成了00000010,大家发现了吗,除2这个操作在二进制中就是将整个数列向由移动的一位。这样我们再判断数据的奇偶性就能决定是否点亮第二个LED,后面的以此类推,这样我们通过一个for循环就能快速的实现数据到二进制的转换。showTime函数如下。 将程序下载到Arduino中,运行processing中的Clock程序,显示二进制时间的效果如下图所示图中的二进制时钟原型机中上面一排的第三个灯亮,对应的时间是4点,而下面一排的LED是第二个和第四个灯亮,对应的时间是10分,所以当时的时间就是4点10分。原型机完成了,大家期待我的可穿戴式二进制手表吧。 |
© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed