logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Arduino Uno R3, LCD 16x2 I2C, enkoder – jak zrobić przewijane menu do sterowania silnikiem?

Ardudidu 18 Mar 2023 02:57 459 3
REKLAMA
  • #1 20495137
    Ardudidu
    Poziom 2  
    Posty: 2
    Dzień dobry,
    Czy jest ktoś w stanie pomóc mi z projektem opartym na Arduino Uno R3, wywietlacz LCD (16x2x I2C) oraz enkoder obrotowy.

    Problem polega na tym, że nie potrafię stworzyć przewijanego MENU, jestem osoba początkującą, która mało w swoim życiu programowała, oczywiście "jakieś" podstawy teoretyczne posiadam niestety nie są one wystarczające.

    Opisując całą sprawę to aktualnie pracuję nad sterowaniem silnika krokowego i wymarzyłem sobie aby na wyświetlaczu przed rozpoczęciem pracy można było ustawić własnoręcznie parametry (np. chce aby wał silnika obracał się zawsze o 360 stopni ale co <<5 stopni>>), również chciałbym ustawić czas pomiędzy skokiem ( np.5 sekund).

    OPIS DZIAŁANIA PROGRAMU:
    1.Podłączam zasilanie, na wyświetlaczu pojawia się MENU GŁÓWNE,
    2.Obracając enkoder (prawo/lewo) jestem wstanie wybrać żądaną funkcję ,
    3.Przykładowo wybieram ( poprzez klikniecie przycisku wbudowanego w enkoder) zmiene wartości kąta,
    4.Przechodząc do zagnieżdżonego menu gdzie obracając enkoderem (zwiększam/ zmniejszam) wartość kąta,
    5.Zatwierdzam wartość ponownym użyciem przycisku enkodera,
    6.Wracam do głównego MENU.


    Pytanie więc brzmi jak wykorzystać enkoder aby sterować nim całym programem, domyślam się że mogę wykorzystać do tego case ale nie wiem jak to dokładnie zrobić.

    Jeśli jest ktoś, kto robił lub zna odpowiedź na problem opisany powyżej to Proszę o POMOC, siedzę kolejną noc nad tym zagadnieniem i nic nie mogę zdziałać tylko usuwam kolejne szkice w IDE. Również będę wdzięczny o jakieś linijki kodu lub poradniki.

    Dziękuje za Pomoc oraz za poświęcony czas.
  • REKLAMA
  • #2 20495813
    gulson
    Administrator Systemowy
    Posty: 29231
    Pomógł: 148
    Ocena: 5984
    Zobaczmy, jak sobie poradzi ElektrodaBot przynajmniej stworzy jakiś zalążek programu.

    @ElektrodaBot napisz program na Arduino Uno R3, wywietlacz LCD (16x2x I2C) oraz enkoder obrotowy. Enkoder steruje programem.
    OPIS DZIAŁANIA PROGRAMU:
    1.Po włączeniu na wyświetlaczu pojawia się MENU GŁÓWNE,
    2.Obracając enkoder (prawo/lewo) jestem wybieramy funkcję ,
    3.Przykładowo wybieram ( poprzez klikniecie przycisku wbudowanego w enkoder) zmiene wartości kąta,
    4.Przechodząc do zagnieżdżonego menu gdzie obracając enkoderem (zwiększam/ zmniejszam) wartość kąta,
    5.Zatwierdzam wartość ponownym użyciem przycisku enkodera,
    6.Wracam do głównego MENU.
  • REKLAMA
  • #3 20495817
    ElektrodaBot
    AI od OpenAI ChatGPT4
    Posty: 8726
    Pomógł: 349
    Ocena: 917
    gulson napisał:
    (...) isku wbudowanego w enkoder) zmiene wartości kąta,
    4.Przechodząc do zagnieżdżonego menu gdzie obracając enkoderem (zwiększam/ zmniejszam) wartość kąta,
    5.Zatwierdzam wartość ponownym użyciem przycisku enkodera,
    6.Wracam do głównego MENU.
    Oto przykładowy program na Arduino Uno R3, wykorzystujący enkoder obrotowy i wyświetlacz LCD (16x2x I2C):

    ```
    #include <LiquidCrystal_I2C.h>

    // Deklaracje pinów enkodera
    #define pinA 2
    #define pinB 3
    #define pinButton 4

    // Deklaracje zmiennych
    int currentSelection = 0;
    int angle = 0;
    bool buttonPressed = false;
    int prevPosition = 0;

    // Inicjalizacja wyświetlacza
    LiquidCrystal_I2C lcd(0x27, 16, 2);

    void setup() {
    // Inicjalizacja pinów enkodera
    pinMode(pinA, INPUT_PULLUP);
    pinMode(pinB, INPUT_PULLUP);
    pinMode(pinButton, INPUT_PULLUP);

    // Inicjalizacja wyświetlacza
    lcd.init();
    lcd.backlight();
    lcd.setCursor(0, 0);
    lcd.print("MENU GLOWNE");
    }

    void loop() {
    // Odczyt pozycji enkodera
    int position = readEncoder();

    // Odczyt stanu przycisku
    if (digitalRead(pinButton) == LOW) {
    buttonPressed = true;
    } else {
    buttonPressed = false;
    }

    // Wybór funkcji z menu głównego
    if (currentSelection == 0) {
    // Obracanie enkoderem zmienia wybór funkcji
    currentSelection += position;

    // Sprawdzenie, czy wybór przekracza zakres
    if (currentSelection > 1) {
    currentSelection = 1;
    } else if (currentSelection < 0) {
    currentSelection = 0;
    }

    // Wyświetlenie aktualnego wyboru
    lcd.setCursor(0, 1);
    if (currentSelection == 0) {
    lcd.print("> Zmiana kata ");
    } else {
    lcd.print("> Wyjscie ");
    }
    }

    // Zmiana wartości kąta
    if (currentSelection == 1) {
    // Wyjście z podmenu
    if (buttonPressed) {
    currentSelection = 0;
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("MENU GLOWNE");
    }
    } else if (currentSelection == 0) {
    // Obracanie enkoderem zmienia wartość kąta
    angle += position;

    // Wyświetlenie aktualnej wartości kąta
    lcd.setCursor(0, 1);
    lcd.print("Kat: ");
    lcd.print(angle);
    lcd.print(" ");

    // Zatwierdzenie wartości kąta
    if (buttonPressed) {
    lcd.setCursor(0, 1);
    lcd.print("Wartosc zatwierdzona ");
    delay(1000);
    lcd.setCursor(0, 1);
    lcd.print("Kat: ");
    lcd.print(angle);
    lcd.print(" ");
    }
    }
    }

    // Funkcja odczytująca pozycję enkodera
    int readEncoder() {
    int newPosition = 0;
    int delta = 0;

    // Odczyt stanu pinów enkodera
    boolean aState = digitalRead(pinA);
    boolean bState = digitalRead(pinB);

    // Sprawdzenie, czy wartośc pinu A uległa zmianie
    if (aState != (prevPosition & 0x01)) {
    // Zwiększenie wartości newPosition, jeśli pin A i B są w różnych stanach
    if (bState != aState) {
    newPosition++;
    } else {
    newPosition--;
    }
    }

    // Zapisanie stanu pinu A do prevPosition
    prevPosition = (prevPosition << 1) | aState;

    // Zwrócenie różnicy pozycji
    delta = newPosition - (newPosition & 0x01) / 2;
    return delta;
    }
    ```

    W tym przykładzie programu enkoder służy do wyboru funkcji z menu głównego oraz do zwiększania/ zmniejszania wartości kąta w podmenu. Przycisk enkodera służy do zatwierdzania wyboru funkcji oraz wartości kąta. Wyświetlacz LCD służy do wyświetlania aktualnego menu oraz wybranej wartości kąta.
    Możesz mnie wywołać w każdym temacie pisząc @ElektrodaBot. Zastrzeżenie: Niektóre odpowiedzi udzielone przez ElektrodaBota mogą być niedokładne. Elektroda nie ponosi odpowiedzialności za dokładność, rzetelność ani kompletność prezentowanych informacji. Wszystkie odpowiedzi ElektrodaBota powinny być zweryfikowane przez użytkownika. OpenAI może monitorować i zapisywać informacje wprowadzane po wywołaniu ElektrodaBota.
  • #4 20495820
    gulson
    Administrator Systemowy
    Posty: 29231
    Pomógł: 148
    Ocena: 5984
    Nie traktuj tego jak gotowca, nawet nie wiadomo, czy działa, po prostu pozwoli Ci poznać poszczególne funkcje.
REKLAMA