Skocz do zawartości

Problem z przyciskami GPIO


marcinf8702

Pomocna odpowiedź

Witam wszystkich 

Chciałbym poprosić o pomoc w obsłudze przycisków w malince. Problem polega na tym że używam przycisków w dwóch na tą chwilę funkcjach. i w momencie gdy od razu w programie wywołuje funkcję input_text do wprowadzania tekstu to wszystko działa. Ale gdy najpierw wywołam funkcje menu i przez nią wywoła funkcje wprowadzania tekstu to już przyciski nie działają. Przypuszcza że chodzi o zmianę funkcji dla przycisków ( po zmianie funkcji przyciski nie zmieniają funkcjonalności ). Próbowałem też to resetować, ale nic to nie dało. Z góry dziękuję za pomoc 

from gpiozero import Button
from RPLCD.gpio import CharLCD
from RPi import GPIO
from time import sleep

# Konfiguracja wyświetlacza LCD
lcd = CharLCD(
    pin_rs=25,
    pin_rw=None,
    pin_e=24,
    pins_data=[23, 17, 21, 22],
    numbering_mode=GPIO.BCM,
    cols=16,
    rows=4
)

# Podłączenie przycisków 
INC_BUTTON = 19
DEC_BUTTON = 13
BACK_BUTTON = 6
NEXT_BUTTON = 5
SEL_BUTTON = 26

# Konfiguracja i opóźnienie czasowe 
inc_button = Button(INC_BUTTON, bounce_time=0.1)
dec_button = Button(DEC_BUTTON, bounce_time=0.1)
back_button = Button(BACK_BUTTON, bounce_time=0.1)
next_button = Button(NEXT_BUTTON, bounce_time=0.1)
sel_button = Button(SEL_BUTTON, bounce_time=0.1)


def no_op():
    pass

# Resetowanie funkcji przycisków 
def reset_button_handlers():
    inc_button.when_pressed = no_op
    dec_button.when_pressed = no_op
    sel_button.when_pressed = no_op
    back_button.when_pressed = no_op
    next_button.when_pressed = no_op

# ============================ WPROWADZANIE TEKSTU ================================

# Funkcja do wyświetlania alfabetu i aktualnego tekstu
def display_interface(selected_index, text):
    """Funkcja do wyświetlania alfabetu z kursorem oraz wprowadzanego tekstu."""
    lcd.clear()
    # Wyświetl alfabet na pierwszej linii
    start_index = max(0, selected_index - 8)  # Przesuwanie widoku w lewo lub prawo
    end_index = start_index + 16
    line = ''.join(alphabet[start_index:end_index])
    lcd.write_string(line)
    
    # Dodanie kursora
    cursor_pos = selected_index - start_index
    if cursor_pos < 16:
        lcd.cursor_pos = (1, cursor_pos)
        lcd.write_string('^')
    
    # Wyświetl aktualny tekst na czwartej linii
    lcd.cursor_pos = (3, 0)
    lcd.write_string(f"Text: {text}")

# Funkcja do wprowadzania tekstu
def input_text():
    """Funkcja do wprowadzania tekstu na wyświetlaczu LCD."""
    text = ""  # Przechowuje wprowadzony tekst
    selected_char_index = 0  # Indeks wybranej litery

    def update_display():
        """Aktualizuje wyświetlacz LCD."""
        display_interface(selected_char_index, text)

    def next_char():
        """Zwiększa indeks litery."""
        nonlocal selected_char_index
        selected_char_index = (selected_char_index + 1) % len(alphabet)
        update_display()

    def prev_char():
        """Zmniejsza indeks litery."""
        nonlocal selected_char_index
        selected_char_index = (selected_char_index - 1) % len(alphabet)
        update_display()

    def select_char():
        """Dodaje wybraną literę do tekstu."""
        nonlocal text
        text += alphabet[selected_char_index]
        update_display()

    def delete_char():
        """Usuwa ostatnią literę z tekstu."""
        nonlocal text
        text = text[:-1]
        update_display()
        
    def back_to_main_menu():
        display_menu()
        
      
    # Przyciski do obsługi funkcji wprowadzania tekstu
    reset_button_handlers()
    inc_button.when_pressed = next_char
    dec_button.when_pressed = prev_char
    sel_button.when_pressed = select_char
    back_button.when_pressed = delete_char
    next_button.when_pressed = back_to_main_menu
    
    update_display()
    while True:
       
        sleep(0.1)  # Czekaj na naciśnięcia przycisków

# ============================ MENU GŁÓWNE ===================================
def display_menu():
    #reset_button_handlers()
    lcd.clear()
    lcd.cursor_pos = (3, 15)
    lcd.write_string(f"{current_menu_index}")
    lcd.cursor_pos = (0, 0)
    lcd.write_string("===== MENU =====")
    for i, item in enumerate(menu_items):
        lcd.cursor_pos = (i+1, 0 if i == current_menu_index else 3)
        lcd.write_string(f">> {item}" if i == current_menu_index else item)

  
def next_menu_item():
    global current_menu_index
    current_menu_index = (current_menu_index - 1) % len(menu_items)
    display_menu()
      
      
def previous_menu_item():
    global current_menu_index
    current_menu_index = (current_menu_index - 1) % len(menu_items)
    display_menu()


def select_menu_item():
    selected_option = menu_items[current_menu_index]
        
    if selected_option == "ZALOGUJ":
       lcd.clear()
       lcd.write_string(selected_option)
       sleep(2)
       
    elif selected_option == "DODAJ KARTE":
        lcd.clear()
        lcd.write_string(selected_option)
        input_text()

    elif selected_option == "EXPORT":
        lcd.clear()
        lcd.write_string(selected_option)
        sleep(2)
                
        display_menu()
  
  
    
# ============================ MENU GŁÓWNE - END ==============================    




# Deklaracja zmiennych 
menu_items = ["ZALOGUJ", "DODAJ KARTE", "EXPORT"]  # Opcje w menu

# Lista liter alfabetu do wyboru
alphabet = [chr(i) for i in range(65, 91)]+ [chr(i) for i in range(48, 58)]  # A-Z

current_menu_index = 0
mode = 0 # zmienna kontrolująca gdzie jesteśmy w programie 

# Przyciski do obsługi funkcji MENU GŁÓWNEGO
inc_button.when_pressed = next_menu_item      
dec_button.when_pressed = previous_menu_item  
sel_button.when_pressed = select_menu_item    



    
    

# Główna pętla programu
try:
    display_menu()
    while True:
        
        sleep(0.1)
except KeyboardInterrupt:
    lcd.clear()
    GPIO.cleanup()










 

Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.