摩爾斯電碼是一種通信系統(tǒng),用于在稱(chēng)為點(diǎn)和破折號(hào)的兩種不同持續(xù)時(shí)間的信號(hào)中對(duì)任何字符進(jìn)行編碼。莫爾斯電碼由 Samuel FB 開(kāi)發(fā),并進(jìn)一步用于電報(bào)傳輸秘密信息。它在第二次世界大戰(zhàn)期間使用最多。摩爾斯電碼可以通過(guò)敲擊、閃光或書(shū)寫(xiě)來(lái)執(zhí)行。莫爾斯電碼有兩個(gè)版本,原始的和國(guó)際的莫爾斯電碼。在國(guó)際莫爾斯電碼中,原始版本通過(guò)刪除空格和設(shè)計(jì)特定長(zhǎng)度的破折號(hào)進(jìn)行了修改。摩爾斯電碼可用于編碼字母和數(shù)字。它主要用于無(wú)線電和海洋通信,也是士兵訓(xùn)練的一部分。
語(yǔ)言一直是摩爾斯電碼的障礙,因?yàn)橛闷渌Z(yǔ)言很難執(zhí)行變音符號(hào)的代碼。有一些著名的詞被認(rèn)為是摩爾斯電碼的重要特征,例如“SOS”。SOS 完整形式是拯救我們的靈魂,作為一種普遍的求救信號(hào)代表危險(xiǎn)。
下圖顯示了從 A 到 Z 字母的摩爾斯電碼。
今天在本教程中,我們將使用 Arduino 構(gòu)建一個(gè)摩爾斯電碼轉(zhuǎn)換器,它將任何字符作為串行監(jiān)視器的輸入,并通過(guò)蜂鳴器將其轉(zhuǎn)換為等效的摩爾斯電碼蜂鳴聲。
所需組件
阿杜諾
蜂鳴器
面包板
跳線
電路原理圖
將蜂鳴器的正極引腳連接到 Arudino UNO 的第 8引腳,將負(fù)極引腳連接到 Arduino 的地。使用 Arduino IDE 上傳代碼并在串行監(jiān)視器上鍵入字符以創(chuàng)建聲音。Arduino還可以添加 LCD以顯示短劃線和圓點(diǎn)。
編程說(shuō)明
最后給出了Arduino摩爾斯電碼生成器的完整代碼,這里我們解釋程序以了解項(xiàng)目的工作。
下面的代碼用于接收字符串,然后將其轉(zhuǎn)換為莫爾斯電碼。
?
char stringToMorseCode[] = "";
?
然后定義連接到 Arduino 的蜂鳴器的引腳以及該蜂鳴器產(chǎn)生的聲音的音高。然后我們定義點(diǎn)和破折號(hào)的長(zhǎng)度。
?
詮釋音頻8 = 8;// 在引腳 8 上輸出音頻 int note = 1200; // 音符/音高 int dotLen = 100; // 莫爾斯電碼 'dot' 的長(zhǎng)度 int dashLen = dotLen * 3; // 莫爾斯電碼 'dash' 的長(zhǎng)度
?
在void loop()函數(shù)中,如果串行數(shù)據(jù)可用,它將保存到變量indata中。然后它使用命令inData[index1]一個(gè)一個(gè)地讀取字符。命令variable.toUppercase()用于將小寫(xiě)字符轉(zhuǎn)換為大寫(xiě)。然后它根據(jù)每個(gè)字符創(chuàng)建聲音。
?
無(wú)效循環(huán)() { char inChar = 0; 字符 inData[100] = ""; // 數(shù)據(jù)長(zhǎng)度為 6 個(gè)字符 String variable = ""; 字符串變量 1 = ""; 整數(shù)索引1 = 0; if ( Serial.available() > 0 ) { while (Serial.available() > 0 && index1 < 100) { delay(100); inChar = Serial.read(); inData[index1] = inChar; 指數(shù)1++; inData[index1] = '\0'; } variable.toUpperCase(); for (byte i = 0 ; i < 100 ; i++) { variable.concat(String(inData[i])); } 延遲(20);
?
下面的函數(shù)MorseDot和MorseDash分別用于創(chuàng)建點(diǎn)和破折號(hào)的聲音。
?
無(wú)效 MorseDot() { 音調(diào)(audio8, note, dotLen); // 開(kāi)始播放音調(diào) delay(dotLen); // 保持在這個(gè)位置 } 無(wú)效 MorseDash() { 音調(diào)(audio8, note, dashLen); // 開(kāi)始播放音調(diào) delay(dashLen); // 保持在這個(gè)位置 }
?
GetChar函數(shù)具有所有字母的代碼。因此,每當(dāng)我們鍵入任何字母時(shí),都會(huì)從該函數(shù)中獲取相應(yīng)的摩爾斯電碼來(lái)創(chuàng)建特定的聲音。
?
void GetChar(char tmpChar) { switch (tmpChar) { case 'a': MorseDot(); 延遲(100); 摩斯破折號(hào)(); 延遲(100); 休息; … … … 默認(rèn): break; } }
?
現(xiàn)在使用 Arduino IDE 將代碼上傳到 Arduino,然后在串行監(jiān)視器中輸入任何字符,然后按 Enter 按鈕將字符發(fā)送到 Arduino。
在這里,我們輸入了“SOS”,這是一個(gè)通用的求救信號(hào),以創(chuàng)建相同的聲音。
char stringToMorseCode[] = "";
詮釋音頻8 = 8;// 在引腳 8 上輸出音頻
int note = 1200; // 音符/音高
int dotLen = 100; // 莫爾斯電碼 'dot' 的長(zhǎng)度
int dashLen = dotLen * 3; // 莫爾斯電碼 'dash' 的長(zhǎng)度
無(wú)效設(shè)置(){
序列.開(kāi)始(9600);
}
無(wú)效循環(huán)()
{
char inChar = 0;
字符 inData= ""; // 數(shù)據(jù)長(zhǎng)度為 6 個(gè)字符
String variable = "";
字符串變量 1 = "";
整數(shù)索引1 = 0;
if ( Serial.available() > 0 ) { // 從 atmega16 的 Rx 讀取
while (Serial.available() > 0 && index1 < 100) // 讀取到第 6 個(gè)字符
{
delay(100);
inChar = Serial.read(); // 開(kāi)始讀取并保存到變量
inData[index1] = inChar;
指數(shù)1++;
inData[index1] = '\0'; // 在末尾添加一個(gè) null
}
variable.toUpperCase();
for (byte i = 0 ; i < 100 ; i++) {
variable.concat(String(inData[i])); // 連接字符串
}
delay(20);
}
String stringToMorseCode = String(變量);
for (int i = 0; i < sizeof(stringToMorseCode) - 1; i++)
{
char tmpChar = stringToMorseCode[i];
tmpChar = toLowerCase(tmpChar);
獲取字符(tmpChar);
}
}
無(wú)效 MorseDot()
{
音調(diào)(audio8, note, dotLen); // 開(kāi)始播放音調(diào)
delay(dotLen); // 保持在這個(gè)位置
}
無(wú)效 MorseDash()
{
音調(diào)(audio8, note, dashLen); // 開(kāi)始播放音調(diào)
delay(dashLen); // 保持在這個(gè)位置
}
void GetChar(char tmpChar)
{
switch (tmpChar) {
case 'a':
MorseDot();
延遲(100);
摩斯破折號(hào)();
延遲(100);
休息;
案例'b':
莫爾斯破折號(hào)();
延遲(100);
莫爾斯點(diǎn)();
延遲(100);
莫爾斯點(diǎn)();
延遲(100);
莫爾斯點(diǎn)();
延遲(100);
休息;
案例'c':
莫爾斯破折號(hào)();
延遲(100);
莫爾斯點(diǎn)();
延遲(100);
摩斯破折號(hào)();
延遲(100);
莫爾斯點(diǎn)();
延遲(100);
休息;
案例“d”:
摩斯破折號(hào)();
延遲(100);
莫爾斯點(diǎn)();
延遲(100);
莫爾斯點(diǎn)();
延遲(100);
休息;
案例“e”:
莫爾斯點(diǎn)();
延遲(100);
休息;
案例'f':
莫爾斯點(diǎn)();
延遲(100);
莫爾斯點(diǎn)();
延遲(100);
摩斯破折號(hào)();
延遲(100);
莫爾斯點(diǎn)();
延遲(100);
休息;
case 'g':
MorseDash();
延遲(100);
摩斯破折號(hào)();
延遲(100);
莫爾斯點(diǎn)();
延遲(100);
休息;
案例“h”:
莫爾斯點(diǎn)();
延遲(100);
莫爾斯點(diǎn)();
延遲(100);
莫爾斯點(diǎn)();
延遲(100);
莫爾斯點(diǎn)();
延遲(100);
休息;
案例“我”:
莫爾斯點(diǎn)();
延遲(100);
莫爾斯點(diǎn)();
延遲(100);
休息;
案例'j':
莫爾斯點(diǎn)();
延遲(100);
摩斯破折號(hào)();
延遲(100);
摩斯破折號(hào)();
延遲(100);
摩斯破折號(hào)();
延遲(100);
休息;
案例“k”:
莫爾斯破折號(hào)();
延遲(100);
莫爾斯點(diǎn)();
延遲(100);
摩斯破折號(hào)();
延遲(100);
休息;
案例 'l':
MorseDot();
延遲(100);
摩斯破折號(hào)();
延遲(100);
莫爾斯點(diǎn)();
延遲(100);
莫爾斯點(diǎn)();
延遲(100);
休息;
案例 'm':
MorseDash();
延遲(100);
摩斯破折號(hào)();
延遲(100);
休息;
案例'n':
MorseDash();
延遲(100);
莫爾斯點(diǎn)();
延遲(100);
休息;
case 'o':
MorseDash();
延遲(100);
摩斯破折號(hào)();
延遲(100);
摩斯破折號(hào)();
延遲(100);
休息;
案例“p”:
莫爾斯點(diǎn)();
延遲(100);
摩斯破折號(hào)();
延遲(100);
摩斯破折號(hào)();
延遲(100);
莫爾斯點(diǎn)();
延遲(100);
休息;
案例 'q':
MorseDash();
延遲(100);
摩斯破折號(hào)();
延遲(100);
莫爾斯點(diǎn)();
延遲(100);
摩斯破折號(hào)();
延遲(100);
休息;
case 'r':
MorseDot();
延遲(100);
摩斯破折號(hào)();
延遲(100);
莫爾斯點(diǎn)();
延遲(100);
休息;
case 's':
MorseDot();
延遲(100);
莫爾斯點(diǎn)();
延遲(100);
莫爾斯點(diǎn)();
延遲(100);
休息;
case 't':
MorseDash();
延遲(100);
休息;
案例“你”:
莫爾斯點(diǎn)();
延遲(100);
莫爾斯點(diǎn)();
延遲(100);
摩斯破折號(hào)();
延遲(100);
休息;
案例'v':
莫爾斯點(diǎn)();
延遲(100);
莫爾斯點(diǎn)();
延遲(100);
莫爾斯點(diǎn)();
延遲(100);
摩斯破折號(hào)();
延遲(100);
休息;
案例'w':
莫爾斯點(diǎn)();
延遲(100);
摩斯破折號(hào)();
延遲(100);
摩斯破折號(hào)();
延遲(100);
休息;
case 'x':
MorseDash();
延遲(100);
莫爾斯點(diǎn)();
延遲(100);
莫爾斯點(diǎn)();
延遲(100);
摩斯破折號(hào)();
延遲(100);
休息;
case 'y':
MorseDash();
延遲(100);
莫爾斯點(diǎn)();
延遲(100);
摩斯破折號(hào)();
延遲(100);
摩斯破折號(hào)();
延遲(100);
休息;
案例“z”:
摩斯破折號(hào)();
延遲(100);
摩斯破折號(hào)();
延遲(100);
莫爾斯點(diǎn)();
延遲(100);
莫爾斯點(diǎn)();
延遲(100);
休息;
默認(rèn)值:
中斷;
}
}
評(píng)論