Forum: Mikrocontroller und Digitale Elektronik Frage zum Display neu laden


von Sebastian (Gast)


Lesenswert?

Hallo ich habe vor ein paar Tagen mit einem Uno angefangen zu 
programmieren. Wahrscheinlich ist mein Programm in euren Augen totaler 
Mist aber ich weiß es halt nicht besser.

Ich habe außerhalb meines Loops 4 Funktionen geschrieben die eigentlich 
bis jetzt nur das Design auf meinem Touchscreen darstellen. Ich habe 
einen HomeScreen und 4 Untermenüs. Das hin und her schalten zwischen den 
Menüs klappt auch. In meinem loop gucke ich aktuell nur ob eine Eingabe 
erfolgt ist und wenn ja dann mache ich das mit zich If schleifen welcher 
Taster gedrückt worden ist. Jetzt habe ich aber in einer If Schleife 
folgendes stehen

if (p.x > -5 && p.x < 45) {  //Wird überprüft ob der Button Temp - 
gedrückt     if (p.y > 117 && p.y < 155) {
if(site==1){
tempbutton--;
}}}

Der Wert von tempbutton ändert sich natürlich auch aber auf meinem 
Display natürlich nicht weil die Funktion Temperatur wird ja nicht mehr 
aufgerufen im loop. Dann dachte ich eben das ich in die If schleife 
einfach noch Temperatur(); einfuge so das der Code wieder ausgeführt 
wird und der Wert tempbutton in der Funktion Temperatur dargestellt 
wird. Das klappt auch aber bei jedem Betätigen der Temperatür Buttons 
Flackert einmal das Bild. Das will ich natürlich nicht. Wie muss ich da 
jetzt vorgehen? Sorry wahrscheinlich ist das für Euch Kinderkram aber 
ich mach das esrt seit ein paar Tagen

von Stefan F. (Gast)


Lesenswert?

Sebastian schrieb:
> Wahrscheinlich ist mein Programm in euren Augen totaler
> Mist aber ich weiß es halt nicht besser.

Schwer zu sagen, du hast vergessen, es anzuhängen.

Meinst du, der Typ des Displays ist völlig egal und dass man daher auch 
keinen Schaltplan braucht?

von Sebastian (Gast)


Lesenswert?

#include <stdint.h>
#include "TouchScreen.h"
#include <Adafruit_GFX.h>    // Core graphics library
#include <Adafruit_TFTLCD.h> // Hardware-specific library
#define LCD_CS A3 // Chip Select goes to Analog 3
#define LCD_CD A2 // Command/Data goes to Analog 2
#define LCD_WR A1 // LCD Write goes to Analog 1
#define LCD_RD A0 // LCD Read goes to Analog 0
#define LCD_RESET A4 // Can alternately just connect to Arduino's reset 
pin

// Colors LCD
#define  BLACK   0x0000
#define BLUE    0x001F
#define RED     0xF800
#define GREEN   0x152C
#define CYAN    0x07FF
#define MAGENTA 0xF81F
#define YELLOW  0xFFE0
#define WHITE   0xFFFF

Adafruit_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET);

#define YP A2  // must be an analog pin, use "An" notation!
#define XM A3  // must be an analog pin, use "An" notation!
#define YM 8   // can be a digital pin
#define XP 9   // can be a digital pin
#define BOXSIZE 40
#define PENRADIUS 3
#define TS_MINX 940
#define TS_MINY 160
#define TS_MAXX 160
#define TS_MAXY 970
#define MINPRESSURE 10
#define MAXPRESSURE 1000
TouchScreen ts = TouchScreen(XP, YP, XM, YM, 300);

//Globale Variabeln
bool change = 0;
bool touch = 0;
bool site=0;
int tempbutton=30;
unsigned long starttime=0;
void setup() {
  Serial.begin(9600);
  tft.reset();
  uint16_t identifier = tft.readID();
  if(identifier == 0x9325) {
    Serial.println(F("Found ILI9325 LCD driver"));
  } else if(identifier == 0x9328) {
    Serial.println(F("Found ILI9328 LCD driver"));
  } else if(identifier == 0x7575) {
    Serial.println(F("Found HX8347G LCD driver"));
  } else if(identifier == 0x9341) {
    Serial.println(F("Found ILI9341 LCD driver"));
  } else if(identifier == 0x8357) {
    Serial.println(F("Found HX8357D LCD driver"));
  } else {
    Serial.print(F("Unknown LCD driver chip: "));
    Serial.println(identifier, HEX);
    Serial.println(F("If using the Adafruit 2.8\" TFT Arduino shield, 
the line:"));
    Serial.println(F("  #define USE_ADAFRUIT_SHIELD_PINOUT"));
    Serial.println(F("should appear in the library header 
(Adafruit_TFT.h)."));
    Serial.println(F("If using the breakout board, it should NOT be 
#defined!"));
    Serial.println(F("Also if using the breakout, double-check that all 
wiring"));
    Serial.println(F("matches the tutorial."));
    return;
  }
  tft.begin(identifier);
  HomeScreen();//HomeScreen wird geladen

}

void loop() {



  TSPoint p = ts.getPoint();
  pinMode(XM, OUTPUT);            //Touchscreen wird gelesen und auf dem 
Serialmonitor ausgegeben
  pinMode(YP, OUTPUT);
  if (p.z > MINPRESSURE && p.z < MAXPRESSURE) {
    p.x = map(p.x, TS_MINX, TS_MAXX, tft.width(), 0);
    p.y = map(p.y, TS_MINY, TS_MAXY, tft.height(), 0);
    Serial.print("("); Serial.print(p.x);
    Serial.print(", "); Serial.print(p.y);
    Serial.println(")");

    if (p.x > 52 && p.x < 274) {       //Wird überprüft ob der Button 
Maische gedrückt worden ist
      if (p.y > 64 && p.y < 90) {
        if(site==0){
        Maischen();
      }}
    }
    if (p.x > 52 && p.x < 274) {        //Wird überprüft ob der Button 
Rast.1 gedrückt worden ist
      if (p.y > 115 && p.y < 145) {
         if(site==0){
        Rast1();
      }
      }
    }
    if (p.x > 52 && p.x < 274) {         //Wird überprüft ob der Button 
Rast.2 gedrückt worden ist
      if (p.y > 163 && p.y < 190) {

        if(site==0){
         Rast2();
      }
      }
    }
    if (p.x > 52 && p.x < 274) {         //Wird überprüft ob der Button 
Abmaischen gedrückt worden ist
      if (p.y > 211 && p.y < 240) {

        if(site==0){
        Abmaischen();
      }
      }
    }

    if (p.x > -5 && p.x < 45) {         //Wird überprüft ob der Button 
Temp - gedrückt worden ist
    if (p.y > 117 && p.y < 155) {
    if(site==1){
        tempbutton--;
          Maischen();


      }
      }
    }
    if (p.x > 286 && p.x < 326) {       //Wird überprüft ob der Button 
Temp - gedrückt worden ist
    if (p.y > 118 && p.y < 159) {
    if(site==1){
        tempbutton++;


      }
      }
    }
       if (p.x > 0 && p.x < 55) {     //Wird überprüft ob der Button 
Back gedrückt worden ist
      if (p.y > 25 && p.y < 70) {
       if (site==1){
        HomeScreen();
      }}
    }
  }
}

void HomeScreen ()
{ site=0;
  tft.setRotation(1);
  tft.fillScreen(BLACK);
  tft.drawRoundRect(0, 0, 319, 240, 8, WHITE);     //Page border
  tft.setCursor(20, 10);
  tft.setTextColor(WHITE);
  tft.setTextSize(3);
  tft.println("BRAUMEISTER V1.0");
  tft.drawLine(3,40,316,40,RED);


  tft.fillRoundRect(60, 50, 200, 35, 8,GREEN );
  tft.drawRoundRect(60, 50, 200, 35, 8, WHITE) ;
  tft.fillRoundRect(60, 95, 200, 35, 8,GREEN );
  tft.drawRoundRect(60, 95, 200, 35, 8, WHITE) ;
  tft.fillRoundRect(60, 140, 200, 35, 8,GREEN );
  tft.drawRoundRect(60, 140, 200, 35, 8, WHITE) ;
  tft.fillRoundRect(60, 185, 200, 35, 8,GREEN );
  tft.drawRoundRect(60, 185, 200, 35, 8, WHITE) ;
  tft.setTextColor(WHITE);
  tft.setTextSize(2);
  tft.setCursor(112, 60);
  tft.println("Maischen");
  tft.setCursor(125, 105);
  tft.println("1.Rast");
  tft.setCursor(125, 150);
  tft.println("2.Rast");
  tft.setCursor(103,195);
  tft.println("Abmaischen");
}

void Maischen ()
{
  site=1;

  int Time1=0;


  tft.setRotation(1);
  tft.fillScreen(BLACK);
  tft.fillRoundRect(10, 10, 50, 50, 8,GREEN ); //Back Button
  tft.drawRoundRect(10, 10, 50, 50, 8, WHITE) ;
  tft.setTextColor(WHITE);
  tft.setTextSize(3);
  tft.setCursor(110,25);
  tft.println("Maischen");
  tft.drawLine(100,60,260,60,RED);

  tft.fillRoundRect(63, 100, 200, 40, 8,GREEN );//Temperatur & Time 
Button
  tft.drawRoundRect(63, 100, 200, 40, 8, WHITE) ;
  tft.fillRoundRect(63, 150, 200, 40, 8,GREEN );
  tft.drawRoundRect(63, 150, 200, 40, 8, WHITE) ;

   tft.fillRoundRect(6, 100, 50, 40, 8,GREEN );// down Button
  tft.drawRoundRect(6, 100, 50, 40, 8, WHITE) ;
  tft.fillRoundRect(6, 150, 50, 40, 8,GREEN );
  tft.drawRoundRect(6, 150, 50, 40, 8, WHITE) ;

   tft.fillRoundRect(270, 100, 50, 40, 8,GREEN );// Up Button
  tft.drawRoundRect(270, 100, 50, 40, 8, WHITE) ;
  tft.fillRoundRect(270, 150, 50, 40, 8,GREEN );
  tft.drawRoundRect(270, 150, 50, 40, 8, WHITE) ;

//Beschriftungen
  tft.setCursor(25,25);
  tft.println("<"); //Back
  tft.setCursor(20,110);
  tft.println("<"); //Down Temp
  tft.setCursor(20,160);
  tft.println("<");// Down Time
  tft.setCursor(290,110);
  tft.println(">");// Up Temp
  tft.setCursor(290,160);
  tft.println(">");// Up Time
  tft.setCursor(80,110);
  tft.println("Temperatur"); // Temp
  tft.setCursor(120,160);
  tft.println("Zeit"); // Time

 //Ausgabewerte
  tft.setCursor(10,70);
  tft.print(tempbutton);
  tft.print(" Grad");
  tft.setCursor(180,70);
  tft.print(Time1);
  tft.print("Min");

}

von Stefan F. (Gast)


Lesenswert?

> Dann dachte ich eben das ich in die If schleife
> einfach noch Temperatur();

Wie sollen wir etwas hilfreiches zu einer Funktion sagen, die gar nicht 
existiert?

Würdest du uns bitte den richtigen Quelltext zeigen und beim Einfügen 
in das Textfeld die fetten Hinweise zur Formatierung beachten?

Es fehlt immer noch die Angabe, welches Display du verwendest und dein 
Schaltplan dazu.

von Sebastian (Gast)


Lesenswert?

Ich habe das 2,4 Tft Touchscreen von Az das wird einfach aufgesteckt und 
gut ist. Außerdem funktioniert doch das Display da muss nur was falsch 
programmiert sein.

und die Funktion heißt void Maischen()

von Stefan F. (Gast)


Lesenswert?

In der Funktion Maischen() füllst du das ganze Display mit schwarz aus 
und zeichnest dann den gesamtem Inhalt. Das kann man sehen, also 
flackert es.

Um das Flackern zu verhindern, musst du deine Ausgabe auf das nötigste 
beschränken. Also nur die Zahlen überschreiben, die sich ändern sollen.

von Sebastian (Gast)


Lesenswert?

Das habe ich auch schon probiert aber dann ist das Problem das die Pixel 
die weiß geworden sind weiß bleiben.

von Stefan F. (Gast)


Lesenswert?

Sebastian schrieb:
> Das habe ich auch schon probiert aber dann ist das Problem das die Pixel
> die weiß geworden sind weiß bleiben.

Dann übermale halt den entsprechenden Bereich vorher mit einem schwarzen 
Rechteck, aber nicht das ganze Display.

von Sebastian (Gast)


Lesenswert?

DAS WAR AUCH GERADE MEINE IDEE ABER ICH KANN MIR NICHT VORSTELLEN DAS ES 
NICHT BESSER GELÖST WERDEN KANN

von Joachim B. (jar)


Lesenswert?

Stefan ⛄ F. schrieb:
> Dann übermale halt den entsprechenden Bereich vorher mit einem schwarzen
> Rechteck, aber nicht das ganze Display.

kann man machen, für nur Test merke ich mir den alten Text und schreibe 
ihn neu in black und dann erst den neuen Text in Wunschfarbe (in der 
Hoffnung das keine überflüssigen Pixel gemalt werden) funktioniert bei 
mir ohne weitere Prüfung.

Ob natürlich trotzdem überflüssige Pixel irgendwie gelöscht werden habe 
ich nicht geprüft!

Ich mache auch nicht mehr als 4 TFT/LCD Updates pro Sekunde, weil das eh 
keiner lesen kann!
10ms Timer für Tastenentprellung, count 25 bis 0 -> in loop LCD Update 
wenn 0 und danach Count neu setzen.

von Sebastian (Gast)


Lesenswert?

Ok erstmal danke hat jetzt mit dem übermalen geklappt. Wenn ich etwas 
mehr geübt habe werde das irgendwann wohl auch eleganter hinbekommen.

von Stefan F. (Gast)


Lesenswert?

Sebastian schrieb:
> ABER ICH KANN MIR NICHT VORSTELLEN DAS ES
> NICHT BESSER GELÖST WERDEN KANN

Was wäre denn in deiner Vorstellung besser?

Guck dir mal diese Doku an, besonders ab Seite 19
https://cdn-learn.adafruit.com/downloads/pdf/adafruit-gfx-graphics-library.pdf
da steht, dass der Hintergrund mit Absicht nicht automatisch gelöscht 
wird. Direkt darunter steht eine andere Lösung mit dem GFXcanvax1 
Objekt. Vielleicht gefällt dir diese besser.

von Joachim B. (jar)


Lesenswert?

Sebastian schrieb:
> Ok erstmal danke hat jetzt mit dem übermalen geklappt

vor allem muss man nicht alle Pixel löschen und nicht alle Texte, nur 
die die sich wirklich ändern, die Position wo du schreibst kennst du 
doch!

von Sebastian (Gast)


Lesenswert?

Ja ich habe es ja geschafft hatte da gestern nicht genau drüber 
nachgedacht.
Heute habe ich eh erstmal meinen Code übersichtlicher geschrieben einige 
Funktionen zusammen gefasst und so einiges an Code gespart usw. dafür 
das ich das es kurz machen bin ich mit meinem Erfolg bis jetzt 
zufrieden.
Bin jetzt dabei meine Werte in den Eeprom zu schreiben

von pnp (Gast)


Lesenswert?


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.