Pages: [1]   Go Down
Author Topic: Zeitschaltung / Probleme mit 2 Taster  (Read 1360 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 23
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Hamburg, Germany
Offline Offline
Sr. Member
****
Karma: 6
Posts: 291
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged


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

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

Offline Offline
Sr. Member
****
Karma: 10
Posts: 359
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo Savana,

in etwa so:


Code:
/****************************************************************/
// 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
« Last Edit: July 01, 2011, 02:04:13 pm by maverick1509 » Logged

Offline Offline
Sr. Member
****
Karma: 10
Posts: 359
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Offline Offline
Jr. Member
**
Karma: 0
Posts: 62
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

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

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
Logged

Copenhagen, Denmark
Offline Offline
Edison Member
*
Karma: 32
Posts: 1215
Have you testrun your INO file today?
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

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

Hallo Msquare,

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

Gruß savana
Logged

Pages: [1]   Go Up
Jump to: