Tach zusammen!
Ich hab da mal ne kleine Frage zum Adafruit Touchscreen......ich habe mir auf die Benutzeroberfläche n paar Taster gebastelt....drückt man diese passiert auch das was passieren soll...das Problem dabei:
Das Signal kommt "getaktet" an....zur erklärung:
Ich will ein Relay ansteuern, dieses soll schalten solange ich die Schaltfläche gedrückt halte, und trennen sobald ich los lasse. Was meine Kostruktion mach ist: Wenn ich drücke geht das Relais im 1/10 Sekunden Takt an und wieder aus.....
Das is der Sketch dazu:
if((x > PLUSBUTTON_X) && (x < (PLUSBUTTON_X + PLUSBUTTON_W))) {
if ((y > PLUSBUTTON_Y) && (y <= (PLUSBUTTON_Y + PLUSBUTTON_H))) {
Serial.println("MOVE");
digitalWrite(Relay_2, RELAY_ON);
hoch();}
digitalWrite(Relay_2, RELAY_OFF);
Bei dieser Variante geht das Relay an sobald ich drücke, aber dann nicht mehr aus:
if((x > MINUSBUTTON_X) && (x < (MINUSBUTTON_X + MINUSBUTTON_W))) {
if ((y > MINUSBUTTON_Y) && (y <= (MINUSBUTTON_Y + MINUSBUTTON_H))) {
Serial.println("MOVE");
digitalWrite(Relay_1, RELAY_ON,);
bewegung();
Jemand ne Idee?
DANKESCHÖÖÖÖN!
Die Serial Ausgabe musst du bei sowas schon mal entfernen (oder mit millis() zeitgesteuert machen). Damit müllst du den Ausgangspuffer zu und wenn er voll ist blockiert das Programm erst mal.
Ich weiß aber nicht ob das der einzige Fehler ist. Irgendwie fehlt da ein else-Zweig. Also das Relais nur ausschalten wenn der Knopf nicht gedrückt ist.
Okay. Danke schonmal dafür! Die Serielle Ausgabe war nur zur zusätzlichen Kontrolle für mich. Entferne ich gleich mal.
Kannst Du Deinen Hinweis zum else bitte etwas präzisieren? Wie müsste das etwa aussehen in dem Fall?
if (knopf gedrückt)
{
Relais an
}
else
{
Relais aus
}
Genauso wie bei einem mechanischen Taster auch. Man könnte auch die Zustandswechsel registrieren und nur dann schalten wenn sich was ändert. Aber für das Relais macht das keinen Unterschied.
So sieht das Gebilde jetzt aus....
{if
({
if((x > MINUSBUTTON_X) && (x < (MINUSBUTTON_X + MINUSBUTTON_W))) {
if ((y > MINUSBUTTON_Y) && (y <= (MINUSBUTTON_Y + MINUSBUTTON_H)))
}})
{digitalWrite(Relay_1, RELAY_ON);}
else
{digitalWrite(Relay_1, RELAY_OFF);} }
....funzt aber nicht....wo liegt mein Denkfehler?
Oder liegt der Hund im Touchscreen Sketch selbst begraben? Mir ist aufgefallen, dass der Button in dem Moment in dem er gedrückt wird ebenfalls "taktet"
if (ts.touched())
{
TS_Point p = ts.getPoint();
while ( ! ts.bufferEmpty() )
{
p = ts.getPoint();
}
p.x = map(p.x, TS_MINY, TS_MAXY, 0, tft.height());
p.y = map(p.y, TS_MINX, TS_MAXX, 0, tft.width());
int y = tft.height() - p.x;
int x = p.y;
Langsam wird n Schuh draus....
{
if((x > MINUSBUTTON_X) && (x < (MINUSBUTTON_X + MINUSBUTTON_W)))
if((y > MINUSBUTTON_Y) && (y <= (MINUSBUTTON_Y + MINUSBUTTON_H)))
{digitalWrite(Relay_1, RELAY_ON);}
if ( ts.bufferEmpty() )
delay (10);
{digitalWrite(Relay_1, RELAY_OFF);}
}
Jetzt muss ich es bloß noch schaffen das delay durch millis zu ersetzen....hirn
kann mir da bitte jemand auf die Sprünge helfen? Ich werd noch irre....
Jetzt muss ich es bloß noch schaffen das delay durch millis zu ersetzen
Ich finde, ein delay(10) braucht man nicht zu ersetzen 
Wenn dein sketch sich entschlossen hat, das Relais ganz kurz anzuziehen und gleich wieder auszuschalten,
(wofür 10 ms schon ziemlich wenig ist), gibts wohl nicht viel, was unbedingt in dieser kurzen Zeit parallel ablaufen muss. Oder unter welchen Umständen diese 10 ms vorzeitig abgebrochen werden sollten.
Wenn doch, wird das delay() nicht durch millis() ersetzt, sondern durch eine Zustandsvariable, die sagt, dass z.Zt. die Phase "Relais An" aktiv ist und seit wann.
void RelaisSchalten()
{
const uint_16_t RELAISDAUER=50; // msec
static boolean RelaisAktiv;
static unsigned long RelaisAktivStart;
if ( imTastenbereich(x,y, dx, dy) && RelaisAktiv == false )
{
RelaisAktiv = true;
RelaisAktivStart = millis();
digitalWrite(Relay_1, RELAY_ON);
}
if (RelaisAktiv && ( millis() - RelaisAktivStart > RELAISDAUER) )
{
RelaisAktiv = false;
digitalWrite(Relay_1, RELAY_OFF);
}
}
bool imTastenbereich(int x, int y, byte dx, byte dy)
liefert nur true zurück, wenn eine neue touchscreen-Betätigung erkannt wird, und diese im gewünschten Bereich war (Aufgabe für dich ...)
RelaisSchalten()
kann und sollte so oft wie möglich aufgerufen werden und in loop auch sonst nichts mit delay() enthalten sein. Aber beliebiges andere, das dann gleichzeitig ablaufen wird.
Dein Problem besteht darin, dass der Hauptteil eines Sketches immer im Loop läuft. Mach' es doch so:
- wird ein Tastendruck erkannt, setze eine Variable auf einen Wert größer 1
- prüfe, ob die Variable größer 0 ist und schalte den Ausgang, wenn nicht ausschalten
- verringere die Variable um 1
Damit erreichst du ein stabiles Verhalten ...
Vielen Dank für eure Hilfe! Ich komme der Sache deutlich näher! 
...hab aber schon das nächste Problem ausgemacht....dazu aber neuer Thread zwecks Übersichtlichkeit... 