Variablen indizieren

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Antworten
bogo10
User
Beiträge: 5
Registriert: Dienstag 26. Dezember 2017, 19:09

Hallo,
vorweg - ich bin Anfänger, hab ein paar Grundkenntnisse in Programmierung allgemein und sehr wenig in Python.
Ich hab ein LCD- Board mit 5 Tastern am Pi Zero W hängen und möchte prinzipiell folgendes machen:

Code: Alles auswählen

for i in (11, 12, 13, 14, 15):
    Tast(i) = pca.digitalRead(i)
    time.sleep(3)


Soll heißen: die 5 Taster (an den Pins 11-15) werden nacheinander abgefragt und das Ergebnis in den Variablen Tast11- Tast15 gespeichert.
Das geht so natürlich nicht. Aber irgendwie sollte das doch möglich sein? Ich ahne schreckliches von wegen Array oder so.
Für einen kräftigen Schubs in die richtige Richtung wäre ich dankbar.
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

@bogo10: Du kannst die Werte entweder in einer Liste oder einem Wörterbuch speichern:

Code: Alles auswählen

tasten = {}
for i in (11, 12, 13, 14, 15):
    tasten[i] = pca.digitalRead(i)
Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

bogo10 hat geschrieben:Ich ahne schreckliches von wegen Array oder so.
Ja, genau. Eine Liste oder ein Wörterbuch sind die üblichen Datentypen, die man hierfür benutzt. Wegen deiner "Horrorvorstellung" solltest du dir einfach im Klaren sein, dass irgendwann sozusagen der Schraubendreher nicht mehr ausreicht und man sich dann eben mal mit der Bohrmaschine vertraut machen muss... ;)
bogo10
User
Beiträge: 5
Registriert: Dienstag 26. Dezember 2017, 19:09

Danke. Da werd ich mir wohl oder übel mal eine Bohrmaschine kaufen müssen :? bzw. mich mal durch die Doku wühlen.
Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Hier kann ich immer wieder die deutsche Übersetzung des offiziellen Python-Tutorials empfehlen, welches gut die benötigten Grundlagen vermittelt. In Kapitel 5.5 kommen Wörterbücher (Dictionaries) zur Sprache.
bogo10
User
Beiträge: 5
Registriert: Dienstag 26. Dezember 2017, 19:09

So, jetzt scheint es zu funktionieren:

Code: Alles auswählen

while True:
    Taster = []
    Zustand = []
    for i in (11, 12, 13, 14, 15):
        Taster.append("Taster" + str(i-10))
        tast = pca.digitalRead(i)
        Zustand.append(tast)
    Ergebnis = zip(Taster, Zustand)
    print(Ergebnis)
    Ergebnis_dict = dict(Ergebnis)
    if not (Ergebnis_dict["Taster1"]): # Taster ist betätigt -> 0
        print("Handsteuerung")
    time.sleep(3)
Aber gefallen tuts mir nicht. Ich hab da bestimmt ein paar Pirouetten gedreht. Verbesserungsvorschläge?
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

So wie ich Deinen Code lese, wird der Text "Handsteuerung" immer dann ausgegeben, wenn der Aufruf von 'pca.digitalRead(i)' mit i = 11 etwas zurück gibt, das im boolschen Kontext False ergibt. Ja, das geht auch einfacher.
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

@bogo10: wenn Listen gar nicht Dein gewünschtes Format sind, dann erzeug doch gleich das, was Du haben möchtest:

Code: Alles auswählen

TASTER_PINS = {
    "Taster 1": 11,
    "oben links": 12,
    "Alarmknopf": 13,
    "noch ein Schalter": 14,
    "der letzte": 15,
}

while True:
    zustand = {
        name: pca.digitalRead(pin)
        for name, pin in TASTER_PINS.items()
    }
    print(zustand)
    if not zustand["Taster 1"]:
        print("Handsteuerung")
    time.sleep(3)
bogo10
User
Beiträge: 5
Registriert: Dienstag 26. Dezember 2017, 19:09

@kbr Das ist nur ein Beispiel, danach kommen noch paar Zeilen .... Und ja, so wars gedacht.

@Sirius3 Danke, das sieht doch schon viel aufgeräumter und strukturierter aus als bei mir. Ich hatte nur den Umweg über die Listen vor den Augen. Da muß ich wohl noch bischen üben.

@snafu Ja das ist ständig offen. Aber Erfahrung und viel Programmierpraxis ist unbezahlbar :(

Allen danke, das ihr eure Zeit geopfert habt.
Antworten