颠覆传统的LED时钟-炫酷的小字时钟电路方案DIY

2019年09月26日 作者:Teardown

我想使设计尽可能简单,并易于转换成便宜的套件。因此,这个炫酷的小字时钟除了PCB,一堆LED,3D打印灯箱,主要的MCU,按钮和RTC之外,组装起来的器件真心不多。

当我第一次开始这个项目时,主要要担心的是附近的字母之间会有太多的光相互渗出,从而由于缺乏对比度而使显示屏难以阅读。为了帮助印刷电路板方便,我选择了黑色阻焊层,并另外使用铜层来尝试阻挡尽可能多的光,但是这些都不会对印刷电路板FR4材料内部的散射光有帮助,该材料为淡黄色的半透明玻璃。

因此,我依靠的主要方法是非常古老的办法,即在每个LED之间使用物理隔离器来尝试阻挡尽可能多的光。因为我自己有一台3D打印机,所以能够非常快速地打印出LED时钟的灯箱,该灯箱还可以兼作时钟支架,并以微小的角度支撑起来。

下面的这个就是该设计迭代的外观:

虽然说这个项目绝对不是完美的,但至少对我而言,考虑到LED间对比度和设计成本/简单性之间的权衡,这已经足够了(我打算出售该项目的套件,因此设计越简单越好)。

以下是我这个炫酷小字时钟的组装以及相应的Demo演示,希望你喜欢。

软件设计

这可能有些枯燥,但让我们来了解一下我如何/为什么以这种方式设计时钟软件。请记住,我绝对不是专业软件开发人员,所以最终做事的方式很可能不是经过优化或传统的。

对于初学者,我需要一种方法来自动扫描12x10 的led矩阵,以便我的主要代码部分可以与RTC芯片对话,生成动画等。为此,我选择使用以4kHz之类的触发条件的中断。每次执行该中断时,它都会绘制当前的LED列(存储为全局数组),然后递增该列计数器,以便下次它可以绘制下一列直到到达最后一列并重新开始。因此,你可以看到在中断担心如何绘制时,如何通过写入显示数组(充当原始显示缓冲区)来更新此显示图像。此外,通过选择是否跳过周期,它甚至可以使显示屏看起来更亮或更暗!

但是,有一个小麻烦,为了使电路板更容易布线,我最终将所有行和列分配给看似随机的I / O(而不是像我通常那样整齐地/按引脚顺序组织)。这意味着我不能做一个简单的快速端口写入并正确更新所有行/列值。为了解决这个问题,我创建了一个引脚映射和关联的函数,该函数采用所需的行和列状态,并正确地切换所有引脚,即使它们不正常。该功能基本上是一个很大的switch语句。

现在如何对显示进行多路复用/扫描?好了,马上启动整个列。为此,列中的垂直LED灯带的阳极以我们希望它们点亮的图案驱动。为了实际选择正确的列,我们将连接到该列中所有LED阴极的引脚设置为输出并将其拉低,同时将其他所有列引脚设置为输入(高阻抗,因此没有电流可以流动)。简单吧?如果你在搜索引擎上搜索“ led矩阵的工作原理”之类的东西,有无数的示例和示意图会比我更好地解释。

因此,从程序员的角度来看,向显示器写入数据所需要做的就是设置存储在显示缓冲区阵列中的像素,它们似乎神奇地点亮了相应的LED!酷!

下一步是处理按钮输入。好吧,我只是使用了另一个在按钮输入引脚更改状态时触发的中断(称为引脚更改中断,PIC在某些引脚上支持的功能)。当我的中断看到按下按钮时,它将设置一个全局标志,程序的任何部分都可以读取,操作然后清除,以使其他所有程序都知道按下按钮的效果。

我在显示扫描中使用中断的原因是,使我免于不得不在主循环和手动按钮输入中手动进行操作,因为坐在那里并反复读取按钮等待按下是浪费时钟周期。因此,中断可以处理这两个繁琐的任务,并为程序的主要部分留出足够的计算自由度,可以实际执行一些有趣的操作,例如说时间或显示整洁的动画。

那么,如何跟踪时间呢?好吧,我走了简单的路,并使用DS1302串行实时时钟芯片为我完成了这项工作。它甚至可以为超级电容器充电,用以在断电时保持一段时间。我使用我编写的软串行库通过三线串行接口(基本上是SPI)与RTC通讯,以便可以使用所需的任何GPIO引脚。

我不得不面对的最后一件事是添加动画模式。到目前为止,它具有七种模式:追逐,随机,闪烁,乒乓,下雨,弹跳球和涟漪。Chase点亮从左到右,从上到下运行的LED。随机催眠用随机点亮的像素填充屏幕。闪烁会在屏幕上随机打开和关闭随机像素。乒乓球基本上是一种单人乒乓球游戏,球在其附近反弹并在其底部击中一个桨。雨是随机产生的暴跌的像素下降(几乎让人回想起臭名昭著的Matrix下降字母动画)。弹跳球基本上是Pong,但没有桨,每次击球时都会随机改变速度。涟漪是随机产生的传播波(与水滴干扰水坑表面一样)。

你可能已经发现,这些动画的许多描述都使用random这个词。我想在每次显示时都以不同的方式显示许多动画,但是如何使用微控制器做到这一点。对于计算机系统而言,在不读取某种随机输入的情况下很难实现随机。好吧,我再次作弊。我使用rand()(一种标准的C函数)来生成伪随机数。

我说伪随机是因为它实际上是确定性的(由于它是线性移位反馈计算的优点),但是对于足够短的运行时间,普通人将无法注意到它并不是非常随机。问题是,如果你只使用rand(),那么每次打开微型电源时,它都会生成相同的“随机”数字序列...这个随机函数开始听起来不是很随机!

很好地解决了,我们可以使用函数srand(srand = seed + rand ...非常有创造力...)以不同的起始编号“播种”它。但是要确保种子并非总是相同,我们利用了这个设备是时钟的事实,并且当用户启动动画时,动画的时间不可能与上次的时间完全相同。因此,我们将种子设置为当前时间的函数(我基本上将小时,分钟和秒串联为一个大数)。

好了,本文差不多就到这里,以上几乎是该软件所有有趣部分的概述。

 

版权声明:Hackaday授权,电路城原创翻译视频,谢绝转载!

如果你也喜欢开源的项目,并想分享你自己开源的作品,为开源世界贡献你的力量!

视频内容投放通道:yanfen.mo@supplyframe.cn

相关文章

tracer