LCD 16x2 / mpc i polskie znaki diakrytyczne ?

Tutaj można zadać pytanie, jeśli Linuksa widzi się pierwszy raz w życiu ;)
Awatar użytkownika
kobrawerde
Gibki Gibbon
Gibki Gibbon
Posty: 2025
Rejestracja: 10 wrz 2006, 16:00
Płeć: Mężczyzna
Wersja Ubuntu: 22.04
Środowisko graficzne: Cinnamon
Architektura: x86_64
Kontakt:

LCD 16x2 / mpc i polskie znaki diakrytyczne ?

Post autor: kobrawerde »

Może ktoś zna jakieś rozwiązanie lub potwierdzi moje przypuszczenia.
Dokładnie mam problem z wyświetlaniem polskich znaków diakrytycznych na LCD 16x2 . Jest to związane z samym LCD i powiązane z programami mpd / mpc ...przy pomocy ktorych stream -uje :-) radia internetowe a nazwy stacji i np. utwory granych wykonawców są wyświetlane wlaśnie na LCD. Wiadomo iż 95% tego typu urządzeń na rynku mowa o LCD nie ma zaimplementowanych już w sobie czyli firmware danego LCD polskich znaków : ąśćńłó ..itd i trzeba sobie jakoś radzić np. w programie LCDproc / Kodi jest pewien wybór ktory umożliwia zamianę pilskich znaków diakrytycznych na bardziej akceptowalne tzn. e a s c l o itd zamiast wyświetlania chińskich ślaczków lub dziwnych zamienników : ? & % itd . Program który jest odpowiedzialny za wyświetlanie znaków na LCD w tym przypadku to mpc ... i zczytuje on wszystko to co pokazuje i wyświetla konsola linux. Więc moje pytanie czy jest możliwość aby konsola linux konwertowała nazwy kanałów / utworów z polskimi znakami diakrytycznymi na zjadliwe dla LCD ...po chłopsku zamiana : ąśęćół na : ascol itd ... pewnie jest to raczej mało prawdopodobne :-(
Czytałem iż jest też jakaś możliwość wgrania jeszcze paru własnych znaków do samego LCD ale to raczej już dla zaawansowanych elektroników ...można chyba uszkodzić LCD :-)
pozdrawiam!
Awatar użytkownika
mario_7
Administrator
Administrator
Posty: 8594
Rejestracja: 30 sie 2006, 13:11
Płeć: Mężczyzna
Wersja Ubuntu: 20.04
Środowisko graficzne: GNOME
Architektura: x86_64

Re: LCD 16x2 / mpc i polskie znaki diakrytyczne ?

Post autor: mario_7 »

Opisz dokładniej jak to działa.
Jest szansa filtrować ciągi znaków przed wysłaniem do LCD?
Awatar użytkownika
kobrawerde
Gibki Gibbon
Gibki Gibbon
Posty: 2025
Rejestracja: 10 wrz 2006, 16:00
Płeć: Mężczyzna
Wersja Ubuntu: 22.04
Środowisko graficzne: Cinnamon
Architektura: x86_64
Kontakt:

Re: LCD 16x2 / mpc i polskie znaki diakrytyczne ?

Post autor: kobrawerde »

Powiem tak ..nie mam pojęcia :-( czy jest taka możliwość .... wiem iż sam program mpd / mpc jak w manualu pisze jest ustawiony w konfiguracji na system kodowania UTF-8 ..... za wyświetlanie informacji na LCD
odpowiada w moim przypadku program mpc ...i jego komendy ktore możemy odczytać w konsoli linux np. mpc ( jeśli radio jest wyłączone ) :
volume: 20% repeat: off random: off single: off consume: off
jeśli gra jakaś stacja :
Blue fm Poznan: The Script-Hall of Fame --> PoP NoN Stop
[playing] #1/111 0:00/0:00 (0%)
volume: 20% repeat: off random: off single: off consume: off
komenda dla samego tytułu :
mpc -f %title% ..... jest ona zastosowana w skrypcie pythona

Program który przekazuje informacje bezpośrednio do LCD to odpowiedni skrypt pythona ...a całość mam zainstalowane nie na popularnym RPI lecz Orange Pi lite
jeśli jesteś zainteresowany to zerknij tu tam jest więcej szcegółów wraz z kodem w pythonie
http://www.orangepi.org/orangepibbsen/f ... d&tid=1389

Ps. oczywiście nie na wszystkich stacjach są wysyłane polskie znaki diakrytyczne .... i tam jest OK tzn te z ogonkami są pokazywane bez ...ale nie wszystkie pewnie zależy to już od nadawcy ?
ale właśnie dobrze by było żeby robił to automatycznie np. jakiś skrypt ...ale czy to możliwe nie mam pojęcia
Awatar użytkownika
mario_7
Administrator
Administrator
Posty: 8594
Rejestracja: 30 sie 2006, 13:11
Płeć: Mężczyzna
Wersja Ubuntu: 20.04
Środowisko graficzne: GNOME
Architektura: x86_64

Re: LCD 16x2 / mpc i polskie znaki diakrytyczne ?

Post autor: mario_7 »

Jak skrypt pythona, to idealnie - wystarczy, że napiszesz prostą funkcję do zamiany polskiich znaków.
W skrócie: słownik typu 'polski znak' => 'odpowiednik' a potem iterować po tym słowniku i podmieniać znaki przez replace() tuż przed wysłaniem na wyświetlacz.
Awatar użytkownika
kobrawerde
Gibki Gibbon
Gibki Gibbon
Posty: 2025
Rejestracja: 10 wrz 2006, 16:00
Płeć: Mężczyzna
Wersja Ubuntu: 22.04
Środowisko graficzne: Cinnamon
Architektura: x86_64
Kontakt:

Re: LCD 16x2 / mpc i polskie znaki diakrytyczne ?

Post autor: kobrawerde »

WOW ...byłoby super ale w programowaniu to ze mnie noga... a python jest dla mnie już zupełnie niezrozumiały :-( .....
myślę iż pewnie ten kawałek skrytpu w pythonie odpowiada za wyświetlanie znaków ...lub może poprawnie treści pokazywanych w konsoli przez program mpc:

Kod: Zaznacz cały

def main():

  # Initialise display
  lcd_init()

  counter = 0

  while True:

  # Get current status and playtime
    process = subprocess.Popen('sudo mpc -v',shell=True, stdout=subprocess.PIPE)
    ekran1 = process.communicate()[0]
    statusLines = ekran1.split('\n')
    ekran1 = statusLines[1]
    if ekran1 <> '':
      ekran1L1 = ekran1.split(' ',1)[0].strip()
      ekran1L2temp = ekran1.split(' ',1)[1].strip()
      ekran1L2 = ekran1L2temp.split(' ',1)[0].strip()
      
    process = subprocess.Popen('sudo mpc -f %name%', shell=True, stdout=subprocess.PIPE)
    ekran2 = process.communicate()[0]
    statusLines = ekran2.split('\n')
    ekran2 = statusLines[0]
    ekran2L1 = ekran2[0:40]
    ekran2L2 = ekran2[40:80]

    process = subprocess.Popen('sudo mpc -f %artist%', shell=True, stdout=subprocess.PIPE)
    ekran3 = process.communicate()[0]
    statusLines = ekran3.split('\n')
    ekran3 = statusLines[0]
    ekran3L1 = ekran3[0:40]
    ekran3L2 = ekran3[40:80]

    process = subprocess.Popen('sudo mpc -f %title%', shell=True, stdout=subprocess.PIPE)
    ekran4 = process.communicate()[0]
    statusLines = ekran4.split('\n')
    ekran4 = statusLines[0]
    ekran4L1 = ekran4[0:40]
    ekran4L2 = ekran4[40:80]

    process = subprocess.Popen('sudo date +"%R  %d.%m.%Y"', shell=True, stdout=subprocess.PIPE)
    ekran5 = process.communicate()[0]
    statusLines = ekran5.split('\n')
    ekran5 = statusLines[0]
    ekran5L1 = ekran5[0:40]
    ekran5L2 = ekran5[40:80]

    if counter == 1:
      if ekran1 == "":
        counter = 15
      else:
        lcd_string(ekran1L1,LCD_LINE_1)
        lcd_string(ekran1L2,LCD_LINE_2)
    if counter == 15:
      if ekran2 == "":
        counter = 30
      else:
        lcd_string(ekran2L1,LCD_LINE_1)
        lcd_string(ekran2L2,LCD_LINE_2)
    if counter == 30:
      if ekran3 == "":
        counter = 45
      else:
        lcd_string(ekran3L1,LCD_LINE_1)
        lcd_string(ekran3L2,LCD_LINE_2)
    if counter == 45:
      if ekran4 == "":
        counter = 60
      else:
        lcd_string(ekran4L1,LCD_LINE_1)
        lcd_string(ekran4L2,LCD_LINE_2)
    if counter == 60:
      if ekran5 == "":
        counter = 75
      else:
        lcd_string(ekran5L1,LCD_LINE_1)
        lcd_string(ekran5L2,LCD_LINE_2)


    press = read_switches()

    if (press == 3):
      menu()
      counter = 0

    if (press == 1):
      run_cmd("sudo mpc next")
      counter = 0

    if (press == 2):
      run_cmd("sudo mpc prev")
      counter = 0

    sleep(0.1)
    counter = counter + 1
    if counter == 76:
      counter = 1
Na początku mialem sploszczonego linuxa ale myślalem iż jak przywrócę go do wersji angielskiej ..to może nie będzie ogonków jednak zamiast były ślaczki lub inne zamienniki.
Potem doczytalem iż w skrypcie pythona można umieścić taki kod i niby będzie to zmieniało polskie znaki na zamienniki bez ogonków ...ale chyba to nie działa :-)

Kod: Zaznacz cały

#!/usr/bin/env python
# -*- coding: utf-8 -*-
unicodedata.normalize('NFKD', u'zażółć gęśłą jaźń').replace(u'ł', 'l').encode('ascii', 'ignore')
unicodedata.normalize('NFKD', u'ąśężźćńłóń').replace(u'ł', 'l').encode('ascii', 'ignore')
cały kod którego stosuje jest tu ( niestety to nie jest moja tworczość ! ...bo wiadomo pewnie bym sobie dał radę )

https://www.dropbox.com/s/e790egx2ojabpjf/radio.py?dl=0
Awatar użytkownika
mario_7
Administrator
Administrator
Posty: 8594
Rejestracja: 30 sie 2006, 13:11
Płeć: Mężczyzna
Wersja Ubuntu: 20.04
Środowisko graficzne: GNOME
Architektura: x86_64

Re: LCD 16x2 / mpc i polskie znaki diakrytyczne ?

Post autor: mario_7 »

Tak na szybko mogłoby to wyglądać tak:

Kod: Zaznacz cały

def replace_pl(chars):
  pl = {  'ą': 'a',
          'ć': 'c',
          'ę': 'e',
          'ł': 'l',
          'ń': 'n',
          'ó': 'o',
          'ś': 's',
          'ź': 'z',
          'ż': 'z',
  }
  for f, t in pl.items():
    chars = chars.replace(f,t)
  return chars
Definicję tej funkcji powinieneś umieścić gdzieś na początku pliku (np. przed definicją main())

Powinieneś po utworzeniu każdej zmiennej ekran (która tworzona jest poprzez odczytanie stdout z process.communicate):

Kod: Zaznacz cały

ekranX = process.communicate()[0]
zrobić coś takiego:

Kod: Zaznacz cały

ekranX = replace_pl(ekranX)
Oczywiście znak X musisz zastąpić odpowiednią cyfrą.
Awatar użytkownika
kobrawerde
Gibki Gibbon
Gibki Gibbon
Posty: 2025
Rejestracja: 10 wrz 2006, 16:00
Płeć: Mężczyzna
Wersja Ubuntu: 22.04
Środowisko graficzne: Cinnamon
Architektura: x86_64
Kontakt:

Re: LCD 16x2 / mpc i polskie znaki diakrytyczne ?

Post autor: kobrawerde »

Kurcze jeszcze nie dziala to tak jak powinno ...ale chyba będzie OK ... czemu ? bo dziwne ale grając radio Kraków miałem dziwne chińskie krzaczki :-) a teraz mam zwykłe "o" WOW :-) ....jednak inne stacje jak Radio Puławy / Ostrołęka / Wrocław / itp mają wzamian np. "ł" znak zapytania ? ....co chyba wynika podglądając komendy w terminalu np. mpc ...... wszystko teraz mam zamiast właśnie ółąśćźż ...pewnie znaki ???? itp i one są wyświetlane na LCD ....zatem teraz sprawdzę system jeszcze raz polonizując go w UTF-8 .......... jak zatrybi to masz wielkie piwo ! .... i dozgonną wdzięczność :clap:
sprawdzam ...kurcze jak to leciało z tym spolszceniem zaraz znajdę !

Ps. po spolszczniu i sprawdzeniu jest o 90% lepiej tzn. nazwy utworów z polskimi znakami już konwertuje OK ..tak samo nazwy stacji ! ...jest super ...ale dziwne bo w konsoli nie wszystkie stacjie ale sporo mają nazwy z : ????? znakami zapytania więc tego program nie zmieni nie wiem czy tak było wcześniej ? ... czy poprostu stacje tak nadają a tego już nie zmienimy :-) ...spytam jeszce kolegę który stworzył to oprogramowanie w pythonie czy u niego te stacje też tak mają czy coś z moim systemem.
Jeszcze raz dziękuję jesteś wielki ! ..... sam bym do tego napewno nie doszedł . Może innym też się przyda.
Dodałem też dużą czcionkę do kodu ...ale czy to będzie dobrze ?

Kod: Zaznacz cały

def replace_pl(chars):
  pl = {  'ą': 'a',
          'ć': 'c',
          'ę': 'e',
          'ł': 'l',
          'ń': 'n',
          'ó': 'o',
          'ś': 's',
          'ź': 'z',
          'ż': 'z',
          'Ą': 'A',
          'Ć': 'C',
          'Ę': 'E',
          'Ł': 'L',
          'Ń': 'N',
          'Ó': 'O',
          'Ś': 'S',
          'Ź': 'Z',
          'Ż': 'Z',
  }
  for f, t in pl.items():
    chars = chars.replace(f,t)
  return chars
@mario_7......pozdrawiam!
Awatar użytkownika
mario_7
Administrator
Administrator
Posty: 8594
Rejestracja: 30 sie 2006, 13:11
Płeć: Mężczyzna
Wersja Ubuntu: 20.04
Środowisko graficzne: GNOME
Architektura: x86_64

Re: LCD 16x2 / mpc i polskie znaki diakrytyczne ?

Post autor: mario_7 »

Może być.

Co do znaków zapytania - być może to wina kodowania tekstu który jest "nadawany" przez poszczególne stacje.
Awatar użytkownika
kobrawerde
Gibki Gibbon
Gibki Gibbon
Posty: 2025
Rejestracja: 10 wrz 2006, 16:00
Płeć: Mężczyzna
Wersja Ubuntu: 22.04
Środowisko graficzne: Cinnamon
Architektura: x86_64
Kontakt:

Re: LCD 16x2 / mpc i polskie znaki diakrytyczne ?

Post autor: kobrawerde »

Czy ktoś znający środowisko programistyczne w pythonie może podpowiedzieć jeszcze ...jeśli oczywiście jest taka możliwość ? ..czy da się zmienić trochę kodu aby wyświetlane informacje dotyczące nazwy wyświetlanych utworów muzycznych były przewijane . Niestety na LCD 16x2 ni zawsze mieszczą się one na ekranie . Nie mam pojęcia czy to jest możliwe ..ale spytać warto
pozdrawiam!
ps. znalazlem w necie jakiś przykład ...tzw scroll ... ale mimo licznych przeróbek ...lipa :-(

Kod: Zaznacz cały

#!/usr/bin/env python

import I2C_LCD_driver
from time import *

mylcd = I2C_LCD_driver.lcd()

str_pad = " " * 16
my_long_string = "This is a string that needs to scroll"
my_long_string = str_pad + my_long_string

while True:
    for i in range (0, len(my_long_string)):
        lcd_text = my_long_string[i:(i+16)]
        mylcd.lcd_display_string(lcd_text,1)
        sleep(0.15)
        mylcd.lcd_display_string(str_pad,1)
ODPOWIEDZ

Wróć do „Przedszkole Linuksa”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 23 gości