You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让盲文转文本项目输出单词而非单个字母?附代码优化需求

盲文转文本项目优化方案

一、实现完整单词输出的方法

当前代码仅能输出单个字母,要实现完整单词输出,核心是累积输入的字母,具体实现逻辑如下:

  • 新增变量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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 03:35:44