二进制时钟(手工版)
本帖最后由 nille 于 2014-9-22 17:55 编辑2014年9月9日 ,在苹果2014年新品发布会上,苹果发布了他们的智能手表iWatch,第二天我的朋友圈里就被各种iWatch的消息刷屏了。我想我的二进制时钟也是不是应该凑个热闹,把它戴在手上,变成一块二进制手表,取名叫binWatch。 在完成的二进制时钟原型机的基础上,可以先来个手工版的binWatch,首先在我脑海中出现的就是之前做铁甲钢拳格斗机器人时剩下的另一个护肘(链接),也许这个手表可以先来个手工版的。
图1 制作铁甲钢拳时用的护肘
手工活就先从LED开始吧,按照原型机的设计我们需要10个LED,确切的说是10个接了220欧电阻的LED。颜色方面,我用4个蓝色的显示小时,用6个红色的表示分钟。连接方面,电阻接在了LED的正极,准备好的LED如下所示。图2 准备好的LED
为了连接方便,我们还在电阻的另一端焊上了一节杜邦线,并套上了一段热缩管。图3 在电阻另一端焊上杜邦线
我们把所有LED的负极都连在一起,并在末端也连上一节杜邦线,以方便后续和控制板连接。10个LED都加工完成之后我们在护肘上摆一下位置,排列样式如下图所示。
图4 在护肘上确定一下最后的样子
控制板方面我们没有选用标准的Arduino板。为了让整个手表看起来更紧凑(不过最后看起来也没有达到这样的效果),这里选用的是(DFRduino Pro Mini),这是基于Arduino的最小系统。实物图片如下,DFRduino Pro Mini的板子上是没有焊插针的,需要自己焊接,而我这里可以利用一些圆孔作为缝纫孔,缝纫孔就无法再连接其他的器件了,因为考虑到四个角都至少要有一个缝纫孔,所以我选择了9、10、TXD和RAW作为缝纫孔,记住这一点很重要,因为你在写程序的时候这些引脚就无法使用了(后来当我写程序的时候感觉应该把6和13作为缝纫孔,而不是9和10)。
图5 DFRduino Pro Mini
将控制板和连接好的LED都缝在护肘上,完成后如下图所示。这里我们给DFRduino Pro Mini的管脚上焊了一些弯脚插针,以方便插接杜邦线,之所以采用这种方式是考虑到可能当有些器件有问题需要调整的时候可以尽量减少修改的工作量。焊接插针的时候要注意缝纫孔上不要焊插针,在图中一些LED末端的杜邦线已经连接到了控制板上,这个时候是不是就已经没有紧凑的感觉了。
图6 将控制板和LED都缝在护肘上
手工活到这里就算告一段落了,接下来要来点技术活了。文章开头就已经说了,我们做的是一个手表,是要带着出门的,不可能像原型机一样还用一个USB线缆连着电脑,从电脑上获取时间,所以我们需要一个能够告诉Arduino当前时间的模块——RTC实时时钟模块,这里我们选择的是(DS1307时钟模块),其外观见下图
图8 DS1307时钟模块
DS1307时钟模块出厂时就附带电池(CR1225 41MAH),并已经烧录了准确的北京时间(MST)。模块在不具备外接5V电源的情况下,最小使用寿命为9年,但是一般能达到17年。模块通过I2C协议通信,同时支持I2C扩展。为了方便调试我们可以先在一块UNO上测试一下模块,提醒大家一定要按照使用时的情况和要求测试好之后再缝在护肘上,之前的LED我就反了一次工。DS1307时钟模块与Arduino的连接方式见下图。
图9 DS1307时钟模块与Arduino的连接
连接好之后(这里我就不附实际连接图了),在DFRobot的网站上下载一个该模块的库文件放在电脑Arduino开发环境目录下的libraries文件夹当中。在打开Arduino的开发环境,在Examples中就会发现多了DS1307,里面包含三个例程,其中TinyRTC_Test_V13是测试比较全面的例程,大家可以用它来测试一下手上的DS1307时钟模块,同时里面的很多函数实现也可以直接拷贝到新项目中使用。
图9 DS1307时钟模块的例程
测试完成后,将DS1307时钟模块缝到护肘上,同时将I2C接口用杜邦线连接到DFRduino Pro Mini的插针上,这里DS1307时钟模块的引脚上也焊好了弯角插针。最后将LED都连接到控制板上,并且通过下载器将DFRduino Pro Mini连接到电脑上,LED与控制板引脚对应的关系是:蓝色表示小时,连接到引脚2、3、4、5;红色代表分钟,连接到引脚6、7、8、11、12、13(9、10作为缝纫孔空了出来)。打开Arduino开发环境,我们来完成二进制手表的代码。
图10 整体调试
首先我们要参考例程TinyRTC_Test_V13包含一堆头文件,同时再定义一个数组和一个变量,数组rtc用来存储从DS1307时钟模块获取的时间,数组中的7个值分别表示秒、分、时、星期、日、月、年,而变量oldMin用来保存之前的分钟时间值,该变量是用来确定我们是否要更新LED的时间显示。
int rtc; //秒、分、时、星期、日、月、年
int oldMin; //之前的分钟值
//从TinyRTC_Test_V13例程中将函数DS1302_SetOut拷贝过来。
void DS1302_SetOut(byte data ) {
......
}
正式编写代码之前我们来捋一下程序的流程,因为二进制手表只有小时和分钟两个值可以显示,而且也没有交互的按钮,所以手表的程序逻辑很简单,就是从DS1307时钟模块获取时间,然后判断分钟数和之前保存的分钟数是否一致,如果不一致的话说明时间有变化,就要更新LED的显示。因此setup函数和loop函数编写如下。
void setup()
{
//将连接LED的引脚置为输出
for(i=2;i<14;i++)
{
pinMode(i,OUTPUT);
}
//DS1307时钟模块使用的是I2C协议
Wire.begin();
//获取当前时间,同时给oldMin赋初值
getTime();
oldMin =rtc;
}
void loop()
{
//获取当前时间
getTime();
//如果分钟值有变化,就要更新LED显示
if(rtc!=oldMin){
oldMin=rtc; //更新oldMin的值
showTime(); //更新LED显示
}
}
//这里获取时间我们定义的函数是getTime(),而显示时间,更新LED则定义了函数showTime(),两个函数的实现如下
void getTime(void){
DS1302_SetOut(0x00);
RTC.get(rtc,true); //获取时间,将时间存入数组rtc中
}
/*
showTime的程序和原型机中的程序类似,只是在具体的引脚方面有些改动。,可以参考之前的帖子https://mc.dfrobot.com.cn/forum.php?mod=viewthread&tid=2964
*/
void showTime(void){
//判断小时数值是否大于12
if(rtc>12)
rtc=rtc-12;
for(i=2;i<6;i++)
{
if(rtc%2 == 1)
{
digitalWrite(i,HIGH);
}
else
{
digitalWrite(i,LOW);
}
rtc = rtc/2;
}
for(i=6;i<12;i++)
{
if(rtc%2 == 1)
{
if(i>8) //大家可以思考一下为什么这里有个if判断哦
digitalWrite(i+2,HIGH);
else
digitalWrite(i,HIGH);
}
else
{
if(i>8)
digitalWrite(i+2,LOW);
else
digitalWrite(i,LOW);
}
rtc = rtc/2;
}
}
程序完成之后,我们还差最后一步,给整个手表装上电源,这里我选用的是(AA电池升压模块),这款模块只需2节电池就可以提供5V的电压来保证手表的运作。两节电池通过GS1662芯片升压之后,可以轻松输出5V、1A,而且模块上还有一个开关,这样我的整个手表也就有了一个开关,当我不看时间的时候就可以把手表关上。
图11 AA电池升压模块
将电源模块缝在护肘上,手工版二进制手表完工后整体的效果如下图所示,因为LED显示时间的时候太亮了,所以最后这张效果图没有将电源打开。大家如果制作的话最好选用更大的电阻串在LED上,这样LED就不会太刺眼了。
图12 最终的手工版二进制手表
最后做了一张表把手工版二进制手表使用的器件都列了出来,表格如下。
我赛,看这个时钟是不是有点困难:lol 习惯了就好了哦 这个是护腕式时钟? カツキ 发表于 2014-11-21 10:31
这个是护腕式时钟?
是的,呵呵 nille 发表于 2014-11-21 12:48
是的,呵呵
呵呵呵。。。 就是感觉这个东西还可以做得更小。:lol swanglei 发表于 2014-9-25 14:59
我赛,看这个时钟是不是有点困难
对程序猿来说轻而易举啦。:lol
页:
[1]