112889| 24
|
[入门教程] Arduino教程03 做一个S.O.S求救信号灯「DFR0100 」 |
该教程实验平台:Arduino入门套件 简单回顾下Lesson 2的内容:
项目二 S.O.S求救信号器本项目将继续使用项目1的搭建的电路,但我们这里将改变一下代码,就能让我们的LED变为S.O.S求救信号了。这是国际莫尔斯码求救信号。莫尔斯码是一种字符编码,英文的每个字母,都是由横杠和点不同的组合而成。这样的好处是,使用简单的两种状态,就能来传递所有的字母和数字,非常的简便!不得不佩服前人的聪明吧! 我们正好可以通过LED开关两种状态来拼出一个个字母。通过长闪烁和短闪烁来表示点和横杠。我们这个项目中,我们就拼写S.O.S这三个字母。 通过查阅莫尔斯码表,我们可以知道,字母“S”用三个点表示,我们这里用短闪烁替代,字母“O”则用三个横杠表示,用长闪烁替代。 有了前一个项目的基础,不难理解下面样例代码2-1。但先不要急着输入这段代码,只是看一下。 样例代码2-1:( 注意:我们这里使用的是数字引脚10,而不是13。)
STEP 2:输入代码上面的写法固然正确,可是是不是觉得有点繁琐呢?如果有个100个,难不成还重复100遍吗?有没有更好的书写程序的方法呢?想必发明编程的人也考虑到这个问题了,所以有了我们更好的一种写法。我们先来看一下样例代码2-2。 样例代码2-2:
代码回顾代码的第一部分与上个项目是完全一样的。也是初始化一个变量,设置数字引脚10的模式为输出模式。在主函数loop()中,你可以看到与上一个项目中类似的语句用来控制LED的开和关,并保持一段时间。然而,这次不同的是,主函数包含了三个独立的代码段。 第一段代码是输出是三个点:
} LED开关的语句是包含在一对花括号内的,因此为一组代码段。必须说明的,花括号必须成对出现,如有遗留编译器编译时将不通过。有个小技巧大家可以学一下,在开始写花括号的时候,就先把“{”“}”都写上,之后再在两个括号之间输入代码,这样就不会出现写到最后括号对应不上的情况。 当程序运行后我们可以看到,灯闪了3次而不是只闪了1次。产生这样效果的是因为使用了for循环。for语句通常在程序中用作循环使用。我们来看一下: for循环顺序如下: 来看下我们程序中的for循环:
第一步:初始化变量x=0。 我们这里需要它循环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信号源项目就算告一个段落了。有所收获吗? 课后作业我们学习了两个项目的基础,现在做个课后习题吧~做个交通信号灯,下图是整个一个运行过程,虚线框的是程序循环的部分。
|
红绿灯。。。
|
红绿灯代码!我是小白!有什么地方可以完善的吗? 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); } |
int ledRed = 2; int ledYellow = 3; int ledGreen = 4; void setup() { pinMode(ledRed,OUTPUT); pinMode(ledYellow,OUTPUT); pinMode(ledGreen,OUTPUT); } void loop() { // put your main code here, to run repeatedly: digitalWrite(ledRed,HIGH); delay(5000); digitalWrite(ledYellow,HIGH); delay(2000); digitalWrite(ledRed,LOW); digitalWrite(ledYellow,LOW); digitalWrite(ledGreen,HIGH); delay(5000); digitalWrite(ledGreen,LOW); digitalWrite(ledYellow,HIGH); delay(2000); digitalWrite(ledYellow,LOW); } |
xuexideyang 发表于 2016-1-27 22:43 确实应该是x=0然后1然后2,循环三次 |
© 2013-2023 Comsenz Inc. Powered by Discuz! X3.4 Licensed