Go Down

Topic: Gelöst: Bestimmten Programmablauf nur einmal durchführen (Read 811 times) previous topic - next topic

Paulxy

Dec 03, 2012, 04:05 pm Last Edit: Dec 04, 2012, 08:21 pm by Paulxy Reason: 1
Hallo alle zusammen !

Ich melde mich mal wieder zu Wort...nachdem ich schon einige "kleinere" Projekte erfolgreich absolviert habe, bleibe ich momentan noch an einer bestimmten Ecke hängen.
Und zwar habe ich eine Tür mit einem kleinen Taster versehen, der einmal den Eingang vom Arduino (pin 10) auf HIGH setzt, wenn die Tür geschlossen ist, und auf LOW wenn die Tür geöffnet ist.
Und jetzt mein Problem, wenn nun die Tür geöffnet wird, soll eine LED nur einmal auf HIGH und wieder auf LOW gesetzt werden. Bisher blinkt sie bei mir dauerhaft durch, solange der Taster auf LOW ist. Wenn nun wieder die Tür geschlossen wird, soll die LED etwas länger leuchten als die davor.
Mit einer while Schleife habe ich es auch schon versucht, aber man kommt leider nicht mehr aus der Schleife raus ! -_-
Ich weiß nicht genau wie ich das umsetzen soll. Irgendwie stehe ich gerade aufem Schlauch...ich brauche unbedingt einen Denkanstoß ! :)
Hier mein Sketch:
Code: [Select]
int tastertur = 10;
int led = 11;
int buttonState = 0;


void setup()
{
 pinMode(tastertur, INPUT);
 pinMode(led, OUTPUT);
 
}

void loop()
{
 buttonState = digitalRead(tastertur);
 if (buttonState == HIGH)
 {    
   digitalWrite(led, HIGH);
   delay(500);
   digitalWrite(led, LOW);
   delay(500);  
   }  
  else
  {    
    digitalWrite(led, HIGH);
    delay(2000);
    digitalWrite(led, LOW);
    delay(2000);    
  }
}


Freundliche Grüße
Paul

sth77

Okay, wenn nur der Denkanstoß gefragt ist: ;)
In diesem Fall musst du nicht den Zustand der Tür (also des Tasters) abfragen, sondern die Zustandsänderung. Zustandsänderungen sind in dem Fall Flankenwechsel von LOW auf HIGH bzw. andersrum von HIGH auf LOW. Du musst also abfragen: "War die Tür auf und ist jetzt die Tür zu, so lasse die LED einmal aufblinken."

Mein Arduino-Blog: http://www.sth77.de/ - letzte Einträge: Teensy 3.0 - Teensyduino unter Window 7 - Teensyduino unter Windows 8

Paulxy

Vielen Dank für die schnelle Antwort ! ;)
Vielleicht war Denkanstoß etwas missverständlich ausgedrückt  :D
Ok, diesen Gedanken hatte ich auch schon so in etwa, nur mein Problem liegt halt beim umsetzen ! (hätte ich vorher erwähnen müssen!)
Ich weiß einfach nicht wie ich den bestimmten Programmablauf pausieren kann oder wie ich das nennen soll...gibt es da sowas wie wait() ? :D
Oder wird das mit diesem blinkwithoutdelay http://www.arduino.cc/en/Tutorial/BlinkWithoutDelay umgesetzt ?
Wenn ja, wüsste ich momentan noch nicht wie ich das damit machen sollte ?! Wahrscheinlich vertue ich mich da auch.



Addi


Ok, diesen Gedanken hatte ich auch schon so in etwa, nur mein Problem liegt halt beim umsetzen ! (hätte ich vorher erwähnen müssen!)
Ich weiß einfach nicht wie ich den bestimmten Programmablauf pausieren kann oder wie ich das nennen soll...gibt es da sowas wie wait() ?


Nimm einfach eine Flagvariable (bool).

Addi
/ \    _|  _| o
 /--\ (_| (_| |

mkl0815

Der Trick ist nicht zun pausieren, sondern eine zusätzliche Variable z.B. "boolean blink" zu definieren. Diese wird auf "true" gesetzt, immer dann, wenn die Tür geöffnet wird. Also wenn sich der Zustand Deines Tasters von HIGH auf LOW ändert.
Innerhabl von loop() fragst Du nun in einem "IF-Block" die Variable "blink" ab, wenn sie TRUE ist, dann blinkst Du einmal und setzt innerhalb dieses Blocks die Variable wieder auf "FALSE". Damit blinkst Du beim nächsten Durchlauf nicht mehr, ohne zu warten oder was zu blockieren.
Erst wenn sich der Zustand des Tasters wieder von HIGH auf LOW ändert, wird die Variable "blink" wieder auf TRUE gesetzt.

Paulxy

Aha...ich habe es fasst. Ich glaube es ist schon zu spät für mich gerade noch den Fehler zu finden :D
Erstmal vielen dank !

Also ich habe das jetzt so wie mkl0815 gemacht. Wenn ich das Programm starte und die Tür dabei geschlossen ist (Taster = HIGH) dann blinkt die LED auch nur einmal, aber wenn ich die Tür dann wieder auf mache, dann blinkt die LED nicht nur einmal (mit längerem Abstand) sondern fröhlich weiter vor sich hin ?! Wo ist da der Fehler ?
Und wenn ich die Tür dann wieder schließe dann blinkt die LED auch wieder nur einmal, so wie es sein soll. Es hakt gerade nur noch wenn die Tür offen ist. Aber ich finde gerade meinen Fehler irgendwie nicht ! Wahrscheinlich übersehe ich da was mega einfaches !

Code: [Select]
int tastertur = 10;
int led = 11;
int buttonState = 0;
boolean schleife = true;
boolean schleife1 = true;

void setup()
{
  pinMode(tastertur, INPUT);
  pinMode(led, OUTPUT);
 
}

void loop()
{
  buttonState = digitalRead(tastertur);
  if (buttonState == HIGH)
  {
     
     if (schleife == true)
     {
     digitalWrite(led, HIGH);
     delay(500);
     digitalWrite(led, LOW);
     delay(500);
     schleife = false;
     schleife1 = true;
     }
  } 
     
   else
   {       
     
    if (schleife1 == true)
   {
     digitalWrite(led, HIGH);
     delay(2000);
     digitalWrite(led, LOW);
     delay(2000);
     schleife1 == false;
     schleife = true;
   }
  }
}

michael_x

Quote
Wahrscheinlich übersehe ich da was mega einfaches !

Sehr wahrscheinlich:
Mal abgesehen davon, dass es mühsam ist, herauszufinden was diese beiden Variablen bedeuten:

Code: [Select]
    schleife1 == false;
     schleife = true;


sind zwei verschiedene Operationen, wobei die erste effektiv nichts bewirkt ;)
Daher verhält sich der if - Teil anders als der else - Teil

Paulxy

Ouh hätte ich mal erwähnen sollen !
Ich habe jetzt mein Sketch nochmal etwas umgeändert, und es funktioniert ! :)

Code: [Select]
int tastertur = 10;
int led = 11;
int buttonState = 0;
boolean variable = true;

void setup()
{
  pinMode(tastertur, INPUT);
  pinMode(led, OUTPUT); 
}

void loop()
{
  buttonState = digitalRead(tastertur);
  if (buttonState == HIGH)
  {     
     if (variable == true)
     {
     digitalWrite(led, HIGH);
     delay(500);
     digitalWrite(led, LOW);
     delay(500);
     variable = false;     
     }
  }       
  else
  {         
     if (variable == false)
     {
     digitalWrite(led, HIGH);
     delay(2000);
     digitalWrite(led, LOW);
     delay(2000);     
     variable = true;
     }
  }
}


Code: [Select]
boolean variable
Das ist einfach eine Variable die einen bestimmten Zustnad je nach Tasterabfrage hat...hoffentlich versteht ihr das wie ich das meine ?!

Aber auf jedenfall vielen Dank ! :)

Grüße Paul

Go Up