Schieberegler mit Einrastfunktion, Timer und Schriftgrößen (Touchscreen)

Hallo!!!
Ich bin neu bei Arduino und habe einige Problem mit der Programmierung meines Touchscreens.
Den Schieberegler habe ich bereits programmiert nur würde ich ihn gerne mit einer Einrastfunktion realisieren.
Also mit 6 verschieden wie z.B. (60,90,120,160,190,250) und nicht so wie er jetzt ist Stufenlos.
Weiters im Menü rechts oben hätte ich gerne einen Timer nur habe ich keine Ahnung wie man solch einen Programmiert.
Außerdem kann ich die Schriftgröße nicht ändern lediglich die Schriftart (Big_FONT).
Bitte um Hilfe!!!

#include <memorysaver.h>
#include <UTFT.h>
#include <URTouch.h>
#include <URTouchCD.h>
//#define TOUCH_ORIENTATION  PORTRAIT



UTFT    myGLCD(CTE50CPLD,38,39,40,41);
URTouch  myTouch( 6, 5, 4, 3, 2);
extern uint8_t BigFont[];
extern uint8_t SevenSeqNumFont[];
extern uint8_t SmallFont[];

char currentPage, selectedUnit;


 
int x,y;

const int Temperatur = 10;
int xR=38;

  
         void drawHomeScreen(){
  myGLCD.setColor(VGA_TEAL);
  myGLCD.fillRoundRect(0,0,800,480);
  myGLCD.setColor(VGA_MAROON);
  myGLCD.fillRoundRect(50,80,750,180);
  myGLCD.fillRoundRect(50,220,750,320);
  myGLCD.fillRoundRect(50,360,750,460);

  myGLCD.setColor(VGA_WHITE);
  myGLCD.drawRoundRect(50,80,750,180);
  myGLCD.drawRoundRect(50,220,750,320);
  myGLCD.drawRoundRect(50,360,750,460);
 
  myGLCD.drawRoundRect(0,0,799,479);
 
  myGLCD.setColor(VGA_WHITE);
  myGLCD.setFont(BigFont);

  myGLCD.setBackColor(VGA_TEAL);
  myGLCD.print("Menue",CENTER, 10);
  myGLCD.print("DATUM/UHRZEIT",LEFT, 10);
  myGLCD.print("In Betrieb seit:",RIGHT,10);

  myGLCD.setBackColor(VGA_MAROON);
  myGLCD.print("Temperaturauswahl",CENTER, 120);
  myGLCD.print("Aktuelle Temperaturen",CENTER, 260);
  myGLCD.print("Abschalten",CENTER, 400);

  myGLCD.setColor(VGA_MAROON);
  myGLCD.drawLine(360,25,440,25);
  myGLCD.setColor(VGA_WHITE);

}

   void drawFrame(int x1, int y1, int x2, int y2) {
  myGLCD.setColor(VGA_LIME);
  myGLCD.drawRoundRect (x1, y1, x2, y2);
  while (myTouch.dataAvailable())
    myTouch.read();
    myGLCD.setColor(255, 255, 255);
    myGLCD.drawRoundRect (x1, y1, x2, y2);
}

 void drawTemperaturauswahl(){
  myGLCD.setColor(VGA_TEAL);
  myGLCD.fillRoundRect(0,0,800,480);
 myGLCD.setColor(VGA_MAROON);
 myGLCD.fillRoundRect (10, 400,120, 460);
 myGLCD.setColor(VGA_WHITE);
 myGLCD.drawRoundRect (10, 400,120, 460);
 myGLCD.drawRect(49, 199, 750, 275);
 myGLCD.print("<-", 45, 420);
  myGLCD.setBackColor(VGA_TEAL);
 myGLCD.print("MIN(0)", 25, 175);
  myGLCD.print("MAX(250)", 650, 175);
 myGLCD.print("Temperaturauswahl", CENTER, 50);
 
 }

  void drawAktuelleTemperaturen(){
 myGLCD.setColor(VGA_TEAL);
 myGLCD.fillRoundRect(0,0,800,480);
 myGLCD.setColor(VGA_MAROON);
 myGLCD.fillRoundRect (10, 400, 120, 460);
 myGLCD.setColor(VGA_WHITE);
 myGLCD.drawRoundRect (10, 400, 120, 460);
 myGLCD.print("<-", 45, 420);
 myGLCD.setBackColor(VGA_TEAL);
 myGLCD.print("Temp. im Garraum:", 50, 150);
 myGLCD.print("Fleischtemperatur:", 50,200);
 myGLCD.print("Aktuelle Temperaturen", CENTER, 50);
 
 }

void setTemperaturauswahl() {
  if (myTouch.dataAvailable()) {
    myTouch.read();
    x=myTouch.getX();
    y=myTouch.getY();   
         
    
    if( (y>=200) && (y<=275)) {
      xR=x; 
      if (xR<=50) { 
        xR=50;
      }
      if (xR>=740){ 
        xR=740;
      }
    }
  }

  int xRC = map(xR,50,749,0,250);
  analogWrite(Temperatur, xRC);
 
  myGLCD.setColor(255, 255, 255);
  myGLCD.fillRect(xR,200,(xR+15),274);
  myGLCD.setColor(xRC, 0, 0);
  myGLCD.fillRect(50, 200, (xR-1), 274);
  myGLCD.setColor(0, 0, 0);
  myGLCD.fillRect((xR+16), 200, 749, 274);

  
       }

     

     



void setup() {
   myGLCD.InitLCD(LANDSCAPE);
  myTouch.InitTouch();
  myGLCD.clrScr();
  myTouch.setPrecision(PREC_MEDIUM);
  myGLCD.setFont(BigFont);
  
 
  
  drawHomeScreen();
  currentPage = '0';
  }
  


void loop() {
  
  if (myTouch.dataAvailable()) {

  if (currentPage == '0') {
        myTouch.read();
        x=myTouch.getX();
        y=myTouch.getY();
 
        if ((x>=50) && (x<=750) && (y>=80) && (y<=180)) {
          myGLCD.setColor(VGA_LIME);
      myGLCD.print("Temperaturauswahl",CENTER, 120);
            drawFrame(50, 80, 750, 180);
            currentPage = '1';
            myGLCD.clrScr();
            drawTemperaturauswahl();
           }
         
 
    if ((x>=50) && (x<=750) && (y>=220) && (y<=320))
    { myGLCD.setColor(VGA_LIME);
      myGLCD.print("Aktuelle Temperaturen",CENTER, 260);
      drawFrame(50, 220, 750, 320);
      currentPage = '2';
      myGLCD.clrScr();
      drawAktuelleTemperaturen();
    }
    }
    }
    
    
  


    if (currentPage == '1') {
      setTemperaturauswahl();
      if (myTouch.dataAvailable()) {
        myTouch.read();
        x=myTouch.getX();
        y=myTouch.getY();

         if ((x>=10) && (x<=120) &&(y>=400) && (y<=460)) {
          myGLCD.setBackColor(VGA_MAROON);
          myGLCD.setColor(VGA_LIME);
          myGLCD.print("<-", 45, 420);
          drawFrame(10, 400, 120, 460);
          currentPage = '0';
          myGLCD.clrScr();
          drawHomeScreen(); 
        }
      }
  }
        
       if (currentPage == '2') {
       if (myTouch.dataAvailable()) {
        myTouch.read();
        x=myTouch.getX();
        y=myTouch.getY();
        
        if ((x>=10) && (x<=120) &&(y>=400) && (y<=460)) {
          myGLCD.setBackColor(VGA_MAROON);
          myGLCD.setColor(VGA_LIME);
          myGLCD.print("<-", 45, 420);
          drawFrame(10, 400, 120, 460);
          currentPage = '0';
          myGLCD.clrScr();
          drawHomeScreen();
        }
       }
       }
}

Hallo,

Vielleicht veräts Du uns noch welches Display Du verwendest?
Der Name (am besten mit Link) zu Deiner lib wäre auch Super gewesen. Ist das eh auch die Richtige?

Ein paar Kommentare im Code? Zumindest wo ist der Balken? Ich hab im Code danach gesucht: "(60,90,120,160,190,250)".... Und versteh mich bitte nicht falsch, ich versuche nur Deinen Topic zu 'retten'.

Grüße,
Donny

dony:
Ein paar Kommentare im Code? Zumindest wo ist der Balken? Ich hab im Code danach gesucht: "(60,90,120,160,190,250)".... Und versteh mich bitte nicht falsch, ich versuche nur Deinen Topic zu 'retten'.

Ich glaube er meint er möchte aus dem normalen Slider wie dem in seinem Code einen mit Rastfunktion machen.
Sprich er ist nicht variabel sondern hat fixe Werte an denen der Slider am Balken einrastet.
(s. BSP Bild)

Schieberegler5.gif

Hallo!
Danke für die schnelle Rückmeldung.

Bei dem Display handel es sich um : https://eckstein-shop.de/50-MIT-Touchscreen-MD050SD-MCU-Bus-TFT-LCD-Display
Shield: https://eckstein-shop.de/TFT-LCD-Mega-Shield-fuer-Arduino-Mega-2560
Arduino board : HIMALAYA basic MEGA 2560 R3 ATMEGA Board Arduino Mega 2560 kompatibel

Ich verwende die UTFT und URTOUCH Library von Kenning Karlsen.
UTFT: UTFT - Rinky-Dink Electronics
URTOUCH: URTouch - Rinky-Dink Electronics

Habe alles relevante für den Schieberegler im Code makiert. Ja genau ich will einen Slider, der bei vordefinierten Werten einrastet. Hierbei geht es um eine Temperatursteuerung. Also folgende Werte wären sinnvoll(0,80,120,160,190,220,250). Diese Werte habe ich im Code noch nicht implementiert, da ich nicht weiß wie man solch einen Slider programmiert. Habe anhand eines Videos einen Schieberegler, der stufenlos einstellbar ist erstellt. Nur benötige ich wie vorher angesprochen einen der stufen besitzt.
Link zum Video: Arduino TFT LCD Touch Screen Tutorial - YouTube

Vielen Dank im voraus

#include <memorysaver.h>
#include <UTFT.h>
#include <URTouch.h>
#include <URTouchCD.h>
#include <Sodaq_DS3231.h>

UTFT    myGLCD(CTE50CPLD,38,39,40,41);
URTouch  myTouch( 6, 5, 4, 3, 2);
extern uint8_t BigFont[];
extern uint8_t SevenSeqNumFont[];
extern uint8_t SmallFont[];


char currentPage, selectedUnit;

int x,y;

const int Temperatur = 10;                         // Schieberegler     
int xR=38;                                             //Schieberegler


String dateString;
String hours;
int minuteNow=0;
int minutePrevious=0;

  
         void drawHomeScreen(){
  myGLCD.setColor(VGA_TEAL);
  myGLCD.fillRoundRect(0,0,800,480);
  myGLCD.setColor(VGA_MAROON);
  myGLCD.fillRoundRect(50,80,750,180);
  myGLCD.fillRoundRect(50,220,750,320);
  myGLCD.fillRoundRect(50,360,750,460);

  myGLCD.setColor(VGA_WHITE);
  myGLCD.drawRoundRect(50,80,750,180);
  myGLCD.drawRoundRect(50,220,750,320);
  myGLCD.drawRoundRect(50,360,750,460);
 
  myGLCD.drawRoundRect(0,0,799,479);
 
  myGLCD.setColor(VGA_WHITE);
  
  myGLCD.setFont(BigFont);
  myGLCD.setBackColor(VGA_TEAL);
  myGLCD.print("Menue",CENTER, 10);
  
  myGLCD.setFont(BigFont);
  myGLCD.print("In Betrieb seit:",RIGHT,10);

  myGLCD.setBackColor(VGA_MAROON);
  myGLCD.print("Temperaturauswahl",CENTER, 120);
  myGLCD.print("Aktuelle Temperaturen",CENTER, 260);
  myGLCD.print("Abschalten",CENTER, 400);

  myGLCD.setColor(VGA_MAROON);
  myGLCD.drawLine(360,25,440,25);
  myGLCD.setColor(VGA_WHITE);

}


void getAndPrintTime()
{
   DateTime now = rtc.now(); 
   minuteNow = now.minute();
   if(minuteNow!=minutePrevious)
   {
      dateString = getDayOfWeek(now.dayOfWeek())+" ";
      dateString = dateString+String(now.date())+"/"+String(now.month());
      minutePrevious = minuteNow;
      hours = String(now.hour());
    if(now.minute()<10)
    {
      hours = hours+":0"+String(now.minute());
    }else
    {
      hours = hours+":"+String(now.minute());
    }
    printTime();
   }
}

void printTime()
{
  String dateAndTime = dateString+" "+hours;

   myGLCD.setColor(VGA_WHITE);
   myGLCD.setBackColor(VGA_TEAL);
   myGLCD.print(dateAndTime,5, 15);
   

}

void setRTCTime()
{
  DateTime dt(2018, 02, 21, 19, 23, 50, 3); 
  rtc.setDateTime(dt);
}


String getDayOfWeek(int i)
{
  switch(i)
  {
    case 1: return "Montag";break;
    case 2: return "Dienstag";break;
    case 3: return "Mittwoch";break;
    case 4: return "Donnerstag";break;
    case 5: return "Freitag";break;
    case 6: return "Samstag";break;
    case 7: return "Sonntag";break;
    
  }
}


   void drawFrame(int x1, int y1, int x2, int y2) {
  myGLCD.setColor(VGA_LIME);
  myGLCD.drawRoundRect (x1, y1, x2, y2);
  while (myTouch.dataAvailable())
    myTouch.read();
    myGLCD.setColor(255, 255, 255);
    myGLCD.drawRoundRect (x1, y1, x2, y2);
}

 void drawTemperaturauswahl(){
  myGLCD.setColor(VGA_TEAL);
  myGLCD.fillRoundRect(0,0,800,480);
 myGLCD.setColor(VGA_MAROON);
 myGLCD.fillRoundRect (10, 400,120, 460);
 myGLCD.setColor(VGA_WHITE);
 myGLCD.drawRoundRect (10, 400,120, 460);
 myGLCD.drawRect(49, 199, 750, 275);                  //Rahmen des Schiebereglers 
 myGLCD.print("<-", 45, 420);
  myGLCD.setBackColor(VGA_TEAL);
 myGLCD.print("MIN(0)", 25, 175);
  myGLCD.print("MAX(250)", 650, 175);
 myGLCD.print("Temperaturauswahl", CENTER, 50);
 
 }

  void drawAktuelleTemperaturen(){
 myGLCD.setColor(VGA_TEAL);
 myGLCD.fillRoundRect(0,0,800,480);
 myGLCD.setColor(VGA_MAROON);
 myGLCD.fillRoundRect (10, 400, 120, 460);
 myGLCD.setColor(VGA_WHITE);
 myGLCD.drawRoundRect (10, 400, 120, 460);
 myGLCD.print("<-", 45, 420);
 myGLCD.setBackColor(VGA_TEAL);
 myGLCD.print("Temp. im Garraum:", 50, 150);
 myGLCD.print("Fleischtemperatur:", 50,200);
 myGLCD.print("Aktuelle Temperaturen", CENTER, 50);
 
 }




void setTemperaturauswahl() {                          //programmierung des Schiebereglers 
  if (myTouch.dataAvailable()) {                        
    myTouch.read();                                    
    x=myTouch.getX();
    y=myTouch.getY();   
         
    
    if( (y>=200) && (y<=275)) {
      xR=x; 
      if (xR<=50) { 
        xR=50;
      }
      if (xR>=740){ 
        xR=740;
      }
    }
  }

  int xRC = map(xR,50,749,0,250);
  analogWrite(Temperatur, xRC);
 
  myGLCD.setColor(255, 255, 255);
  myGLCD.fillRect(xR,200,(xR+15),274);
  myGLCD.setColor(xRC, 0, 0);
  myGLCD.fillRect(50, 200, (xR-1), 274);
  myGLCD.setColor(0, 0, 0);
  myGLCD.fillRect((xR+16), 200, 749, 274);              //programmierung des Schiebereglers ende 
 }




void setup() {
  
  rtc.begin();
  myGLCD.InitLCD(LANDSCAPE);
  myTouch.InitTouch();
  myGLCD.clrScr();
  myTouch.setPrecision(PREC_MEDIUM);
 //setRTCTime();
  
  drawHomeScreen();
  currentPage = '0';
  }
  


void loop() {


getAndPrintTime();

  
  if (myTouch.dataAvailable()) {

  if (currentPage == '0') {
        myTouch.read();
        x=myTouch.getX();
        y=myTouch.getY();


 
        if ((x>=50) && (x<=750) && (y>=80) && (y<=180)) {
          myGLCD.setBackColor(VGA_MAROON);
          myGLCD.setColor(VGA_LIME);
      myGLCD.print("Temperaturauswahl",CENTER, 120);
            drawFrame(50, 80, 750, 180);
            currentPage = '1';
            myGLCD.clrScr();
            drawTemperaturauswahl();
           }
         
 
    if ((x>=50) && (x<=750) && (y>=220) && (y<=320))
    { myGLCD.setColor(VGA_LIME);
      myGLCD.print("Aktuelle Temperaturen",CENTER, 260);
      drawFrame(50, 220, 750, 320);
      currentPage = '2';
      myGLCD.clrScr();
      drawAktuelleTemperaturen();
    }
    }
    }
    
    
  


    if (currentPage == '1') {
      setTemperaturauswahl();
      if (myTouch.dataAvailable()) {
        myTouch.read();
        x=myTouch.getX();
        y=myTouch.getY();

         if ((x>=10) && (x<=120) &&(y>=400) && (y<=460)) {
          myGLCD.setBackColor(VGA_MAROON);
          myGLCD.setColor(VGA_LIME);
          myGLCD.print("<-", 45, 420);
          drawFrame(10, 400, 120, 460);
          currentPage = '0';
          myGLCD.clrScr();
          drawHomeScreen(); 
        }
      }
  }
        
       if (currentPage == '2') {
       if (myTouch.dataAvailable()) {
        myTouch.read();
        x=myTouch.getX();
        y=myTouch.getY();
        
        if ((x>=10) && (x<=120) &&(y>=400) && (y<=460)) {
          myGLCD.setBackColor(VGA_MAROON);
          myGLCD.setColor(VGA_LIME);
          myGLCD.print("<-", 45, 420);
          drawFrame(10, 400, 120, 460);
          currentPage = '0';
          myGLCD.clrScr();
          drawHomeScreen();
        }
       }
       }
}

So schaut das doch gleich viel schöner aus und man kennt sich aus. :wink: Nur ein gut gemeinter Ratschlag. Ich will ja nicht nervig sein aber wenn die links, Hyperlinks wären (also zum draufklicken) dann wäre es Vorbildhaft. :wink:

Jetzt ist es leider schon spät aber ich werde mich morgen nochmals melden, bzgl. Deiner Frage/Bitte.

Grüße,
Donny

Hallo,

Also so wie ich das sehe, wirst Du das ausprogrammieren müssen, mit Rechtecken bzw. Linien. Da ich leider kein Display hier habe, das mit der lib kompatible wäre kann ich hier nichts testen. Also ich stell mir das so vor: Den Funktion gibt es ja keine...?

edit: Ich hab mir das nochmal durch den Kopf gehen lassen. <- Das gehört etwas geändert:
[ = Anfang des Touch Feld (UButton)
] = Ende des Touch Feld
| = Fix Punkt - Temperatur

[ |--][--|--][--|--][--| ] <- Hoffe Du verstehst. Wie weit der Button nach oben/unten geht, muss man direkt testen.
0 80 100 250
Jetzt hast Du einen Button von 0 bis zur hälfte von 80, dann beginnt sofort das nächste Feld das vor 80 Anfängt und danach Aufhört. <- So musst Du nur in der Nähe der Temperatur 'drücken' und der Slider springt da hin wo er soll.

In einer Variable speicherst Du den aktuellen Zustand, nur 0-7.
Den Slider musst Du quasi zu den vertikalen Linie 'springen' lassen sobald Du in die nähe fährst oder in der nähe 'drückst', springt der Slider zu der Temperatur.
Das würde ich so machen: Die Touch fläche einige Pixel vor und hinter die vertikale Linie. Wenn man in diesem Touch Bereich kommst, 'springt' der Slider auf die genau definierte Position der Linie |, dann muss der Wert gespeichern werden.

byte sliderTemp[] = {0,80,120,160,190,220,250);
byte currentTemp = 3; // 120 <- nur als Beispiel

// Slider Aufbau

if (newTemp != currentTemp) {
  Serial.print("Neue Temperatur: ");
  Serial.print(sliderTemp[currentTemp]);
// Slider muss auf die 3. Vertikale Linie
}

Das ist jetzt eigentlich noch gar nichts aber wenn Du das Grafik Zeugs schreibst, könnten wir das hinbekommen.

Grüße,
Donny

Hab mich mal an die Sache rangewagt, wollte schon immer mal mit dem Display rumspielen, ist bisher nur verstaubt xD

Hier jedenfalls das Resultat, funktioniert wie erwünscht:

kann Code hier nicht posten, da begrenzter Zeichensatz

Code befindet sich im Anhang.

Edit: Code etwas ausgebessert, dass der Rahmen vom Slider bei größten oder kleinsten Wert nicht verändert wird

Schieberegler_einrastend.ino (9.39 KB)