Forum: Mikrocontroller und Digitale Elektronik Raspberry Pico Micropython + SSD1306


von Kevin (Gast)


Lesenswert?

Hallo an alle,

Ich hab aus Interesse von PICs in C zu einem RPI Pico mit Micropython 
gewechselt. Ich muss zugeben, mir fällt es etwas schwer.

Vor allem geht es gerade um Text schreiben auf einem Bildschirm.

Ich hab den Code aus den Tutorials, das auch funktioniert. Jedoch kann 
Ich kein Text löschen, bzw überschreiben.

Wenn Ich Text an eine Position setze an dem schon Text war, wird einfach 
die Kombination aus beidem gezeigt.
Wenn ich Leerzeichen an dieser Stelle einfüge, so wie ich das immer 
gemacht hab, dann bleiben die Zeichen bestehen.

Ist das wirklich so gedacht oder übersehe ich etwas?

Hier mein Code:
1
#------------------------------------------------
2
# Import Libraries
3
#------------------------------------------------
4
5
# General Lib
6
import board
7
import busio
8
9
# OLED lib
10
import displayio
11
import terminalio
12
from adafruit_display_text import label
13
import adafruit_displayio_ssd1306
14
15
# LED
16
import pwmio
17
import time
18
#------------------------------------------------
19
#------------------------------------------------
20
21
22
#------------------------------------------------
23
# Define GPIO
24
#------------------------------------------------
25
26
# RGB LED
27
LED_R = pwmio.PWMOut(board.GP10, frequency=5000, duty_cycle=0)
28
29
30
#------------------------------------------------
31
# OLED
32
#------------------------------------------------
33
34
# Reset OLED
35
displayio.release_displays()
36
37
i2c = busio.I2C(board.GP1, board.GP0)
38
39
display_bus = displayio.I2CDisplay(i2c, device_address=0x3C)
40
display = adafruit_displayio_ssd1306.SSD1306(display_bus, width=128, height=64)
41
42
# Make the display context
43
splash = displayio.Group()
44
display.show(splash)
45
46
#------------------------------------------------
47
#------------------------------------------------
48
49
50
#------------------------------------------------
51
# Functions
52
#------------------------------------------------
53
def Set_Led(R):
54
    LED_R.duty_cycle=R
55
56
57
def Write_OLED(text, x, y):
58
    text_area = label.Label(terminalio.FONT, text=text, color=0xFFFF00, x=x, y=y)
59
    splash.append(text_area)
60
61
62
#------------------------------------------------
63
#------------------------------------------------
64
    
65
66
# Main Loop    
67
while True:
68
    Write_OLED("ON", 20, 10)
69
    Set_Led(1) # ON (ist gegen GND geschaltet)
70
    time.sleep(2)
71
    
72
    Set_Led(65535) # OFF
73
    Write_OLED("  ", 20, 10) # keine Wirkung
74
    Write_OLED("OFF", 20, 10) # 
75
    time.sleep(2)

Vielen Dank
mbG

von Kevin (Gast)


Lesenswert?

Zudem läuft das Programm nur 4 minuten, dann gibt es einen: „Memory 
Error: memory allocation failed, allocating 1024 bytes“

Ja, das Problem ist bekannt, da alles auf den Ram kommt- jedoch wird bei 
mir in der Schleife doch nichts hinzugefügt, mein Programm muss 
lediglich zwischen verschiedenen Adressen jumpen ?!

von J. S. (jojos)


Lesenswert?

Das splash.append() sieht mir verdächtig aus, da wird man nicht 
unendlich hinzufügen können.

von Stefan F. (Gast)


Lesenswert?

Kevin schrieb:
> Ist das wirklich so gedacht oder übersehe ich etwas?

Ja, bei den Adafruit Bibliotheken ist das üblich. Bei PC Programmierung 
in der Regel auch. Du kannst den Bereich vorher mit einem gefüllten 
Quadrat übermalen.

von J. S. (jojos)


Lesenswert?

1
text_area = label.Label(terminalio.FONT, text=text, color=0xFFFF00, x=x, y=y)
2
splash.append(text_area)

dieser Teil darf nur einmal in einer Initialisierung ausgeführt werden, 
damit wird das label erzeugt. Danach kann der Text mit 'text_area.text = 
"xxx"' verändert werden.
Jetzt werden knapp unendlich viele Labels erzeugt und alle 
übereinandergelegt. Da geht dem pico irgendwann die Puste aus.

von Keviin (Gast)


Lesenswert?

J. S. schrieb:
> text_area = label.Label(terminalio.FONT, text=text,
> color=0xFFFF00, x=x, y=y)
> splash.append(text_area)
>
> dieser Teil darf nur einmal in einer Initialisierung ausgeführt werden,
> damit wird das label erzeugt. Danach kann der Text mit 'text_area.text =
> "xxx"' verändert werden.
> Jetzt werden knapp unendlich viele Labels erzeugt und alle
> übereinandergelegt. Da geht dem pico irgendwann die Puste aus.

OHJE! Ok ja das war die Lösung. Diese Libraries muss man erst mal 
verstehen.
Vielen vielen Dank, das hat meine zwei Probleme gelöst.

Hier also die Lösung:
1
VARIABLE= label.Label(terminalio.FONT, text="", color=0xFFFF00, x=10, y=5)
2
splash.append(VARIABLE)
3
4
VARIABLE.text="Intensity: "
5
VARIABLE.text="blabla: "
6
7
ANDEREVARIABLE= label.Label(terminalio.FONT, text="", color=0xFFFF00, x=60, y=5)
8
splash.append(ANDEREVARIABLE)
9
10
ANDEREVARIABLE.text="Ergebnis "

lG

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.