HI!
Kurz vorweg, ich bin am verzweifeln...
Egal was ich bisher versucht habe, es läuft einfach nicht so wie
gewünscht!
Das ist jetzt mal das Minimum was ich mir eigentlich erhoffe:
Wenn der Arduino startet, soll ein schwarzer Bildschirm kommen, unten
links mit der Beschriftung "Optionen".
Bei einem "Klick" darauf, soll sich ein neuer Bildschirm aufbauen.
Vermutlich muss der TFT-Controller noch angegeben werden. Ich hatte auch
schon meine Traumata mit den GLCDs. Teilweise hatte der Lieferant nicht
einmal den richtigen Typ auf der Webseite angegeben. Viel Spaß noch...
Nathan B. schrieb:> Mein Problem dabei:> Setze ich die ersten 3 Zeilen des loop() ins setup(), dann geht es.
Na toll, dann laß es doch dort. Immerhin geht es dann ja.
Also, ich habe ja schon einiges mit bunten TFT's und mit Touchscreens
(kapazitiven) zu tun gehabt. Aber was ich da in deinem Quelltext sehe,
graust mich.
Deshalb ein paar Merksätze meinerseits:
1. Die Initialisierung und die Ansteuerung für Displays und für
Touchscreens gehören in entsprechende Lowlevel-Treiber in jeweils
eigenen Quellen und sie gehören separat ausgetestet und sinnvoll
gekapselt (soweit das in C möglich ist) - aber sowas gehört nicht nach
main.
2. die physische Ansteuerung eines Displays und das GDI gehören auch
getrennt.
3. Bemerke bitte den Unterschied zwischen Touch und Display. Das sind
nämlich 2 völlig unterschiedliche Dinge - und sie gehören auch völlig
unterschiedlich gehandhabt.
4. Touchscreens ohne Controller, also simple resistive, müssen
zeitzyklisch abgefragt werden, was auf ADC-Benutzung und Umschaltung
X-Messung und Y-Messung (also die Portcharakteristika umschalten)
hinausläuft. Sowas macht man wohl am besten im System- bzw. Timer-Tick.
Kapazitive Touchscreens haben regelmäßig ihren eigenen Controller und
ein I2C-Interface zuzüglich einer Interrupt-Leitung, die zumeist in der
Anlauf-Phase auch als Initialisier-Eingang fungiert. Die Benutzung läuft
darauf hinaus, den Touchcontroller erstmal richtig initialisiert zu
kriegen - einschließlich der notwendigen Pausen im ms Bereich, bis
dieser läuft und dann auf den Interrupt zu reagieren, also dann den
Touchcontroller auszulesen, den Zustand mit seiner Historie zu
vergleichen und ggf. Ereignisse zu generieren. Zumeist ist das
TouchDown, TouchMove und TouchUp.
So einfach wie du dir das denkst, ist es nicht. Also lies zuvor die
zuständigen Dokumentationen.
W.S.
Nathan B. schrieb:> bin absolut neu außerhalb BASIC
Mach die Zeilen doch in ein Unterprogramm, das du aus setup() aufrufst.
Wenn du es wieder mal brauchst, rufst du das Unterprogramm wieder auf.
So wie damals GOSUB in BASIC.
Das mit dem weissen Bildschirm konnte so gelöst werden
#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 mylcd(ILI9341,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
mylcd(240,320,A3,A2,A1,A0,A4);//width,height,cs,cd,wr,rd,reset
#include <stdint.h>
#include "TouchScreen.h"
// These are the pins for the shield! on UNO
#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 MINPRESSURE 3800
#define MAXPRESSURE 4000
// For better pressure precision, we need to know the resistance
// between X+ and X- Use any multimeter to read it
// For the one we're using, its 300 ohms across the X plate
TouchScreen ts = TouchScreen(XP, YP, XM, YM, 300);
//define some colour values
#define BLACK 0x0000
#define BLUE 0x001F
#define RED 0xF800
#define GREEN 0x07E0
#define CYAN 0x07FF
#define MAGENTA 0xF81F
#define YELLOW 0xFFE0
#define WHITE 0xFFFF
void setup()
{
Serial.begin(9600);
mylcd.Init_LCD();
Serial.println(mylcd.Read_ID(), HEX);
mylcd.Fill_Screen(BLACK);
// default button is "0" Green
mylcd.Set_Text_Mode(0);
//display 1 times string
//mylcd.Fill_Screen(0x0000); // write black to screen
mylcd.Set_Text_colour(RED);
mylcd.Set_Text_Back_colour(BLACK);
mylcd.Set_Text_Size(sizeText);
//mylcd.Print_String("text", 0, 16); // first row, 16 pixel down from
left top corner
mylcd.Print_String("string", 100, 120);
}
void loop()
{
comme:
digitalWrite(13, HIGH);
TSPoint p = ts.getPoint();
digitalWrite(13, LOW);
pinMode(XM, OUTPUT);
pinMode(YP, OUTPUT);
mylcd.Set_Text_Mode(0);
mylcd.Fill_Screen(0x0000); // write black to screen
mylcd.Set_Text_colour(RED);
mylcd.Set_Text_Back_colour(BLACK);
mylcd.Set_Text_Size(3);
mylcd.Print_String("text", 30, 30);
// we have some minimum pressure we consider 'valid'
// pressure of 0 means no pressing!
Serial.print("X = "); Serial.print(p.x);
Serial.print("\tY = "); Serial.print(p.y);
Serial.print("\tPressure = "); Serial.println(p.z);
delay(150);
if (p.z > MINPRESSURE && p.z < MAXPRESSURE && high_flag == 0) {
Serial.print("X = "); Serial.print(p.x);
Serial.print("\tY = "); Serial.print(p.y);
Serial.print("\tPressure = "); Serial.println(p.z);
buttonState = 1;
Serial.print("buttonState1: "); Serial.println(buttonState);
Serial.print("high_flag: "); Serial.println(high_flag);
delay(50);
}
goto comme;
}