# pygame-mbot-02.py vom 21.11.2024 import sys from pygame.locals import * COM_Port = "COM14" print(f"Starte Verbindung zu {COM_Port}") from pygame_mbot_module import * ser = ser_init( COM_Port, 115200 ) if ser=="error": sys.exit("Serielle Verbindung zu {COM_Port} nicht hergestellt!") print(f"Verbindung zu {COM_Port} steht") print("Warte auf Daten: ", end="") fenster = mache_fenster("PyGame mBot 02",800, 600) schalter = [ [100,100], [200,100], [300,100] ] taster = [ [100,333], [200,333], [300,333] ] line = 0; hell = 0; entf = 0 # enthalten später die aktuellen Messwerte des mBot senden_erlaubt = True # def sende(msg): print(msg) if senden_erlaubt: ser.write(f"{msg}\n".encode()) def aktion_schalter(i): if i == 0: if schalter[i][2] : sende("rgb 125 0 0") else: sende("rgb 0 0 0") elif i == 1: if schalter[i][2] : sende("rgbl 125 0 0") sende("rgbr 0 0 125") else: sende("Lampe 2 aus") elif i == 2: if schalter[i][2] : sende("Lampe 2 an") else: sende("Lampe 2 aus") else: print(f"Für Schalter {i} ist keine Aktion zugeordnet") def aktion_taster(i): if i == 0: if taster[i][2] : sende("Kurzer Piep") else: pass elif i == 1: if taster[i][2] : sende("Lampe 2 an") else: sende("Lampe 2 aus") elif i == 2: if taster[i][2] : sende("x =.=") else: sende("x _._") else: print(f"Für Taster {i} ist keine Aktion zugeordnet") pygame.init() FPS=60 fenster = pygame.display.set_mode((800, 600)) pygame.display.set_caption("mBot ...") clock = pygame.time.Clock() # from TextTyper import * # text_typer("Hello") def text_typer_xy(text,x,y, size, color) : font = pygame.font.SysFont("arial", size) text = font.render(text, True, color) textrect = text.get_rect() textrect.centerx = x textrect.centery = y fenster.blit(text, textrect) def definiere_Schalter(s): rect = Rect(s[0], s[1], 90, 60) return rect def zeige_Schalter(s): f = rot_aus if s[2] else rot_ein pygame.draw.rect(fenster, f , Rect(s[0], s[1], 90, 60), 0, border_radius = 35) pygame.draw.rect(fenster, schwarz, Rect(s[0], s[1], 90, 60), 5, border_radius = 35) S = [] for i in range(len(schalter)): S.append(definiere_Schalter(schalter[i])) schalter[i].append(False) # ------------- def definiere_Taster(t): rect = Rect(t[0],t[1], 80, 50) return rect def zeige_Taster(t): farbe = blau_ein if t[2] else blau_aus # Ternary Operators, or Conditional Expressions. rect = pygame.draw.rect(fenster, farbe,Rect(t[0],t[1], 80, 50), 0, border_radius = 15) pygame.draw.rect(fenster, schwarz, Rect(t[0],t[1], 80, 50), 5, border_radius = 15) # ------------------------- T = [] for i in range(len(taster)): T.append(definiere_Taster(taster[i])) taster[i].append(False) taster[i].append(0) r1_laenge = 700; r1_farbe = rot fenster.fill(gelb) text_typer_xy("mBot",400,300, 66, rot) daten = "Warte auf Daten" pygame.display.update() time.sleep(3) def Fenster_zeigen(): fenster.fill(grau) for i in range(len(schalter)): zeige_Schalter(schalter[i]) for i in range(len(taster)): zeige_Taster(taster[i]) text_typer_xy(daten, 400,500,33,rot) pygame.display.update() Fenster_zeigen() time.sleep(2) letzte_daten = " ? - ? - ? " ende = False while not ende: # Schleife Hauptprogramm # global line hell, entf if ser.inWaiting(): msg = ser.readline() # liest Bytearray mit '\r\n' daten = msg.decode().strip() werte = daten.split(",") if len(werte) != 3: daten = letzte_daten continue line, hell, entf = werte print(daten) letzte_daten = daten for event in pygame.event.get(): # Überprüfen auf Nutzeraktion # Beenden bei [ESC] oder 'Fenster schließen' if event.type==QUIT or (event.type==KEYDOWN and event.key==K_ESCAPE): # zum Ende ende = True if event.type == pygame.MOUSEBUTTONDOWN: # Mausklick auswerten: for i in range(len(S)): # - für die Schalter if S[i].collidepoint(event.pos): schalter[i][2] = not schalter[i][2] zustand = "EIN" if schalter[i][2] else "aus" print(f'Schalter {i} ist {zustand} bei {i}') aktion_schalter(i) for i in range(len(T)): # - für die Taster if T[i].collidepoint(event.pos): taster[i][2] = True taster[i][3] = time.time() print(f'Taster {i} ist EIN bei {time.time()}') aktion_taster(i) for i in range(len(taster)): # Status der Taster überwachen if taster[i][2]: if taster[i][3] + 0.5 < time.time(): taster[i][2] = False aktion_taster(i) Fenster_zeigen() clock.tick(FPS) #FPS #print(time.time()) print("\n\n ### ENDE ###") pygame.quit() sys.exit() # statt ser.close()