Pages: [1]   Go Down
Author Topic: Gelöst: Bestimmten Programmablauf nur einmal durchführen  (Read 719 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 30
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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ß ! smiley
Hier mein Sketch:
Code:
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
« Last Edit: December 04, 2012, 02:21:42 pm by Paulxy » Logged

Germany
Online Online
Edison Member
*
Karma: 48
Posts: 2337
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Okay, wenn nur der Denkanstoß gefragt ist: smiley-wink
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."

Logged

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

Offline Offline
Newbie
*
Karma: 0
Posts: 30
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Vielen Dank für die schnelle Antwort ! smiley-wink
Vielleicht war Denkanstoß etwas missverständlich ausgedrückt  smiley-grin
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() ? smiley-grin
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.


Logged

Offline Offline
Full Member
***
Karma: 5
Posts: 193
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

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

Offline Offline
Edison Member
*
Karma: 21
Posts: 1419
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 30
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Aha...ich habe es fasst. Ich glaube es ist schon zu spät für mich gerade noch den Fehler zu finden smiley-grin
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:
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;
   }
  }
}
Logged

Germany
Offline Offline
Faraday Member
**
Karma: 59
Posts: 3071
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
    schleife1 == false;
     schleife = true;

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

Offline Offline
Newbie
*
Karma: 0
Posts: 30
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Code:
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:
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 ! smiley

Grüße Paul
Logged

Pages: [1]   Go Up
Jump to: