Go Down

Topic: pinmode wechselschaltung (Read 1 time) previous topic - next topic

Poser

hallo

ich hab ein Arduino 2560 mit 3,2" Touch alles funktioniert soweit. ich möchte nur das zb. beim drücken des touch auf ein button (pin12 Low) und (pin11 high) ist und wenn ich auf den anderen button drücke gewechselt wird so das immer der eine low der andere high ist.


vielen dank im voraus

mkl0815

Und worin besteht nun genau die Frage?
Geht es um das Zeichenen auf dem TFT, die Abfrage eine "touch" Ereignisses oder um das Umschalten der Pins?

Was mich halt wundert ist, das Du die Frage schonmal gestellt hast und dann aber im Thread nicht mehr geantwortet hast, nachdem Du Hilfe bekommen hast.
Oder geht es jetzt um ein anderen Projekt? Das Zeichnen der Buttons, erkennen von Touch-Ereignissen und auch das schalten von Pins sollte aber das gleiche sein.

Mario.

Poser

es ist ein anderes project

es geht um die pins denn rest mit touch funktioniert ja alles nur das die pins nicht wechseln

mkl0815

dann poste doch mal den Sketch. Woher sollen wir sonst wissen welche Pins Du wie schalten willst.

Prinzipiell ist es so, das Du im setup() die Pins mittels "pinMode(11,OUTPUT)" und pinMode(12,OUTPUT) zunächst als Ausgänge definieren musst.
Dann definierst Du Dir am einfachsten eine Funktion pinSwap(), welche die Pins umschaltet.
Code: [Select]

void pinSwap() {
    //aktuellen Zustand lesen
    boolean state = digitalRead(11);
    //pins umschalten
    digitalWrite(11,!state);
    digitalWrite(12,state);
}

Immer wenn der zweite Button gedrückt wurde, rufst Du diese Funktion auf, um die Pins umzuschalten.

Achtung, das ist keine sehr schöne Lösung, weil sie sehr spezifisch auf Dein konkretes Problem bezogen ist. Mir ging es dabei vorwiegend dsarum, das es einfach ist.
Funktionen sollten in der Regel allgemeiner programmiert werden, damit man sie wiederverwerten kann. Z.B. könnte man die Pin-Nummern als Parameter übergeben. Zusätzlich auch den status.

Mario.

Poser

#4
Apr 17, 2013, 05:07 pm Last Edit: Apr 17, 2013, 05:20 pm by uwefed Reason: 1
Hi hier der komplette sketch


Das Relais1 und Relais2 sollen immer im wechsel geschaltet werden
Code: [Select]
// ITDB02_Touch_Button
// This program is a quick demo of how create and use buttons.
//
// This program requires the ITDB02_Graph library (8bit mode)
// or ITDB02_Graph16 (16bit mode).
//
// It is assumed that the ITDB02 module is connected to a
// ITDB02 Shield, a ITDB02 Mega Shield or that you know how
// to change the pin numbers in the setup.
//

#include <UTFT.h>
#include <ITDB02_Touch.h>

// Declare which fonts we will be using
extern uint8_t BigFont[];// Pin 13 has an LED connected on most Arduino boards.
// give it a name:
int Relais6 = 13;
int Relais5 = 12;
int Relais4 = 11;
int Relais3 = 10;
int Relais2 = 9;
int Relais1 = 8;
int Relais7 = 7;


// Uncomment the next line for Arduino 2009/Uno
//UTFT myGLCD(ITDB32S,19,18,17,16);   // Remember to change the model parameter to suit your display module!
//ITDB02_Touch  myTouch(15,10,14,9,8);

// Uncomment the next line for Arduino Mega
UTFT myGLCD(ITDB32S,38,39,40,41);   // Remember to change the model parameter to suit your display module!
ITDB02_Touch  myTouch(6,5,4,3,2);

int x, y;
char stCurrent[20]="";
int stCurrentLen=0;
char stLast[20]="";

void setup()
{
// Initial setup
 myGLCD.InitLCD(LANDSCAPE);
 myGLCD.clrScr();

 myTouch.InitTouch(LANDSCAPE);
 myTouch.setPrecision(PREC_MEDIUM);

 myGLCD.setFont(BigFont);
 //myGLCD.setBackColor(0, 0, 255);

// initialize the digital pin as an output.
 pinMode(Relais6, OUTPUT);
 pinMode(Relais5, OUTPUT);
 pinMode(Relais4, OUTPUT);
 pinMode(Relais3, OUTPUT);
 pinMode(Relais2, OUTPUT);
 pinMode(Relais1, OUTPUT);
 pinMode(Relais7, OUTPUT);
 
 
 
 
// Draw the upper row of buttons
 for (x=0; x<6; x++);
   {
 myGLCD.setBackColor (0, 0, 0);
 myGLCD.setColor(255, 255, 255);
 myGLCD.fillRoundRect (190, 15, 240, 40);
 myGLCD.drawRoundRect (190, 15, 240, 40);
 myGLCD.print("BAD&KUECHE", 10, 20);
 myGLCD.print("ON", 200, 20);
 myGLCD.fillRoundRect (250, 15, 300, 40);
 myGLCD.drawRoundRect (250, 15, 300, 40);  
 myGLCD.print("OFF", 250, 20);
 myGLCD.print("WOHN", 10, 60);
 myGLCD.fillRoundRect (190, 55, 240, 80);
 myGLCD.drawRoundRect (190, 55, 240, 80);
 myGLCD.print("ON", 200, 60);
 myGLCD.fillRoundRect (250, 55, 300, 80);
 myGLCD.drawRoundRect (250, 55, 300, 80);
 myGLCD.print("OFF", 250, 60);
 myGLCD.print("AUSSEN", 10, 100);
 myGLCD.fillRoundRect (190, 95, 240, 120);
 myGLCD.drawRoundRect (190, 95, 240, 120);
 myGLCD.print("ON", 200, 100);
 myGLCD.fillRoundRect (250, 95, 300, 120);
 myGLCD.drawRoundRect (250, 95, 300, 120);
 myGLCD.print("OFF", 250, 100);
 myGLCD.print("RADIO", 10, 140);
 myGLCD.fillRoundRect (190, 135, 240, 160);
 myGLCD.drawRoundRect (190, 135, 240, 160);
 myGLCD.print("ON", 200, 140);
 myGLCD.fillRoundRect (250, 135, 300, 160);
 myGLCD.drawRoundRect (250, 135, 300, 160);
 myGLCD.print("OFF", 250, 140);
 myGLCD.print("TERRASSE", 10, 180);
 myGLCD.fillRoundRect (190, 175, 240, 200);
 myGLCD.drawRoundRect (190, 175, 240, 200);
 myGLCD.print("ON", 200, 180);
 myGLCD.fillRoundRect (250, 175, 300, 200);
 myGLCD.drawRoundRect (250, 175, 300, 200);
 myGLCD.print("OFF", 250, 180);
 myGLCD.print("UMSCHALTUNG", 10, 220);
 myGLCD.fillRoundRect (190, 215, 240, 239);
 myGLCD.drawRoundRect (190, 215, 240, 239);
 myGLCD.print("G", 200, 220);
 myGLCD.fillRoundRect (250, 215, 300, 239);
 myGLCD.drawRoundRect (250, 215, 300, 239);
 myGLCD.print(" A ", 250, 220);

 }

 }


void updateStr(int val)
{
 if (stCurrentLen<20)
 {
   stCurrent[stCurrentLen]=val;
   stCurrent[stCurrentLen+1]='\0';
   stCurrentLen++;
   myGLCD.setColor(0, 255, 0);
   myGLCD.print(stCurrent, LEFT, 224);
 }
 
 {
   
 }
}
// Draw a red frame while a button is touched
void waitForIt(int x1, int y1, int x2, int y2)
{
 myGLCD.setColor(255, 0, 0);
 myGLCD.drawRoundRect (x1, y1, x2, y2);
 while (myTouch.dataAvailable())
   myTouch.read();
 myGLCD.setColor(255, 255, 255);
 myGLCD.drawRoundRect (x1, y1, x2, y2);
}
void loop()
{
 while (true)
 {
   if (myTouch.dataAvailable())
   {
     myTouch.read();
     x=myTouch.getX();
     y=myTouch.getY();
     {
     if ((y>=15) && (y<=40))  // Upper row
     {
       if ((x>=190) && (x<=240))  // Button: Bad & KÜCHE ON
     {
       digitalWrite(Relais5, LOW);   // turn the LED on (HIGH is the voltage level)
       waitForIt(190, 15, 240, 40);
                 }
       if ((x>=250) && (x<=300))  // Button: Bad & KÜCHE OFF
       digitalWrite(Relais5, HIGH);   // turn the LED on (HIGH is the voltage level)
       waitForIt(250, 15, 300, 40);
        }
        {
       if ((y>=55) && (y<=80))  // Upper row
       {          
       if ((x>=190) && (x<=240))  // Button: WOHN ON
       {
       digitalWrite(Relais6, LOW);   // turn the LED on (HIGH is the voltage level)
       waitForIt(190, 55, 240, 80);
       }
       if ((x>=250) && (x<=300))  // Button: WOHN OFF
       digitalWrite(Relais6, HIGH);   // turn the LED on (HIGH is the voltage level)
       waitForIt(250, 55, 300, 80);
       }
       if ((y>=95) && (y<=120))  // Upper row
       {
       if ((x>=190) && (x<=240))  // Button: AUSSEN ON
       {
       digitalWrite(Relais3, LOW);   // turn the LED on (HIGH is the voltage level)
       waitForIt(190, 95, 240, 120);
       }
       if ((x>=250) && (x<=300))  // Button: AUSSEN OFF
       digitalWrite(Relais3, HIGH);   // turn the LED on (HIGH is the voltage level)
       waitForIt(250, 95, 300, 120);
       }
       if ((y>=135) && (y<=160))  // Upper row
       {
       if ((x>=190) && (x<=240))  // Button: RADIO ON
       {
       digitalWrite(Relais4, LOW);   // turn the LED on (HIGH is the voltage level)
       waitForIt(190, 135, 240, 160);
       }
       if ((x>=250) && (x<=300))  // Button: RADIO OFF
       digitalWrite(Relais4, HIGH);   // turn the LED on (HIGH is the voltage level)
       waitForIt(250, 135, 300, 160);
       }
       if ((y>=175) && (y<=200))  // Upper row
       {
       if ((x>=190) && (x<=240))  // Button: TERRASSE ON
       {
       digitalWrite(Relais7, LOW);   // turn the LED on (HIGH is the voltage level)
       waitForIt(190, 175, 240, 200);
       }
       if ((x>=250) && (x<=300))  // Button: TERRASSE OFF
       digitalWrite(Relais7, HIGH);   // turn the LED on (HIGH is the voltage level)
       waitForIt(250, 175, 300, 200);
       }
       if ((y>=215) && (y<=238))  // Upper row
       {
     [u][i][b]  if ((x>=190) && (x<=240))  // Button: UMSCHALTUNG GENERATOR / AKKU   G
       digitalWrite(Relais1, HIGH);   // turn the LED on (LOW is the voltage level)
       digitalWrite(Relais2, LOW);    // turn the LED on (HIGH is the voltage level)
       waitForIt(190, 215, 240, 238);
       }
       if ((x>=250) && (x<=300))  // Button: UMSCHALTUNG GENERATOR / AKKU   A
       digitalWrite(Relais1, LOW);   // turn the LED on (HIGH is the voltage level)
       digitalWrite(Relais2, HIGH);   // turn the LED on (LOW is the voltage level)
       waitForIt(250, 215, 300, 238);[/b][/i][/u]
       }
        }
     }
   }
 }


[EDIT] bitte den code-Tag (#) verwenden und nicht den sub-Tag. Uwe [/EDIT]

mkl0815

Tut mir leid, aber das ist doch der gleiche Sketch den Du schon in
http://arduino.cc/forum/index.php/topic,129829.msg991581.html
und in
http://arduino.cc/forum/index.php/topic,131854.msg991563.html
hattest.
Dort hast Du auf die Hinweise auch nach einer Weile nicht mehr reagiert.
Weisst Du den wenigstens an welcher Stelle im Sketch Du die Pins schalten musst?

Ich habe das gerade mal auf meinem TFT getestet, der Sketch enthält auf jeden Fall noch logische Fehler. Die Funktion "waitForIt(x1,y1,x2,y2)" wird vermutlich falsch verwendet, denn der rote Rahmen den diese Funktion um den gerade gedrückten Button malen soll, ist ständig woanders, aber fast nie um den tatsächlich gedrückten Button.
Ich würde Die empfehlen erstmal per Serial.println() Debugausgaben auf die serielle Schnittstelle zu schreiben, damit Du lernst wo in Deinem Sketch was nicht so funktioniert wie es soll. Oder zu lernen wie der Sketch überhaupt funktioniert. Sonst sehe ich diesen Thread genau so enden wie die letzten beiden.

Mario.

Poser

#6
Apr 17, 2013, 09:24 pm Last Edit: Apr 17, 2013, 10:46 pm by uwefed Reason: 1
hi

ich will es erweitern

Code: [Select]
if ((x>=190) && (x<=240))  // Button: UMSCHALTUNG GENERATOR / AKKU   G
       digitalWrite(Relais1, HIGH);   // turn the LED on (LOW is the voltage level)
       digitalWrite(Relais2, LOW);    // turn the LED on (HIGH is the voltage level)
       waitForIt(190, 215, 240, 238);
       }
       if ((x>=250) && (x<=300))  // Button: UMSCHALTUNG GENERATOR / AKKU   A
       digitalWrite(Relais1, LOW);   // turn the LED on (HIGH is the voltage level)
       digitalWrite(Relais2, HIGH);   // turn the LED on (LOW is the voltage level)
       waitForIt(250, 215, 300, 238);


dieser teil schaltet nicht der rahmen ist bei mir da wo ich drücke und der rest funzt genauso wie ich es haben möchte nur der letzte teil wo ich 2 pins benöte noch nicht

marko

Poser

oder kann man die buttons als taster und nicht als schalter machen
so das zb. einmal darauf drücken an und nochmals aus ist ??


Go Up