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));
}
}