Display ILI9341 touchscreen con Arduino

Ciao!
oggi approfondirò l'utilizzo del display TFT 2.8", che abbiamo già visto in questo post, soffermandoci sull'uso della funzionalità touchscreen del display.








per utilizzare la funzionalità touchscreen del display, che è basata sul chip XPT2046, è necessario scaricare ed installare oltre alle librerie Adafruit ILI9341 e Adafruit GFX utilizzate per la visualizzazione, anche la libreria XPT2046_Touchscreen.


Lo schema di collegamento è più complesso rispetto al solito, lo trovate qui sotto:


Qui sotto invece trovate il codice, è derivato dall'esempio "onoffbutton" della libreria Adafruit ILI9341, ho poi fatto delle leggere modifiche per l'utilizzo con il chip touchscreen XPT2046


  1. //This example implements a simple sliding On/Off button. The example
  2. // demonstrates drawing and touch operations.
  3. //
  4. //Thanks to Adafruit forums member Asteroid for the original sketch!
  5. //
  6. #include
  7. #include
  8. #include
  9. #include
  10. #include
  11. // This is calibration data for the raw touch data to the screen coordinates
  12. #define TS_MINX 350
  13. #define TS_MINY 350
  14. #define TS_MAXX 3800
  15. #define TS_MAXY 4000
  16. #define TS_CS     D0
  17. #define TS_TIRQ   D1
  18. XPT2046_Touchscreen ts(TS_CS, TS_TIRQ);  // Param 2 - Touch IRQ Pin - interrupt enabled polling
  19. #define TFT_CS    D8
  20. #define TFT_DC    D4
  21. Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC);
  22. boolean RecordOn = false;
  23. #define FRAME_X 210
  24. #define FRAME_Y 180
  25. #define FRAME_W 100
  26. #define FRAME_H 50
  27. #define REDBUTTON_X FRAME_X
  28. #define REDBUTTON_Y FRAME_Y
  29. #define REDBUTTON_W (FRAME_W/2)
  30. #define REDBUTTON_H FRAME_H
  31. #define GREENBUTTON_X (REDBUTTON_X + REDBUTTON_W)
  32. #define GREENBUTTON_Y FRAME_Y
  33. #define GREENBUTTON_W (FRAME_W/2)
  34. #define GREENBUTTON_H FRAME_H
  35. void drawFrame()
  36. {
  37.   tft.drawRect(FRAME_X, FRAME_Y, FRAME_W, FRAME_H, ILI9341_BLACK);
  38. }
  39. void redBtn()
  40. {
  41.   tft.fillRect(REDBUTTON_X, REDBUTTON_Y, REDBUTTON_W, REDBUTTON_H, ILI9341_RED);
  42.   tft.fillRect(GREENBUTTON_X, GREENBUTTON_Y, GREENBUTTON_W, GREENBUTTON_H, ILI9341_BLUE);
  43.   drawFrame();
  44.   tft.setCursor(GREENBUTTON_X + 6 , GREENBUTTON_Y + (GREENBUTTON_H / 2));
  45.   tft.setTextColor(ILI9341_WHITE);
  46.   tft.setTextSize(2);
  47.   tft.println("ON");
  48.   RecordOn = false;
  49. }
  50. void greenBtn()
  51. {
  52.   tft.fillRect(GREENBUTTON_X, GREENBUTTON_Y, GREENBUTTON_W, GREENBUTTON_H, ILI9341_GREEN);
  53.   tft.fillRect(REDBUTTON_X, REDBUTTON_Y, REDBUTTON_W, REDBUTTON_H, ILI9341_BLUE);
  54.   drawFrame();
  55.   tft.setCursor(REDBUTTON_X + 6 , REDBUTTON_Y + (REDBUTTON_H / 2));
  56.   tft.setTextColor(ILI9341_WHITE);
  57.   tft.setTextSize(2);
  58.   tft.println("OFF");
  59.   RecordOn = true;
  60. }
  61. void setup(void)
  62. {
  63.   Serial.begin(9600);
  64.   tft.begin();
  65.   ts.setRotation(2);
  66.   if (!ts.begin()) {
  67.     Serial.println("Unable to start touchscreen.");
  68.   }
  69.   else {
  70.     Serial.println("Touchscreen started.");
  71.   }
  72.   tft.fillScreen(ILI9341_BLUE);
  73.   // origin = left,top landscape (USB left upper)
  74.   tft.setRotation(1);
  75.   redBtn();
  76. }
  77. void loop()
  78. {
  79.   // See if there's any  touch data for us
  80.   if (!ts.bufferEmpty())
  81.   {
  82.     // Retrieve a point
  83.     TS_Point p = ts.getPoint();
  84.     Serial.print("x = ");
  85.     Serial.print(p.x);
  86.     Serial.print(", y = ");
  87.     Serial.print(p.y);
  88.     delay(30);
  89.     Serial.println();
  90.     // Scale using the calibration #'s
  91.     // and rotate coordinate system
  92.     p.x = map(p.x, TS_MINY, TS_MAXY, 0, tft.height());
  93.     p.y = map(p.y, TS_MINX, TS_MAXX, 0, tft.width());
  94.     int y = tft.height() - p.x;
  95.     int x = p.y;
  96.     if (RecordOn)
  97.     {
  98.       if ((> REDBUTTON_X) && (< (REDBUTTON_X + REDBUTTON_W))) {
  99.         if ((> REDBUTTON_Y) && (<= (REDBUTTON_Y + REDBUTTON_H))) {
  100.           Serial.println("Red btn hit");
  101.           redBtn();
  102.         }
  103.       }
  104.     }
  105.     else //Record is off (RecordOn == false)
  106.     {
  107.       if ((> GREENBUTTON_X) && (< (GREENBUTTON_X + GREENBUTTON_W))) {
  108.         if ((> GREENBUTTON_Y) && (<= (GREENBUTTON_Y + GREENBUTTON_H))) {
  109.           Serial.println("Green btn hit");
  110.           greenBtn();
  111.         }
  112.       }
  113.     }
  114.     Serial.println(RecordOn);
  115.   }
  116. }

Questo è tutto!
per qualsiasi domanda lascia pure un commento, risponderò appena possibile.

Seguimi sulle mie pagine per rimanere sempre aggiornato sui nuovi post!

Nessun commento:

Posta un commento

Lascia un commento qui sotto, ti risponderò il prima possibile!

Altri Post