圣诞节又来了,无论是您一年中最喜欢的假期还是冷汗带走,装饰品都在增加。今年,为什么不在您的装饰品中加入一些DIY技术以使其脱颖而出呢?
在这个项目中,我们将从头开始构建防风雨,运动激活的8 x 8 LED矩阵……价格不到20美元。尽管可以在房子周围的任何地方使用,但它的设计都适合放在标准圣诞门花环的中央。而且由于它是电池供电的,所以也可以在房子外的任何地方!
零件清单
对于此项目,您将需要:
- 我使用Nano的原因是它的体积很小,但是您几乎可以使用任何与Arduino兼容的微控制器。
- 64个红色LED。
- 8 x 220欧姆电阻。
- PIR运动传感器。
- 许多Arduino入门套件都附带了这些套件。我从亚马逊以10美元的价格购买了多包产品。
- 一块原型板。
- 这里使用的是9 x 7厘米,尽管您可以使用任何尺寸。 / li>
- 7-12v电池。出于预算原因,这里使用一个简单的电池组,但是移动银行充电器可能会使用更长的时间。
- 各种短导线
- 特百惠盒子或类似的防风雨外壳。
- 确保它的大小足以容纳所有内部组件!
- 圣诞花环。
- 任何人都可以,只要确保外壳盒可以放入其中即可。
- 烙铁和焊料。
虽然不是严格必要的,因为您可以将组件直接焊接到Nano上,在测试过程中,我还发现一块小面包板非常有用。
该项目需要大量的焊接,作为一个初学者,它似乎令人生畏。我个人还是焊接的初学者,发现它并不像看起来那样具有挑战性或耗时。如果您还不熟悉焊接,这里有一些很好的技巧可以帮助您。
如果您真的不热衷于焊接,可以使用LED灯条或现成的项目来完成此项目。入门套件中可能包含的LED矩阵。如果您决定走那条路线,则必须进行一些代码调整。
设置Arduino
我们将从Arduino的电路图以及将要连接的电线开始
在矩阵内部
现在制作我们的8 x 8 LED矩阵。首先创建矩阵的一行和一列是一个好主意,以确保它恰好在原型板上您想要的位置。
在上面的照片中,所有LED放置的位置应使阳极(较长的正极脚)朝向原型板的顶部。这很重要,因为我们将通过将共同的阳极连接在一起来创建共同的阳极列,以及共同的阴极行(较短的负极)。现在马上解决这个问题将在以后省去头痛!
我们将建立一个公共的行阴极矩阵,该图显示了它们如何连接。
可能看起来有些令人生畏首先,但这是一个非常简单的配置。在每一行中,所有阴极从右到左连接,然后连接到我们的Arduino引脚之一。之后,我们对阳极的每一列都执行相同的操作。这样,根据我们加电的那一列以及接地的那一行,我们可以打开阵列中的任何单个LED。
让焊接开始
开始通过放置第一排LED。确保所有阳极都朝向顶部,并将其翻转过来。我发现在每个角落添加另一个LED,并使用弹性线将另一块Protoboard固定在顶部,有助于将所有东西固定到位。
现在,每个LED的阴极(短)脚一一弯曲。左侧,以便它们彼此重叠。从左侧开始向右操作最简单。如果您使用一块较大的原型板,则可以先将它们焊接到板上,然后使用焊盘将它们连接在一起。小心不要将任何阴极连接到板上的任何其他线或阳极上!
对所有八行重复此过程,完成后,您应该拥有看上去类似的东西像这样:
跳跃阳极!
阳极的列稍微有些怪异。在上图中,阳极每次穿过一排阴极时就会弯曲。这是因为它们根本无法触摸行。我们必须将阳极弯曲到阴极行上方,并将它们彼此连接。您可能会发现用笔弯曲腿有很大帮助。
对每一排阳极执行此操作,并在每个顶部阳极上连接一个电阻。您可能会发现将电阻器放置在原型板的下一个孔中并使用焊料将其连接起来更为容易。您现在应该有类似这样的内容:
恭喜! LED矩阵已完成。在此阶段,请彻底检查焊接,以确保没有间断,并且所有列均未接触到行。如果它看起来不漂亮,请不要担心,我们只需要它起作用即可!您现在可以通过将5v连接到任一列末端并接地到任何行末端来分别检查每个LED。
提供的一切都很好,将连接线连接到每一列和每一行,并将它们连接到您的Arduino,如上图所示。
让我们开始编码
打开Arduino IDE,然后选择您的电路板和端口。如果您不熟悉Arduino,请查看此入门指南。
将此代码输入编辑器。如果您不熟悉它,则代码会很密集,但是可以在此处使用完整的注释,以帮助您了解其工作原理。
const int row[8] = { 2,3,4,5,6,7,8,9 };const int col[8] ={ 10,11,12,14,15,16,17,18 };int pirPin = 19; int pirState = LOW; int val = 0; bool pirTrigger = false;const int pirLockTime = 12000; int pirCountdown = pirLockTime;int pixels[8][8];const int refreshSpeed = 500;int countDown = refreshSpeed;int currentCharIndex = 0;typedef bool CHAR_MAP_NAME[8][8];const CHAR_MAP_NAME blank = { {0 , 0 , 0 , 0 , 0 , 0 , 0 , 0},{0 , 0 , 0 , 0 , 0 , 0 , 0 , 0},{0 , 0 , 0 , 0 , 0 , 0 , 0 , 0},{0 , 0 , 0 , 0 , 0 , 0 , 0 , 0},{0 , 0 , 0 , 0 , 0 , 0 , 0 , 0},{0 , 0 , 0 , 0 , 0 , 0 , 0 , 0},{0 , 0 , 0 , 0 , 0 , 0 , 0 , 0},{0 , 0 , 0 , 0 , 0 , 0 , 0 , 0},}; const CHAR_MAP_NAME threedownthreein = { {0 , 0 , 0 , 0 , 0 , 0 , 0 , 0},{0 , 0 , 0 , 0 , 0 , 0 , 0 , 0},{0 , 0 , 1 , 0 , 0 , 0 , 0 , 0},{0 , 0 , 0 , 0 , 0 , 0 , 0 , 0},{0 , 0 , 0 , 0 , 0 , 0 , 0 , 0},{0 , 0 , 0 , 0 , 0 , 0 , 0 , 0},{0 , 0 , 0 , 0 , 0 , 0 , 0 , 0},{0 , 0 , 0 , 0 , 0 , 0 , 0 , 0},}; const int noOfFrames = 5;const CHAR_MAP_NAME *charMap[noOfFrames] ={&blank,&threedownthreein,&blank,&blank,&threedownthreein};void setup(){ for (int i=0;i<8;i++){ pinMode(row[i], OUTPUT); pinMode(col[i],OUTPUT); //motion sensor pinMode(pirPin, INPUT); digitalWrite(col[i], LOW); }}void screenSetup(){ const CHAR_MAP_NAME *thisMap = charMap[currentCharIndex]; for (int x = 0; x < 8; x++) { for (int y = 0; y < 8; y++) { bool on = (*thisMap)[x][y]; if(on) { pixels[x][y] = HIGH; } else { pixels[x][y] = LOW; } } } currentCharIndex++; if(currentCharIndex>=noOfFrames){ currentCharIndex = 0; } }void refreshScreen(){ for (int currentRow = 0; currentRow < 8; currentRow++){ digitalWrite(row[currentRow], LOW); for (int currentCol = 0; currentCol < 8; currentCol++){ int thisPixel = pixels[currentRow][currentCol]; digitalWrite(col[currentCol], thisPixel); if (thisPixel == HIGH) { digitalWrite(col[currentCol], LOW); } } digitalWrite(row[currentRow], HIGH); } }void loop(){ val = digitalRead(pirPin); if (val == HIGH){ pirTrigger = true; } else if (val == LOW && pirCountdown <=0) { pirTrigger=false; pirCountdown = pirLockTime; } if(pirTrigger==true && pirCountdown > 0) { refreshScreen(); countDown--; pirCountdown--; if(countDown <= 0) { countDown = refreshSpeed; screenSetup(); } } }
要理解的重要部分是:
> refreshSpeed 变量。此变量确定每个屏幕之间的时间刷新方式。数字越大意味着等待时间越长。
常量 CHAR_MAP_NAME s。在此处放置要显示的每个字符映射表(或框架,如果更容易想到它们的话)。
noOfFrames 变量。这决定了一个完整播放中显示多少帧。请注意,它可以与字符映射表的数量不同。例如,如果要显示“ A CAT",则只需要定义四个不同的框架:空白, A , C 和 T 。
现在,当运动传感器检测到运动时,LED屏幕应使LED向下闪烁3次,并从左上角闪烁3次。如果显示不正确,请再次检查接线,以确保一切均在正确的位置!当您添加自己的图像或消息时,它可能会过早切断或播放时间过长。尝试更改 pirLockTime 变量,直到它播放所需的时间。
将每帧添加到LED显示屏的过程可能有点繁琐,因此我们创建了此电子表格,以便为您的LED矩阵创建文本和图像(创建Google表格的副本,以便对其进行编辑)更加容易。
使用电子表格,您可以将创建的内容直接复制到代码。
使它勇于挑战
现在,我们有了一个正常工作的LED矩阵,我们需要一种使它在冬天的天气中生存的方法。虽然此方法可能无法承受热带风暴或在游泳池中扣篮,但应足以保护所有电子设备免受元件侵害。
我使用了一个15厘米长的圆形特百惠盒子直径和6厘米深,非常适合我的组件。在盖子上切一个比您的LED矩阵稍大的窗户,并在上面贴上一层透明的塑料膜,确保没有液体进入的空间。用某些包装坚固的塑料效果最好,但这就是我的全部。您也可以为原型板安装一些支架,尽管两项工作都可以使用坚固的防水胶带轻松完成。
接下来,在窗口下方打一个小孔,然后小心地缓慢加宽直到PIR传感器只能适应。您希望它尽可能贴合。
安装PIR传感器,并用胶带或热胶填充您可以看到的任何缝隙。
清理任何胶带或可能会阻止盒子正确关闭的胶水,并将所有组件与电池一起添加到盒子中。在这里,使用了一个简单的AA电池组,直接插入Nano的VCC引脚。将几小瓶软木塞添加到外壳的外部,以帮助将模型悬挂在花环的中央。
然后我们就完成了
一旦盒子被密封,将其与您的圣诞花环一起悬挂,并等待您的访客对您低于20美元的高科技产品表示欢迎!您甚至可以更进一步,还可以为房屋周围的其他地方创建出色的DIY装饰!
在此项目中,我们从头开始构建了一个自包含的LED矩阵系统,该系统可以运动并可以存活下来。除了最恶劣的天气外在其他项目的假期结束后,此构建将很有用,并且可以使用相同的技术为其他项目创建便宜的防风雨外壳。
您是否构建了任何东西你的圣诞节DIY转折?您今年打算准备任何以DIY为主题的圣诞节礼物吗?在下面的评论中让我们知道!