摩爾斯電碼是一種通信系統,用于在稱為點和破折號的兩種不同持續時間的信號中對任何字符進行編碼。莫爾斯電碼由 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] = '\0'; } 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 讀取
while (Serial.available() > 0 && index1 < 100) // 讀取到第 6 個字符
{
delay(100);
inChar = Serial.read(); // 開始讀取并保存到變量
inData[index1] = inChar;
指數1++;
inData[index1] = '\0'; // 在末尾添加一個 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);
}
}
無效 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);
休息;
默認值:
中斷;
}
}
評論
查看更多