Forum: Mikrocontroller und Digitale Elektronik Arduiono TFTOuchpad von Adafruit


von Mirco (Gast)


Lesenswert?

Moin Leute,

ich habe mir das TFT Touchpad von Adafruit gekauft
http://www.adafruit.com/products/376

ich habe die Beispielprogramme schon hochgeladen und geteste, diese 
funktionieren auch soweit. Nun möchte ein Programm etwas abändern und 
zwar möchte ich auf dem Display ein Rechteck erzeugen, nachdem man auf 
das Rechteck gedrückt hat soll sich die Hintergrundfarbe des Displays 
ändern.  Auch diese kleine Herausforderung habe ich implementiert.

Leider ist mir aufgefallen, dass ich ein paar abweichungen bezüglich der 
Druckfläche habe. Das heißt, wenn ich ein wenig neben dem Rechteck 
drücke, ändert sich die Hintergrundfarbe trotzdem noch. Liegt dieser 
Fehler in der Genauigkeit des Display oder an meinem Programm. Mein Ziel 
ist es 2 Rechtecke zu erzeugen, die beim betätigen andere Verzweigungen 
aufrufen...

Ist rechteck 1 gedrückt, mache fall 1
ist rechteck 2 gedrückt, mache fall 2...

Im programm, habe ich extra die switch case anwesiung genommen, damit 
ich das Touchpad "entprellen" kann.
1
#define XMAX1 40
2
#define XMAX2 220
3
4
#define YMAX1 80
5
#define YMAX2 80
6
7
8
9
void setup(void) {
10
  Serial.begin(9600);
11
  Serial.println(F("TFT LCD test"));
12
  
13
  tft.reset();
14
  
15
#ifdef USE_ADAFRUIT_SHIELD_PINOUT
16
  Serial.println(F("Using Adafruit 2.8\" TFT Arduino Shield Pinout"));
17
#else
18
  Serial.println(F("Using Adafruit 2.8\" TFT Breakout Board Pinout"));
19
#endif
20
21
  tft.reset();
22
23
  uint16_t identifier = tft.readID();
24
25
  
26
  tft.begin(identifier);
27
  tft.setRotation(1);
28
  testText();
29
  
30
 //Programmcode wir nur einmal ausgeführt
31
}
32
33
void loop(void) 
34
{
35
  static unsigned char TFT_State=0;
36
37
  digitalWrite(13, HIGH);
38
  Point p = ts.getPoint();    //Widerstandswert lesen
39
  digitalWrite(13, LOW);
40
  pinMode(XM, OUTPUT);
41
  pinMode(YP, OUTPUT);
42
  // scale from 0->1023 to tft.width: The Raw ADC value has to be  converted to Pixel Co-ordinates. This is done with map function. This mapping changes for v0.9 and v1.0. The demo applications already takes care of this mapping. 
43
  p.x = map(p.x, TS_MINX, TS_MAXX, tft.width(), 0);  
44
  p.y = map(p.y, TS_MINY, TS_MAXY, tft.height(), 0); 
45
46
  static char ColorCounter=0;
47
  
48
  switch (TFT_State)
49
    {
50
      case 0:
51
        { 
52
         if (p.z > MINPRESSURE && p.z < MAXPRESSURE)
53
           TFT_State=10;
54
         break;
55
        } 
56
57
      case 10:
58
        {  //WEnn der WIderstand im Bereich des roten Kästchen ist dann...
59
if ( p.x > XMAX1 && p.x < XMAX1+BOXSIZE) {TFT_State=20; } //WEnn der WIderstand im Bereich des roten Kästchen ist dann...
60
         break;
61
        }
62
             
63
       case 20:
64
       {      //Warte bis losgelassen wurde
65
        if (!(p.y  > YMAX1 && p.y <YMAX1+BOXSIZE && p.x >XMAX1 && p.x<XMAX1+BOXSIZE)) { TFT_State=30; ColorCounter++;}
66
         break;
67
       }
68
       case 30: //Programmcode Hier
69
       {
70
          Serial.println(("Color: ")); Serial.println((int)(ColorCounter));
71
            
72
         if(ColorCounter==1)
73
          tft.fillScreen(MAGENTA);
74
         else if(ColorCounter==2)
75
          tft.fillScreen(WHITE);
76
         else if(ColorCounter==3)
77
          tft.fillScreen(BLACK);
78
         else if(ColorCounter==4)
79
          tft.fillScreen(GREEN);
80
         else if(ColorCounter==5)
81
         {
82
          tft.fillScreen(CYAN);
83
          ColorCounter=0;  
84
         }
85
         testText();
86
         TFT_State=0;
87
         
88
     break;
89
     
90
    }
91
  }
92
}
93
94
unsigned long testText() {
95
  
96
  
97
  tft.fillRect(XMAX1, YMAX1, BOXSIZE, BOXSIZE, BLUE); //querformat x,y
98
  tft.fillRect(XMAX2, YMAX2, BOXSIZE, BOXSIZE, RED); //querformat x,y
99
  
100
  unsigned long start = micros();
101
  tft.setCursor(0, 0);
102
   
103
  return micros() - start;
104
}

von Eumel (Gast)


Lesenswert?

59$ ? LOL
Die gibts bei ebay für höchstens 20.

von Mirco (Gast)


Lesenswert?

ich habe dafür auch keine 59$ bezahlt...

von Mirco (Gast)


Lesenswert?

kann mir keiner helfen...

von schwarzGast (Gast)


Lesenswert?

Zeige x und y auf dem Display an und vergleiche es mit der Position 
Deiner Box. Finger sind nicht ideal und Du wirst immer mehrere Pixel 
gleichzeitig drücken, die Frage ist, was die Auswertung daraus macht. 
Außerdem kann der Touch leicht versetzt aufgebracht sein, d.h. Du 
müsstest einen Offset bestimmen und herausrechnen. Dazu am besten einen 
definierten Punkt anzeigen, mit etwas Spitzem drücken (kleine 
Kontaktfläche, soll nicht die Oberfläche beschädigen) und die Position 
vergleichen. Du könntest dafür auch eine Kalibrierroutine schreiben und 
die Offset-Werte im EEPROM ablegen, aber das lohnt sich bei einem Stück 
nicht.

Sollte es daran nicht liegen, dann kannst Du mit der x- und y-Anzeige 
Deinen Code "debuggen", einfach die Switch-Cases mit den Werten von Hand 
durchrechnen. Oder einen Debugger benutzen, wenn das geht.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.