如何让盲文转文本项目输出单词而非单个字母?附代码优化需求
盲文转文本项目优化方案
一、实现完整单词输出的方法
当前代码仅能输出单个字母,要实现完整单词输出,核心是累积输入的字母,具体实现逻辑如下:
- 新增变量
current_word存储当前正在输入的单词 - 识别到盲文对应的字母时,将字母追加到
current_word中 - 按下确认键(switch_7)时,在LCD上显示完整的
current_word,而非单个字母 - 可选:添加清空单词功能(如长按switch_7),方便输入新内容
二、冗余代码清理后的完整代码
以下是优化后的代码,解决了冗余问题同时实现了单词输出功能:
import time import RPi.GPIO as GPIO import os # GPIO初始化 GPIO.setmode(GPIO.BOARD) GPIO.setwarnings(False) # 常量定义 E_PULSE = 0.0005 E_DELAY = 0.0005 LCD_WIDTH = 16 LCD_CHR = True LCD_CMD = False LCD_LINE_1 = 0x80 LCD_LINE_2 = 0xC0 # 引脚映射 LCD_PINS = { 'RS': 7, 'E': 11, 'D4': 12, 'D5': 13, 'D6': 15, 'D7': 16 } SWITCH_PINS = [18, 22, 29, 31, 32, 33, 36] # switch1到switch7 # 盲文按键组合与字母映射(1表示按键按下) BRAILLE_MAP = { (1,0,0,0,0,0): 'a', (1,1,0,0,0,0): 'b', (1,0,0,1,0,0): 'c', (1,0,0,1,1,0): 'd', (1,0,0,0,1,0): 'e', (1,1,0,1,0,0): 'f', (1,1,0,1,1,0): 'g', (1,1,0,0,1,0): 'h', (0,1,0,1,0,0): 'i', (0,1,0,1,1,0): 'j', (0,1,1,0,0,0): 'k', (1,1,1,0,0,0): 'l', (1,0,1,1,0,0): 'm', (1,0,1,1,1,0): 'n', (1,0,1,0,1,0): 'o', (1,1,1,1,0,0): 'p', (1,1,1,1,1,0): 'q', (1,1,1,0,1,0): 'r', (0,1,1,1,0,0): 's', (0,1,1,1,1,0): 't', (1,0,1,0,0,1): 'u', (1,1,1,0,0,1): 'v', (0,1,0,1,1,1): 'w', (1,0,1,1,0,1): 'x', (1,0,1,1,1,1): 'y', (1,0,1,0,1,1): 'z' } def speek(data): # 依赖espeak工具,需提前安装:sudo apt-get install espeak os.system(f'espeak -v en "{data}"') def lcd_init(): lcd_byte(0x33, LCD_CMD) lcd_byte(0x32, LCD_CMD) lcd_byte(0x06, LCD_CMD) lcd_byte(0x0C, LCD_CMD) lcd_byte(0x28, LCD_CMD) lcd_byte(0x01, LCD_CMD) time.sleep(E_DELAY) def lcd_byte(bits, mode): GPIO.output(LCD_PINS['RS'], mode) # 发送高四位 for pin, bit_mask in zip(['D4','D5','D6','D7'], [0x10,0x20,0x40,0x80]): GPIO.output(LCD_PINS[pin], bits & bit_mask) lcd_toggle_enable() # 发送低四位 for pin, bit_mask in zip(['D4','D5','D6','D7'], [0x01,0x02,0x04,0x08]): GPIO.output(LCD_PINS[pin], bits & bit_mask) lcd_toggle_enable() def lcd_toggle_enable(): time.sleep(E_DELAY) GPIO.output(LCD_PINS['E'], True) time.sleep(E_PULSE) GPIO.output(LCD_PINS['E'], False) time.sleep(E_DELAY) def lcd_string(message, line): message = message.ljust(LCD_WIDTH, " ") lcd_byte(line, LCD_CMD) for char in message: lcd_byte(ord(char), LCD_CHR) # 批量配置GPIO引脚 for pin in LCD_PINS.values(): GPIO.setup(pin, GPIO.OUT) for pin in SWITCH_PINS: GPIO.setup(pin, GPIO.IN) # 初始化LCD lcd_init() lcd_string("Welcome", LCD_LINE_1) time.sleep(2) lcd_byte(0x01, LCD_CMD) lcd_string("Input Braille", LCD_LINE_1) time.sleep(1) current_word = "" # 存储当前输入的单词 while True: # 读取前6个按键状态(盲文输入键) switch_states = tuple(GPIO.input(pin) for pin in SWITCH_PINS[:6]) time.sleep(0.1) # 按键消抖 # 获取对应字母 current_char = BRAILLE_MAP.get(switch_states, '').lower() # 按下确认键(第7个按键),更新并显示单词 if GPIO.input(SWITCH_PINS[6]): if current_char: current_word += current_char lcd_string(current_word.ljust(LCD_WIDTH), LCD_LINE_2) speek(current_word) time.sleep(0.5) # 防止重复触发
关键优化说明
- 单词累积机制:通过
current_word变量持续追加识别到的字母,按下确认键时显示完整内容 - 字典映射替代多分支判断:用
BRAILLE_MAP字典管理盲文与字母的对应关系,新增或修改规则只需修改字典,维护性大幅提升 - 冗余代码清理:移除重复导入的模块、合并重复的GPIO配置代码、删除无效注释与空函数块
- 按键读取优化:一次性读取所有按键状态,减少冗余sleep,提升响应速度
- 语音功能补全:实现基础语音输出功能,依赖系统espeak工具
内容的提问来源于stack exchange,提问作者Max69
相关产品推荐
相关产品推荐

