快捷搜索:  汽车  科技

arduino循迹传感器原理(神奇的Arduino4)

arduino循迹传感器原理(神奇的Arduino4)LED亮 -> 等待1个工作时间 -> LED灭 ->根据上面的规则,我们可以写出发送S的代码:l在一个字母里,每个点或横线之间要有1个单位的延迟时间;l每个字母间,要有3个单位的延迟时间;l在每个单词间,要有7个单位的延迟时间。

【步睿课堂原创电脑知识精华,不做搬运工,不做Ctrl-Ver,想要学到干货,请关注我们!】

在上次神奇的arduino文章里讲了如何点亮外部LED,并让其闪烁。今天我们就在昨天的基础上做一个小小的升级,让LED有规律的闪烁,发送一个摩尔斯的SOS求救代码。

硬件我们依然用上次的,在这里我就不做过多的叙述了,如果又不太理解的,可以看上篇文章《神奇的arduino3》。

元件连接图

arduino循迹传感器原理(神奇的Arduino4)(1)

设计思路

arduino循迹传感器原理(神奇的Arduino4)(2)

这张是摩尔斯密码表,一个点代表一个短音(嘀),一个横线代表一个长音(嗒),我们可以看到S是3个点。在摩尔斯编码的时候存在一些规则:

l横线的工作时间是点的3倍

l在一个字母里,每个点或横线之间要有1个单位的延迟时间;

l每个字母间,要有3个单位的延迟时间;

l在每个单词间,要有7个单位的延迟时间。

根据上面的规则,我们可以写出发送S的代码:

LED亮 -> 等待1个工作时间 -> LED灭 ->

等待1个延迟时间 ->

LED亮 -> 等待1个工作时间 -> LED灭 ->

等待1个延迟时间 ->

LED亮 -> 等待1个工作时间 -> LED灭

发送一个O代码:

LED亮 -> 等待3个工作时间 -> LED灭 ->

等待1个延迟时间 ->

LED亮 -> 等待3个工作时间 -> LED灭 ->

等待1个延迟时间 ->

LED亮 -> 等待3个工作时间 -> LED灭

把S和O拼接到一起,每个字母间等待3个延迟时间:

LED亮 -> 等待1个工作时间 -> LED灭 ->

等待1个延迟时间 ->

LED亮 -> 等待1个工作时间 -> LED灭 ->

等待1个延迟时间 ->

LED亮 -> 等待1个工作时间 -> LED灭

等待3个延迟时间 ->

发送一个O代码:

LED亮 -> 等待3个工作时间 -> LED灭 ->

等待1个延迟时间 ->

LED亮 -> 等待3个工作时间 -> LED灭 ->

等待1个延迟时间 ->

LED亮 -> 等待3个工作时间 -> LED灭

等待3个延迟时间 ->

LED亮 -> 等待1个工作时间 -> LED灭 ->

等待1个延迟时间 ->

LED亮 -> 等待1个工作时间 -> LED灭 ->

等待1个延迟时间 ->

LED亮 -> 等待1个工作时间 -> LED灭 ->

等待7个延迟时间

最后,我们让每个信号间有一个间隔,现在SOS完整的思路出来,我们根据这个思路,写出代码。

程序代码

代码还使用上篇文章里出现的语句就够了

// LED引脚

int ledPin = 2;

// 定义1个单位的工作时间,单位毫秒

int workTime = 200;

// 定义1个单位的延迟时间

int delayTime = 200;

void setup()

{

pinMode(ledPin OUTPUT);

}

void loop()

{

// 字母S开始---------------------

// 滴

digitalWrite(ledPin HIGH);

delay(workTime);

digitalWrite(ledPin LOW);

// 等待1个延迟时间

delay(delayTime);

// 滴

digitalWrite(ledPin HIGH);

delay(workTime);

digitalWrite(ledPin LOW);

// 等待1个延迟时间

delay(delayTime);

// 滴

digitalWrite(ledPin HIGH);

delay(workTime);

digitalWrite(ledPin LOW);

// 字母S结束----------------------

// 滴答间间隔3个延迟时间

delay(delayTime * 3);

// 字母O开始---------------------

// 哒

digitalWrite(ledPin HIGH);

delay(workTime * 3);

digitalWrite(ledPin LOW);

// 等待1个延迟时间

delay(delayTime);

// 哒

digitalWrite(ledPin HIGH);

delay(workTime * 3);

digitalWrite(ledPin LOW);

// 等待1个延迟时间

delay(delayTime);

// 哒

digitalWrite(ledPin HIGH);

delay(workTime * 3);

digitalWrite(ledPin LOW);

// 字母O结束----------------------

// 字母S开始---------------------

// 滴

digitalWrite(ledPin HIGH);

delay(workTime);

digitalWrite(ledPin LOW);

// 等待1个延迟时间

delay(delayTime);

// 滴

digitalWrite(ledPin HIGH);

delay(workTime);

digitalWrite(ledPin LOW);

// 等待1个延迟时间

delay(delayTime);

// 滴

digitalWrite(ledPin HIGH);

delay(workTime);

digitalWrite(ledPin LOW);

// 字母S结束----------------------

// 单词间延迟7个时间单位

delay(delayTime * 7);

}

其实代码没有什么可以解释的了,因为我们的代码全是按照刚才的思路翻译出来的。看到这些代码,你肯定非常头痛,如果我们要发送一句话,那是不是要写上千行代码?这是一个非常庞大的工作量,而且还用容易出错。如果你能想到这里,很好,那你适合学习编程,因为编程就是为了代替人们完成大量重复的工作。

优化代码

我们通过找规律可以发现代码中存在大量重复,我们可以把重复的代码提炼出来,用一个代码块(函数)来封装他们:

void di(){

digitalWrite(ledPin HIGH);

delay(workTime);

digitalWrite(ledPin LOW);

}

void da(){

digitalWrite(ledPin HIGH);

delay(workTime * 3);

digitalWrite(ledPin LOW);

}

然后在需要滴的时候用这个函数名来代替,就像这样

// 字母S开始---------------------

// 滴

di();

// 等待1个延迟时间

delay(delayTime);

// 滴

di();

// 等待1个延迟时间

delay(delayTime);

// 滴

di();

// 字母S结束----------------------

这样就节约了大量时间,减少了代码行数,使代码的复用性更高。接下来看完整的程序:

// LED引脚

int ledPin = 2;

// 定义1个单位的工作时间,单位毫秒

int workTime = 200;

// 定义1个单位的延迟时间

int delayTime = 200;

void setup()

{

pinMode(ledPin OUTPUT);

}

void di(){

digitalWrite(ledPin HIGH);

delay(workTime);

digitalWrite(ledPin LOW);

}

void da(){

digitalWrite(ledPin HIGH);

delay(workTime * 3);

digitalWrite(ledPin LOW);

}

void loop()

{

// 字母S开始---------------------

// 滴

di();

// 等待1个延迟时间

delay(delayTime);

// 滴

di();

// 等待1个延迟时间

delay(delayTime);

// 滴

di();

// 字母S结束----------------------

// 滴答间间隔3个延迟时间

delay(delayTime * 3);

// 字母O开始---------------------

// 哒

da();

// 等待1个延迟时间

delay(delayTime);

// 哒

da();

// 等待1个延迟时间

delay(delayTime);

// 哒

da();

// 字母O结束----------------------

// 字母S开始---------------------

// 滴

di();

// 等待1个延迟时间

delay(delayTime);

// 滴

di();

// 等待1个延迟时间

delay(delayTime);

// 滴

di();

// 字母S结束----------------------

// 单词间延迟7个时间单位

delay(delayTime * 7);

}

代码分析

这节课我们主要学会了一个新的知识:函数

接下来我们详细的了解以下函数。

C 语言中的函数定义的一般形式如下:

return_type function_name( parameter list )

{

body of the function

}

·返回类型:一个函数可以返回一个值。return_type是函数返回的值的数据类型。有些函数执行所需的操作而不返回值,在这种情况下,return_type 是关键字 void

·函数名称:function_name是函数的实际名称,你可以根据情况自己设定名称。函数名和参数列表一起构成了函数签名。

·参数:(parameter list参数就像是占位符。当函数被调用时,您向参数传递一个值,这个值被称为实际参数。参数列表包括函数参数的类型、顺序、数量。参数是可选的,也就是说,函数可能不包含参数。

·函数主体:(body of thefunction函数主体包含一组定义函数执行任务的语句。

在调用函数的时候只需要写:函数名();就可以调用了。

后语

今天我们做了一个SOS的摩尔斯电码发送器,下篇文章我们会做一个完整的摩尔斯编码器,难度会比今天提升一个数量级。

想学更多吗?赶紧关注我们并在评论区留言,我们会制作你喜欢的课程。

猜您喜欢: