Подгонка длинного текста из текстового файла на дисплей L C через Python и Raspberry Pi - PullRequest
0 голосов
/ 28 февраля 2020

Вот краткая версия моей проблемы и то, что я хочу:

  1. Чтение текста из файла
  2. Форматирование текста для отображения на ЖК-дисплее 4x20 с возможностью чтения переводы строки, если строка слишком длинная (например, посмотрите, какая длина строки (не более 20 символов), сделайте символ новой строки после последнего найденного пробела)
  3. Если текст в целом слишком длинный (более 80 символов) ) отобразить первые 80 символов на дисплее - очистить дисплей - показать оставшиеся символы - повторить несколько раз.

А вот и длинная версия;)

I ' новичок в программировании , и в настоящее время я работаю над небольшим домашним проектом, в котором я хочу использовать Raspberry Pi 3 вместе с GSM HAT (от Waveshare) для отображения полученного SMS на L * 1032. * -Отображение. После получения SMS (используя «Gammu-SMS Daemon») SMS сохраняется в виде файла .txt в папке на моем RPi. Оттуда я хочу прочитать его с помощью скрипта python и отобразить его в отформатированном виде на ЖК-дисплее. Пока ничего сложного я не подумала. Сейчас я борюсь (уже более недели), чтобы напечатать длинный текст SMS на моем дисплее. При использовании библиотеки RPLCD и связи через I2 C с моим дисплеем мой код до сих пор выглядит следующим образом:

# Description: Read text from received SMS Textfile and print it on an 
# 4x20 LCD Screen

from __future__ import print_function
import os
import glob
import sys
import time
from time import *
import textwrap
from RPLCD.i2c import CharLCD

# setting up the parameters for the lcd. For standard use only the first two arguments are 
# needed
lcd = CharLCD(i2c_expander="PCF8574", address=0x27,port=1,cols=20,rows=4,
              dotsize=8,charmap="A02",auto_linebreaks=True,backlight_enabled=True)

# open last received SMS file:
list_of_files = glob.glob('/home/pi/sms_inbox/*.txt')
latest_file = max(list_of_files, key=os.path.getctime)


with open(latest_file, "r") as file:
  data = file.read() 
  # print to LCD. If data is too long, text starts to 
  # print from top to bottom again over existing characters 
  lcd.write_string(data)


file.close()

Это работает до тех пор, пока текст из файла не длиннее 4x20 = 80 символов в длину очевидно. Если текст длиннее этого, новые символы размещаются над первыми символами в первой строке дисплея. Не подлежит, конечно. Затем я использовал textwrap lib для форматирования в макс. из 20 символов в строке. Я добавил это, и мой вывод на терминал через функцию print выглядел очень многообещающим. Затем я подумал, что могу сохранить этот новый форматированный текст в новом файле и снова прочитать его, чтобы получить идеальную ширину текста. Но мой LCD не думал об этом. Может быть, потому что в файле происходит много странных, невидимых символов? Вот расширенный код:

# Description: Read text from received SMS Textfile and print it on an 
# 4x20 LCD Screen

from __future__ import print_function
import os
import glob
import sys
import time
from time import *
import textwrap
from RPLCD.i2c import CharLCD

# setting up the parameters for the lcd. For standard use only the first two arguments are 
# needed
lcd = CharLCD(i2c_expander="PCF8574", address=0x27,port=1,cols=20,rows=4,
              dotsize=8,charmap="A02",auto_linebreaks=True,backlight_enabled=True)

# open last received SMS file:
list_of_files = glob.glob('/home/pi/sms_inbox/*.txt')
latest_file = max(list_of_files, key=os.path.getctime)


with open(latest_file, "r") as file:
  data = file.read() 
  # print to LCD. If data is too long, text starts to 
  # print from top to bottom again over existing characters 
  lcd.write_string(data)

  # open a new file here. Save new formated text in there
  processed_file = open("/home/pi/processed_sms/processed_sms.txt","w")

  # shorten each line of text to a max. of 20 characters. 
  # This does NOT cut a word in the middle, it makes a newline 
  # on a found whitespace character found before the word which is too long:
  wrapper = textwrap.TextWrapper(width=20) 
  wordlist = wrapper.wrap(text = data)

  for element in wordlist:
    print(element) 
    # save new formatted file   
    processed_file.write(element)
    processed_file.write("\n")    

file.close()
processed_file.close()

# open formated file again and try to display it on the LCD (doesent work properly!)
processed_file_read = open("/home/pi/processed_sms/processed_sms.txt","r")

new_data = processed_file_read.read()
# display show weird formating, it's not readable!
lcd.write_string(new_data)

processed_file_read.close()

Новый файл не был читаем для моего ЖК-дисплея, текст был полностью отключен в отношении строк, пробелов и всего остального. Невозможно прочитать! Я также попробовал некоторые самодельные алгоритмы для форматирования текста, но мне не так просто, как начинающему в программировании , особенно в python. Таким образом, вся хитрость заключается в том, чтобы отформатировать и разместить текст, как я уже говорил несколько раз, таким образом, чтобы он мог уместиться на дисплее. Если текст слишком длинный, он должен отображать первые 80 символов, очистить дисплей и показать оставшиеся. Тогда я хотел бы повторить это пару раз. Это не может быть так сложно, или что вы думаете?

Можете ли вы помочь мне? Это было бы так здорово! Я хочу go спать рано на следующий день: D. ТАНКИ уже!

...