Arduino-30 秒倒计时





准备工作:
材料:
材料名称 | 数量 | 型号/说明/备注 |
Arduino Mega 2560 | 1 |
|
显示数码管 | 1 | 4 位 7 段 |
MAX7219 集成电路 | 1 |
|
杜邦线 |
|
|
10 微冷 (AF) |
| 电解的电容 |
“104”或 0.1 uF |
| 陶瓷电容 |
电阻 | 1 | 10k-100k |
电源 | 5V | USB电源 |
工具:
工具名称 | 数量 | 型号/说明/备注 |
Arduino IDE | 1 | 软件 |
剥线钳 | 1 |
|
斜嘴钳 | 1 | 5寸 |
接地带 | 1 | 去除静电 |
准备数码管

您可以在亚马逊上购买它(预组装),也可以自己制作。预组装MAX7219 ,我个人(作为电子爱好者)更喜欢自己构建它。但这更像是一件值得骄傲的事情。而且,这是我唯一躺着的东西。当然,直到圣诞节。
如果你想预组装它,那么跳过接下来的几个步骤(换句话说,直接跳到代码中)。要构建自己,我们必须遵循几个步骤:取下点阵显示器的MAX7219并将其连接到Arduino/七段显示器。让我们开始吧!
取下 IC

我已将视频添加为视觉指南。这太容易了,你只需要一点点撬动力。
不要损坏 IC/芯片。只需使用一点点的力量。我不能强调如果你不用一点点力(假设你会用很多力),你有多重要将折断MAX7219上的别针。这是非常精致的!无论如何,如果你已经完成了,让我们继续......
将其添加到面包板






顺便说一句,介绍中的视频非常有帮助。我将引用它。无论如何,正如我在视频中挣扎的那样,你只是把那个东西拍在面包板上。因此,一旦您将该IC放在面包板上,就可以按照我的接线图进行操作。
如果你对这种东西不熟悉,你可以按照我的示意图进行操作。我之所以把两者都放在这里,是为初学者和中级人士准备的。
无论如何,请允许我解释一下我的接线问题。后者在降压型转换器上具有+5V电压。GND是Arduino和+5V降压转换器的GND。
*重要提示 - 将缺口/凹槽向前(意思是,引脚 1 应朝上)。
剩下的就很简单了:你根据芯片的左右两侧连接段。一个从芯片的左上角开始(位于芯片的左侧)。这些段位于芯片的右侧,并转到每个段的“位置”。比如,A去,你猜对了,Seg A。这是因为每个称为段的东西都放在实际显示器上。
段 A 是第一段或“线”,位于 D1 的中间。如果你愿意,你可以对这个理论进行更多的研究,因为我不打算讨论这个。
无论如何,诀窍是:数字引脚位于左侧,但它们来自 DIG0-DIG7!那么你选择哪一个呢?最简单是 DIG0、DIG1、DIG2 和 DIG3。换句话说,把它连接在那个组合中,你应该没问题。是的,这很重要。你
必须使用 +5V ,否则可能会产生灾难性的后果。希思我的警告......
哦,是的,还有一件事:我认为你必须在某些Arduino上使用数字引脚。
编码

我最喜欢的一步,正如您可能已经知道的那样(因为今天的标题),这应该从 30 开始倒计时。但是,它是如何做到这一点的,它如何知道它是否及时倒计时?好吧,冷静下来。我将在下一步中分段解释其余部分。
#include <LedControl.h>
//Austin Harris
//December 23, 2022
//Timer Countdown Thing - V1.0.3
#define DataIn 2
#define LOAD 4
#define CLK 3
LedControl lc = LedControl(2,4,3,1); // DataIn, CLK, LOAD, # of module(s)
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
lc.shutdown(0,false);
/* Set the brightness to a medium values: 0-15 */
lc.setIntensity(0,15);
/* and clear the display */
lc.clearDisplay(0);
lc.setDigit(0,1,3,false);
lc.setDigit(0,0,0, false);
delay(1000);
}
void loop() {
// put your main code here, to run repeatedly:
lc.setDigit(0,1,2,false);
for(int i2 = 9; i2 >= 0; i2--){
lc.setDigit(0,0,i2,false);
delay(1000);
if(i2 == 0){
lc.setDigit(0,1,1,false);
for(int i3 = 9; i3 >= 0; i3--){
lc.setDigit(0,0,i3,false);
delay(1000);
if(i3 == 0){
lc.setDigit(0, 1, 0, false);
for(int i4 = 9; i4 >= 0; i4--){
lc.setDigit(0, 0, i4, false);
delay(1000);
while(i4== 0){
Serial.println("Congrats! You did it!");
delay(1000);
}
}
}
}
}
}
digitalWrite(24, HIGH);
digitalWrite(32, HIGH);
}
代码解释

老实说,如果你能想出一些更好的代码(或者当我做更多的研究时),那么请分享它!我很想听听你对代码的评论!(除非它是负面的)。无论如何,我们开始吧:
#include < LedControl.h>
这是 LedControl 库(可以找到的)的包含
在 GitHub 上
).对于初学者来说,这意味着将另一组代码纳入此代码中。使用户更容易控制七个段。
#define DataIn 2
#define LOAD 4
#define CLK 3
这些“#define”是一组代码,用于制作 DataIn(我知道语法很糟糕)、LOAD 和 CLK 变量。不打算在这里教这个。
LedControl lc = LedControl(2,4,3,1);DataIn、CLK、LOAD、模
意思是,我没有给它起一个很酷的名字或任何东西。这只是lc。这很无聊,但我很匆忙。无论如何,LedControl 库“设置”引脚,或者让变量实际与 Arduino 连接。
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
lc.shutdown(0,false);
/* Set the brightness to a medium values: 0-15 */
lc.setIntensity(0,15);
/* and clear the display */
lc.clearDisplay(0);
lc.setDigit(0,1,3,false);
lc.setDigit(0,0,0, false);
delay(1000);
}
这是设置。我真的不知道如何解释,但是,基本上,它在“设置”或启动时运行代码。无论如何,Serial.begin 设置了串行监视器(对于初学者,请查找它)。具有讽刺意味的是,lc.shutdown 是错误的。因为它没有被设置为 true。强度是显示器的亮度。它可以设置为 0-15(在右侧)。清除显示部分“重置”或清除显示。设置数字部分设置为显示屏中间的“3”。换句话说,它位于右侧的第 3 位(第二位数字)。“0”位于最右边(第一位数字)。
然后,我们给出 1 秒的延迟,因为它每秒暂停一次。
*它应该从 30 秒开始倒计时,
void loop() {
// put your main code here, to run repeatedly:
lc.setDigit(0,1,2,false);
for(int i2 = 9; i2 >= 0; i2--){
lc.setDigit(0,0,i2,false);
delay(1000);
if(i2 == 0){
lc.setDigit(0,1,1,false);
for(int i3 = 9; i3 >= 0; i3--){
lc.setDigit(0,0,i3,false);
delay(1000);
if(i3 == 0){
lc.setDigit(0, 1, 0, false);
for(int i4 = 9; i4 >= 0; i4--){
lc.setDigit(0, 0, i4, false);
delay(1000);
while(i4== 0){
Serial.println("Congrats! You did it!");
delay(1000);
}
}
}
}
}
}
}
这是我最挣扎的地方,因为我想,“我想使用一定数量的 for 循环吗?或者if语句呢?一会儿循环呢?好吧,你猜怎么着......我用了所有这些!所以,对于循环,我只是使用了一堆同样的东西。所以,随心所欲地叫我重复,但这对我来说最有意义。
对于循环中的第一行代码,我只是让它说,“你知道吗?显示 2,因为它已经是一秒钟了。哦,还有,设置数字上的 false 只是说它是否应该显示十六进制字符,但我们想要数字,天哪!无论如何,由于我们以秒为单位倒计时,因此我们将其显示为 2 并将下一个数字(前一个 0)设置为 9。我们使用 for 循环来做到这一点,因为我懒得把所有东西都输入出来。
在这种情况下,不使用 for 循环也是非常低效的,因为我们正在计数。记得?无论如何,既然你现在知道了 for 循环的作用,它几乎就是重复自己。
现在,对于 if 语句,我几乎说如果 for 循环数字是 等于(未分配)0,然后我们在最右边显示一个“1”。那是因为它已经 10 秒了。
请记住,我们以秒为单位进行计数!这就是为什么我添加了 1 秒(1000 毫秒)的延迟。然后重复,从 9 倒数到 0。同样是十秒钟。下面是一个可视化效果,9、8、7、6、5、4、3、2、1 和 0。注意,这是 10。
最重要的是,你可能在中间有第二次停顿。这就是这里的最终目标。
while(i4 == 0){
digitalWrite(LED, HIGH);
lc.shutdown(0, true);
delay(1000);
digitalWrite(LED, LOW);
lc.shutdown(0, false);
delay(1000);
}
这做了两件事(假设您将其固定为使用 LED):
1.它“闪烁”显示屏或以 1 秒的延迟打开和关闭显示屏
2.它打开假设的(顺便说一句,我测试过,它可以工作)LED。我会把锅搅得更厉害!您甚至可以添加压电蜂鸣器!是的,你可以用 while 循环做你想做的事。正如我在视频中所说,我正在将其用于抓娃娃机。这就是我将在那里放置一些有用的代码的地方。剩下的就是历史了。
大结局,还是我应该说最后的倒计时?

好吧,希望你学到了一些新东西!我希望你喜欢这个教程,但我想我会祝你有美好的一天!如果您有任何问题或需要告诉我一些事情,请随时在下面发表评论。











