查看: 2248|回复: 1

[入门] 【S.O.S求救信号】基于Mind+ Ardunio入门教程02

[复制链接]
本帖最后由 DFEDU 于 2019-12-2 10:15 编辑

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

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

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



图形化编程  
     
       在输入指令前我们先来理解样例程序2-1,先不要急着输入这段代码,只是看一下。

样例程序 2-1:


       这一编法正确无疑,然而是不是觉得有点繁琐呢?如果有个100个,难不成还重复100遍吗?有没有更好的书写程序的方法呢?想必发明编程的人也考虑到这个问题了,所以我们使用一个新的模块来解决这一问题。


       连接好主板和电脑,打开Mind+载入扩展的Arduino UNO库,输入样例程序2-2所示程序。
样例程序2-2


       输入完毕后,确认正确后,点击下载代码到Arduino中,如果一切顺利的话,我们将看到LED闪烁出摩尔斯码S.O.S信号,等待0.5秒。重复闪烁。给Arduino外接电池,整个装到防水的盒子里,就可以用来发S.O.S信号了。S.O.S通常用于航海或者登山。  



图形化指令学习



代码学习

本项目的C代码如下。接下来我们将依次学习每一行代码的意义

[mw_shl_code=applescript,true]// 主程序开始
void setup() {

}
void loop() {
        for (int index = 0; index < 3; index++) {
                digitalWrite(13, HIGH);
                delay(150);
                digitalWrite(13, LOW);
                delay(100);
        }
        delay(100);
        for (int index = 0; index < 3; index++) {
                digitalWrite(13, HIGH);
                delay(450);
                digitalWrite(13, LOW);
                delay(100);
        }
        delay(100);
        for (int index = 0; index < 3; index++) {
                digitalWrite(13, HIGH);
                delay(150);
                digitalWrite(13, LOW);
                delay(100);
        }
        delay(100);
}[/mw_shl_code]

       当程序运行后我们可以看到,灯闪了3次而不是只闪了1次。我们再来看一下,在loop主函数中包含了三个独立的代码段,每一段的开头都能发现for的字样,这就是我们用来解决重复执行相同代码的好帮手。正式因为使用了for循环才能产生这样的效果。


for 循环

       for语句格式如下:

       for循环顺序如下:

              第一轮:1 → 2 → 3 → 4
              第二轮:2 → 3 → 4
              …
              直到2不成立,for循环结束。
       来看下我们程序中的for循环:

[mw_shl_code=applescript,true]for(int index=0;index<3;index++){  
      ……  
}  [/mw_shl_code]

              第一步:初始化变量index=0。
              第二步:判断index是否小于3。
              第三步:判断第二步成立,for循环中执行LED亮与灭。
              第四步:index自加,变为1。
             (index++这句话表示把index的值增加1,等同于写成index=index+1,也就是把index当前的值变为index+1,再赋给index一遍。0变为1,第二轮循环则1变2。)
              第五步:回到第二步,此时index=1,判断是否小于3。
              第六步:重复第三步。
              ……
              直到index循环到3时,判断index<3不成立,自动跳出for循环,程序继续往下走。  
  
       我们这里需要它循环3次,所以设置为index<3。从0开始计算,0到2,循环了3次。那如果要循环100次的话呢?答案:for(int index=0;index<100;index++){}

       必须说明的,花括号必须成对出现,如有遗留编译器编译时将不通过。有个小技巧大家可以学一下,在开始写花括号的时候,就先把“{”“}”都写上,之后再在两个括号之间输入代码,这样就不会出现写到最后括号对应不上的情况。在本章的课后作业中,我们就要开始尝试自己敲击键盘,在手动编辑区输入代码。这些小细节还需要大家牢记在心。

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


比较运算符

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

==(等于)                      >(大于)

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

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

       特别要说明一下,在之后手动编写代码的时候,等于必须是两个等号。还有像小于等于和大于等于,<和=之间不能留有空格,否则编译不通过。

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

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

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

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



课后作业

       学习了两个项目的基础,让我们来自己动手输入一下本项目“代码学习”中的一行行语句吧!

       点击“手动编辑”即可通过键盘输入代码!


       输入完代码后,右键点击“上传到设备”旁的上箭头,通过“仅编译”检验代码是否存在格式等问题


*进行图形化编程来修改程序的时候,只会更改“自动生成”中的代码。若此时对话框处于“手动编辑”,点击“上传到设备”,并不能够将图形化编程转化的代码烧录到板中!需要我们再点击“自动生成”进行切换,再上传,才能够更新板子中的程序。

       C语言编程就好比写字,字迹要求横平竖直、排版工整、美观隽秀的同时还要保证一定的书写速度。风格良好的代码亦是如此,语句格式、缩进对齐与输入代码的效率,一并需要。这两者都得积累平时一点一滴的水磨工夫,才能养成良好的习惯,写代码时更得心应手,为项目六及其之后的纯代码学习夯实基础!
*仅编译后出现报错的可能原因(1):


*出现这一问题的原因是在某一行语句指令的末端,没有加上 ; 或者输入的是中文输入法中的分号

       此外再用Mind+做个课后习题:交通信号灯~下图是整个一个运行过程,虚线框的是程序循环的部分。

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


gada888  版主

发表于 2019-11-26 15:10:49

好教程
回复

使用道具 举报

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

本版积分规则

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

硬件清单

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

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

mail