124199| 25
|
[入门教程] Arduino教程02 做一个S.O.S求救信号灯「DFR0100 」 |
【本篇课程内容于 2024年8月2日更新】 >课程配套Arduino器材:Arduino入门套件 DFR0100 Arduino教程02项目 - SOS求救信号器 本项目将继续使用【闪烁第一个LED】所搭建的电路(注意引脚有所更换),只需要对代码进行一定的改动,就能让我们的LED发出SOS求救信号了。 国际摩斯码是一种独特的字符编码系统,其精妙之处在于它利用简单的两种信号:横杠(长音)和点(短音),通过不同的组合方式来代表英文中的每一个字母以及数字。这种设计极大地简化了信息传递的复杂性,因为仅需两种基本信号形态,就能构建出完整的通信语言。这种创造性的编码方式展现了前人非凡的智慧与创新能力,确实令人钦佩不已。 我们正好可以通过LED发光的长短来代表不同的字母。通过长闪烁和短闪烁来分别表示横杠和点。在这个项目中,我们就拼写SOS这三个字母。 通过查阅摩斯码表,我们可以知道,字母“S”的摩斯码是三个点,我们这里用三次短闪烁表示。字母“O”则是三个横杠,用三次长闪烁表示。 硬件连接 图 1 SOS 求救信号器 示例代码 有了前一个项目的基础,不难理解下面样例代码1。但先不要急着输入这段代码,只是看一下。 样例代码1: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(1000); //1000毫秒延时产生字母之间的间隙 //三个长闪烁来表示字母“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(1000); //1000毫秒延时产生字母之间的间隙 //再用三个短闪烁来表示字母“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); // 在重复SOS信号前等待5秒 } 上面的写法固然正确,是不是觉得有点繁琐呢?如果有100个字母,难不成还重复100遍吗?有没有更好的编写程序的方法呢?想必发明编程的人也考虑到这个问题了,所以我们有了更好的一种写法。 我们先来看一下样例代码2。 样例代码2: //项目 -- SOS求救信号器 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毫秒 } //1000毫秒延时产生字母之间的间隙 delay(1000); //三个长闪烁来表示字母“O” for(int x=0;x<3;x++){ digitalWrite(ledPin,HIGH); //设置LED 为开 delay(400); //延时400毫秒 digitalWrite(ledPin,LOW); //设置LED 为关 delay(100); //延时100毫秒 } //1000毫秒延时产生字母之间的间隙 delay(1000); // 再用三个短闪烁来表示字母“S” for(int x=0;x<3;x++){ digitalWrite(ledPin,HIGH); //设置LED 为开 delay(150); //延时150毫秒 digitalWrite(ledPin,LOW); //设置LED 为关 delay(100); //延时100毫秒 } //在重复SOS信号前等待5秒 delay(5000); } 在输入代码的时候,注意保持代码层次的清晰,除了美观外,也便于你日后检查代码。编译通过后,上传代码到Arduino中,如果一切顺利的话,我们将看到LED闪烁出摩斯码SOS信号,等待5秒,重复闪烁。 通过使用Arduino板外接电池,并将整个装置封装在一个防水盒子里,我们就能创建出一个便携式设备,用于在紧急情况下发送国际通用的求救信号SOS。这一信号在航海和登山等户外活动中尤为重要,因为它能够快速有效地传达出求助信息。 我们接着来分析下代码。 代码回顾 代码loop()前的部分与项目【闪烁第一个LED】是完全一样的。也是初始化一个变量,设置数字引脚10的模式为输出模式。在主函数loop()中,你可以看到与项目【闪烁第一个LED】中类似的语句用来控制LED的打开和关闭,并通过延时delay()实现长短闪烁功能。然而,有所不同的是这次主函数包含了三个独立的代码段。 第一段代码段是输出代表字母“S”的三个点: 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(int x=0;x<3;x++){ ... } 第一次循环: · 声明并初始化变量x=0。 · 判断x<3,为真,则执行循环体中的程序。 · x自加,更新x为1。 第二次循环: · 此时x=1。 · 判断x<3,为真,则执行循环体中的程序。 · x自加,更新x为2。 ...... 循环结束: · 在下一次循环开始前,x的值被自加到3。 · 判断3<3,为假,因此循环结束,不再执行循环体。并继续向下执行。 (x++是x=x+1的简写,实现x的迭代(自加)功能。) 我们这里需要它循环3次,所以设置为x<3。从0开始计算,0,1,2,循环了3次。那如果要循环100次的话呢? 答案: for(int x=0;x<100;x++){ ... } 我们在写一些判断语句的时候会经常用到一些比较运算符,比如大于,小于等等。下面就介绍一些常用的比较运算符。 比较运算符 for循环中的“<”称之为比较运算符。比较运算符在代码中是用作判断的,用于比较两个值。我们常用的比较运算符有: ==(等于) >(大于) !=(不等于) <=(小于等于) <(小于) >=(大于等于) 特别要说明一下,比较运算中等于必须是两个等号(单等号的作用是赋值)。还有像小于等于和大于等于,<和=之间不能留有空格,否则编译不通过。 当然,除了比较运算符外,程序也可以用的+、-、*、/(加、减、乘、除)这些常用的算术运算符。 现在知道for循环是如何运作的了吧!我们的主函数loop()中有三个for循环,按照下面表格运行,最终完成SOS的输出。 第一个for循环 短闪烁3次,代表输出3个点,也就是字母“S” 第二个for循环 长闪烁3次,代码输出3个横杠,也就是字母“O” 第三个for循环 短闪烁3次,代表输出3个点,也就是字母“S” 局部变量和全局变量 必须要注意的,我们这里要引用一个新的概念:局部变量和全局变量。局部变量,这类变量只在自己的代码块内起作用。像是该程序的for循环中定义的变量x就属于局部变量,这意味着每个for循环都拥有自己独立的x变量。这些x变量之间互不影响,各自在其所属的循环中控制迭代过程,确保了即使在同一程序中存在多个for循环,它们之间的变量也不会产生冲突。还有一种变量叫全局变量,不同之处是,它能在整个程序中起作用,但条件是,必须在setup()、loop()函数外声明。像我们这里的ledPin,就能在整个程序中起作用。 在构建SOS求救信号器项目时,为了确保SOS信号中的每个字母(S、O、S)能够被清晰区分,我们在每个for循环迭代完成(表示一个字母)后,特意插入了1000毫秒的延时。这个延时使得SOS字母之间的停顿变得明显,有助于接收方准确识别每个字母。而在整个SOS信号序列完成后,即三个字母(S、O、S)均通过LED灯的闪烁表示完毕后,我们进一步设置了一个5秒的延时。这个较长的延时是在程序准备重新进入主循环loop()并执行下一轮SOS信号之前的一个等待时间,确保了SOS信号之间有足够的间隔,避免信号间的混淆。 好了,我们SOS求救信号器项目就算告一个段落了。有所收获吗? 课后练习 我们以【闪烁第一个LED】和【SOS求救信号器】两个项目作为基础,现在尝试自己做个交通信号灯吧,下图是交通信号灯的运行过程,虚线框的是程序的循环部分。自己动手试一下吧! 提示:原先我们只控制了一个LED灯,现在要扩展到同时控制三个不同颜色的LED灯。电路连接的基本原理保持不变,但我们需要利用三个不同的数字端口来分别控制这三个LED灯。在编程时,关键在于通过调整这些数字端口的高低电平信号,来独立控制每个LED灯的亮灭状态。 示例代码.rar 下一篇教程:Arduino教程 03 交通信号灯 DFRobot版权所有,欢迎转载。 转载请务必标注来源: DF创客社区+作者姓名+原文网址。 |
红绿灯。。。
|
红绿灯代码!我是小白!有什么地方可以完善的吗? 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); } |
楼主,讲解的好详细啊。 不过循环有点不清楚,For 循环第四步 是不是应该是 X=1;第五步 判断X<3成立,执行循环;第六步 ,X++,X=2;第七步 判断X<3成立,执行循环;第八步 ,X++,X=3; 第九步,判断X<3不成立,退出循环。 |
xuexideyang 发表于 2016-1-27 22:43 确实应该是x=0然后1然后2,循环三次 |
© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed