2013-12-13 18:41:47 [显示全部楼层]
74338浏览
查看: 74338|回复: 21

[入门教程] Arduino教程03 做一个S.O.S求救信号灯「DFR0100 」

[复制链接]

该教程实验平台:Arduino入门套件

简单回顾下Lesson 2的内容:

  • 如何使用面包板
  • 电阻的作用
  • LED相关知识

项目二 S.O.S求救信号器

本项目将继续使用项目1的搭建的电路,但我们这里将改变一下代码,就能让我们的LED变为S.O.S求救信号了。这是国际莫尔斯码求救信号。莫尔斯码是一种字符编码,英文的每个字母,都是由横杠和点不同的组合而成。这样的好处是,使用简单的两种状态,就能来传递所有的字母和数字,非常的简便!不得不佩服前人的聪明吧!

我们正好可以通过LED开关两种状态来拼出一个个字母。通过长闪烁和短闪烁来表示点和横杠。我们这个项目中,我们就拼写S.O.S这三个字母。

通过查阅莫尔斯码表,我们可以知道,字母“S”用三个点表示,我们这里用短闪烁替代,字母“O”则用三个横杠表示,用长闪烁替代。

有了前一个项目的基础,不难理解下面样例代码2-1。但先不要急着输入这段代码,只是看一下。

样例代码2-1:

( 注意:我们这里使用的是数字引脚10,而不是13。)

int ledPin = 10;

void setup() {
pinMode(ledPin, OUTPUT);
}
void loop() {
// 三个快闪烁来表示字母“S”
digitalWrite(ledPin,HIGH);
delay(150);
digitalWrite(ledPin,LOW);
delay(100);

digitalWrite(ledPin,HIGH);
delay(150);
digitalWrite(ledPin,LOW);
delay(100);

digitalWrite(ledPin,HIGH);
delay(150);
digitalWrite(ledPin,LOW);
delay(100);

delay(100);           //100毫秒延时产生字母之间的间隙       
//三个短闪烁来表示字母“O”
digitalWrite(ledPin,HIGH);
delay(400);
digitalWrite(ledPin,LOW);
delay(100);

digitalWrite(ledPin,HIGH);
delay(400);
digitalWrite(ledPin,LOW);
delay(100);

digitalWrite(ledPin,HIGH);
delay(400);
digitalWrite(ledPin,LOW);
delay(100);

delay(100);         //100毫秒延时产生字母之间的间隙

//再用三个快闪烁来表示字母“S”
digitalWrite(ledPin,HIGH);
delay(150);
digitalWrite(ledPin,LOW);
delay(100);

digitalWrite(ledPin,HIGH);
delay(150);
digitalWrite(ledPin,LOW);
delay(100);

digitalWrite(ledPin,HIGH);
delay(150);
digitalWrite(ledPin,LOW);
delay(100);

delay(5000);        // 在重复S.0.S信号前等待5秒

STEP 2:输入代码

上面的写法固然正确,可是是不是觉得有点繁琐呢?如果有个100个,难不成还重复100遍吗?有没有更好的书写程序的方法呢?想必发明编程的人也考虑到这个问题了,所以有了我们更好的一种写法。我们先来看一下样例代码2-2。

样例代码2-2:

//项目二 -- S.O.S信号
int ledPin = 10;
void setup() {
pinMode(ledPin, OUTPUT);
}
void loop() {
// 三个快闪烁来表示字母“S”
for(int x=0;x<3;x++){
digitalWrite(ledPin,HIGH);            //设置LED 为开
delay(150);                           //延时150毫秒
digitalWrite(ledPin,LOW);             //设置LED 为关
delay(100);                           //延时100毫秒
}

//100毫秒延时产生字母之间的间隙
delay(100);

//三个短闪烁来表示字母“O”
for(int x=0;x<3;x++){
digitalWrite(ledPin,HIGH);            //设置LED 为开
delay(400);                           //延时400毫秒
digitalWrite(ledPin,LOW);             //设置LED 为关
delay(100);                           //延时100毫秒
}

//100毫秒延时产生字母之间的间隙
delay(100);

// 再用三个快闪烁来表示字母“S”
for(int x=0;x<3;x++){
digitalWrite(ledPin,HIGH);            //设置LED 为开
delay(150);                           //延时150毫秒
digitalWrite(ledPin,LOW);             //设置LED 为关
delay(100);                           //延时100毫秒
}

// 在重复S.0.S信号前等待5秒
delay(5000);
}

在输入代码的时候,注意保持代码的一个层次感,除了美观外,也便于你日后检查代码。确认正确后,下载代码到Arduino中,如果一切顺利的话,我们将看到LED闪烁出莫尔斯码S.O.S信号,等待5秒。重复闪烁。给Arduino外接电池,整个装到防水的盒子里,就可以用来发S.O.S信号了。S.O.S通常用于航海或者登山。我们接着来分析下代码。

代码回顾

代码的第一部分与上个项目是完全一样的。也是初始化一个变量,设置数字引脚10的模式为输出模式。在主函数loop()中,你可以看到与上一个项目中类似的语句用来控制LED的开和关,并保持一段时间。然而,这次不同的是,主函数包含了三个独立的代码段。

第一段代码是输出是三个点:

            for(int x=0;x<3;x++){
                    digitalWrite(ledPin,HIGH);            //设置LED 为开
                    delay(150);                           //延时150毫秒
                    digitalWrite(ledPin,LOW);             //设置LED 为关
                    delay(100);                           //延时100毫秒

}

LED开关的语句是包含在一对花括号内的,因此为一组代码段。必须说明的,花括号必须成对出现,如有遗留编译器编译时将不通过。有个小技巧大家可以学一下,在开始写花括号的时候,就先把“{”“}”都写上,之后再在两个括号之间输入代码,这样就不会出现写到最后括号对应不上的情况。

当程序运行后我们可以看到,灯闪了3次而不是只闪了1次。产生这样效果的是因为使用了for循环。for语句通常在程序中用作循环使用。我们来看一下:
for语句格式如下:

for循环顺序如下:
截屏2020-07-09 13.19.53.png
第一轮:1  2  3  4
第二轮:2  3  4

直到2不成立,for循环结束。

来看下我们程序中的for循环:

for(int x=0;x<3;x++){
      ……
}

第一步:初始化变量x=0。
第二步:判断x是否小于3。
第三步:判断第二步成立,for循环中执行LED开与关。
第四步:x自加,变为2。
(x++这句话表示把x的值增加1,等同于写成x=x+1,也就是把x当前的值变为x+1,再赋给x一遍。0变为1,第二轮循环则1变2。)
第五步:回到第二步,此时x=2,判断是否小于3。
第六步:重复第三步。
......
直到x循环到3时,判断x< 3不成立,自动跳出for循环,程序继续往下走。   

我们这里需要它循环3次,所以设置为x < 3。从0开始计算,0到2,循环了3次。那如果要循环100次的话呢?答案:for(int x=0;x< 100;x++){}

我们在写一些判断语句的时候会经常用到一些比较运算符,比如大于,小于等等。下面就说下常用的比较运算符。

比较运算符

“<”称之为比较运算符。比较运算符在代码中是用作判断的,比较两个值。我们常用的比较运算符有:

     ==(等于)
     !=(不等于)
     <(小于)
     >(大于)
     <=(小于等于)
     >=(大于等于)

特别要说明一下,等于必须是两个等号。还有像小于等于和大于等于,<和=之间不能留有空格,否则编译不通过。

当然,除了比较运算符外,程序也可以用的+、-、*、/(加、减、乘、除)这些常用的算术运算符。

现在知道for循环是如何运作吧!我们代码中有3个for循环:第一个for循环3次,长闪烁3次,代表输出3个点,也就是字母“S”。第二个for循环同样循环3次,短闪烁3次,代码输出3个横杠,也就是字母“0”。第三个for循环又来输出个“S”。

必须要注意的,我们这里要引用一个新的概念,是局部变量和全局变量。局部变量,这类变量只在自己的代码内起作用。就像我们这里for循环中的变量x,它就是个局部变量,所以说,虽然每个for循环中都有一个变量x,但它们不冲突就是这样原因,它们只在自己的循环中执行。还有一种变量叫全局变量,不同之处是,它能在整个程序中起作用,但条件是,必须在setup()、loop()函数外声明。就像我们这里的ledPin,能在整个程序中起作用。

在每for循环之间有个小延时100毫秒,是S.O.S字母之间有个清晰的停顿说明。最后,在回到主函数loop重新执行一遍之前,有个相对较长的延时,为5秒。

好了,我们S.O.S信号源项目就算告一个段落了。有所收获吗?

课后作业

我们学习了两个项目的基础,现在做个课后习题吧~做个交通信号灯,下图是整个一个运行过程,虚线框的是程序循环的部分。
提示:以上我们是只点亮的一个LED灯,现在需要点亮三个LED灯。电路连接的原理是和一个灯相同,程序中需要改变的用三个数字口来分别控制3个LED灯。自己动手试一下吧!
截屏2020-07-09 13.21.51.png

DF创客社区版权所有,欢迎转载。
转载请务必标注来源: DF创客社区+作者姓名+原文网址。



合乎  初级技匠

发表于 2013-12-30 22:15:54

后面几个lesson呢
回复

使用道具 举报

Jane  高级技匠
 楼主|

发表于 2014-1-2 10:16:54

合乎 发表于 2013-12-30 22:15
后面几个lesson呢

之后会慢慢更新的~
回复

使用道具 举报

Jane  高级技匠
 楼主|

发表于 2014-1-2 10:18:16

合乎 发表于 2013-12-30 22:15
后面几个lesson呢

如果看教程的过程中有什么好的建议和问题也可以提
回复

使用道具 举报

Ash  管理员

发表于 2014-3-19 18:26:41

教程写的太好了吧,感动cry啊
回复

使用道具 举报

xuexideyang  见习技师

发表于 2016-1-27 22:43:34

楼主,讲解的好详细啊。
不过循环有点不清楚,For 循环第四步  是不是应该是 X=1;第五步  判断X<3成立,执行循环;第六步  ,X++,X=2;第七步 判断X<3成立,执行循环;第八步  ,X++,X=3; 第九步,判断X<3不成立,退出循环。
回复

使用道具 举报

平凡的世界  见习技师

发表于 2016-8-6 19:04:51

学习的好资料。感谢楼主
回复

使用道具 举报

nick19860328  学徒

发表于 2016-10-6 01:22:20

xuexideyang 发表于 2016-1-27 22:43
楼主,讲解的好详细啊。
不过循环有点不清楚,For 循环第四步  是不是应该是 X=1;第五步  判断X ...

确实应该是x=0然后1然后2,循环三次
回复

使用道具 举报

zuoyan  见习技师

发表于 2017-3-1 20:25:21

学习了
回复

使用道具 举报

Jane  高级技匠
 楼主|

发表于 2017-3-24 23:28:14


期待作品分享哈~
回复

使用道具 举报

gray6666  初级技神

发表于 2017-3-27 14:29:36

教程详细,感谢分享
回复

使用道具 举报

Peter达  学徒

发表于 2017-5-1 15:21:15

谢谢分享
回复

使用道具 举报

地狱满员  初级技师

发表于 2018-1-28 01:03:04

写得很好特别是程序分析过程,这个过程是小白们理解程序执行原理所需要的,猛赞
回复

使用道具 举报

1093050170  学徒

发表于 2019-6-25 10:29:55

很详细!!
回复

使用道具 举报

LeSoleil  见习技师

发表于 2019-7-17 09:16:40

太好了!
回复

使用道具 举报

绝地智者  见习技师

发表于 2019-7-19 22:13:53

厉害了,新手来顶一顶帖子,加油学习~
回复

使用道具 举报

云飞  见习技师

发表于 2019-10-15 17:17:50

很好 有代码
回复

使用道具 举报

jzzgb  见习技师

发表于 2019-10-31 21:14:58

不错,点赞
回复

使用道具 举报

DFHk-0ykaN8  见习技师

发表于 2020-3-9 11:43:44

为什么  这样写效果是很奇怪的抖动,,没有呼吸的效果  
我的习惯是这样写的
回复

使用道具 举报

且听风吟丶  见习技师

发表于 2020-6-26 22:50:18

期待我也能做出来
回复

使用道具 举报

IdSNilMdFl2A  学徒

发表于 昨天 11:37

红绿灯代码!我是小白!有什么地方可以完善的吗?

int ledpin1 = 8;
int ledpin2 = 10;
int ledpin3 = 12;
void setup() {
       pinMode(ledpin1, OUTPUT);
       pinMode(ledpin2,OUTPUT);
       pinMode(ledpin3,OUTPUT);
}
void loop() {
      digitalWrite(ledpin1,HIGH);
      digitalWrite(ledpin2,LOW);
      delay(5000);
      digitalWrite(ledpin1,HIGH);
      digitalWrite(ledpin2,HIGH);
      delay(2000);
      digitalWrite(ledpin1,LOW);
      digitalWrite(ledpin2,LOW);
      digitalWrite(ledpin3,HIGH);
      delay(5000);
      digitalWrite(ledpin2,HIGH);
      digitalWrite(ledpin3,LOW);
      delay(2000);
}
回复

使用道具 举报

12下一页
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2021 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail