Raspberry Pi Buttonabfrage mit OLED-Screen benutzen

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Antworten
DenisKam
User
Beiträge: 2
Registriert: Mittwoch 17. Februar 2021, 17:56

Also Hallo erstmal,
ich bin ein echter Anfänger wenn es ums Programmieren geht. Vor allem mit Python habe ich noch keine Erfahrungen gesammelt. Deswegen würde ich mich freuen wenn mir jemand helfen könnte. Aber erstmal zu meinem Problem!

Ich habe einen Code geschrieben, sowie ich denken würde, dass er funktionieren sollte. Es sollte bei einem Tastendruck ein Zähler hochgezählt werden. Wenn dann zum Beispiel der Zähler auf 1 steht, soll er dann etwas auf den OLED-Screen schreiben. In meinem Fall soll nach jedem Knopf druck ein anderes Getränk aufgelistet werden, bis man wieder am Anfang landet. Bei mir funktioniert es aber nicht, da der Screen bis auf die Border blank ist. Deswegen wollte ich mal fragen wieso es nicht geht und wie ich es beheben kann.

MEIN CODE:

import RPi.GPIO as GPIO
from time import sleep
from luma.core.interface.serial import i2c, spi, pcf8574
from luma.core.interface.parallel import bitbang_6800
from luma.core.render import canvas
from luma.oled.device import sh1106

#GPIO
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)

#Screen
serial = i2c(port=1, address=0x3C)
device = sh1106(serial)
with canvas(device) as draw:
draw.rectangle(device.bounding_box, outline="white", fill="black")

#Button
btn = 5
GPIO.setup(btn, GPIO.IN, pull_up_down=GPIO.PUD_UP)

#Count Variable
count = 0

while True:
if GPIO.input(btn) == True :
count = count + 1
sleep (0.5)
elif count == 0:
draw.text((50, 25), "Wählen sie ein Getränk", fill="white")
elif count ==1:
draw.text((50, 25), "Vodka", fill="white")
elif count ==2:
draw.text((50, 25), "Gin", fill="white")
elif count == 3:
draw.text((50, 25), "Whiskey", fill="white")
elif count ==4:
draw.text((50, 25), "Rum", fill="white")
elif count == 5:
draw.text((50, 25), "REINIGUNG", fill="white")
elif count >5:
count = 0;
else:
draw.text((50, 25), "Wählen sie ein Getränk", fill="white")

Ich freue mich schon auf eure Rückmeldungen! :D

Liebe Grüße
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

`as` bei `import` ist dazu da, dass man etwas umbenennt, `GPIO` wird aber gar nicht umbenannt.
spi, pcf8574 und bitbang_6800 werden importiert, aber gar nicht benutzt.
Warnungen sind dazu da, dass man sie behebt, nicht dass man sie ignoriert. Dazu muß man aber auch verlässlich GPIO.cleanup aufrufen.
Eingerückt wird immer mit 4 Leerzeichen pro Ebene, nicht mal 4 und mal nur einer.
Die meisten if-Blocke enthalten den selben Code und sollten zu einem zusammengefasst werden.
Der else-Block wird soweit ich sehe niemals erreicht.

Der eigentliche Fehler dürfte daran liegen, dass draw außerhalb des with-Blocks nicht funktioniert.

Code: Alles auswählen

from time import sleep
from itertools import cycle
from RPi import GPIO
from luma.core.interface.serial import i2c
from luma.core.render import canvas
from luma.oled.device import  sh1106

BUTTON_PIN = 5

TEXTS = [
    "Wählen sie  ein  Getränk",
    "Vodka",
    "Gin",
    "Whiskey",
    "Rum",
    "REINIGUNG",
]


def loop(draw):
    text_cycle = cycle(TEXTS)
    draw.rectangle(device.bounding_box, outline="white", fill="black")
    while True:
        if GPIO.input(BUTTON_PIN):
            text = next(text_cycle)
            draw.text((50, 25), text, fill="white")
        sleep (0.5)


def main():
    try:
        GPIO.setmode(GPIO.BCM)
        GPIO.setup(BUTTON_PIN, GPIO.IN, pull_up_down=GPIO.PUD_UP)

        #Screen
        serial = i2c(port=1, address=0x3C)
        device = sh1106(serial)
        with canvas(device) as draw:
            loop(draw)
    finally:
        GPIO.cleanup()

if __name__ == "__main__":
    main()
DenisKam
User
Beiträge: 2
Registriert: Mittwoch 17. Februar 2021, 17:56

Danke für deine schnelle Antwort.
Ich hab es so wie ich es hatte zum Laufen bekommen, da es für mich logischer ist.
Jetzt steh ich vor der Hürde, dass ich eine Bedingung machen will wenn Count 1 ist und btnRelays True ist soll Relay Vodka geöffnet werden.

Der Code:
if GPIO.input(btnRelays) ==True and count == 1:
GPIO.output(relayVodka) == False

Im code habe ich einen Pull Up. Der Fehler der jetzt kommt ist function takes exactly 2 arguments (1given).
Was muss ich machen damit der Hase wieder läuft?
Benutzeravatar
__blackjack__
User
Beiträge: 13077
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@DenisKam: Python lernen wäre wahrscheinlich ein erster sinnvoller Schritt. Die Fehlermeldung ist ziemlich deutlich. Da ist eine Funktion die zwei Argumente erwartet, aber nur eines bekommt. Schau mal in die Dokumentation was die Funktion erwartet und vergleich das mit dem was Du übergibst.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten