INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
TFT-Touchscreen - Slideshow stoppen
05.11.2020, 07:41
Beitrag #1
TFT-Touchscreen - Slideshow stoppen
Hallo Gemeinde,

ich habe ein 3,5inch Touchscreen von QooTec mit einem Sketch der BMP-Dateien in einer festgelegten Reihenfolge in einer Endlosschleife abspielt. Was ich möchte, ist dass ich diese Schleife an einer x-beliebigen Stelle anhalten kann. Das würde ich am liebsten per Taster machen, die Touchscreen-Funktion wird eigentlich nicht gebraucht.

Leider überschreitet dieser Sketch meine bescheidenen Arduino-Kenntnisse, so dass ich nicht weiß wie und wo ich ansetzen soll. Am Ende des Sketch befindet sich eine delay-Anweisung, deren Sinn sich mir nicht erschließt. Entferne ich sie, stelle ich keinen spürbaren Unterschied fest. Klar ist mir, dass ein delay dazu führt dass ein externer Hardwarebefehl nicht erkannt wird.

Dann noch eine letzte Frage: sind diese Displays von Haus aus langsam in der Darstellung? Im Sketch finde ich keine Möglichkeit eine Zeit einzustellen.

Ich möchte jetzt keinen fertigen Code, sondern nur einen Hinweis ob ein Stop möglich ist, und mit welcher Idee sich dieser umsetzen lässt. Mir ist auch klar dass Nextion-Displays besser sind, aber dieses Display gehört nun einmal zum Auftrag.

Code:
#include <SD.h>
#include <SPI.h>
#include <LCDWIKI_GUI.h> //Core graphics library
#include <LCDWIKI_KBV.h> //Hardware-specific library

//if the IC model is known or the modules is unreadable,you can use this constructed function
LCDWIKI_KBV my_lcd(ILI9486,A3,A2,A1,A0,A4); //model,cs,cd,wr,rd,reset
//if the IC model is not known and the modules is readable,you can use this constructed function
//LCDWIKI_KBV my_lcd(320,480,A3,A2,A1,A0,A4);//width,height,cs,cd,wr,rd,reset

#define  BLACK   0x0000
#define BLUE    0x001F
#define RED     0xF800
#define GREEN   0x07E0
#define CYAN    0x07FF
#define MAGENTA 0xF81F
#define YELLOW  0xFFE0
#define WHITE   0xFFFF

#define PIXEL_NUMBER  (my_lcd.Get_Display_Width()/4)
#define FILE_NUMBER 4
#define FILE_NAME_SIZE_MAX 20

uint32_t bmp_offset = 0;
uint16_t s_width = my_lcd.Get_Display_Width();  
uint16_t s_heigh = my_lcd.Get_Display_Height();
//int16_t PIXEL_NUMBER;

char file_name[FILE_NUMBER][FILE_NAME_SIZE_MAX];

uint16_t read_16(File fp)
{
    uint8_t low;
    uint16_t high;
    low = fp.read();
    high = fp.read();
    return (high<<8)|low;
}

uint32_t read_32(File fp)
{
    uint16_t low;
    uint32_t high;
    low = read_16(fp);
    high = read_16(fp);
    return (high<<8)|low;  
}

bool analysis_bpm_header(File fp)
{
    if(read_16(fp) != 0x4D42)
    {
      return false;  
    }
    //get bpm size
    read_32(fp);
    //get creator information
    read_32(fp);
    //get offset information
    bmp_offset = read_32(fp);
    //get DIB infomation
    read_32(fp);
    //get width and heigh information
    uint32_t bpm_width = read_32(fp);
    uint32_t bpm_heigh = read_32(fp);
    if((bpm_width != s_width) || (bpm_heigh != s_heigh))
    {
      return false;
    }
    if(read_16(fp) != 1)
    {
        return false;
    }
    read_16(fp);
    if(read_32(fp) != 0)
    {
      return false;
     }
     return true;
}

void draw_bmp_picture(File fp)
{
  uint16_t i,j,k,l,m=0;
  uint8_t bpm_data[PIXEL_NUMBER*3] = {0};
  uint16_t bpm_color[PIXEL_NUMBER];
  fp.seek(bmp_offset);
  for(i = 0;i < s_heigh;i++)
  {
    for(j = 0;j<s_width/PIXEL_NUMBER;j++)
    {
      m = 0;
      fp.read(bpm_data,PIXEL_NUMBER*3);
      for(k = 0;k<PIXEL_NUMBER;k++)
      {
        bpm_color[k]= my_lcd.Color_To_565(bpm_data[m+2], bpm_data[m+1], bpm_data[m+0]); //change to 565
        m +=3;
      }
      for(l = 0;l<PIXEL_NUMBER;l++)
      {
        my_lcd.Set_Draw_color(bpm_color[l]);
        my_lcd.Draw_Pixel(j*PIXEL_NUMBER+l,i);
      }    
     }
   }    
}

void setup()
{
    Serial.begin(9600);
   my_lcd.Init_LCD();
   Serial.println(my_lcd.Read_ID(), HEX);
   my_lcd.Fill_Screen(BLUE);
   //s_width = my_lcd.Get_Display_Width();  
   //s_heigh = my_lcd.Get_Display_Height();
   //PIXEL_NUMBER = my_lcd.Get_Display_Width()/4;
   if(PIXEL_NUMBER == 60) //240*320
   {
       strcpy(file_name[0],"tulip.bmp");
       strcpy(file_name[1],"game.bmp");
       strcpy(file_name[2],"tree.bmp");
       strcpy(file_name[3],"flower.bmp");
   }
   else //320*480
   {
       strcpy(file_name[0],"01.bmp");
       strcpy(file_name[1],"02.bmp");
       strcpy(file_name[2],"03.bmp");
       strcpy(file_name[3],"04.bmp");
   }
  //Init SD_Card
   pinMode(10, OUTPUT);
  
    if (!SD.begin(10))
    {
      my_lcd.Set_Text_Back_colour(BLUE);
      my_lcd.Set_Text_colour(WHITE);    
      my_lcd.Set_Text_Size(1);
      my_lcd.Print_String("SD Card Init fail!",0,0);
    }
}

void loop()
{
    int i = 0;
    File bmp_file;
    for(i = 0;i<FILE_NUMBER;i++)
    {
       bmp_file = SD.open(file_name[i]);
       if(!bmp_file)
       {
            my_lcd.Set_Text_Back_colour(BLUE);
            my_lcd.Set_Text_colour(WHITE);    
            my_lcd.Set_Text_Size(1);
            my_lcd.Print_String("didnt find BMPimage!",0,10);
            while(1);
        }
        if(!analysis_bpm_header(bmp_file))
        {  
            my_lcd.Set_Text_Back_colour(BLUE);
            my_lcd.Set_Text_colour(WHITE);    
            my_lcd.Set_Text_Size(1);
            my_lcd.Print_String("bad bmp picture!",0,0);
            return;
        }
          draw_bmp_picture(bmp_file);
         bmp_file.close();
         delay(2000);
     }
}

Abschließend möchte ich noch anmerken: ich habe mich bereits viele Stunden mit diesem Sketch (der als Beispiel mit dem Display mitgeliefert wird) beschäftigt. Das ist der erste Sketch mit einem Display. Normalerweise erstelle ich kleine Sachen für den Modellbau. Dieser Sketch stellt für mich eine neue Dimension dar.
Vielen Dank für Eure Hilfe.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
05.11.2020, 10:01
Beitrag #2
RE: TFT-Touchscreen - Slideshow stoppen
Solange Du delay für die Pausen benutzt, wird sich das nicht ändern.
Schaue Dir das Beispiel BlinkWithoutDelay in der IDE an und verstehe es.
Dann kannst Du die Zeitsteuerung auf nicht blockierend umstellen und damit Deinen Eingang abfragen.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
05.11.2020, 10:27
Beitrag #3
RE: TFT-Touchscreen - Slideshow stoppen
(05.11.2020 10:01)Tommy56 schrieb:  Solange Du delay für die Pausen benutzt, wird sich das nicht ändern.
Schaue Dir das Beispiel BlinkWithoutDelay in der IDE an und verstehe es.
Dann kannst Du die Zeitsteuerung auf nicht blockierend umstellen und damit Deinen Eingang abfragen.

Gruß Tommy

Hallo Tommy,

das hatte ich ja geschrieben dass ich weiß dass das Delay eine Eingabe verhindert. In dem mittlerweile bearbeiteten Sketch habe ich das Delay bereits herausgenommen. Meine Frage ging ja dahin, ob mir jemand eine Idee gaben kann, wie ich den Stop realisiere. Ursprünglich wollte ich die Bilder per Touchscreen durchwischen, habe die Idee aber aufgegeben.

Gruß
Armin
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
05.11.2020, 10:41
Beitrag #4
RE: TFT-Touchscreen - Slideshow stoppen
Dann solltest Du auch den aktuellen Sketch einstellen und nich einen, der schon veraltet ist. Sowas bremst die Hilfsbereitschaft stark aus.

Du merkst Dir den Zustand läuft/lauft nicht in einer globalen Variable, die Du mit einem Taster umschaltest. Suchwort toggle bringt z.B. dieses.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
05.11.2020, 10:47
Beitrag #5
RE: TFT-Touchscreen - Slideshow stoppen
(05.11.2020 10:41)Tommy56 schrieb:  Dann solltest Du auch den aktuellen Sketch einstellen und nich einen, der schon veraltet ist. Sowas bremst die Hilfsbereitschaft stark aus.

Du merkst Dir den Zustand läuft/lauft nicht in einer globalen Variable, die Du mit einem Taster umschaltest. Suchwort toggle bringt z.B. dieses.

Gruß Tommy

Den habe ich mittlerweile so "verwurstet, dass er beim prüfen schon Fehler meldet.
Aber gut, scheinbar ist die Sache doch komplizierter als ich dachte.

Danke und Gruß
Armin
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Auf oder Abzählen stoppen Lampe 11 1.182 07.04.2020 19:38
Letzter Beitrag: Tommy56
  Loop-Teil mit Interrupt für bestimmte Zeit stoppen Alter Fritz 11 1.851 23.12.2019 23:10
Letzter Beitrag: hotsystems
  LEDs mit Touchscreen steuern Mr_Martin 5 1.418 08.09.2019 22:55
Letzter Beitrag: georg01
  2,8" Touchscreen Display Shield - so gehts avoid 4 5.275 09.07.2018 11:15
Letzter Beitrag: Harry Hirsch
  Touchscreen Problematik ElAleMaNo 7 2.830 25.09.2017 18:23
Letzter Beitrag: SkobyMobil
  Countdown - Werte ändern am Touchscreen ElAleMaNo 2 1.952 04.07.2017 18:43
Letzter Beitrag: Tommy56
  Adafruit 2.8" Color TFT Touchscreen mittlig1977 3 2.681 14.10.2016 22:23
Letzter Beitrag: Tommy56
  Servo soll nur in Ruhelage stoppen Sven1996 1 1.906 19.08.2016 14:37
Letzter Beitrag: StephanBuerger
  3,2 zoll Touchscreen Kalibrierungsproblem ElAleMaNo 9 3.586 10.04.2016 20:06
Letzter Beitrag: rkuehle
  Touchscreen - Problem mit den Buttons Kücki 11 8.177 16.02.2014 01:18
Letzter Beitrag: Kücki

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste