Python2 instalacja na Bookworm / ( moduł : smbus ) ?
Re: Python2 instalacja na Bookworm / ( moduł : smbus ) ?
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.
Re: Python2 instalacja na Bookworm / ( moduł : smbus ) ?
Zainstaluj jedynie na czystym systemie:
następnie:
lub:
następnie:
i powinno to działać. Tam nie ma nic dziwnego. Program 2to3 działa w 99% kodu Pythona.
Kod: Zaznacz cały
apt install python3-full
Kod: Zaznacz cały
apt install python3-smbus2
Kod: Zaznacz cały
apt install python3-smbus
Kod: Zaznacz cały
2to3 skrypt1 [opcje] skrypt2
Re: Python2 instalacja na Bookworm / ( moduł : smbus ) ?
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 :
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 ...
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)
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 ...
Re: Python2 instalacja na Bookworm / ( moduł : smbus ) ?
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
może zamieszczę tu prze-konwertowany skrypt
jak zmieniłem w skrypcie tylko : import smbus ...na import smbus2 to wywala:
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 :-)
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'
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)
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'?
ale i tak nie wiadomo co jeszcze ...szkoda czasu. Trzeba by od podstaw liznąć pytona3 :-)
Re: Python2 instalacja na Bookworm / ( moduł : smbus ) ?
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.
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.
Re: Python2 instalacja na Bookworm / ( moduł : smbus ) ?
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
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
Re: Python2 instalacja na Bookworm / ( moduł : smbus ) ?
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:
Dopisz moduł i2c-dev do pliku (lub sprawdź czy tam jest)|
Zrestartuj system i nawiąż połączenie z magistralą i2c.
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:
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
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
Kod: Zaznacz cały
nano /etc/modules
Kod: Zaznacz cały
i2cdetect -y 1
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)
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
Re: Python2 instalacja na Bookworm / ( moduł : smbus ) ?
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 :
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
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 :-)
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 !!!

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
Kod: Zaznacz cały
overlays= i2c0 i2c1 i2c2
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.
Re: Python2 instalacja na Bookworm / ( moduł : smbus ) ?
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ć.
====
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-smbus2Kod: Zaznacz cały
root@orangepi3-lts:~# python3 start2.py
może zamieszczę tu prze-konwertowany skryptKod: 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'
jak zmieniłem w skrypcie tylko : import smbus ...na import smbus2 to wywala: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)
pewnie używając smbus2 trzeba inaczej zdefiniować w skrypcie : smbus.SMBus(0) ...bo to pozmieniali :-)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'?
ale i tak nie wiadomo co jeszcze ...szkoda czasu. Trzeba by od podstaw liznąć pytona3 :-)