Python Scripting για RPI LCD display κανείς ?

Tzimisce

Administration Team
Staff member
1 February 2007
33,179
127.0.0.1
Μιχάλη, είναι μία πολύ ωραία γλώσσα για να ξεκινήσεις!
Βέβαια, μην περιμένεις ότι θα μπορείς να γράψεις σε άλλη γλώσσα αν μάθεις μόνο Python.
Τη χρησιμοποιώ μόνο σε automated endpoint tests και είναι λίγο pain in the ass μέχρι να μπεις στη φιλοσοφία της.
Πρέπει πρακτικά να παίξεις για λίγο καιρό full python για να τη συνηθίσεις. :p

Σταύρο, παίζει να κάνεις κάποιο λάθος στο copy paste.
Στείλε κάπου ΟΛΟ το script που έχεις γράψει να κάνουμε τις αλλαγές εκεί και να το πάρεις πάλι όλο.
Αλλιώς ψάξε το όπως λέει ο papdoux, σε command line για να δεις τι χτυπάει.

Αν η αλλαγή που έκανες ήταν μόνο εκείνο το κομμάτι που έκανε copy paste ο Μιχάλης, πάρε αυτό.
 

tuxx

Supreme Member
3 January 2014
3,319
/dev/null
Σταύρο,

για να το πάρεις σωστά από το github, πριν κάνεις paste, πάτα το κουμπί RAW. Aκόμα καλύτερα αφού πατήσεις raw, κάνε copy τη διεύθυνση και δώσε:


Code:
wget [URL]https://gist.githubusercontent.com/anonymous/e57ae98e5063cf90337b0fe2f8172115/raw/85854aaa3f51bd1659ae1f33d990930ff817bb75/audio.py[/URL] -O /path/to/your/file/display.py


Στον κώδικα που έβαλα παραπάνω, ο κώδικας του forum χαλάει το link, οπότε δε θα σου δουλέψει.
 

Σταύρος Κ.

Established Member
19 June 2006
215
@ Τuxx
Θα προτιμήσω να δουλέψω με windows και ssh, με το Linux ξέρεις ότι αισθάνομαι άβολα:chinese:
Θα κατεβάσω το αρχείο που έφτιαξε ο Tzimisce, μόνο που θα του αλλάξω την πληροφορία του bit rate γιατί είναι η ανάποδη από αυτήν που θέλω.

@ Tzimisce
Πόσο εύκολο είναι σε αυτό το script να προσθέσω και άλλη οθόνη ?
Να κάνω απλώς copy paste μια από τις υπάρχουσες και να τροποποιήσω τα δεδομένα της ή πρέπει να αλλάξω κάτι ακόμη ?

@Όλους σας
Ευχαριστώ για την βοήθεια
τώρα καταλαβαίνω τι εννοεί το λεξικό με την «οδόντωση» …
 

tuxx

Supreme Member
3 January 2014
3,319
/dev/null
Σταύρο, αυτό που σου λέω, από windows με ssh (putty) θα το κάνεις. Τέλοσπάντων κάνεις ότι θέλεις.

Ο κώδικας στο git είναι όντως ο ανάποδος από αυτόν που θες. Παρόλα αυτά, αυτό που λέμε είναι ότι παίζει πολύ μεγάλο ρόλο ο τρόπος σύνταξης με τα tabs και τα κενά στα if, οπότε υπάρχει περίπτωση να το πειράξεις και να μην σου παίξει και πάλι.

Έκανα την αλλαγή εδώ και ο κώδικας είναι αυτός:

https://gist.github.com/archphile/c76d0921603f9f44e38df6f3a2898dcf


Τουλάχιστον όταν θα το σώσεις, σώστε με δεξί κλικ από εδώ:

https://gist.githubusercontent.com/...8a6991e7cc0f4b18c6bfe29bce58272b3b/display.py
 

Σταύρος Κ.

Established Member
19 June 2006
215
Σταύρο, αυτό που σου λέω, από windows με ssh (putty) θα το κάνεις. Τέλοσπάντων κάνεις ότι θέλεις.

Ο κώδικας στο git είναι όντως ο ανάποδος από αυτόν που θες. Παρόλα αυτά, αυτό που λέμε είναι ότι παίζει πολύ μεγάλο ρόλο ο τρόπος σύνταξης με τα tabs και τα κενά στα if, οπότε υπάρχει περίπτωση να το πειράξεις και να μην σου παίξει και πάλι.

Έκανα την αλλαγή εδώ και ο κώδικας είναι αυτός:

https://gist.github.com/archphile/c76d0921603f9f44e38df6f3a2898dcf


Τουλάχιστον όταν θα το σώσεις, σώστε με δεξί κλικ από εδώ:

https://gist.githubusercontent.com/...8a6991e7cc0f4b18c6bfe29bce58272b3b/display.py

Υπόχρεος
:grinning-smiley-043
 

Tzimisce

Administration Team
Staff member
1 February 2007
33,179
127.0.0.1
Η άλλη οθόνη τι θέλεις να δείχνει;
Έτσι όπως το έχει γράψει ο νουμπάς σιγά μη βγάλεις άκρη! :flipout:
Αν η οθόνη σου είναι 4x20, οπότε θα πρέπει να φτιάξεις ακόμη 2 οθόνες.
Αν όχι, θα πρέπει να φτιάξεις άλλη μία.
Στη γραμμή 52 θα πρέπει να δηλώσεις πόσες οθόνες έχεις σύνολο και να τις κάνεις define σε δικές τους functions.
Κάνε για αρχή copy paste 1-2 ίδιες να δεις ότι δουλεύει και μετά αλλάζεις το τι θα δείξουν. :p
Βήμα βήμα.
 

Σταύρος Κ.

Established Member
19 June 2006
215
Η άλλη οθόνη τι θέλεις να δείχνει;
Έτσι όπως το έχει γράψει ο νουμπάς σιγά μη βγάλεις άκρη! :flipout:
Αν η οθόνη σου είναι 4x20, οπότε θα πρέπει να φτιάξεις ακόμη 2 οθόνες.
Αν όχι, θα πρέπει να φτιάξεις άλλη μία.
Στη γραμμή 52 θα πρέπει να δηλώσεις πόσες οθόνες έχεις σύνολο και να τις κάνεις define σε δικές τους functions.
Κάνε για αρχή copy paste 1-2 ίδιες να δεις ότι δουλεύει και μετά αλλάζεις το τι θα δείξουν. :p
Βήμα βήμα.

Λοιπόν,
Αν και μιλάς με γρίφους (..κάνεις define σε δικές τους functions) θα καταχραστώ την καλοσύνη σου και θα πω τι θα ήθελα.

Θα ήθελα να προσθέσω μια οθόνη (screen 7) αφιερωμένη εξολοκλήρου στην RΑΜ
Αν καταλαβαίνω σωστά ότι οπου function = ο υπολογισμός, τότε αυτός της μνήμης υπάρχει ήδη στην γραμμή 512 (# Return RAM information (unit=kb) in a list).
Η εμφάνιση της RAM στην καινούργια οθόνη θα πρέπει να καταλαμβάνει και τις δυο γραμμές (το LCD είναι 16x2) και ο ανάλογος κώδικας που πιστευω ότι μπορεί να δουλέψει είναι ο :

while True:
RAM_stats = getRAMinfo()
RAM_used = round(int(RAM_stats[1]) / 1000,1)
RAM_free = round(int(RAM_stats[2]) / 1000,1)
lcd.message('RAM Used %sMB \n' % (RAM_used))
lcd.message('RAM Free %sMB ' % (RAM_free))

Βέβαια δεν βλέπω να χρησιμοποιείται πουθενά η μέθοδος «lcd.message» για την εμφάνιση της πληροφορίας στο LCD, και διατηρώ επιφυλάξεις….

Αν καταφέρω την RAM να απεικονίζεται έτσι, τότε η υπάρχουσα απεικόνιση της στην δευτερη γραμμη της οθόνης 5 (στην γραμμή 922) θα μπορούσε να αντικατασταθεί με πληροφόρηση για το CPU usage (που απουσιάζει) ετσι ώστε τελικα, η οθόνη 5 να αφορά αμιγώς στο CPU (temp & usage)

Για να γίνει αυτό, διαβάζω ότι αρκεί στα import να προστεθεί και το psutil, ενώ ο κώδικας που θα εμφανίζει την πληροφορία είναι ο :

while True:
CPU_usage = psutil.cpu_percent(interval = .5)
lcd.message('CPU Load %s%% ' % (CPU_usage))

(και πάλι βλέπω «lcd.message»)

Έχουν νόημα όλα τα παραπάνω και να το προσπαθήσω ή παραμένω βαθειά νυχτωμένος ?
 

Tzimisce

Administration Team
Staff member
1 February 2007
33,179
127.0.0.1
Εκεί που τελειώνει η μέθοδος screen_5 βάλε αυτή.
Code:
    def screen_6(self):
        ramStats = self.getRAMinfo()

        try:
            temp = ramStats[0]
        except KeyError:
            temp = 'Error'

        self.display_data[0] = temp

        try:
            temp = ramStats[1]
        except KeyError:
            temp = 'Error'

        self.display_data[1] = temp
        data_changed = True

        self.wait_time = self.scroll_period

        return data_changed

Και φυσικά ανέβασε τα screens σου κατά ένα.
Μετά πες μου τι σου γράφει.
Α... Και μην αγχώνεσαι.
Ούτε εγώ "ξέρω" Python.
Αλλά wtf? Λες να καεί η οθόνη; :flipout:

BTW πέρα από τον τρόπο που έχει ορίσει τα vars ο τυπάς, μην πολυχρησιμοποιείς underscores στα ονόματά τους.
Καλύτερα να παίζεις με camelCase (ramState αντί για RAM_State).
Αν και το Hungarian Notation θα ήταν πιο σωστό σε κώδικα που δίνεις έξω γιατί όποιος τον πάρει πρέπει να μυρίσει τα νύχια του για να καταλάβει τι γυρίζει η getRAMinfo(). :(
 

Σταύρος Κ.

Established Member
19 June 2006
215
Καλημέρα σας,
Κατάφερα να βρω τελικά λίγο χρόνο να ασχοληθώ και να διαπιστώσω ιδίοις όμμασι πόσο ευαίσθητη είναι η python στην στοίχιση.
Κανένα αρχείο απ´ αυτά που είχατε την καλοσύνη να μου φτιάξετε, δεν έπαιξε με την μια, αλλά όντως ψυλλιασμένος ακλούθησα το tip του papdoux και τελικά τα κατάφερα !:Banane0:

Αναφορικά με την προσθήκη μιας ακόμη οθόνης, έκανα copy paste την εύκολη οθόνη της date / time στο τέλος της αλληλουχίας των οθονών και άλλαξα το counter της γραμμής 52.
Το script δεν έσκασε, αλλά όταν ήρθε η σειρά της νέας οθόνης δεν έγινε τίποτε.:nounder:
Δηλαδή όταν φτάνω στην τελευταία οθόνη και θέλω να προχωρήσω στην νέα, δίνοντας την εντολή να αλλάξει η οθόνη δεν περνάς στην επομένη αλλά παραμένεις σε αυτή που είσαι (σαν να είναι μια «κούφια» εντολή).

Καταλαβαίνω ότι εδώ το blind coding ίσως και να μην παίζει.
Παρόλα αυτά αν κάποιος έχει να προτείνει πράγματα να δοκιμάσω, δηλώνω διαθέσιμος να ασχοληθώ αυτό το σαββατοκύριακο.

Αν πάλι κάποιος επιθυμεί να ασχοληθεί πιο προσωπικά, είναι ευπρόσδεκτος !
Κερνώ καφέ (περιοχή ελληνορωσσων) ή remote access (ή και τα δυο)
Απλώς στείλτε μου ένα PM να συνεννοηθούμε

Πάντως σας ευχαριστώ Όλους σας για την βοήθεια που μου δώσατε ως τώρα ! :grinning-smiley-043
Ήταν και χρήσιμη και διδακτική…


φιλικά
Σταύρος
 
Last edited:

tuxx

Supreme Member
3 January 2014
3,319
/dev/null
Βλέπω ακόμη ένα section στον κώδικα (στον αρχικό κώδικα, γραμμή 989) το οποίο αναφέρεται σε κάποιον έλεγχο που γίνεται σε πολλές οθόνες:

Code:
# Temporary screen passed
			self.temporary_screen = False
			
			data_changed = False
			
			# If screen 0 is selected
			if (self.screen == 0):
				# If display is 4x20
				if (self.rows >= 4):
					data_changed1 = self.screen_0()
					data_changed2 = self.screen_1()
					data_changed = data_changed1 or data_changed2
					
				# Else it's a 2x16
				else:
					data_changed = self.screen_0()
					
			# Else if screen is 1
			elif (self.screen == 1):
				# 1 is only for 2x16 display
				if (self.rows < 4):
					data_changed = self.screen_1()
					
				# Else return to screen 0
				else:
					self.screen == 0
					
			# Else if screen is 2
			elif (self.screen == 2):
				# If display is 4x20
				if (self.rows >= 4):
					data_changed1 = self.screen_2()
					data_changed2 = self.screen_3()
					data_changed = data_changed1 or data_changed2
					
				# Else it's a 2x16
				else:
					data_changed = self.screen_2()
					
			# Else if screen is 3
			elif (self.screen == 3):
				# 1 is only for 2x16 display
				if (self.rows < 4):
					data_changed = self.screen_3()
					
				# Else return to screen 2
				else:
					self.screen == 2
					
			# Else if screen is 4
			elif (self.screen == 4):
				# If display is 4x20
				if (self.rows >= 4):
					data_changed1 = self.screen_4()
					data_changed2 = self.screen_5()
					data_changed = data_changed1 or data_changed2
					
				# Else it's a 2x16
				else:
					data_changed = self.screen_4()
					
			# Else if screen is 5
			elif (self.screen == 5):
				# 1 is only for 2x16 display
				if (self.rows < 4):
					data_changed = self.screen_5()
					
				# Else return to screen 4
				else:
					self.screen == 4


Δεν ξέρω τι κάνει το παραπάνω, αλλά πιθανώς να χρειαστεί κάποια προσθήκη και εδώ.
 

Tzimisce

Administration Team
Staff member
1 February 2007
33,179
127.0.0.1
Βλέπω ακόμη ένα section στον κώδικα (στον αρχικό κώδικα, γραμμή 989) το οποίο αναφέρεται σε κάποιον έλεγχο που γίνεται σε πολλές οθόνες:



Δεν ξέρω τι κάνει το παραπάνω, αλλά πιθανώς να χρειαστεί κάποια προσθήκη και εδώ.



Όντως!
Αυτό πρακτικά αλλάζει τις οθόνες. :p
Αμέσως μετά θέλει ένα:

Code:
			# Else if screen is 6
			elif (self.screen == 6):
				# 1 is only for 2x16 display
				if (self.rows < 4):
					data_changed = self.screen_6()
					
				# Else return to screen 5
				else:
					self.screen == 5
 
Last edited:

Σταύρος Κ.

Established Member
19 June 2006
215
Ok
Κατάφερα να επαναλάβω την οθόνη Date/Time ως 7η οθόνη, μετά την προσθήκη στο τέλος του κώδικα εναλλαγής οθονών.
Στην συνέχεια δοκίμασα τον κώδικα που είχε προτείνει ο Tzimisce :

def screen_6(self):
ramStats = self.getRAMinfo()

try:
temp = ramStats[0]
except KeyError:
temp = 'Error'

self.display_data[0] = temp

try:
temp = ramStats[1]
except KeyError:
temp = 'Error'

self.display_data[1] = temp
data_changed = True

self.wait_time = self.scroll_period

return data_changed

και το αποτέλεσμα είναι αυτό :
IMG_20161105_201057.png


παρεμπιπτόντως η ανάλογη «κανονική» οθόνη είναι αυτή :
image.jpg



καμιά ιδέα ?
 

Tzimisce

Administration Team
Staff member
1 February 2007
33,179
127.0.0.1
Ok
Κατάφερα να επαναλάβω την οθόνη Date/Time ως 7η οθόνη, μετά την προσθήκη στο τέλος του κώδικα εναλλαγής οθονών.
Στην συνέχεια δοκίμασα τον κώδικα που είχε προτείνει ο Tzimisce :

καμιά ιδέα ?

Η δεύτερη οθόνη είναι αυτό που θέλεις να βγάλεις;

Για δοκίμασε αυτό να αλλάξεις την function που σου έγραψα με αυτή να δούμε τι θα βγάλει.
Και φυσικά πρόσεξε το indentation! :p


Code:
def screen_6(self):
        ramStats = self.getRAMinfo()
        cpuTemp = self.getCPUtemperature()

        self.display_data[0] = 'CPU temp ' + cpuTemp
        self.display_data[1] = 'RAM ' + ramStats[1] + ' / ' + ramStats[0]
        data_changed = True

        self.wait_time = self.scroll_period

        return data_changed
 

Σταύρος Κ.

Established Member
19 June 2006
215
Η δεύτερη οθόνη είναι αυτό που θέλεις να βγάλεις;

Για δοκίμασε αυτό να αλλάξεις την function που σου έγραψα με αυτή να δούμε τι θα βγάλει.
Και φυσικά πρόσεξε το indentation! :p


Code:
def screen_6(self):
        ramStats = self.getRAMinfo()
        cpuTemp = self.getCPUtemperature()

        self.display_data[0] = 'CPU temp ' + cpuTemp
        self.display_data[1] = 'RAM ' + ramStats[1] + ' / ' + ramStats[0]
        data_changed = True

        self.wait_time = self.scroll_period

        return data_changed

Η δεύτερη οθόνη που επισύναψα, υπάρχει και είναι η screen_5 (γραμμή 914).
Ιδανικά όμως, θα ήθελα να αφορά αμιγώς στο CPU, δηλαδή η δεύτερη γραμμή της , αντί για RAM να δείχνει το CPU usage.
Για να γίνει αυτό θεώρησα ότι η υπάρχουσα δεύτερη γραμμή της RAM (used/total), θα πρέπει να μετακομίσει σε μια νέα οθόνη και να «σπάσει» σε δυο γραμμές (used RAM & available RAM).

Μέχρι στιγμής με τις οδηγίες σας, έχω πετύχει την δημιουργία μιας νέας οθόνης.

Μένει ο κώδικας που θα γεμίσει με πληροφορία για την RAM τις δυο γραμμές της.
Αν το καταφέρουμε αυτό, θα απομένει η εμφάνιση του CPU usage αντί της πληροφορίας για την RAM, στην υπάρχουσα οθόνη.

Βγάζουν νόημα τα παραπάνω ?
Το βλέπετε σχετικά εύκολο να το καταφέρω με τις οδηγίες σας (άρα να συνεχίσω να σας ταλαιπωρώ ? :hmmmm2:) ή να το πάρω απόφαση και να παραμείνω ως έχω ?
 

Tzimisce

Administration Team
Staff member
1 February 2007
33,179
127.0.0.1
Well, αν δεν ψάξεις μόνος σου, δύσκολα θα βγει άκρη.
Κάτι που αν το είχε ένας προγραμματιστής μπροστά του, ακόμη και να μην ήξερε τη γλώσσα, θα το έκανε σε 10 λεπτά, μέσω του forum χρειάζεται μία εβδομάδα.
Αφού δημιουργήθηκε η οθόνη για αρχή, τουλάχιστον είσαι σε καλό δρόμο πάντως. :p
Μένει να χτίσεις το text που θα εμφανίζει τώρα.
Γράψε τι ακριβώς θέλεις να εμφανίζεται στην οθόνη σου να το δούμε.

Με τον τελευταίο κώδικα τι εμφανίζεται btw;
 

Σταύρος Κ.

Established Member
19 June 2006
215
Καλημέρα,
Ιδανικά θα ήθελα να εμφανίζει :

UsedRAM 87 MB
FreeRAM 923 MB

Είναι 16 ψηφία ανά γραμμή και «χωρούν» και στις δυο γραμμές (αν χρειαστει) 3ψηφιες τιμές RAM.

Ο κώδικας σου είναι η πρώτη από τις δυο photo του post 32.
Εμφανίζει πράγματι τις τιμές free / used RAM ανά γραμμή (στην αρχή της γραμμής) και μετά ακολουθούν πληροφορίες (σκουπίδια?) από άλλες οθόνες.

Για μένα αυτό σημαίνει ότι την πληροφορία μπορείς να την έχεις και πρέπει να «πατήσεις» στην υπάρχουσα υλοποίηση για να την μορφοποιήσεις καθώς και για να ορίσεις την ανανέωση της.
Ο ανάλογος κώδικας για αυτό τον σκοπό υπάρχει στις άλλες οθόνες, αλλά δεν γνωρίζω να τον τροποποιήσω κατάλληλα και να τον «συνθέσω» για την νέα οθόνη.

Από την άλλη καταλαβαίνω ότι χωρίς να βλέπεις άμεσα τα αποτελέσματα κάθε αλλαγής του κώδικα δύσκολα εντοπίζεις το τι θέλει αλλαγή – όπως προείπες η περίπτωση δεν προσφέρεται για blind coding...

Αν πιστεύεις ότι θα καταλήξουμε με μια ανιαρή εργασιοθεραπεία χωρίς αποτελέσματα, πες το να το σταματήσουμε εδώ.
Όπως έχω πει, οι συγκεκριμένες τροποποιήσεις είναι over & above από το τι χρειαζόμουν.

Φιλικά
Σταύρος
 

Tzimisce

Administration Team
Staff member
1 February 2007
33,179
127.0.0.1
Αφήνει 'σκουπίδια' από τις προηγούμενες οθόνες;
Μήπως τότε πρέπει να καθαρίσεις τα variables?
Κάτι σαν

Code:
def screen_6(self):
        data_changed = False
        ramStats = self.getRAMinfo()

        self.display_data[0] = ''
        self.display_data[1] = ''
        self.display_data[0] = 'UsedRAM ' + ramStats[1]
        self.display_data[1] = 'FreeRAM ' + ramStats[0]

        data_changed = True

        self.wait_time = self.scroll_period

        return data_changed

Περίεργο μου φαίνεται πάντως.
Αυτός ο κώδικας τι σου εμφανίζει;
 

Σταύρος Κ.

Established Member
19 June 2006
215
Αφήνει 'σκουπίδια' από τις προηγούμενες οθόνες;
Μήπως τότε πρέπει να καθαρίσεις τα variables?
Κάτι σαν

Code:
def screen_6(self):
        data_changed = False
        ramStats = self.getRAMinfo()

        self.display_data[0] = ''
        self.display_data[1] = ''
        self.display_data[0] = 'UsedRAM ' + ramStats[1]
        self.display_data[1] = 'FreeRAM ' + ramStats[0]

        data_changed = True

        self.wait_time = self.scroll_period

        return data_changed

Περίεργο μου φαίνεται πάντως.
Αυτός ο κώδικας τι σου εμφανίζει;

Ο παραπάνω κώδικας δεν επιστρέφει τίποτε.
Όπως στην αρχή (…όταν φτάνω στην τελευταία οθόνη και θέλω να προχωρήσω στην νέα, δίνοντας την εντολή να αλλάξει η οθόνη δεν περνά στην επομένη αλλά παραμένει σε αυτή που είναι - σαν να είναι μια «κούφια» εντολή).

Νομίζω ότι σε παιδεύω άδικα …

:nounder:
 

Tzimisce

Administration Team
Staff member
1 February 2007
33,179
127.0.0.1
Από εδώ και πέρα μάλλον θα πρέπει να παίζεις και να δοκιμάζεις διάφορα μόνος σου ή με κάποιον που έχει το hardware για να βλέπει το αποτέλεσμα. :smile:
Δύσκολα θα βγει κάτι τελικό με assumptions.