打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Arduino教程 Lesson 3:做一个S.O.S求救信号灯
简单回顾下Lesson 2的内容:

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


STEP 1:还原Lesson 2的硬件电路


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

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

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

有Lesson 1 和Lesson 2的基础,不难理解下面这段代码吧!
  1. int ledPin = 10;
  2. void setup() {
  3.         pinMode(ledPin, OUTPUT);
  4. }
  5. void loop() {
  6.         // 三个快闪烁来表示字母“S”
  7.         digitalWrite(ledPin,HIGH);
  8.         delay(150);
  9.         digitalWrite(ledPin,LOW);
  10.         delay(100);
  11.         
  12.         digitalWrite(ledPin,HIGH);
  13.         delay(150);
  14.         digitalWrite(ledPin,LOW);
  15.         delay(100);

  16.         digitalWrite(ledPin,HIGH);
  17.         delay(150);
  18.         digitalWrite(ledPin,LOW);
  19.         delay(100);

  20.         //三个短闪烁来表示字母“O”
  21.         digitalWrite(ledPin,HIGH);
  22.         delay(400);
  23.         digitalWrite(ledPin,LOW);
  24.         delay(100);

  25.         digitalWrite(ledPin,HIGH);
  26.         delay(400);
  27.         digitalWrite(ledPin,LOW);
  28.         delay(100);

  29.         digitalWrite(ledPin,HIGH);
  30.         delay(400);
  31.         digitalWrite(ledPin,LOW);
  32.         delay(100);

  33.         //再用三个快闪烁来表示字母“S”
  34.         digitalWrite(ledPin,HIGH);
  35.         delay(150);
  36.         digitalWrite(ledPin,LOW);
  37.         delay(100);
  38.         
  39.         digitalWrite(ledPin,HIGH);
  40.         delay(150);
  41.         digitalWrite(ledPin,LOW);
  42.         delay(100);

  43.         digitalWrite(ledPin,HIGH);
  44.         delay(150);
  45.         digitalWrite(ledPin,LOW);
  46.         delay(100);
  47. }
复制代码

STEP 2:输入代码

上面的写法固然正确,可是是不是觉得有点繁琐呢?如果有个100个,难不成还重复100遍吗?有没有更好的书写程序的方法呢?想必发明编程的人也考虑到这个问题了,所以有了我们更好的一种写法。我们先来看一下下面这段代码。
  1. int ledPin = 10;
  2. void setup() {
  3.         pinMode(ledPin, OUTPUT);
  4. }
  5. void loop() {
  6.         // 三个快闪烁来表示字母“S”
  7.        for(int x=0;x<3;x++){
  8.                digitalWrite(ledPin,HIGH);            //设置LED 为开
  9.                delay(150);                           //延时150毫秒
  10.                digitalWrite(ledPin,LOW);             //设置LED 为关
  11.                delay(100);                           //延时100毫秒
  12.        }
  13.       
  14.         //100毫秒延时产生字母之间的间隙
  15.         delay(100);

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

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

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

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


代码回顾

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

第一段代码是输出是三个点:
  1.     for(int x=0;x<3;x++){
  2.      digitalWrite(ledPin,HIGH);            //设置LED 为开
  3.      delay(150);                           //延时150毫秒
  4.      digitalWrite(ledPin,LOW);             //设置LED 为关
  5.      delay(100);                           //延时100毫秒
  6.        }
复制代码

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

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



for循环顺序如下:
   第一轮:1 --> 2 -->3 --> 4
   第二轮:2 --> 3 --> 4
   …
   直到2不成立,for循环结束。


来看下我们程序中的for循环:
  1. for(int x=0;x<3;x++){
  2.       ……
  3. }
复制代码
第一步:x开始为0;

第二步:判断x是否小于3。
第三步:判断第二步成立,for循环中执行LED开与关。
第四步:x自加,变为2。

这里有个x++,这是什么意思呢?
x++这句话表示把x的值增加1,等同于写成x=x+1,也就是把x当前的值变为x+1。


第五步:回到第二步,此时x=2,判断是否小于3。
第六步:重复第三步。
……

直到x循环到3时,判断x<3不成立,自动跳出for循环,程序继续往下走。

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

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

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


可以做些其他的事

有了一定的基础,现在做个课后习题吧~做个交通信号灯,下图是整个一个运行过程,虚线框的是程序循环的部分。

提示:上面我们是只点亮的一个LED灯,现在需要点亮三个LED灯。电路连接的原理是和一个灯相同,程序中需要改变的用三个数字口来分别控制3个LED灯。自己动手试一下吧!


本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
Arduino教程 2 LED灯闪烁
LabVIEW编程进阶:实现交通信号灯示例
用App Inventor蓝牙控制Arduino的LED灯开关
搭建第一个程序控制电路LED灯,体会C语言的魅力
自己动手打造家庭安保系统
轮流变换方向的流水灯
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服