MicroPython/发送摩斯码/main.py

135 lines
2.7 KiB
Python

# -*- coding: utf-8 -*-
from machine import Pin, PWM, Timer
import utime
class MorseCodeTransmitter:
"""摩斯码发送器"""
# 摩斯码本
MORSECODEBOOK = {
"A": ".-",
"B": "-...",
"C": "-.-.",
"D": "-..",
"E": ".",
"F": "..-.",
"G": "--.",
"H": "....",
"I": "..",
"J": ".---",
"K": "-.-",
"L": ".-..",
"M": "--",
"N": "-.",
"O": "---",
"P": ".--.",
"Q": "--.-",
"R": ".-.",
"S": "...",
"T": "-",
"U": "..-",
"V": "...-",
"W": ".--",
"X": "-..-",
"Y": "-.--",
"Z": "--..",
"0": "-----",
"1": ".----",
"2": "..---",
"3": "...--",
"4": "....-",
"5": ".....",
"6": "-....",
"7": "--...",
"8": "---..",
"9": "----.",
}
# 合法字符集
CHARACTERSALLOWED = set("ABCDEFGHIJKLMNOPQRSTUVWXYZ 0123456789")
def __init__(self):
# 单位时距(单位为毫秒)
self.unit_time_interval = 120
# 初始化LED
self.LED = Pin("LED", Pin.OUT, value=0)
def emit(self, characters: str) -> bool:
"""发送摩斯码"""
"""
:parma characters: 字符串,数据类型为字符
"""
# 检查字符串
if not all(
character.upper() in self.CHARACTERSALLOWED for character in characters
):
print("allowed: a-z, 0-9, space")
return False
# 转为大写
characters = characters.upper()
print(f"emitting {characters} ...", end="")
for character in characters:
# 单词间隔
if character == " ":
utime.sleep_ms(self.unit_time_interval * 7)
continue
for code in self.MORSECODEBOOK.get(character):
# 点亮LED
self.LED.value(1)
if code == ".":
utime.sleep_ms(self.unit_time_interval * 1)
else:
utime.sleep_ms(self.unit_time_interval * 3)
# 熄灭LED
self.LED.value(0)
# 符号间隔
utime.sleep_ms(self.unit_time_interval * 1)
# 字母间隔
utime.sleep_ms(self.unit_time_interval * 3)
print("done")
return True
def __enter__(self):
"""支持上下文管理"""
return self
def __exit__(self, exc_type, exc_val, exc_tb):
"""退出"""
self.LED.off()
if __name__ == "__main__":
with MorseCodeTransmitter() as transmitter:
result = transmitter.emit(characters="hello world")