Arduino Polska Forum

Pełna wersja: Problem z ekranem dotykowym
Aktualnie przeglądasz uproszczoną wersję forum. Kliknij tutaj, by zobaczyć wersję z pełnym formatowaniem.
Witam Wszystkich.

Mam problem z wyświetlaczem dotykowym tft 2,8" z SD SPI na ST7789, sterowny jest ESP32 WROOM 32.
Mianowicie chodzi o to że po uruchomieniu wyświetlają się 2 przyciski (powiedzmy 1 i 2). Po wejściu w np. "1" są kolejne 3 przyciski do ustawień przekaźników. Problem w tym że po wciśnięciu ekranu w miejscu przycisku 1 on dalej tam jest a nie powinien. Niestety tft.fillScreen() zamalowuje tylko ekran a nie czyści "bufora? współrzędnych?". Nie mam pojęcia jak sobie z tym poradzić. 

Druga sprawa to przerwania tegoż ekranu/dotyku. nie wiem jak napisać tą funkcję.

biblioteki użyte:

#include <FS.h>
#include "FS.h"
#include "Free_Fonts.h"  // Include the header file attached to this sketch
#include "eeprom.h"
#include "grafika.h"
#include <TFT_eSPI.h> 
#include <SPI.h>
#include <Wire.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <WiFiMulti.h>
#include <stdint.h>
#include <SD.h>
#include <DS1302.h>
#include <Timers.h>
#include <HX711_ADC.h>
#include <Stepper.h>  //krokowy
#include <PCF8575.h>
#include <Adafruit_GFX.h>
#include <TouchScreen.h>


podłączenie pinów SPI:

#define TFT_MISO 19
#define TFT_MOSI 23
#define TFT_SCLK 18
#define TFT_CS  15   
#define TFT_DC    2   
#define TFT_RST  4  
#define TOUCH_CS 5   


Pin TFT_CS oraz TOUCH_CS ustawione na HIGH


Kod:
void loop() {


  //uruchomienie akcja.attach
  akcja.process();

  // Pobierz dane z DS1302
  t = rtc.getTime();

 
  uint16_t t_x = 0, t_y = 0;              // współrzędne pulsacji
  bool pressed = tft.getTouch(&t_x, &t_y);  // prawda po naciśnięciu


  // Sprawdź, czy kliknąłeś obszar przycisku
  for (uint8_t b = 0; b < totalButtonNumber; b++) {
    if (pressed && key[b].contains(t_x, t_y)) {
      key[b].press(true);
      Serial.print(t_x);
      Serial.print(",");
      Serial.println(t_y);
    } else {
      key[b].press(false);
    }
  }


  // Akcja po naciśnięciu przycisku
  for (uint8_t b = 0; b < totalButtonNumber; b++) {

    if (key[b].justReleased()) {
      key[b].drawButton();  // przerysuj po wydaniu

      switch (b) {
        case 0:
          //ekran1
          break;
        case 1:
          //ekran2
          break;
        case 2:
          //ekran3
          break;
        case 3:
          //ekran4
          break;
        case 4:
          //
          break;
        case 5:
          //
          break;
        case 6:
          //
          break;
        case 7:
          //
          break;
        case 8:
          //
          break;
        default:
          delay(1);
          // sprawozdania
          return;
      }
    }
    if (key[b].justPressed()) {
      key[b].drawButton(true);  // zmienia kolor przycisku po naciśnięciu
      delay(10);                // Odrzucanie interfejsu użytkownika
    }
  }
}
Niestety projekt zbyt unikatowy sprzętowo by go odtworzyć i coś w nim grzebać. Ale od razu widać, że w ogóle nie starasz się zarządzać czasem w programie, próbując w każdym obiegu loop pytać o czas z RTC.
Do napisania funkcji obsługi przerwania wybierasz pin IRQ z TFT i pod ten pin od strony IO ESP32 piszesz funkcję, wpisz w Google pytanie i masz przykład https://www.upesy.com/blogs/tutorials/wh...duino-code
Kod:
void IRAM_ATTR function_ISR() {
  // Function code
}

void setup() {
  Serial.begin(115200);
  pinMode(23, INPUT_PULLUP);
  attachInterrupt(23, function_ISR, FALLING);
}

void loop() {
}
 Zdziwiłbym się, gdyby biblioteka nie miała odpowiednich opcji, więc może po prostu wystarczy jej podać odpowiednie parametry. Przykład jest dla przypadku, gdy IRQ wywołuje stan niski.
(19-01-2024, 16:20)kaczakat napisał(a): [ -> ]Niestety projekt zbyt unikatowy sprzętowo by go odtworzyć i coś w nim grzebać. Ale od razu widać, że w ogóle nie starasz się zarządzać czasem w programie, próbując w każdym obiegu loop pytać o czas z RTC.
Do napisania funkcji obsługi przerwania wybierasz pin IRQ z TFT i pod ten pin od strony IO ESP32 piszesz funkcję, wpisz w Google pytanie i masz przykład https://www.upesy.com/blogs/tutorials/wh...duino-code
Kod:
void IRAM_ATTR function_ISR() {
  // Function code
}

void setup() {
  Serial.begin(115200);
  pinMode(23, INPUT_PULLUP);
  attachInterrupt(23, function_ISR, FALLING);
}

void loop() {
}
 Zdziwiłbym się, gdyby biblioteka nie miała odpowiednich opcji, więc może po prostu wystarczy jej podać odpowiednie parametry. Przykład jest dla przypadku, gdy IRQ wywołuje stan niski.
Pin IRQ z TFT podłączyłem pod pin 36, inne mam już zajęte a na PCF8575 nie będzie i tak działał prawidłowo. Po odczytaniu stanu pinu wychodzi zawsze "1" po naciśnięciu jest zmiana na "0". Przerwanie chciałem zrobić na przykładzie podanym przez Ciebie w linku lecz po różnych kombinacjach zawsze po wgraniu do esp niestety sie resetuje w kółko. 
Kod:
void IRAM_ATTR tft_irq_isr(void) {
}
Jedynie oś takiego nie powoduje resetu. 
Kod:
pinMode(TFT_IRQ_PIN, INPUT);     //pin TFT_irq przerwania
tak jest ustawiony pin 36
Kod:
attachInterrupt(TFT_IRQ_PIN, tft_irq_isr, FALLING);
i przerwanie w void setup