INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Led soll zeitversetzt ausgehen
07.03.2015, 14:28 (Dieser Beitrag wurde zuletzt bearbeitet: 07.03.2015 14:33 von Affenbrot.)
Beitrag #1
Led soll zeitversetzt ausgehen
Moin moin jungs,

habe da eine kleine Frage. Probier gerade ein wenig mit dem Arduino rum und versuch ein if .. else bedingung aufzustellen.

bekomm das aber nicht so hin wie ich möchte.

Vielleicht kann mir einer helfen.

Der Code


const int buttonPin = 2;
const int ledPin = 5;
const int Warten = 666;



void setup() {

pinMode(ledPin, OUTPUT);

pinMode(buttonPin, INPUT);

}

void loop(){


if (digitalRead(buttonPin) == HIGH && digitalRead(buttonPin) <= Warten) // if-bedingung : wenn knopf HIGH und weniger als 1 Sec HIGH dann soll die LED leuchten
{
digitalWrite(ledPin, HIGH);
delay(3000);
}
else
(digitalRead(buttonPin) != HIGH && digitalRead(buttonPin) >= Warten); // else bedingung : wenn knopf ungleich HIGH ist und ZEIT auch größer als 1 sec ist, dann Programm abrechen
{
digitalWrite(ledPin, LOW);
}


}



wäre für ein Antwort dankbar.

Gruß

Vielleicht sollte ich auch schreiben , was der Ardunio macht. die LED leuchtet nur für 3 Sekunden wenn ich den Knopf betätige. mehr nicht
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
07.03.2015, 15:17 (Dieser Beitrag wurde zuletzt bearbeitet: 07.03.2015 15:39 von marcus.)
Beitrag #2
RE: Led soll zeitversetzt ausgehen
Hallo Affenbrot!

Der Fehler liegt hier:

Code:
digitalRead(buttonPin) <= Warten

Der Eingang ist entweder High oder Low, also wahr oder falsch, 1 oder 0.

Warten kann man so nicht vergleichen, du musst die vergangene Zeit vergleichen. Z.B. millis() hernehmen und zudem noch eine Variable a la "zuletztGedrueckt".

Pseudocode, vermutlich nicht ganz fehlerfrei da schnell heruntergeschrieben:
Code:
if (        digitalRead(buttonPin)   &&   (   millis()>(zuletztGedrueckt+Warten)  )     )
{
zuletztGedrueckt=millis(); //merken wann gedrueckt wurde. Millis() enthält die aktuellen mS seit Programmstart.

digitalWrite(ledPIN, high); //An

//debouncen vom Schalter wird eigentlich nicht benötigt, denn die duch zuletztGedrueckt eingeführte Verzögerung erledigt das.

}
else if (   millis()>(zuletztGedrueckt+Warten)  )  //Danach kanns wieder aus

{
digitalWrite(ledPIN, low); //Aus
}

Wenn du es mit Delay machen willst und sowieso sonst nichts anderes passiert (z.B. eine einfache Eieruhr, Timer, Nachtlicht...) geht natürlich auch

Code:
if(digitalRead(TASTER))
{
digitalWrite(LED,HIGH);
delay(6660); //lange warten - in der Zeit kann nichts anderes passieren
digitalWrite(LED,LOW);
}

In deinem Beispiel hast du ein Delay von 3000, debouncen ist also kein Thema.


//EDIT: Ausser du willst dass die LED nur angeht wenn der Taster WENIGER als 1s gedrückt wurde? Dann sowas z.B.:
Code:
if (      digitalRead(TASTE)   && (gedrueckt==0) )
{ gedrueckt=millis(); }  

else if (  !digitalRead(TASTE)   && (gedrueckt>0)  )  // "!" bedeutet "nicht"
{
//LED nur schalten wenn die Taste nicht zu spät losgelassen wurde, z.B.
if(  (gedrueckt-millis()) < Maximaledruckdauerinms ) { digitalWrite(led,high); } // Maximalgdr. z.B.  666


gedrueckt=0; //Zurücksetzen

}


Viele Grüße
Marcus

PS:
Mit dem Code-Tag (# Knopf im Editor) wird Quellcode übersichtlicher:
[code] if... [/code]

//edit2: Ein paar Flüchtigkeitsfehler beseitigt.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
07.03.2015, 15:43
Beitrag #3
RE: Led soll zeitversetzt ausgehen
Hi , Danke für die antworten .

Ich muss da erstmal durchsteigen.

Die Funktion: Die LEd soll beim angehen wenn der Schalter geschlossen ist , aber wenn der Kontakt unterbrochen wird bevor die 666 ms erreicht werden, soll die Lampe noch 3 Sekunden weiter leuchten. Falls der kontakt über die 666 ms geschlossen bleibt dann. soll die lampe garnicht mehr angehen. bis zum nächsten mal drücken.

Gruß
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
07.03.2015, 21:12
Beitrag #4
RE: Led soll zeitversetzt ausgehen
hi hab mich mal rangemacht.

aber den letzten Code bekomme ich nicht zum laufen .


wäre für jede Antwort dankbar
Code:
int buttonPin = 2;    
int ledPin =  13;    
int  warten = 3000;
  int druecken = 0;
int wait = 666;


void setup() {

  pinMode(ledPin, OUTPUT);      

  pinMode(buttonPin, INPUT);

}

void loop(){
  
  if (digitalRead(buttonPin) && (druecken == 0))
  druecken=millis();


  {digitalWrite(ledPin,HIGH);}
  
  else if (! digitalRead(buttonPin) && druecken > 0)
{
  if ((druecken-millis()) < wait )

    {digitalWrite(ledPin,HIGH);}
    
    druecken = 0 ;
  
}}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
07.03.2015, 22:58
Beitrag #5
RE: Led soll zeitversetzt ausgehen
Hallo Affenbrot,

ein Fehler liegt hier:

Code:
if(...)
bla;
{blubb;}

Das geht nicht. Der Code gehört zwischen die geschweiften Klammern.

Code:
if(:::)
{
bla;
blubb;
}


Auch wird in beiden Fällen die LED angeschaltet.

Deine letzte Beschreibung ist nicht ganz klar, kannst du das nochmal etwas (Sprachlich) verdeutlichen?

Wenn es lediglich so sein soll, dass die LED 3s leuchten soll, und nicht mehr bis zum erneuten Tastendruck, dann sowas:
Code:
int count, gedrueckt, warten=3000,
led=3, taster=4;

void setup()
{
    
}

void loop()
{    //count=millis();
    
    
    if (digitalRead(taster) &&  gedrueckt==0 )
        
    {
        
        gedrueckt=millis();    
        
        digitalWrite(led,HIGH);
        
    }    
    else if( gedrueckt>0 && ((millis()-gedrueckt)>warten) )
    {
        digitalWrite(led,LOW);  
        
        
        
        
    }
    
    
    if(!digitalRead(taster)   )
    {    
        gedrueckt=0;
    }
    
    
}


Wenn zwischen einem langen und einem kurzen Tastendruck unterschieden werden soll, müsste man auch noch "merken" wann losgelassen wurde.

zB. mit etwas a la "losgelassen-gedrueckt > maximaldruckdauer" auswerten.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
08.03.2015, 08:49 (Dieser Beitrag wurde zuletzt bearbeitet: 08.03.2015 10:12 von Affenbrot.)
Beitrag #6
RE: Led soll zeitversetzt ausgehen
Hi marcus ,
danke für die netten Ratschläge.

hier habe ich mal ein Struktogramm.
Klick mich

gruß Ich

ps : ich verstehe mit diesen Millis() wirklich nur Bahnhof ...... Huh
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
08.03.2015, 11:11 (Dieser Beitrag wurde zuletzt bearbeitet: 08.03.2015 12:18 von marcus.)
Beitrag #7
RE: Led soll zeitversetzt ausgehen
Hallo Affenbrot,

danke für das übersichtliche Diagramm, jetzt habe ich es kapiert - hoffentlich :-)

mit millis() kannst du abfragen wie lange das Programm schon läuft.
Das ist praktisch um sich z.B. zu merken wann der Knopf gedrückt und wann losgelassen wurde. Dann kann man die Differenzzeit ausrechnen und weiß wie lange der Knopf gedrückt wurde.

Verwendet man Delay pausiert das ganze Programm, in dieser Zeit kann nichts anderes passieren.
Natürlich ginge auch:


...
Code:
if(digitalRead(taster))
    {
        digitalWrite(led,HIGH);
        delay(600); //erstmal kurz warten und überprüfen ob der  Taster noch gedürckt wird
        if(!digitalRead(taster)) {    delay(3000); } //Nö? Schnelle Finger. Dann gibts ein Bonus-Delay! Juhu!!!!
        delay(2400); //der Rest (3000 minus der 600mS vom Warten bis zur Tastendruckabfrage )
        digitalWrite(led,LOW); //Dunkel=TRUE
        delay(200); //Das habe ich nur hier reingeschrieben dass man etwas merkt wenn der Knopf >6s gedrückt wird
    }
...
Das wäre die Sparvaiante wenn sonst nichts anderes ablaufen soll. Hier gehen die Probleme schon los, zumindest wenn länger als 6s gedrückt wird. Möchte man das nicht, muss spätestens jetzt etwas a la gedrueckt=TRUE/FALSE gesetzt und abgefragt werden.

...
Code:
tasterstatus=digitalRead(taster); //je nachdem ob Pullup oder Pulldown, also Taster High oder Low beim Drücken, muss man es mit "!" vor digitalRead negieren. In diesem Beispiel habe ich es mal so gemacht um zu zeigen, dass es dadurch einfacher wird als es später zig mal unten zu ändern.
    
    if(tasterstatus  && !gedrueckt) //eigentlich wie vorhin, nur diesmal wird geprüft ob die Variable "gedrueckt" gesetzt wurde
    {    gedrueckt=1;
        digitalWrite(led,HIGH);
        delay(600);
        if(!tasterstatus) {    delay(3000); }
        delay(2400);
        digitalWrite(led,LOW);
        
    }
    if  (!tasterstatus){    gedrueckt=0;} //erst beim loslassen auf 0 setzen, sonst würde bei gedrücktgehaltener Taste die LED nie ausgehen
...
Immer noch sehr einfach :-) Was aber wenn jetzt nebenbei ein Servo schwenken soll oder Pi bis auf die letzte Stelle berechnet werden soll? Mit delay stoppt das ganze Programm und wartet. Vergleicht man stattdessen Millisekunden umgeht man das.
Das klingt halb so kompliziert wie es ist. Äh...
Wir machen so etwas jeden Tag:
"Die Kartoffeln habe ich um 15 Uhr in den Topf gegeben, jetzt ist 15:45 Uhr, also sind sie länger als 40 Minuten drinn.... Abschütten! Aber nur wenn ich sie nicht schon rausgetan habe, das wäre ja doof."

Code:
if( topfRead(Kartoffeln) && !kartoffelnImTopf )
{
Kochstartmerken=uhrzeit();
kartoffelnImTopf=TRUE;
kochen();
}
if(  (uhrzeit() <  (Kochstartmerken+40Minuten) ) && kartoffelnImTopf  )
{
abschuetten();
kartoffelnImTopf=FALSE;
}

Einziger Unterschied: Der Arduino kann sich Zahlen besser merken und vergisst sie nicht so leicht, mag aber keine Kartoffeln.

Etwas eleganter als mit dem Delay (abgesehen von meinem Spagetti-Chaoscode) ist es ungefähr so:
Code:
//der schnelle Vogel fängt die lang leuchtende LED


/*
ich entschuldige mich für die wirren Formatierungen, ich habe es schnell in UnoArduSim geschrieben. Beim hin- und her kopieren passiert das manchmal, zudem sind einige Dinge anders als in der Arduino IDE.
Das Programm ist schnell runtergeschrieben, kann also noch optimiert werden... Insbesondere da ich vergessen hatte dass die LED auch ausgehen soll wenn der Taster >6000ms gedrückt wird. Das habe ich nachträglich "eingeflickt", ist deshalb etwas unstrukturiert.  
*/

unsigned long gedruecktum, losgelassenum; //zum Zeit merken
//ich hatte vorher ausversehen INT benutzt, für die Zeit ist u.long nötig, sonst überlauft die Variable (kann sich nicht so lange Zahlen merken) und wird negativ


//int, kurze Zahlen
int immerwarten=3000, //so lange leuchtet die LED mindestens
kurzdruckwarten=3000,  //wenn nur kurz gedrückt wurde leuchtet die LED so viel länger
kurzdauer=666,//So kurz muss man drücken für die Bonuszeit
nachleuchten; //merkt sich später ob und wie lange nachgeleuchtet wird. Wird auch als Status-Indiz missbraucht


//byte, sehr kurze Zahlen
byte led=3, taster=4; // Da sind sie sachen angeschlossen. Je nachdem ob Pullup oder Pulldown-Widerstand am Taster muss man später ggf. digitalRead mit "!" negieren

//JaNein
boolean gedrueckt;


void setup()
{
    pinMode(led,OUTPUT);    //Kraftfeldverstärker voll
pinMode(taster,INPUT);    

}

void loop() //huiii

{    
    
    
    //  Je nachdem ob Pullup oder Pulldown-Widerstand muss es digitalRead(taster) oder  !digitalRead(taster) benutzt werden.
    //einfacher geht es wenn man am Loop-Anfang Tasteneingabe=digitalRead(taster); setzten würde, dann kann man es schnell für alle Ändern.
    
    //Wenn erstmals gedrückt wird (gedrueckt noch nicht gesetzt - sonst würde das Programm immer und immer wider diesen Schritt ausführen solange gedrückt wird)
    if( digitalRead(taster) && !gedrueckt )
    {
        gedruecktum=millis(); gedrueckt=1; //merke dir die Drückzeit und dass gedrückt wurde
        digitalWrite(led,HIGH);  //LED an
        
        nachleuchten=1;//darf später nicht null sein  da es auch als Indikator fungiert; Man könnte auch noch eine extra Variable benutzen, aber 1mS ist vertretbar
        
    }

    //ansonsten Wenn der Taster losgelassen wird,  die Loslasszeit  noch nicht gesetzt ist, aber schonmal gedrückt wurde... (sonst würde es immer ablaufen wenn der Taster nicht gedrückt wurde)
    else if ( !digitalRead(taster) && !losgelassenum &&  gedrueckt )
    {
        gedrueckt=0; //Vergiss dass gedrückt wurde
        
        //prüfe ob beim einschalten Nachleuchten gesetzt wurde, sonst wird bei Tastendruck länger der Leuchtzeit losgelassenum gesetzt. Das bringt den Programmablauf durcheinander wenn die LED schon längst aus ist
        if(nachleuchten)
        {    
        losgelassenum=millis();//Merke dir wann losgelassen wurde um später zwischen kurzem Antipen und länger Drücken zu unterscheiden
         }
        
    }
    
    
    //
    
    
    
     //wenn schon losgelassen wurde  -und- nur kurz gedrückt wurde -und- auch im Moment nicht nochmal gedrückt wird  
    if(     (losgelassenum>0)  && ((gedruecktum+kurzdauer)>millis()) &&!gedrueckt)//&&  nachleuchten<2 )
    {
        nachleuchten=kurzdruckwarten; //Setze das Nachleuchten auf lange 3000s
    }
    
    
    //wenn das Nachleuchten mindestens auf 1 gesetzt wurde nach dem drücken -und- die Summe von wann gedrückt wurde, der Nachleuchtzeit und Immerwarten abgelaufen ist
    if( nachleuchten>0 && (nachleuchten+immerwarten+gedruecktum)<millis() )
    {
        digitalWrite(led,LOW);  //LED aus  
        nachleuchten=0; losgelassenum=0;   gedruecktum=0; //Alles zurücksetzen so dass es wieder von Vorne losgehen kann.  Nur Gedrueckt wird erst beim loslassen zurückgesetzt, sonst würde die LED blinken
    }
    
} //Das Wars. Viele Grüße, Marcus
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
09.03.2015, 10:22 (Dieser Beitrag wurde zuletzt bearbeitet: 09.03.2015 13:26 von Affenbrot.)
Beitrag #8
RE: Led soll zeitversetzt ausgehen
Hi marcus,

Danke danke danke danke für den CODE.

habe mich entschlossen ihn ein wenig zu ändern, das es auch mit zwei LEDs funktioniert.

Ich habe auf die 666ms regel verzichtet aber eines neues Problem.

Das Input SIgnal kommt von einem Blinkerrelais welches ca. jede Sekunde schaltet.

Das bedeutet . Das Relais schaltet das erste mal dann leuchtet die LED. Das ist soweit richtig. die LED geht nach drei sekunden aus, soll aber ausbleiben bis das RelaisSignal länger als 1 Sekunde aus ist.

Kurz: die zurücksetz regel müsste eine zeit des Inputes größer als 1 Sekunde sein.


EDIT 09.03. würde gerne zurückrudern. Habe jetzt den vormittag mit der Delay funktion gearbeitet und habe rumprobiert.
Würde gerne die hier nehmen.

Code:
int led = 3;
int led2 = 9;
int taste = 4;
int taste2 = 8;
boolean gedrueckt;
boolean gedrueckt2;
void setup()
{
  pinMode(led, OUTPUT);
  pinMode(led2, OUTPUT);
  pinMode(taste,INPUT);
  pinMode(taste2, INPUT);
  }
void loop()
{

    if((digitalRead(taste)  && !gedrueckt) || (digitalRead(taste2) && !gedrueckt2))
    {    gedrueckt=1;
        if (digitalRead(taste))
        
        {digitalWrite(led,HIGH);
        delay(3000);
        if(!digitalRead(taste)) {    delay(0); }
        
        digitalWrite(led,LOW);}
    
      gedrueckt2 = 1;
      
        if (digitalRead(taste2))
        {digitalWrite(led2,HIGH);
        delay(3000);
        if(!digitalRead(taste2)) {    delay(0); }
        
        digitalWrite(led2,LOW);}
      
    }
    if  (!digitalRead(taste))
  
{    gedrueckt=0;  }
    if (!digitalRead(taste2))
    {gedrueckt2=0; }
    
}

die ist einfacher zu verstehen. Jetzt die frage, geht das mit dem Relais trotzdem ?
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Servo soll nur in Ruhelage stoppen Sven1996 1 233 19.08.2016 14:37
Letzter Beitrag: StephanBuerger
  Schrittmotor soll auf Tasterdruck bis zum Endschalter fahren Wurstbemme 11 1.594 08.01.2016 11:56
Letzter Beitrag: hotsystems
  USBhost mit keyboard gefunden, funktioniert aber nicht wie's soll HaWe 0 543 05.08.2015 14:26
Letzter Beitrag: HaWe
  NRF24 soll Daten empfangen und senden... MaHaI976 2 938 08.06.2015 19:36
Letzter Beitrag: MaHaI976
  Bewegungsmelder soll Programm starten lukass89 7 2.041 24.09.2014 18:33
Letzter Beitrag: MaHa1976
  Arduino SOLL-Werte von MySql abfragen sepro 5 1.853 01.08.2014 18:44
Letzter Beitrag: rkuehle
  LED soll sos blinken bernie_r 2 2.569 18.06.2013 09:53
Letzter Beitrag: peterunterhofer

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste