Go Down

Topic: Zeitschaltung / Probleme mit 2 Taster (Read 1 time) previous topic - next topic

savana

Hallo werte Arduino Gemeinde,

Habe folgendes problem habe eine Zeitschaltung programmiert die es mir erlaubt mit 2 Tastern 2 LEDs getrennt voneinander zu schalten.
Wenn ich beide Taster betätige ist nur eine LED in Funktion, es sollen aber beide leuchten je nach dem welche Zeit dafür vorgesehen ist.
Ist die Zeit von Taster 1 abgelaufen z.B 3 sec. dann erst kann ich Taster 2 betätigen und die LED 2 leuchtet.

Ich würde mich über jede Hilfe freuen.Den Quell Text füge ich hinzu.

/****************************************************************/
// LED Zeitschaltung bei betätigung des Tasters Pin 12 oder Pin 10
// leuchtet die LED, bis die vorgegebene Zeit abgelaufen ist
// bsp. delay(2000); = 2 sec Leuchtdauer
/****************************************************************/
int ledPin2=10; 
int inputPin2=9;
int ledPin1=13;
int inputPin1=12;
int val1 = 0; 
int val2 = 0;
 
void setup()         // Initialisierung 
{                             
pinMode(ledPin1,OUTPUT);        // LED-Pin als Ausgang
pinMode(inputPin1,INPUT);   // Schalter-Pin als Eingang
pinMode(ledPin2,OUTPUT);        // LED-Pin als Ausgang
pinMode(inputPin2,INPUT);   // Schalter-Pin als Eingang
}   
void loop()           // Endlosschleife

val1=digitalRead(inputPin1);   // Taster einlesen   
if (val1 == HIGH)      // Testen ob der Taster auf High steht

val2=digitalRead(inputPin2);   // Taster einlesen   
if (val2 == HIGH)      // Testen ob der Taster auf High steht
   
  {
  digitalWrite(ledPin1, LOW);   // LED ausschalten
  digitalWrite(ledPin2, LOW);   // LED ausschalten
  }
  else
  {
  digitalWrite(ledPin1, HIGH);   // LED einschalten
  delay(2000);          // Leuchtdauer der LED
 
  digitalWrite(ledPin2, HIGH);   // LED einschalten
  delay(2000);          // Leuchtdauer der LED
  }
}               

markbee

Hallo,

delay() hält das gesamte Programm an dieser Stelle an. Besser ist es, z.B. mit millis() zu arbeiten. Dazu setzt man mit anfangszeit = millis(); eine anfangszeit und kontrolliert diese dann mit einer zweiten Variable (dem ursprünglichen delay-Wert) auf den Ablauf der Zeit hin.

markbee

savana

Hallo markbee,

Danke für deine sehr schnelle Hilfe, konnte das problem nicht lösen!! mit millis
könntest du mir noch einen Hinweis geben wo ich das in meinen  Quelltext einpflege.
Habe es versucht aber kein erfolg .
Wära dir oder auch jemand anderem aus Forum Dankbar, wenn ich Hilfe bekomme.

maverick1509

#3
Jul 01, 2011, 09:02 pm Last Edit: Jul 01, 2011, 09:04 pm by maverick1509 Reason: 1
Hallo Savana,

in etwa so:


Code: [Select]

/****************************************************************/
// LED Zeitschaltung bei betätigung des Tasters Pin 12 oder Pin 10
// leuchtet die LED, bis die vorgegebene Zeit abgelaufen ist
// bsp. delay(2000); = 2 sec Leuchtdauer
/****************************************************************/
int ledPin2=10;  
int inputPin2=9;
int ledPin1=13;
int inputPin1=12;
int val1 = 0;  
int val2 = 0;
unsigned long start,aktuell;
 
void setup()         // Initialisierung  
{                            
pinMode(ledPin1,OUTPUT);        // LED-Pin als Ausgang
pinMode(inputPin1,INPUT);   // Schalter-Pin als Eingang
pinMode(ledPin2,OUTPUT);        // LED-Pin als Ausgang
pinMode(inputPin2,INPUT);   // Schalter-Pin als Eingang
}    
void loop()           // Endlosschleife
{  
aktuell = millis();
if(aktuell - start > 3000 ){ //Schleife wird nur alle drei Sekunden ausgeführt
val1=digitalRead(inputPin1);   // Taster einlesen  
if (val1 == HIGH)      // Testen ob der Taster auf High steht

val2=digitalRead(inputPin2);   // Taster einlesen  
if (val2 == HIGH)      // Testen ob der Taster auf High steht
 
 {
 digitalWrite(ledPin1, LOW);   // LED ausschalten
 digitalWrite(ledPin2, LOW);   // LED ausschalten
 }
 else
 {
 digitalWrite(ledPin1, HIGH);   // LED einschalten
 
 
 digitalWrite(ledPin2, HIGH);   // LED einschalten
 
 }

start=millis();
}

}              


leider hab ich jetzt keine Zeit das zu testen, aber ich glaube es stimmt bei dir noch was nicht.

Was ist denn mit der Zeile

if (val1 == HIGH)      // Testen ob der Taster auf High steht

da fehlt eine geschweifte Klammer, was soll denn da passieren wenn das if true ist??
Gruß
Bernward

maverick1509

Hab noch mal deine erste Mail gelesen, beschreib noch mal genauer, wie sich die beiden LEDs
verhalten sollen, geht aus dem ersten Beitrag nicht klar hervor, jedenfalls kann es so noch nicht funktionieren.
Gruß
Bernward

TelosNox

Du hast mehrere Probleme in deinem Code. Alleine schonmal die verschachtelte If Abfrage.

 val1=digitalRead(inputPin1);   // Taster einlesen   
if (val1 == HIGH)      // Testen ob der Taster auf High steht

val2=digitalRead(inputPin2);   // Taster einlesen   
if (val2 == HIGH)      // Testen ob der Taster auf High steht


Dieser Code macht folgendes:
Immer: Taster 1 einlesen und in val1 schreiben.
Immer: val1 testen ob es auf HIGH steht.
Nur wenn ja: dann Taster 2 einlesen und in val2 schreiben.
Immer: val2 testen, ob es auf HIGH steht.

Der Wert von val2 wird also nur dann richtig ermittelt, wenn val1 == HIGH ist.
Das kommt davon, wenn man keine Blockklammern verwendet.
Die Frage ist sowieso, ob das verschachtelt sein soll. Das wäre nämlich das nächste Problem. Die ganze Geschichte wäre dann nur true, wenn beide Taster gedrückt sind.

Ich nehme mal an, dass du es so haben möchstes, dass eine Betätigung von Taster 1 die LED 1 für 2 sec einschaltet. Unabhängig soll Taster 2 die LED 2 für 2 sec leuchten lassen.

Das müsste dann z.B. so aussehen:


/****************************************************************/
// LED Zeitschaltung bei betätigung des Tasters Pin 12 oder Pin 10
// leuchtet die LED, bis die vorgegebene Zeit abgelaufen ist
// bsp. delay(2000); = 2 sec Leuchtdauer
/****************************************************************/
int ledPin2=10; 
int inputPin2=9;
int ledPin1=13;
int inputPin1=12;
int val1 = LOW; 
int val2 = LOW;
unsigned long led1Millis = 0;
unsigned long led2Millis = 0;
 
void setup()         // Initialisierung 
{                             
pinMode(ledPin1,OUTPUT);        // LED-Pin als Ausgang
pinMode(inputPin1,INPUT);   // Schalter-Pin als Eingang
pinMode(ledPin2,OUTPUT);        // LED-Pin als Ausgang
pinMode(inputPin2,INPUT);   // Schalter-Pin als Eingang
}   
void loop()           // Endlosschleife

val1=digitalRead(inputPin1);   // Taster einlesen
val2=digitalRead(inputPin2);   // Taster einlesen   

if (val1 == HIGH && led1Millis == 0)      // Testen ob der Taster auf High steht und ob die led nicht schon leuchtet
{
    digitalWrite(ledPin1, HIGH);   // LED einschalten
    led1Millis = millis();     //einschaltzeit merken
  } else if (led1Millis + 2000 < millis()) //led leuchtet bereits seit 2 sec
  {
    digitalWrite(ledPin1, LOW);   // LED ausschalten
    led1Millis = 0;      //einschaltzeit zurücksetzen
  }

if (val2 == HIGH && led2Millis == 0)      // Testen ob der Taster auf High steht und ob die led nicht schon leuchtet
{
    digitalWrite(ledPin2, HIGH);   // LED einschalten
    led2Millis = millis();     //einschaltzeit merken
  } else if (led2Millis + 2000 < millis()) //led leuchtet bereits seit 2 sec
  {
    digitalWrite(ledPin2, LOW);   // LED ausschalten
    led2Millis = 0;      //einschaltzeit zurücksetzen
  }
}         


Das verhalten des Codes wäre so, dass ein gedrückter Taster die LED für 2 sec startet. Bleibt der Taster gedrückt, starten nach 2 sec automatisch wieder die nächsten 2 sec leuchtdauer, bis der Taster nach ablauf der 2 sec auf low ist. Beide LEDs funktionieren unabhängig voneinander.

Ob Tippfehler drin sind oder so konnte ich jetzt nicht testen, das sieht man dann aber beim kompilieren.

savana

Hallo TelosNox,

zunächst besten Dank für Deine sehr schnelle und professionelle Hilfe.
Dein Quell Code habe ich getestet  funktioniert  einwandfrei.

Da ich Anfänger bin  habe ich gewisse Dinge nicht gesehen bzw. beachtet, nach dem ich mir Deinen Quell Code angesehen habe ist  mir klar geworden wo der Fehler bei meinen Quell Code ist.

Habe hierbei eine Menge gelernt.

Besten Dank nochmal.

Gruß  savana

Msquare

Ich habe einen kleine tutorial über das mit delay und millis usw. geschrieben auf http://arduino.cc/playground/Code/AvoidDelay (in English)

savana

Hallo Msquare,

Danke für deinen guten Tipp hat mir sehr geholfen.

Gruß savana

Go Up