Programme für das Touch Display MI0283QT-2 von Watterott

Hallo,

ich habe festgestellt, dass mit einem Touch Display die Darstellung von Programmen wesenlich besser wird. Man kann mit dem Arduino plötzlich reden, ohne eine Schnittstelle (USB o.ä) zu benutzen.
Ich habe nun schon mehrere Programme zusammengestellt (ich werde mich hüten, zu behaupten, dass ich die Programme selbst geschrieben habe), die mit dem Arduino UNO und dem Touch Display MI0283QT-2 von Watterott arbeiten. Weitere Programme, z.b. eine Lade oder Entladeschaltung werde ich nun zusammenfassen und die Funktion und Parametereingabe über Touch Display MI0283QT-2 realisieren.
Ein erstes Programm war eine Darstellung der Farben, damit man die Zuordnung besser findet.

//Grundprogramm von Watterott
// Stand 17.02.2011
#include <MI0283QT2.h>
#include <ADS7846.h>

#define TP_EEPROMADDR (0x00) //eeprom address for calibration data

MI0283QT2 lcd;
ADS7846 tp;
int lrr=0;
int lrg=0;
int lrb=0;
int lrra;
int lrga;
int lrba;
int y;
unsigned int RgB;
void tp_calibration(uint8_t check_eeprom)
{
  int i;
  CAL_POINT lcd_points[3] = {
    {
      CAL_POINT_X1,CAL_POINT_Y1    }
    ,
    {
      CAL_POINT_X2,CAL_POINT_Y2    }
    ,
    {
      CAL_POINT_X3,CAL_POINT_Y3    }
  }; //calibration point postions
  CAL_POINT tp_points[3], *p;

  //calibration data in EEPROM?
  if(tp.readCalibration(TP_EEPROMADDR) && check_eeprom)
  {
    return;
  }

  //wait for touch release
  lcd.clear(COLOR_WHITE);
  lcd.drawText((lcd.getWidth()/2)-50, (lcd.getHeight()/2)-10, "Calibration", 1, COLOR_BLACK, COLOR_WHITE);
  while(tp.getPressure() > 5){ 
    tp.service(); 
  };

  //show calibration points
  i = 0;
  do
  {
    //draw points
    lcd.drawCircle(lcd_points[i].x, lcd_points[i].y, 1, RGB(0,0,0));
    lcd.drawCircle(lcd_points[i].x, lcd_points[i].y, 4, RGB(0,0,0));
    lcd.drawCircle(lcd_points[i].x, lcd_points[i].y, 8, RGB(255,0,0));

    //run service routine
    tp.service();

    //press dectected?
    if(tp.getPressure() > 5)
    {
      tp_points[i].x = tp.getXraw();
      tp_points[i].y = tp.getYraw();
      i++;
      lcd.clear(COLOR_WHITE);
      delay(100);
    }
  }
  while(i<3);

  //calulate calibration matrix
  tp.setCalibration(lcd_points, tp_points);

  //save calibration matrix
  tp.writeCalibration(TP_EEPROMADDR);
}


void setup()
{
  Serial.begin(9600); 

  //init Display
  lcd.init(4); //spi-clk = Fcpu/4

    //init Touch-Controller
  tp.init();

  //clear Screen
  lcd.clear(COLOR_WHITE);

  //Touch-Panel Calibration
  tp.service();
  if(tp.getPressure() > 5)
  {
    tp_calibration(0); //dont check EEPROM for calibration data
  }
  else
  {
    tp_calibration(1); //check EEPROM for calibration data
  }

  //Backlight LED
  lcd.led(60); //backlight 0...100%
  lcd.drawText( 2, 2, "BL", 1, COLOR_RED, COLOR_WHITE);
  lcd.drawText(20, 2, 60,   1, COLOR_RED, COLOR_WHITE);

  //Cal text
  lcd.drawText(lcd.getWidth()-30, 2, "CAL", 1, COLOR_RED, COLOR_WHITE);



  //Felder festsetzen


  lcd.fillRect( 5,170, 260,174, RGB(255,  0,  0));   
  lcd.fillRect( 5,190, 260,194, RGB(0,  255,  0)); 
  lcd.fillRect( 5,210, 260,214, RGB(0,  0,  255)); 
  lcd.fillRect( lrr+5,165, lrr+10,174, RGB(255,  0,  0));  
  lcd.fillRect( lrg+5,185, lrg+10,194, RGB(0,  255,  0)); 
  lcd.fillRect( lrb+5,205, lrb+10,214, RGB(0,  0,  255)); 
  lcd.drawText(290, 167, lrr, 1, RGB(0,0,0), RGB(255,255,255));
  lcd.drawText(290, 187, lrg, 1, RGB(0,0,0), RGB(255,255,255));
  lcd.drawText(290, 207, lrb, 1, RGB(0,0,0), RGB(255,255,255));
  lcd.fillRect( 30,30, 290,150, RGB(0,  0,  0));  
}
//service routine

void loop()
{
  char tmp[128];
  static uint16_t last_x=0, last_y=0;
  static uint8_t led=60;
  unsigned long m;
  static unsigned long prevMillis=0;

  tp.service();

  //show tp data
  sprintf(tmp, "X:%03i|%04i Y:%03i|%04i P:%03i", tp.getX(), tp.getXraw(), tp.getY(), tp.getYraw(), tp.getPressure());
  lcd.drawText(45, 2, tmp, 1, COLOR_BLACK, COLOR_WHITE);

  if(tp.getPressure() > 3) //touch press?
  {
    //change backlight power
    if((tp.getX() < 45) && (tp.getY() < 15))
    {
      m = millis();
      if((m - prevMillis) > 800) //change only every 800ms
      {
        prevMillis = m;

        led += 10;
        if(led > 100)
        {
          led = 10;
        }
        lcd.led(led);
      }
    }
    //calibrate touch panel
    else if((tp.getX() > (lcd.getWidth()-30)) && (tp.getY() < 15))
    {
      tp_calibration(0);
    }



    //draw line
    else
    {
      if(last_x == 0)
      {
        //lcd.drawPixel(tp.getX(), tp.getY(), COLOR_RED);
      }
      else
      {
        // lcd.drawLine(last_x, last_y, tp.getX(), tp.getY(), COLOR_BLACK);
      }
      last_x = tp.getX();
      last_y = tp.getY();
    }

    //show backlight power and cal text
    lcd.drawText( 2,                2, "BL    ", 1, COLOR_RED, COLOR_WHITE);
    lcd.drawText(20,                2, led,      1, COLOR_BLUE, COLOR_WHITE);
    lcd.drawText(lcd.getWidth()-30, 2, "CAL",    1, COLOR_RED, COLOR_WHITE);
  }
  else
  {
    last_x = 0;
  }

  if(tp.getPressure() > 3) //touch press?
  {
    //if((tp.getX() < 257) && ((tp.getY() == 172 ))) //rotwert 
    if((tp.getX() < 256) && ((tp.getY() > 170 )))


    {
      y=tp.getY();
      if(y < 175 && y > 165)
      {
       // Serial.print("Rot ");
       // Serial.println(y);
        lrra=lrr;
        lrr=tp.getX();
        if (lrr > 255)lrr=255;
        if (lrr < 5)return;
        lcd.drawText(290, 167, "     ", 1, RGB(0,0,0), RGB(255,255,255));
        lcd.drawText(290, 167, lrr, 1, RGB(0,0,0), RGB(255,255,255));
        RgB=RGB(lrr,lrg,lrb);
        lcd.drawText(270, 220, "      ", 1, RGB(0,0,0), RGB(255,255,255));
        lcd.drawText(270, 220, RgB, 1, RGB(0,0,0), RGB(255,255,255));
        
        lcd.fillRect( 5,165, 260,169, RGB(255, 255, 255));   
        lcd.fillRect( lrr,165, lrr+5,174, RGB(255,  0,  0)); 
      }
    } 
    //grünwert
    y=tp.getY();
    if(y < 195 && y > 185)
    {
   //   Serial.print("Gruen ");
   //   Serial.println(y);


      lrga=lrg;
      lrg=tp.getX();
      if (lrg > 255)lrg=255;
      if (lrg < 5)return;
      lcd.drawText(290, 187, "     ", 1, RGB(0,0,0), RGB(255,255,255));
      lcd.drawText(290, 187, lrg, 1, RGB(0,0,0), RGB(255,255,255));
      RgB=RGB(lrr,lrg,lrb);
      lcd.drawText(270, 220, "      ", 1, RGB(0,0,0), RGB(255,255,255));
      lcd.drawText(270, 220, RgB, 1, RGB(0,0,0), RGB(255,255,255));
      lcd.fillRect( 5,185, 260,189, RGB(255, 255, 255));   
      lcd.fillRect( lrg,185, lrg+5,189, RGB(0,  255,  0)); 
    }  

    //blauwert
    y=tp.getY();
    if(y < 215 && y > 205)
    {
  //    Serial.print("Blau ");
   //   Serial.println(y);

      lrba=lrb;
      lrb=tp.getX();
      if(lrb > 255)lrb=255;
      if (lrb < 5)return;
      lcd.drawText(290, 207, "     ", 1, RGB(0,0,0), RGB(255,255,255));
      lcd.drawText(290, 207, lrb, 1, RGB(0,0,0), RGB(255,255,255));
      RgB=RGB(lrr,lrg,lrb);
      lcd.drawText(270, 220, "      ", 1, RGB(0,0,0), RGB(255,255,255));
      lcd.drawText(270, 220, RgB, 1, RGB(0,0,0), RGB(255,255,255));
      lcd.fillRect( 5,205, 260,209, RGB(255, 255, 255));   
      lcd.fillRect( lrb,205, lrb+5,209, RGB(0,  0, 255)); 
    }  

     lcd.fillRect( 30,30, 290,150, RGB(lrr,  lrg,  lrb)); 
     lcd.fillRect( 80,80, 200,100, RgB); 
     
     
     
     
     Serial.print("Rot : ");
     Serial.print(lrr);
     Serial.print(" Gruen : ");
     Serial.print(lrg);
     Serial.print(" Blau : ");
     Serial.print(lrb);
     Serial.print(" INT : ");
     Serial.println(int RGB(lrr,lrg,lrb));
  }


}

Ein weiteres Programm ist ein Morseübungsprogramm, was ich schon vorher mal dargestellt habe. Das letzte Programm ist eine Temperaturanzeige für bis zu 4 Sensoren (DS18B20).

In einem Untermenue kann man den einzelnen Zeilen die Sensoren zuodnen.

und . Diese Daten werden dann im EEPROM gespeichert und beim erneuten Programmstart wieder eingelesen.

Leider ist der Code zu lang. Bei Bedarf bitte eine E-Mail Adresse mitteilen, ich schicke es dann zu.

Gruss Kalli

Kalli, ick bin stolz uff dir !

Wolltest du hören ? :D

werde ich mir nächsten Monat auch holen, ( wenn meene Olle det zuläßt )

MfG

Hallo Kalli! Ich wollte auch gern das Touch Display programmieren, allerdings bin ich fast ein Anfänger( aber ich habe gute C Kenntnisse)! Kannst du bitte mir sagen, wie und von wo kann ich anfangen? zB wie kann ich das Display so programmieren, dass es bei eine Berührung, 4-5 Farben durch gehen... .

Ich wäre für Unterstützungen sehr dankbar.

LG Mineral rajabi@gmx.at

Hallo Mineral,

der programmtechnischen Gestaltung sind bei dem Display kaum Grenzen gesetzt. Bei Watterott gibt es da ein paar Beispiele, weitere Anwendungen kannst Du auch von mir haben bzw. auch hier im Forum suchen. Kann es Dir ja an die angegebene E-Mail Adresse schicken.

Ich bin jedenfalls begeistert von den vielen Möglichkeiten.

Gruss Kalli

Hallo Kalli,

ich wäre an dem Code für die Temperaturanzeige interessiert, bin Anfänger und möchte eine Lüftersteuerung basierend auf gemessenen Innen- und Außentemperaturen aufbauen, da wäre das schon mal ein sehr guter Anfang, den ich nicht selber ertüffteln müsste.

Meine email ist dibub@web.de.

Vielen Dank im Voraus.

Gruß

Dirk

Hallo, ein paar Programme sind unterwegs.

Inzwischen habe ich das mSD-Shield mit einer RTC 1307 erweitert. Nun werden auch Uhr-Zeit und Datum angezeigt. Eine min max Abspeicherung mit Uhrzeit findet auch statt. Desweiteren wird das Display zu einen wählbaren Zeit Aus-und Eingeschaltet. Bin jetzt aber langsam an die Grenzen des UNO angelangt und habe deshalb etliches umgeschrieben. Auf dem Vorgänger vom UNO funktioniert es auch gut. Da die analogen Eingänge noch fast unbenutzt sind, wird es auch möglich sein, noch irgendwelche Steuerleitungen zu benutzen (Lüfterausgang).

Gruss Kalli

Hi, wie sieht denn die PIN Belegung bei dem Screen aus? Vergleichbar mit einem 20x4 Standard Display oder deutlich mehr? Gruß Thorsten

Hallo,
ist leider mein erstes Display, was ich verwende. Aber über die Belegung siehe hier :

http://shieldlist.org/watterott/msd

Gruss Kalli