电子说
步骤1 :组装并连接矩阵
您无需花很多功夫,就可以将Arduino称为出色的多个LED矩阵。但是,在这种情况下,将第五个矩阵与其他矩阵串联。当然,您将需要一个矩阵和另一组跳线。
步骤2:实时时钟注释
我的实时时钟(RTC)已打开原来是哑巴,新的还没有从香港来。因此,时间是手动设置的。时间是使用内部时钟来保持的。
步骤3:显示数字
这是我的第一个重要项目,在学习过程中,我从在其4-LED滚动文本示例中使用的Makepeace Madrid的LED矩阵库LedControlMS.h开始。
函数displayChar带有两个整数参数:寻址的矩阵号(从零开始)和要显示的字符。只需将数字0-9传递给此功能即可显示这些数字。
由于一个LED矩阵不会显示两个字符,因此小时和分钟的每个数字都必须隔离为一个变量。可以通过以下方式将它们与小时和分钟分开:
第一个数字:整数除以10。这将丢弃余数(例如,将43除以4.3,结果除以3) ,因此返回4(第一个数字)。
第二个数字:模除以10,返回余数(例如,对43进行除法得到3)。
我认为空白的第一个数字看起来比前导零更好,因此将displayChar用作不可显示的字符。
请注意,数字在每个LED矩阵上左对齐显示。我没有研究校正
步骤4:秒
由于我有5个矩阵,因此我决定将第5个矩阵固定在小时和分钟,使用setLed函数通过在每行上依次点亮单个LED来标记秒,其参数为:LED编号(再次从0开始计数),行,列和布尔值(true = on)。
我使用了嵌套循环,对偶数行的第8个LED进行了测试以进行跳过。我敢肯定还有更优雅的方法可以编写此代码,但是我只是开始使用C语言,并且多年没有编程。
步骤5:LED时钟草图
/*该草图基于MAX72xx芯片组运行带有五个LED矩阵的时钟。
在https://www.instructables.com/id/Multiple-LED-Matrixes-with-Arduino
中显示了一个示例,该示例显示了在4个LED矩阵上书写和滚动文本的过程。此草图使用LedControlMS上页的.h(来自Makerspace),是对LEDControl.h库的修改。
此草图使用了Arduino时间和连线库,而DS3131RTC(DS3232RCTC库)
Sketch假定以下连线为MAX72xx LED矩阵-
引脚12连接到DataIn引脚11连接到CLK
引脚10连接到LOAD
Dataout(中间输出引脚)菊花链式连接到DataIn除最后一个矩阵外,每个矩阵的下一个LED的数量。
DS3231RTC的布线
VCC和接地分别连接到+ 5VDC和Gnd 《时钟》 SDA时钟-》模拟4
SCL-》模拟5
*/
#include //DS3232RTC时钟库也可处理DS3231RTC
#include //用于时钟
#include //用于时钟
#include“ LedControlMS.h”//注意tha t这不是库LEDControl
int h1,h2,m1,m2;//每个LED矩阵将显示一个数字:小时1和2,分钟1和2。这些变量只保留一位数字
int s1 = 2;//计数秒数的LED
int hr12;//用于12小时时间
int noMatrix = 5;//矩阵数该库的地址最多为8。
boolean am = true;//标记上午或下午。初始化为am
LedControl lc = LedControl(12,11,10,noMatrix);//Pin分配和矩阵数(5)
void setup(){
//首先,将系统时间设置为硬编码的日期和时间,然后将来自系统时间的RTC。
//setTime()函数是时间库的一部分。
//Hr Min Sec dd mm yyyy //RTC.set(now());////从系统时间设置RTC
//初始化MAX72XXs(在启动-唤醒调用时处于省电模式。
for(int i = 0; i lc.shutdown(i,false);
lc.setIntensity(i,1);//将亮度设置为较低的值
lc.clearDisplay(i);//清除显示
}
delay(100);//等待更新显示之间
lc.clearAll();
}
无效循环( ){
//设置am或pm布尔值(am初始化为true)
if(hour()》 12)
{am = false;
hr12 = hour()-12;
}
/*隔离小时和分钟,每个LED矩阵一位。
我认为一个小时的数字看起来更好,第一位为空。
*/
//分别放置如果小时数在其自己的变量h1和h2中
if(hr12 《10)
{
/*
如果《10 hrs,则第一个LED矩阵为空白(62是空白字符)。
还可以插入零,例如分钟。
*/ h1 = 151;
h2 = hr12;//第二个LED显示小时的一位数字
}
else
{
//否则,只需使用t的两位数字h1 = h12/10; h1和h2上的小时。//整数除以10将返回小时的第一位数字。
h2 = hr12%10;//模除以10将返回第二位数字。
}
//如果(minute()《10)
{
m1 = 0 ;,则分钟由m1和m2
显示。//第一分钟LED d1播放零
m2 = minute();//分钟的第二个数字
}
else
{
m1 = minute()/10;
m2 = minute()%10;
}
/*
使用displayChar函数显示小时和分钟。它使用两个整数参数:
LED矩阵编号(0-7)和要显示的字符。通过将数字本身作为第二个参数进行传递,可以简单地显示数字:即lc.displayChar(0,h1)*/
lc.displayChar(0,h1);//将1位数显示在最左边的(#0)LED上。
lc.displayChar(1,h2);//小时数2到LED#1
lc.displayChar(3,m1);//将1位数字减至LED#3。 (回想一下#2是用于标记秒数的。)
lc.displayChar(4,m2);//将1位数字减至#4
/*此例程确定要点亮哪个单个LED来计数秒数。
中间LED通过一次在每个LED上一次点亮一个LED来计数秒数。在8行中在奇数行上计数8个LED,在偶数行上计数7个LED。因此,两行计数15秒。
*/
for(int r = 7; r》 -1; r-){//对于8行中的每一个,从顶部(#7)开始。..
for(int c = 0; c 《8; c ++){//对于一行中的8个led的每一个(左侧0 )。..
/*
照亮当前列和行上的点。这些似乎在我的硬件上互换了。
因此,我将参数交换到下面的setLed()函数中。
正确地将其寻址为setLed(int led#,int row,int col,boolean)。变量s1保留用于此的LED矩阵的LED编号(从0开始计数)。
*/
if(r%2 == 0 && c == 7)//甚至行AND col 7
{} else
lc.setLed(s1,c,r,true);//打开寻址的LED持续3/4秒
delay(750);
lc.setLed(s1,c,r,false);//关闭1/4秒
delay(250);
}
}
}
}
全部0条评论
快来发表一下你的评论吧 !