电影里常见的摩斯密码,我用Arduino给你加密了一句话

网友投稿 2019-07-01 22:58

https://cdn.china-scratch.com/timg/190703/225K24P8-0.jpg

摩斯密码(Morse Code),很多人肯定都听说过它的名字,尤其在电影中更是经常见到摩斯密码的身影。

但是多数人不了解,认为这是一个神圣的领域,难以企及。

其实,摩斯密码远远没有想象中的特别讳莫如深。相反,它是我目前认识的各种编码方式中最简单的一种。

01

Morse Code

编码方式

1837年,美国画家、电报之父塞缪尔·摩斯(Samuel Morse)发明了摩斯密码。

https://cdn.china-scratch.com/timg/190703/225K23H0-1.jpg

时至今日,对于摩斯密码的发明者仍有争议。还有一种说法是,摩斯密码由美国人艾尔菲德·维尔发明,当时他正在协助塞缪尔·摩斯进行摩尔斯电报机的开发。知乎

摩斯密码是一套用于交流的系统,它依靠一系列的点(dits)和划(dahs)来表示数字和字母,从而传递编码信息。

点表示为 “ · ”,读作「 滴 」,是短促的脉冲信号;

划表示为 “ — ”,读作「 嗒 」,是持续一段时间的长信号。

数字的编码方式很容易记忆,5个 “ — ” 是0,从前面依次加 “ · ” 是1至5,从后面加 “ · ” 是9至5。

https://cdn.china-scratch.com/timg/190703/225K3A52-2.jpg

字母的编码规律不太容易发现,一眼看上去会觉得很乱。

https://cdn.china-scratch.com/timg/190703/225K31507-3.jpg

但是如果用图形化的方式进行编码的话,还是可以发现些许规律。

https://cdn.china-scratch.com/timg/190703/225K42363-4.jpg

知道摩斯密码的编码方式后,我们就可以用一系列的点和划来表示相应的字母和数字,从而传递信息。

所以,我们可以在电影、生活、历史中经常看到摩斯密码的身影。

《风声》中,顾晓梦在旗袍上缝的,是用摩斯密码留下的遗书。

https://cdn.china-scratch.com/Public/Home/images/grey.gif

北京邮电大学校园内,地砖上的长条和点状图案是以摩斯密码显示的校训:“厚德博学 敬业乐群”。

https://cdn.china-scratch.com/timg/190703/225K950c-6.jpg

1912年,泰坦尼克号游轮首航遇险时,在游轮快沉没时才发送新的求救信号,用摩斯密码编写的SOS(· · · / — — — / · · ·,三短三长三短)。

https://cdn.china-scratch.com/timg/190703/225Ka464-7.jpg

后来,SOS的摩斯密码被远在纽约的一个人识别,并迅速告知全世界,最终使705人获救。

也就是在这之后,SOS被广泛使用。

https://cdn.china-scratch.com/timg/190703/225Ka596-8.jpg

所以,你可以对照摩斯密码表,用你能够想到的任何方式来传递摩斯密码中的点和划。

比如,敲击桌面的声音;比如,手电筒发出的光亮。

02

Morse Code

用 Arduino 进行编码

知道了摩斯密码的编码方式后,接下来,我要用 Arduino 控制 LED 灯,通过 LED 灯闪烁频率的变化,向你传递一段摩斯密码。

首先,我需要准备一块 Arduino UNO R3主控板,一块面包板,一个 LED 小灯,一个阻值为1K欧姆的色环电阻,以及两根跳线,并对它们进行电路接线。

电路接线图:

https://cdn.china-scratch.com/timg/190703/225P01551-9.jpg

电路原理图:

https://cdn.china-scratch.com/timg/190703/225P0F10-10.jpg

然后,开始编写程序,告诉电路板应该做些什么:

int ledPin = 7; //告诉电路板,LED灯在7号数字口
void setup(){pinMode(ledPin, OUTPUT); //设置7号数字口的模式为输出pinMode(LED_BUILTIN, OUTPUT); //设置单片机自带的板载LED为输出模式}
//定义摩斯密码中的点(dits)信号void dits(){//LED灯点亮短暂的0.5秒digitalWrite(ledPin, HIGH);delay(500);digitalWrite(ledPin, LOW);delay(200);}
//定义摩斯密码中的划(dahs)信号void dahs(){//LED灯点亮2秒digitalWrite(ledPin, HIGH);delay(2000);digitalWrite(ledPin, LOW);delay(200);}
//定义字符之间的分隔信号,便于观察void division(){//让单片机自带的板载LED灯进行闪烁for(int x = 0; x < 3; x++){digitalWrite(LED_BUILTIN, HIGH);delay(200);digitalWrite(LED_BUILTIN, LOW);delay(200);}}
void loop(){  //分隔信号闪烁,提示准备传递信号division();
//传递第一个字符dahs();dahs();dits();
  //分隔信号闪烁,便于观察division();
//传递第二个字符dits();
  //分隔信号闪烁,便于观察division();
//传递第三个字符dahs();  delay(1000);}

接下来,我们就可以一起来破译摩斯密码了:

(Ps:视频有背景音效,请合适调节音量)

至此,一段完整的字符就已经发送完毕。

剩下的,就是记录LED灯的闪烁频率,并对照摩斯密码表进行译码即可。

只要理解了摩斯密码的编码方式后,要解出其中蕴含的字母就显得特别的简单:

第一个字符:两长一短( — — · ),对应字母 G;

第二个字符:一短( · ),对应字母 E;

第三个字符:一长( — ),对应字母 T;

没错,我要给你传递的信息就是一个字符串:GET。

GET 一项新技能,无论你从什么时候开始学习编程,永远不会为时已晚。

因为,

再小的技能,都值得被认真对待。

好了,本次课程内容就这么多。

未完待续。

本文内容为  HOME+  原创出品

如果对你有所帮助,欢迎在文章底部点击「好看」


另外,我们的第一季课程「玩转 Arduino」正在报名中,点击下方图片,即可报名。

对课程感兴趣的青少年读者,可以把握一下机会。点击文章底部「阅读原文」,了解报名详情。

--end--

声明:本文章由网友投稿作为教育分享用途,如有侵权原作者可通过邮件及时和我们联系删除:freemanzk@qq.com