摩尔斯电码是一种通信系统,用于在称为点和破折号的两种不同持续时间的信号中对任何字符进行编码。莫尔斯电码由 Samuel FB 开发,并进一步用于电报传输秘密信息。它在第二次世界大战期间使用最多。摩尔斯电码可以通过敲击、闪光或书写来执行。莫尔斯电码有两个版本,原始的和国际的莫尔斯电码。在国际莫尔斯电码中,原始版本通过删除空格和设计特定长度的破折号进行了修改。摩尔斯电码可用于编码字母和数字。它主要用于无线电和海洋通信,也是士兵训练的一部分。
语言一直是摩尔斯电码的障碍,因为用其他语言很难执行变音符号的代码。有一些著名的词被认为是摩尔斯电码的重要特征,例如“SOS”。SOS 完整形式是拯救我们的灵魂,作为一种普遍的求救信号代表危险。
下图显示了从 A 到 Z 字母的摩尔斯电码。
今天在本教程中,我们将使用 Arduino 构建一个摩尔斯电码转换器,它将任何字符作为串行监视器的输入,并通过蜂鸣器将其转换为等效的摩尔斯电码蜂鸣声。
所需组件
阿杜诺
蜂鸣器
面包板
跳线
电路原理图
将蜂鸣器的正极引脚连接到 Arudino UNO 的第 8引脚,将负极引脚连接到 Arduino 的地。使用 Arduino IDE 上传代码并在串行监视器上键入字符以创建声音。Arduino还可以添加 LCD以显示短划线和圆点。
编程说明
最后给出了Arduino摩尔斯电码生成器的完整代码,这里我们解释程序以了解项目的工作。
下面的代码用于接收字符串,然后将其转换为莫尔斯电码。
char stringToMorseCode[] = "";
然后定义连接到 Arduino 的蜂鸣器的引脚以及该蜂鸣器产生的声音的音高。然后我们定义点和破折号的长度。
诠释音频8 = 8;// 在引脚 8 上输出音频 int note = 1200; // 音符/音高 int dotLen = 100; // 莫尔斯电码 'dot' 的长度 int dashLen = dotLen * 3; // 莫尔斯电码 'dash' 的长度
在void loop()函数中,如果串行数据可用,它将保存到变量indata中。然后它使用命令inData[index1]一个一个地读取字符。命令variable.toUppercase()用于将小写字符转换为大写。然后它根据每个字符创建声音。
无效循环() { char inChar = 0; 字符 inData[100] = ""; // 数据长度为 6 个字符 String variable = ""; 字符串变量 1 = ""; 整数索引1 = 0; if ( Serial.available() > 0 ) { while (Serial.available() > 0 && index1 < 100) { delay(100); inChar = Serial.read(); inData[index1] = inChar; 指数1++; inData[index1] = ''; } variable.toUpperCase(); for (byte i = 0 ; i < 100 ; i++) { variable.concat(String(inData[i])); } 延迟(20);
下面的函数MorseDot和MorseDash分别用于创建点和破折号的声音。
无效 MorseDot() { 音调(audio8, note, dotLen); // 开始播放音调 delay(dotLen); // 保持在这个位置 } 无效 MorseDash() { 音调(audio8, note, dashLen); // 开始播放音调 delay(dashLen); // 保持在这个位置 }
GetChar函数具有所有字母的代码。因此,每当我们键入任何字母时,都会从该函数中获取相应的摩尔斯电码来创建特定的声音。
void GetChar(char tmpChar) { switch (tmpChar) { case 'a': MorseDot(); 延迟(100); 摩斯破折号(); 延迟(100); 休息; … … … 默认: break; } }
现在使用 Arduino IDE 将代码上传到 Arduino,然后在串行监视器中输入任何字符,然后按 Enter 按钮将字符发送到 Arduino。
在这里,我们输入了“SOS”,这是一个通用的求救信号,以创建相同的声音。
char stringToMorseCode[] = "";
诠释音频8 = 8;// 在引脚 8 上输出音频
int note = 1200; // 音符/音高
int dotLen = 100; // 莫尔斯电码 'dot' 的长度
int dashLen = dotLen * 3; // 莫尔斯电码 'dash' 的长度
无效设置(){
序列.开始(9600);
}
无效循环()
{
char inChar = 0;
字符 inData= ""; // 数据长度为 6 个字符
String variable = "";
字符串变量 1 = "";
整数索引1 = 0;
if ( Serial.available() > 0 ) { // 从 atmega16 的 Rx 读取
< 100) // 读取到第 6 个字符
while (Serial.available() > 0 && index1
{
delay(100);
inChar = Serial.read(); // 开始读取并保存到变量
inData[index1] = inChar;
指数1++;
inData[index1] = '\0'; // 在末尾添加一个 null
}
variable.toUpperCase();
< 100 ; i++) {
for (byte i = 0 ; i
variable.concat(String(inData[i])); // 连接字符串
}
delay(20);
}
String stringToMorseCode = String(变量);
< sizeof(stringToMorseCode) - 1; i++)
for (int i = 0; i
{
char tmpChar = stringToMorseCode[i];
tmpChar = toLowerCase(tmpChar);
获取字符(tmpChar);
}
}
无效 MorseDot()
{
音调(audio8, note, dotLen); // 开始播放音调
delay(dotLen); // 保持在这个位置
}
无效 MorseDash()
{
音调(audio8, note, dashLen); // 开始播放音调
delay(dashLen); // 保持在这个位置
}
void GetChar(char tmpChar)
{
switch (tmpChar) {
case 'a':
MorseDot();
延迟(100);
摩斯破折号();
延迟(100);
休息;
案例'b':
莫尔斯破折号();
延迟(100);
莫尔斯点();
延迟(100);
莫尔斯点();
延迟(100);
莫尔斯点();
延迟(100);
休息;
案例'c':
莫尔斯破折号();
延迟(100);
莫尔斯点();
延迟(100);
摩斯破折号();
延迟(100);
莫尔斯点();
延迟(100);
休息;
案例“d”:
摩斯破折号();
延迟(100);
莫尔斯点();
延迟(100);
莫尔斯点();
延迟(100);
休息;
案例“e”:
莫尔斯点();
延迟(100);
休息;
案例'f':
莫尔斯点();
延迟(100);
莫尔斯点();
延迟(100);
摩斯破折号();
延迟(100);
莫尔斯点();
延迟(100);
休息;
case 'g':
MorseDash();
延迟(100);
摩斯破折号();
延迟(100);
莫尔斯点();
延迟(100);
休息;
案例“h”:
莫尔斯点();
延迟(100);
莫尔斯点();
延迟(100);
莫尔斯点();
延迟(100);
莫尔斯点();
延迟(100);
休息;
案例“我”:
莫尔斯点();
延迟(100);
莫尔斯点();
延迟(100);
休息;
案例'j':
莫尔斯点();
延迟(100);
摩斯破折号();
延迟(100);
摩斯破折号();
延迟(100);
摩斯破折号();
延迟(100);
休息;
案例“k”:
莫尔斯破折号();
延迟(100);
莫尔斯点();
延迟(100);
摩斯破折号();
延迟(100);
休息;
案例 'l':
MorseDot();
延迟(100);
摩斯破折号();
延迟(100);
莫尔斯点();
延迟(100);
莫尔斯点();
延迟(100);
休息;
案例 'm':
MorseDash();
延迟(100);
摩斯破折号();
延迟(100);
休息;
案例'n':
MorseDash();
延迟(100);
莫尔斯点();
延迟(100);
休息;
case 'o':
MorseDash();
延迟(100);
摩斯破折号();
延迟(100);
摩斯破折号();
延迟(100);
休息;
案例“p”:
莫尔斯点();
延迟(100);
摩斯破折号();
延迟(100);
摩斯破折号();
延迟(100);
莫尔斯点();
延迟(100);
休息;
案例 'q':
MorseDash();
延迟(100);
摩斯破折号();
延迟(100);
莫尔斯点();
延迟(100);
摩斯破折号();
延迟(100);
休息;
case 'r':
MorseDot();
延迟(100);
摩斯破折号();
延迟(100);
莫尔斯点();
延迟(100);
休息;
case 's':
MorseDot();
延迟(100);
莫尔斯点();
延迟(100);
莫尔斯点();
延迟(100);
休息;
case 't':
MorseDash();
延迟(100);
休息;
案例“你”:
莫尔斯点();
延迟(100);
莫尔斯点();
延迟(100);
摩斯破折号();
延迟(100);
休息;
案例'v':
莫尔斯点();
延迟(100);
莫尔斯点();
延迟(100);
莫尔斯点();
延迟(100);
摩斯破折号();
延迟(100);
休息;
案例'w':
莫尔斯点();
延迟(100);
摩斯破折号();
延迟(100);
摩斯破折号();
延迟(100);
休息;
case 'x':
MorseDash();
延迟(100);
莫尔斯点();
延迟(100);
莫尔斯点();
延迟(100);
摩斯破折号();
延迟(100);
休息;
case 'y':
MorseDash();
延迟(100);
莫尔斯点();
延迟(100);
摩斯破折号();
延迟(100);
摩斯破折号();
延迟(100);
休息;
案例“z”:
摩斯破折号();
延迟(100);
摩斯破折号();
延迟(100);
莫尔斯点();
延迟(100);
莫尔斯点();
延迟(100);
休息;
默认值:
中断;
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)