Python2 instalacja na Bookworm / ( moduł : smbus ) ?

Tematy związane z oprogramowaniem, instalacją, konfiguracją
Awatar użytkownika
olk777
Posty: 30
Rejestracja: 10 lutego 2018, 17:29

Re: Python2 instalacja na Bookworm / ( moduł : smbus ) ?

Post autor: olk777 »

Dzięki za info i namiary ...w chwili wolnej będę walczył może skumam jak to usprawnić na przyszłość. I oczywiście podam rozwiązanie.
fnmirk
Senior Member
Posty: 8321
Rejestracja: 03 grudnia 2007, 06:37

Re: Python2 instalacja na Bookworm / ( moduł : smbus ) ?

Post autor: fnmirk »

Zainstaluj jedynie na czystym systemie:

Kod: Zaznacz cały

apt install python3-full
następnie:

Kod: Zaznacz cały

apt install python3-smbus2
lub:

Kod: Zaznacz cały

apt install python3-smbus
następnie:

Kod: Zaznacz cały

2to3 skrypt1 [opcje] skrypt2
i powinno to działać. Tam nie ma nic dziwnego. Program 2to3 działa w 99% kodu Pythona.
Awatar użytkownika
olk777
Posty: 30
Rejestracja: 10 lutego 2018, 17:29

Re: Python2 instalacja na Bookworm / ( moduł : smbus ) ?

Post autor: olk777 »

Sprawdziłem te metody nie działają :-) ... najlepiej jest chyba raczej przeprogramować skrypt python2 na pythona3 i pewnie wtedy będzie OK a tak niestety kombinacje. Ale mnie się udało jak opisałem wyżej i działa :-) ...ale jest to kombinacja trudna do 100% powtórzenia trzeba poeksperymentować.W skrócie przywrócenie repo bullseye instalacja pythona2 / python2.7-dev / virtualenv ... ( ale jest to dziwnie niepowtarzalne w 100% -tach ...i wymaga trochę szczęścia przy instalacji w/w )
Co do konwersji prog. 2to3 to też są błędy :

Kod: Zaznacz cały

/usr/bin/2to3:3: DeprecationWarning: lib2to3 package is deprecated and may not be able to parse Python 3.10+
  from lib2to3.main import main
RefactoringTool: Skipping optional fixer: buffer
RefactoringTool: Skipping optional fixer: idioms
RefactoringTool: Skipping optional fixer: set_literal
RefactoringTool: Skipping optional fixer: ws_comma
RefactoringTool: Refactored start.py
--- start.py	(original)
+++ start.py	(refactored)
@@ -95,7 +95,7 @@
           'Ź': 'Z',
           'Ż': 'Z',
   }
-  for f, t in pl.items():
+  for f, t in list(pl.items()):
     chars = chars.replace(f,t)
   return chars
 
@@ -111,7 +111,7 @@
     ekran1 = replace_pl(ekran1)
     statusLines = ekran1.split('\n')
     ekran1 = statusLines[1]
-    if ekran1 <> '':
+    if ekran1 != '':
       ekran1L1 = ekran1.split(' ',1)[0].strip()
       ekran1L2temp = ekran1.split(' ',1)[1].strip()
       ekran1L2 = ekran1L2temp.split(' ',1)[0].strip()
RefactoringTool: Can't parse start1.py: IndentationError: unindent does not match any outer indentation level (<tokenize>, line 114)
RefactoringTool: Files that need to be modified:
RefactoringTool: start.py
RefactoringTool: There was 1 error:
RefactoringTool: Can't parse start1.py: IndentationError: unindent does not match any outer indentation level (<tokenize>, line 114)
Szoda czasu na takie konwersje z automatu :-) ...trzeba to robić ręcznie ze znajomością nowego pythona3 ... upss
jednak na razie brak czasu na siedzenie w kodzie i uczenie się pythona3 ...
W moim projekcie wszystko działa tylko czasami LCD "łapie" dziwne przekłamania na wyświetlaczu ( artefakty , ślaczki itd) ponoć jest to związane opcjami delay / opóźnienia. Muszę poeksperymentować bo najczęściej łapie to przy przełączaniu między prog lcdproc a skryptem pythona lub przy samej inicjalizacji tych programów. Na szczęście jest to zachowanie już bardzo rzadkie ...
fnmirk
Senior Member
Posty: 8321
Rejestracja: 03 grudnia 2007, 06:37

Re: Python2 instalacja na Bookworm / ( moduł : smbus ) ?

Post autor: fnmirk »

Znalazłem taką stronę:
https://python2to3.com/

Skrypt się przekonwertował. Brak błędów.
Awatar użytkownika
olk777
Posty: 30
Rejestracja: 10 lutego 2018, 17:29

Re: Python2 instalacja na Bookworm / ( moduł : smbus ) ?

Post autor: olk777 »

Zaraz sprawdzę :-) ... ciekawe czy takie internetowe konwertery są naprawdę pomocne ? Tylko nie będąc "specem" w pythonie martwi mnie użycie modułów czyli ciągle wałkowanego tu smbus który jest po prostu niezbędny do uruchomienia LCD z tym skryptem. Jak widzę wzrokowo to konwerter internetowy zmienił baaaaaaardzo niewiele :-) ...jeśli to zadziała to aż wstyd że nie umie się tego samemu poprawić. Ale czy aby w skrypcie nie trzeba teraz samemu zmienić smbus na smbus2 ? bo konwerter tego nie wychwycił ? a wątpię żeby to zadziałało bez obecności w systemie modułu smbus którego nie można zainstalować nie mając pythona2 itd :-) ...

Ps. niestety ale to wymaga raczej większej wiedzy ... jak wspomniałem być obeznanym w pythonie3 i żadne konwertery tego nie zrobią poprawnie tak mi się wydaje. Efekt z konwertowanym plikiem i modułem smbus a także zainstalowanymi : apt install python3-smbus / apt install python3-smbus2

Kod: Zaznacz cały

  root@orangepi3-lts:~# python3 start2.py 

Kod: Zaznacz cały

Traceback (most recent call last):
  File "/root/start2.py", line 177, in <module>
    main()
  File "/root/start2.py", line 111, in main
    ekran1 = replace_pl(ekran1)
             ^^^^^^^^^^^^^^^^^^
  File "/root/start2.py", line 99, in replace_pl
    chars = chars.replace(f,t)
            ^^^^^^^^^^^^^^^^^^
TypeError: a bytes-like object is required, not 'str'
może zamieszczę tu prze-konwertowany skrypt

Kod: Zaznacz cały

#!/usr/bin/python
# -*- coding: utf-8 -*-

import smbus
import time
import subprocess

from time       import sleep, strftime
from datetime   import datetime
from subprocess import *

# Define some device parameters
I2C_ADDR  = 0x3f # I2C device address
LCD_WIDTH = 40   # Maximum characters per line
LCD_HEIGHT = 2



# Define some device constants
LCD_CHR = 1 # Mode - Sending data
LCD_CMD = 0 # Mode - Sending command

LCD_LINE_1 = 0x80 # LCD RAM address for the 1st line
LCD_LINE_2 = 0xC0 # LCD RAM address for the 2nd line
LCD_LINE_3 = 0x94 # LCD RAM address for the 3rd line
LCD_LINE_4 = 0xD4 # LCD RAM address for the 4th line

LCD_BACKLIGHT  = 0x08  # On
#LCD_BACKLIGHT = 0x0C  # Off


ENABLE = 0b00000100 # Enable bit

# Timing constants
E_PULSE = 0.005
E_DELAY = 0.005

#Open I2C interface
bus = smbus.SMBus(0)  # Rev 1 Pi uses 0 (and Orange PI PC, for pins 3 and 5)
#bus = smbus.SMBus(1) # Rev 2 Pi uses 1


def lcd_byte(bits, mode):
  # Send byte to data pins
  # bits = the data
  # mode = 1 for data
  #        0 for command

  bits_high = mode | (bits & 0xF0) | LCD_BACKLIGHT
  bits_low = mode | ((bits<<4) & 0xF0) | LCD_BACKLIGHT

  # High bits
  bus.write_byte(I2C_ADDR, bits_high)
  lcd_toggle_enable(bits_high)

  # Low bits
  bus.write_byte(I2C_ADDR, bits_low)
  lcd_toggle_enable(bits_low)

def lcd_toggle_enable(bits):
  # Toggle enable
  time.sleep(E_DELAY)
  bus.write_byte(I2C_ADDR, (bits | ENABLE))
  time.sleep(E_PULSE)
  bus.write_byte(I2C_ADDR,(bits & ~ENABLE))
  time.sleep(E_DELAY)

def lcd_string(message,line):
  # Send string to display

  message = message.ljust(LCD_WIDTH," ")

  lcd_byte(line, LCD_CMD)

  for i in range(LCD_WIDTH):
    lcd_byte(ord(message[i]),LCD_CHR)

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 list(pl.items()):
    chars = chars.replace(f,t)
  return chars

def main():

  counter = 0

  while True:

  # Get current status and playtime
    process = subprocess.Popen('sudo mpc -v', shell=True, stdout=subprocess.PIPE)
    ekran1 = process.communicate()[0]
    ekran1 = replace_pl(ekran1)
    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]
    ekran2 = replace_pl(ekran2)
    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]
    ekran3 = replace_pl(ekran3)
    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]
    ekran4 = replace_pl(ekran4)
    statusLines = ekran4.split('\n')
    ekran4 = statusLines[0]
    ekran4L1 = ekran4[0:40]
    ekran4L2 = ekran4[40:80]

    if counter == 1:
      if ekran1 == "":
        counter = 7
      else:
        lcd_string(ekran1L1,LCD_LINE_1)
        lcd_string(ekran1L2,LCD_LINE_2)
    if counter == 7:
      if ekran2 == "":
        counter = 14
      else:
        lcd_string(ekran2L1,LCD_LINE_1)
        lcd_string(ekran2L2,LCD_LINE_2)
    if counter == 14:
      if ekran3 == "":
        counter = 30
      else:
        lcd_string(ekran3L1,LCD_LINE_1)
        lcd_string(ekran3L2,LCD_LINE_2)
    if counter == 30:
      if ekran4 == "":
        counter = 46
      else:
        lcd_string(ekran4L1,LCD_LINE_1)
        lcd_string(ekran4L2,LCD_LINE_2)

    sleep(0.1)
    counter = counter + 1
    if counter == 53:
      counter = 1


if __name__ == '__main__':

  try:
    main()
  except KeyboardInterrupt:
    pass
  finally:
    lcd_byte(0x00, LCD_CMD)
    lcd_byte(0x01, LCD_CMD)
    lcd_byte(0x08, LCD_CMD)
jak zmieniłem w skrypcie tylko : import smbus ...na import smbus2 to wywala:

Kod: Zaznacz cały

Traceback (most recent call last):
  File "/root/start2.py", line 39, in <module>
    bus = smbus.SMBus(0)  # Rev 1 Pi uses 0 (and Orange PI PC, for pins 3 and 5)
          ^^^^^
NameError: name 'smbus' is not defined. Did you mean: 'smbus2'?
pewnie używając smbus2 trzeba inaczej zdefiniować w skrypcie : smbus.SMBus(0) ...bo to pozmieniali :-)
ale i tak nie wiadomo co jeszcze ...szkoda czasu. Trzeba by od podstaw liznąć pytona3 :-)
fnmirk
Senior Member
Posty: 8321
Rejestracja: 03 grudnia 2007, 06:37

Re: Python2 instalacja na Bookworm / ( moduł : smbus ) ?

Post autor: fnmirk »

Uparłeś się na moduł smbus. Ten moduł działa zapewne z przysłowiowego palca. Odwołuje się do modułu jądra systemowego, do standardowej obsługi magistrali I2C. Błąd powiązany jest z biblioteką programu 2to3, który wymaga wersji środowiska Python niższego niż 3.10. Program 2to3, a właściwie jedna jego biblioteka zostaje traktowana za przestarzałą.

Autor skryptu: Matt Hawkins na stronie www.raspberrypi-spy.co.uk/ przedstawia przykłady obsługi magistrali, odnośnie wyświetlaczy i wiele więcej.

Uporządkuj swoje informacje.

Ps Zarówno smbus jak i smbus2 to jedynie rozwinięcie, aby było ciekawiej jest jeszcze rozwidlenie do wersji smbus3.
Awatar użytkownika
olk777
Posty: 30
Rejestracja: 10 lutego 2018, 17:29

Re: Python2 instalacja na Bookworm / ( moduł : smbus ) ?

Post autor: olk777 »

Dzięki za wszystkie podpowiedzi ale raczej odpuszczę sobie ...muszę jeszcze sporo czasu poświęcić na sklecenie obudowy do radyjka może zrobię ....z pleksi ?. Programistą już nie zostanę chyba za stary jestem. A co do modułu smbus to uparty być muszę bo to wymaga aby ten skrypt poprawnie działał z LCD !!! (wiem bo radio i skrypt działa ! ale dobrze by móc w przyszłości prościej to instalować więc szukałem rozwiązania pod python3 ..raczej już nie dla mnie ale żeby innym było prościej )...zresztą takich błędów z tym smbus jest w necie więcej także o dziwo na RaspperyPi które ma o niebo większe wsparcie niż OrangePi . Każdy raczej przechodzi na skrypty pisane pod pythona3 jeśli takowe są lub jak ja wcześniej na siłę instaluje pythona2. Gdzieś znalazłem na forum RaspberyPi że można było skompilować ten moduł smbus pod pythona3 i nawet był tutek ale linki do plików wygasły więc lipa. A zabawa w programowanie to raczej dla zaawansowanych swoją drogą także takie zabawy w kompilowanie smbus ...bo może się uda a może tylko strata czasu :-)
I trochę zaczynam rozumieć firmę OrangePi że jak dotąd nie aktualizuje FW (2022 r) i zostaje z debianem bullseye ...po prostu tam wszystko działa OK i jest jeszcze kompatybilne :-)
można zerknąć
https://www.linuxcircle.com/2015/05/03/ ... -python-3/
https://forums.raspberrypi.com/viewtopic.php?t=22348
pozdro
fnmirk
Senior Member
Posty: 8321
Rejestracja: 03 grudnia 2007, 06:37

Re: Python2 instalacja na Bookworm / ( moduł : smbus ) ?

Post autor: fnmirk »

Ale mieszasz? Twoim problemem nie jest skrypt napisany w języku Python. Nawet nie jest nim środowisko Python. Ten skrypt działa prawidłowo. Różnica sprowadza się do jednej linijki kodu, po konwersji, która dotyczy kodowania polskich znaków.

Problem Twój dotyczy jądra systemowego i nawiązania komunikacji z magistralą i2c. To wszystko.

Zainstaluj Debiana Bookworm i doinstaluj pakiety:

Kod: Zaznacz cały

apt install python3-smbus python3-dev i2c-tools
Dopisz moduł i2c-dev do pliku (lub sprawdź czy tam jest)|

Kod: Zaznacz cały

nano /etc/modules
Zrestartuj system i nawiąż połączenie z magistralą i2c.

Kod: Zaznacz cały

i2cdetect -y 1
Sprawdź w dokumentacji, czy podobne polecenie zadziała w Twoim przypadku?

Jak i2c będzie aktywna, wtedy baw się skryptem Pythona.

Debian Bullseye na komputerach jednoukładowych wykorzystuje środowisko Python3. Twój opis dotyczy środowiska Python3, z którego korzystasz cały czas, mieszając swoje rozwiązania z wersją środowiska Python2. Chyba, że Twój opis dotyczy czegoś innego.

Twój skrypt przekonwertowany na dowolnej dystrybucji Linuksa ze środowiskiem Pytnon3 i na stronie:https://python2to3.com/ wygląda tak:

Kod: Zaznacz cały

#!/usr/bin/python
# -*- coding: utf-8 -*-
#--------------------------------------
#    ___  ___  _ ____
#   / _ \/ _ \(_) __/__  __ __
#  / , _/ ___/ /\ \/ _ \/ // /
# /_/|_/_/  /_/___/ .__/\_, /
#                /_/   /___/
#
#  lcd_i2c.py
#  LCD test script using I2C backpack.
#  Supports 16x2 and 20x4 screens.
#
# Author : Matt Hawkins
# Date   : 20/09/2015
#
# http://www.raspberrypi-spy.co.uk/
#
# Copyright 2015 Matt Hawkins
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
#
#--------------------------------------
try:
    import smbus2 as smbus
except ImportError:
    import smbus
import time
import subprocess

from time       import sleep, strftime
from datetime   import datetime
from subprocess import *

# Define some device parameters
I2C_ADDR  = 0x3f # I2C device address
LCD_WIDTH = 16   # Maximum characters per line

# Define some device constants
LCD_CHR = 1 # Mode - Sending data
LCD_CMD = 0 # Mode - Sending command

LCD_LINE_1 = 0x80 # LCD RAM address for the 1st line
LCD_LINE_2 = 0xC0 # LCD RAM address for the 2nd line
LCD_LINE_3 = 0x94 # LCD RAM address for the 3rd line
LCD_LINE_4 = 0xD4 # LCD RAM address for the 4th line

LCD_BACKLIGHT  = 0x08  # On
#LCD_BACKLIGHT = 0x00  # Off

ENABLE = 0b00000100 # Enable bit

# Timing constants
E_PULSE = 0.0005
E_DELAY = 0.0005

#Open I2C interface
#bus = smbus.SMBus(0)  # Rev 1 Pi uses 0
bus = smbus.SMBus(0) # Rev 2 Pi uses 1

def lcd_init():
  # Initialise display
  lcd_byte(0x33,LCD_CMD) # 110011 Initialise
  lcd_byte(0x32,LCD_CMD) # 110010 Initialise
  lcd_byte(0x06,LCD_CMD) # 000110 Cursor move direction
  lcd_byte(0x0C,LCD_CMD) # 001100 Display On,Cursor Off, Blink Off
  lcd_byte(0x28,LCD_CMD) # 101000 Data length, number of lines, font size
  lcd_byte(0x01,LCD_CMD) # 000001 Clear display
  time.sleep(E_DELAY)

def lcd_byte(bits, mode):
  # Send byte to data pins
  # bits = the data
  # mode = 1 for data
  #        0 for command

  bits_high = mode | (bits & 0xF0) | LCD_BACKLIGHT
  bits_low = mode | ((bits<<4) & 0xF0) | LCD_BACKLIGHT

  # High bits
  bus.write_byte(I2C_ADDR, bits_high)
  lcd_toggle_enable(bits_high)

  # Low bits
  bus.write_byte(I2C_ADDR, bits_low)
  lcd_toggle_enable(bits_low)

def lcd_toggle_enable(bits):
  # Toggle enable
  time.sleep(E_DELAY)
  bus.write_byte(I2C_ADDR, (bits | ENABLE))
  time.sleep(E_PULSE)
  bus.write_byte(I2C_ADDR,(bits & ~ENABLE))
  time.sleep(E_DELAY)

def lcd_string(message,line):
  # Send string to display

  message = message.ljust(LCD_WIDTH," ")

  lcd_byte(line, LCD_CMD)

  for i in range(LCD_WIDTH):
    lcd_byte(ord(message[i]),LCD_CHR)

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 list(pl.items()):
    chars = chars.replace(f,t)
  return chars

def main():

  counter = 0


while True:

  # Get current status and playtime
    process = subprocess.Popen('sudo mpc -v', shell=True, stdout=subprocess.PIPE)
    ekran1 = process.communicate()[0]
    ekran1 = replace_pl(ekran1)
    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]
    ekran2 = replace_pl(ekran2)
    statusLines = ekran2.split('\n')
    ekran2 = statusLines[0]
    ekran2L1 = ekran2[0:16]
    ekran2L2 = ekran2[16:31]

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

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

    if counter == 1:
      if ekran1 == "":
        counter = 7
      else:
        lcd_string(ekran1L1,LCD_LINE_1)
        lcd_string(ekran1L2,LCD_LINE_2)
    if counter == 7:
      if ekran2 == "":
        counter = 14
      else:
        lcd_string(ekran2L1,LCD_LINE_1)
        lcd_string(ekran2L2,LCD_LINE_2)
    if counter == 14:
      if ekran3 == "":
        counter = 25
      else:
        lcd_string(ekran3L1,LCD_LINE_1)
        lcd_string(ekran3L2,LCD_LINE_2)
    if counter == 25:
      if ekran4 == "":
        counter = 35
      else:
        lcd_string(ekran4L1,LCD_LINE_1)
        lcd_string(ekran4L2,LCD_LINE_2)

    sleep(0.1)
    counter = counter + 1
    if counter == 40:
      counter = 1

if __name__ == '__main__':

  try:
    main()
  except KeyboardInterrupt:
    pass
  finally:
    lcd_byte(0x00, LCD_CMD)
    lcd_byte(0x01, LCD_CMD)
    lcd_byte(0x08, LCD_CMD)

Ps Uzupełnienie swoje informacje o magistrali i2c:
https://www.abelectronics.co.uk/kb/arti ... ducing-i2c
https://www.abelectronics.co.uk/kb/arti ... spberry-pi
https://www.abelectronics.co.uk/kb/arti ... s-in-linux
https://www.abelectronics.co.uk/kb/arti ... ith-python
Awatar użytkownika
olk777
Posty: 30
Rejestracja: 10 lutego 2018, 17:29

Re: Python2 instalacja na Bookworm / ( moduł : smbus ) ?

Post autor: olk777 »

A co ja robię za każdym razem jak od nowa instaluję plik obrazu bookworma na karcie SD żeby sprawdzić ten felerny skrypt ? :-) ..nie ....raczej sobie odpuszczę twoje podpowiedzi bo to chyba TY nie kumasz. Otóż informuję Cię jeszcze raz nowy system przygotowuję do sprawdzenia tego skryptu instalując wszystko co potrzebne do działania LCD !!! tak więc WiringP od OrangePI na wszelki wypadek jeśli Armbian wcześniej nie zainstalował, dodaję do konfiguracji boot-owania opcję: I2c0 , I2c1 i2c2
i zawsze uruchamiam i2cdetect -y 0 ...sprawdzając czy pokaże poprawnie wykryty LCD u mnie to zawsze na LCD Winstar 40x2 :
0x3f. Co więcej instaluje także mpd / mpc bo to wymaga ten skrypt. Na końcu bawię się skryptem !!!
;) ...Przypominam że mój Debian Bookworm jest instalowany na OrangePi3LTS (ARM) Firmware od Armbian-a
Co więcej na Firmware oryginalnym od OrangePi jak Armbian-ie nie potrzeba dodawać żadnego modułu do :

Kod: Zaznacz cały

nano /etc/modules
Choć z przyzwyczajenia ja nieraz to robię ...wystarczy przez konfigurację : armbian-config uruchomić w opcjach : i2c0 i2c1 i2c2 i zrestartować system i magistrala I2C powinna działać. Lub samemu dodajemy wpisy do plików w /boot/ : orangepiEnv.txt lub armbianEnv.txt

Kod: Zaznacz cały

overlays= i2c0 i2c1 i2c2
i restart systemu i magistrala I2C jeśli jest w kernelu powinna działać ! :-)
Dla twojego spokoju na działającym systemie (bookworm / Armbian ) z LCD winstar 40x2 usunąłem wpis w i2c-dev :/etc/modules: i zrestartowałem system ... wynik wszystko działa OK czyli jest to niepotrzebne a z przyzwyczajenia dopisywałem bo tak robiłem na poprzednich wersjach OrangePi Lite :-)
Ostatnio zmieniony 07 stycznia 2025, 16:46 przez olk777, łącznie zmieniany 2 razy.
fnmirk
Senior Member
Posty: 8321
Rejestracja: 03 grudnia 2007, 06:37

Re: Python2 instalacja na Bookworm / ( moduł : smbus ) ?

Post autor: fnmirk »

Niepotrzebnie się gorączkujesz, w taki sposób nie rozwiążesz swojego problemu.

Przeanalizuj i zaktualizuj system, sprawdź go dokładnie.

Przejrzyj skrypt, który wkleiłeś po konwersji na forum, jeżeli takie błędy popełniasz to nie będzie to działać.

====
olk777 pisze: 05 stycznia 2025, 21:10 Zaraz sprawdzę :-) ... ciekawe czy takie internetowe konwertery są naprawdę pomocne ? Tylko nie będąc "specem" w pythonie martwi mnie użycie modułów czyli ciągle wałkowanego tu smbus który jest po prostu niezbędny do uruchomienia LCD z tym skryptem. Jak widzę wzrokowo to konwerter internetowy zmienił baaaaaaardzo niewiele :-) ...jeśli to zadziała to aż wstyd że nie umie się tego samemu poprawić. Ale czy aby w skrypcie nie trzeba teraz samemu zmienić smbus na smbus2 ? bo konwerter tego nie wychwycił ? a wątpię żeby to zadziałało bez obecności w systemie modułu smbus którego nie można zainstalować nie mając pythona2 itd :-) ...

Ps. niestety ale to wymaga raczej większej wiedzy ... jak wspomniałem być obeznanym w pythonie3 i żadne konwertery tego nie zrobią poprawnie tak mi się wydaje. Efekt z konwertowanym plikiem i modułem smbus a także zainstalowanymi : apt install python3-smbus / apt install python3-smbus2

Kod: Zaznacz cały

  root@orangepi3-lts:~# python3 start2.py 

Kod: Zaznacz cały

Traceback (most recent call last):
  File "/root/start2.py", line 177, in <module>
    main()
  File "/root/start2.py", line 111, in main
    ekran1 = replace_pl(ekran1)
             ^^^^^^^^^^^^^^^^^^
  File "/root/start2.py", line 99, in replace_pl
    chars = chars.replace(f,t)
            ^^^^^^^^^^^^^^^^^^
TypeError: a bytes-like object is required, not 'str'
może zamieszczę tu prze-konwertowany skrypt

Kod: Zaznacz cały

#!/usr/bin/python
# -*- coding: utf-8 -*-

import smbus
import time
import subprocess

from time       import sleep, strftime
from datetime   import datetime
from subprocess import *

# Define some device parameters
I2C_ADDR  = 0x3f # I2C device address
LCD_WIDTH = 40   # Maximum characters per line
LCD_HEIGHT = 2



# Define some device constants
LCD_CHR = 1 # Mode - Sending data
LCD_CMD = 0 # Mode - Sending command

LCD_LINE_1 = 0x80 # LCD RAM address for the 1st line
LCD_LINE_2 = 0xC0 # LCD RAM address for the 2nd line
LCD_LINE_3 = 0x94 # LCD RAM address for the 3rd line
LCD_LINE_4 = 0xD4 # LCD RAM address for the 4th line

LCD_BACKLIGHT  = 0x08  # On
#LCD_BACKLIGHT = 0x0C  # Off


ENABLE = 0b00000100 # Enable bit

# Timing constants
E_PULSE = 0.005
E_DELAY = 0.005

#Open I2C interface
bus = smbus.SMBus(0)  # Rev 1 Pi uses 0 (and Orange PI PC, for pins 3 and 5)
#bus = smbus.SMBus(1) # Rev 2 Pi uses 1


def lcd_byte(bits, mode):
  # Send byte to data pins
  # bits = the data
  # mode = 1 for data
  #        0 for command

  bits_high = mode | (bits & 0xF0) | LCD_BACKLIGHT
  bits_low = mode | ((bits<<4) & 0xF0) | LCD_BACKLIGHT

  # High bits
  bus.write_byte(I2C_ADDR, bits_high)
  lcd_toggle_enable(bits_high)

  # Low bits
  bus.write_byte(I2C_ADDR, bits_low)
  lcd_toggle_enable(bits_low)

def lcd_toggle_enable(bits):
  # Toggle enable
  time.sleep(E_DELAY)
  bus.write_byte(I2C_ADDR, (bits | ENABLE))
  time.sleep(E_PULSE)
  bus.write_byte(I2C_ADDR,(bits & ~ENABLE))
  time.sleep(E_DELAY)

def lcd_string(message,line):
  # Send string to display

  message = message.ljust(LCD_WIDTH," ")

  lcd_byte(line, LCD_CMD)

  for i in range(LCD_WIDTH):
    lcd_byte(ord(message[i]),LCD_CHR)

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 list(pl.items()):
    chars = chars.replace(f,t)
  return chars

def main():

  counter = 0

  while True:

  # Get current status and playtime
    process = subprocess.Popen('sudo mpc -v', shell=True, stdout=subprocess.PIPE)
    ekran1 = process.communicate()[0]
    ekran1 = replace_pl(ekran1)
    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]
    ekran2 = replace_pl(ekran2)
    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]
    ekran3 = replace_pl(ekran3)
    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]
    ekran4 = replace_pl(ekran4)
    statusLines = ekran4.split('\n')
    ekran4 = statusLines[0]
    ekran4L1 = ekran4[0:40]
    ekran4L2 = ekran4[40:80]

    if counter == 1:
      if ekran1 == "":
        counter = 7
      else:
        lcd_string(ekran1L1,LCD_LINE_1)
        lcd_string(ekran1L2,LCD_LINE_2)
    if counter == 7:
      if ekran2 == "":
        counter = 14
      else:
        lcd_string(ekran2L1,LCD_LINE_1)
        lcd_string(ekran2L2,LCD_LINE_2)
    if counter == 14:
      if ekran3 == "":
        counter = 30
      else:
        lcd_string(ekran3L1,LCD_LINE_1)
        lcd_string(ekran3L2,LCD_LINE_2)
    if counter == 30:
      if ekran4 == "":
        counter = 46
      else:
        lcd_string(ekran4L1,LCD_LINE_1)
        lcd_string(ekran4L2,LCD_LINE_2)

    sleep(0.1)
    counter = counter + 1
    if counter == 53:
      counter = 1


if __name__ == '__main__':

  try:
    main()
  except KeyboardInterrupt:
    pass
  finally:
    lcd_byte(0x00, LCD_CMD)
    lcd_byte(0x01, LCD_CMD)
    lcd_byte(0x08, LCD_CMD)
jak zmieniłem w skrypcie tylko : import smbus ...na import smbus2 to wywala:

Kod: Zaznacz cały

Traceback (most recent call last):
  File "/root/start2.py", line 39, in <module>
    bus = smbus.SMBus(0)  # Rev 1 Pi uses 0 (and Orange PI PC, for pins 3 and 5)
          ^^^^^
NameError: name 'smbus' is not defined. Did you mean: 'smbus2'?
pewnie używając smbus2 trzeba inaczej zdefiniować w skrypcie : smbus.SMBus(0) ...bo to pozmieniali :-)
ale i tak nie wiadomo co jeszcze ...szkoda czasu. Trzeba by od podstaw liznąć pytona3 :-)
ODPOWIEDZ