Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[ATMEGA][BASCOM] Rezystancyjny panel dotykowy - scroll

adambehnke 06 Lip 2010 23:47 2842 6
  • #1 06 Lip 2010 23:47
    adambehnke
    Poziom 24  

    Witam

    Posiadam w swoich urządzeniach graficzne lcd wraz z dotykowymi panelami rezystancyjnymi. Mam dość rozbudowane menu i potrzebuję takiej funkcji na styl I-Phone -wybierania listy kontaktów , czyli przesuwam palcem w dół po ekranie i lista kontaktów także przesuwa się. Chodzi mi o samo rozpoznanie w którym kierunku przesuwam palcem po ekranie. Generalnie muszę rozpoznać cztery główne kierunki. Jak wiadomo kiedy dotykam ekranu to współrzędne X i Y przyjmują określone wartości jak np: X=100 Y=150. Teraz muszę rozpoznać przesuwanie palcem w 4 kierunkach czyli będę potrzebował jeszcze 4 dodatkowe zmienne jak G ,D,L,P analogicznie g-góra itd.
    Sama zrobienie tzw. scrolowanego menu nie jest problemem. Ale brak mi pomysłu na rozpoznanie kierunku. Oczywiście rozpoznanie kierunku następowało by po określonej długości przesuwania palcem po ekranie a także po czasie przesuwanie tak aby zlikwidować pomyłki w rozpoznawaniu. Samo pole przesuwania będzie miało minimalne wymiary 3*1 cm ale zapewne zrobię większe.

    Przyjmę każdą sugestię wykonania takiego "cudaka" , gdyż męczę się już któryś dzień i słabo to mi wychodzi.

    0 6
  • #2 07 Lip 2010 00:52
    blue_17
    Poziom 32  

    A gdyby śledzić jak rosną wartości współrzędnych :?:

    0
  • #3 07 Lip 2010 08:41
    m.bartczak
    Poziom 16  

    Witam

    Ja bym napisał następujący algorytm (pseudokod, nie znam bascoma ;)):

    Code:

    ; Inicjalizacja zmiennych
    XAct = -1;
    YAct = 0;
    XLast = -1;
    YLast = 0;


    ; Poniższa procedura na przerwaniach:
    interrupt:
       XAct, YAct = odczyt_panelu(); // Zakładam że X=-1 gdy panel nie jest dotknięty
       if(XAct==-1)
       {
          XLast = -1;
       } else {
          if(XLast!=-1)
          {
             XLast = XAct;
             YLast = YAct;
          }
       }
       ret;

    ; Sprawdzanie przeciągnięcia palcem, dragX i dragY zwracają odpowiednie wartości, 0 gdy nie ma przesunięcia
    get_dragged:
       dragX = 0;
       dragY = 0;

       if((XLast!=-1) && (XAct!=-1))
       {
          dragX = XLast-XAct;
          dragY = YLast-YAct;
       }
       ret dragX, dragY;

    0
  • #4 07 Lip 2010 22:25
    adambehnke
    Poziom 24  

    Już wiem jak to zrobię. Zatem:

    Stworzę na LCD pasek po którym będę przesuwał palcem. Owy pasek podzielę na kilkanaście mniejszych obszarów i podczas przeciągania palcem będę przeskakiwał z obszaru na obszar i tym samym będę wiedział który obszar został dotknięty po którym. Według mnie to chyba najprostsza metoda która w prosty sposób pokaże mi kierunek przesuwu. Może nie doskonała ale powinna działać jak trzeba.

    0
  • Pomocny post
    #5 07 Lip 2010 22:41
    m.bartczak
    Poziom 16  

    A mój pomysł nie pomógł? W wyniku tego kodu powinieneś mieć informację o kierunku i odległości przeciągnięcia palcem po ekranie...

    0
  • #6 07 Lip 2010 23:02
    adambehnke
    Poziom 24  

    Przyznam że nie za bardzo rozumiem ten przykład :P Widzę że zapamiętujesz pozycję i podczas dotykania jeśli pozycja uległa zmianie to zostaje dodana lub odjęta od ostatniej pozycji. W ten sposób można by stwierdzić rzeczywiście i kierunek i odległość. W sumie w dużo prostszy sposób niż mój. Będę to musiał jutro przełożyć na bascom i przetestować.

    Chyba że źle zrozumiałem twój przykład to mnie proszę popraw.

    0
  • Pomocny post
    #7 08 Lip 2010 15:11
    m.bartczak
    Poziom 16  

    Dobrze zrozumiałeś :) Zapamiętuje pierwsze dotknięcie ekranu a potem porównuję położenie palca wobec tego pierwszego punktu.

    W momencie podniesienia palca, kasuję zapamiętany punkt dotknięcia.

    0