# -*- 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")