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
09.03.2015, 18:46 (Dieser Beitrag wurde zuletzt bearbeitet: 09.03.2015 18:47 von marcus.)
Beitrag #9
RE: Led soll zeitversetzt ausgehen
Hallo Affenbrot,

das ist aber wieder was anderes - es hilft bei solchen Anfragen ungemein wenn du genau erklärst was du vor hast, wofür das ganze gebraucht wird.
Das hört sich sehr nach Auto-Blinker an.
Ansonsten stellt sich die Frage warum das Blinken eine externe Komponente übernimmt?

Ein Problem dass ich sehe ist dass Du das Projekt kennst und dir schon überlegst wie das Programm aussehen soll. Es ist wesentlich einfacher wenn Andere auch das Vorhaben kennen um so ggf. alternative Lösungsansätze zu entwickeln.

Delay solltest du meiden, da sonst nichts anderes ablaufen kann. Bei zwei Taster/Eingangssignalen wird eins dann während des Delays ignoriert.

In deinem Code vor dem Edit hast du auch einfach die zwei Tasterabfragen in das Beispiel von mir reinkopiert. So etwas kann nicht zuverlässig funktionieren. Für zwei Taster müsste man zwei getrennte Codeteile schreiben,

Auch das Entfernen von Kommentaren und die fehlenden Kommentare deinerseits machen es schwierig nachzuvollziehen was du zugefügt hast und was es bezweckt.

Bei dem neuen Code hast du jetzt Variablen für jede Taste benutzt, das ist schonmal prima.
Ansonsten gibt es aber einige Passagen die sich für mich nicht erschließen; z.B. was das delay(0); soll, oder warum gedrueckt2=1; ausserhalb der Tastenabfrage steht.

Am besten du dröselst ein Problem immer in seine Bestandteile auf. Dein Ablaufplan war also genau die richtige Strategie.


Nochmal schreibe ich kein komplettes Sketch, die Parameter sind ja jetzt fast komplett geändert :-) Noch ein Taster, Blinken...

Um zu ermitteln ob ein getaktetes Signal irgendwann aufgehört hat, könnte man z.B. so vorgehen:
Code:
blinkFrequenz=1000; //ggf. mit etwas Tolleranz

...

eingang1=digitalRead(relay1);  eingang2=digitalRead(relay2); //macht das  auslesen etwas einfacher

...

if(eingang1){blink1=millis();} //Bei jedem aktivem Blinken wird millis(); gesetzt. Passiert während es geschaltet ist kontinuierlich, man könnte noch eine Variable zusätzlich verwenden um dies zu verhindern. Andererseits sorgt dies für ein wenig Toleranz bei der folgende Abfrage.

if( (blink1+blinkFrequenz) < millis() ) //Wenn  das letzte Blinken schon länger als die Blinkfrequenz her ist
{
Serial.println("#1 Blinkt nicht mehr");
}

So, oder so ähnlich.
Spätestens jetzt sind DELAY tabu, denn während eines Delays kann keine Abfrage mehr erfolgen. Natürlich kann man auch Interrupts verwenden, insbesondere da jetzt weitere Faktoren ins Spiel kommen wäre das eine Überlegung wert.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
10.03.2015, 10:58
Beitrag #10
RE: Led soll zeitversetzt ausgehen
Hi,
niemals so:
Code:
if( (blink1+blinkFrequenz) < millis() )
...sondern nur so:
Code:
if( millis() - blink1 > blinkFrequenz )
Das ist mathematisch zwar dasselbe, vermeidet aber Probleme beim Überlauf.
Gruß,
Thorsten

Falls ich mit einer Antwort helfen konnte, wuerde ich mich freuen, ein paar Fotos oder auch ein kleines Filmchen des zugehoerigen Projekts zu sehen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
10.03.2015, 11:22
Beitrag #11
RE: Led soll zeitversetzt ausgehen
Danke für die Korrektur!
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
11.03.2015, 17:31
Beitrag #12
RE: Led soll zeitversetzt ausgehen
Hi danke für die Hilfe.

Ja ich will was mit einem Blinker machen.

Ich habe mir gestern und heute nochmal verschiedene CODES und Funktionen des UNO angeschaut und habe ein wenig mit euren Codes rumgespielt umzu verstehen was passiert. und ich will auch erstmal nur bei einem Taster und einer LED bleiben.

Reintheoretisch habe ich jetzt zwei Codes die funktionieren.

Aber ich muss sie irgendwie zusammenbauen und das hat die letzten 3 Stunden nicht geklappt :-)
wichtig ist mir eigentlich nur das die Led beim ersten Signal an geht und nach x Sekunden ausgeht, solange das Relais läuft und sobald das Relais länger ausbleibt,die Funktion zurückgestellt wird.

Ich poste mal die CODES , der eine mit kommentaren , bei der ich der Meinung bin was passiert.


die Relay Zeit
Code:
int blinkFrequenz=500;
int led =4;
int schalter = 3 ;
int druecken;
long blinken;
void setup()
{
  pinMode ( led,OUTPUT);
pinMode(schalter, INPUT);
}  
void loop()
{
       druecken=digitalRead(schalter);  


      
        if (druecken)
         {
           blinken=millis();
                          }
        if( (blinken+blinkFrequenz) < millis() )
{
digitalWrite(led,HIGH);
}
else
{digitalWrite(led,LOW);

}
}
/* bei dem Code geht die LED aus sobald ich nicht innerhalb der 500 ms gedrückt habe */

Jetzt der Zeitversetze CODE
Code:
unsigned long gedruecktum, losgelassenum; // jeweils ein Variabel bis Millarden ( habe ich gelesen)

int immerwarten=3000;  // variabeln zum Warten
  
int druecken;
int nachleuchten;


int led=4, taster=3; // meine Aktoren , Sensoren


boolean gedrueckt; // ja oder nein  

void setup()
{
pinMode(led,OUTPUT);    
pinMode(taster,INPUT);    

}

void loop()
{
{druecken=digitalRead(taster);}
  
  
    if(( druecken && !gedrueckt )) // Wenn Taster gedrückt und nichtgedrueckt(nicht falsch)(also wahr) || blink1-blinkfrequenz kleiner als ms
    {
        gedruecktum=millis(); gedrueckt=1; // zähl jetzt die Variabel gedruecktum als millis() ; gedrueckt = 1 ( wahr )
        digitalWrite(led,HIGH);  // mach die led an
        
        nachleuchten=1;   // kein plan wofür das sein könnte. eine mS das weiß ich.
    }

    
    else if ( !druecken && !losgelassenum &&  gedrueckt ) // wenn nicht Taster gedrueckt und nicht logelasseum und gedrueckt
    {
       gedrueckt=0; // variabel= 0 = nein
        
      
        if(nachleuchten) // wenn nachleuchten 1 ms
        {    
        losgelassenum=millis();//zähle jetzt losgelassen als millis
         }
        
    }
    
    
    if(( nachleuchten>0 && (immerwarten+gedruecktum)<millis()))  // wenn nachleuchten gleich Null und (3000 + gedrucktum) kleiner als millis
    {
        digitalWrite(led,LOW);   // dann mach das licht aus
        nachleuchten=0; losgelassenum=0;   gedruecktum=0; // setze variabeln auf 0 ( und somit das programm zurück)
    }
    

}

Und jetzt mein rumgespieltes
Code:
unsigned long gedruecktum, losgelassenum; // jeweils ein Variabel bis Millarden ( habe ich gelesen)

int immerwarten=3000;  // variabeln zum Warten
  

int nachleuchten;
int blinkfrequenz = 600;
int druecken = 0;
int led=4, taster=3; // meine Aktoren , Sensoren
int blink1;
int eingang;
boolean gedrueckt; // ja oder nein  

void setup()
{
pinMode(led,OUTPUT);    
pinMode(taster,INPUT);    

}

void loop()

{
{    druecken=digitalRead(taster);
  blink1 = millis();}
    
    if(druecken)
  { blink1 = millis(); }
   //digitalRead(taster) = druecken;  
    if((druecken && !gedrueckt )|| (blink1+blinkfrequenz) < millis()) // Wenn Taster gedrückt und nichtgedrueckt(nicht falsch)(also wahr)
    {
        gedruecktum=millis(); gedrueckt=1; // zähl jetzt die Variabel gedruecktum als millis() ; gedrueckt = 1 ( wahr )
        digitalWrite(led,HIGH);  // mach die led an
        
        nachleuchten=1;   // kein plan wofür das sein könnte. ist auf jedenfall 1 ms
    }

  
    else if ((!druecken) && !losgelassenum &&  gedrueckt ) // wenn nicht Taster gedrueckt und nicht logelasseum und gedrueckt
    {
       gedrueckt=0; // variabel= 0 = nein
        
      
        if(nachleuchten) // wenn nachleuchten 1 ms
        {    
        druecken=millis();//zähle jetzt losgelassen als millis
         }
        
    }
    
    
    if ((nachleuchten>0 && (immerwarten+gedruecktum)<millis()) && (!druecken && (blink1-blinkfrequenz) < millis()))//&& (blink1-blinkfrequenz) < millis()) // wenn nachleuchten gleich Null und (3000 + gedrucktum) kleiner als millis
    {
        digitalWrite(led,LOW);   // dann mach das licht aus
        nachleuchten=0; losgelassenum=0;   gedruecktum=0; blink1=0; druecken = 0 ; //blinkfrequenz = 0;// setze variabeln auf 0 ( und somit das programm zurück)
    }
   // else

     //{digitalWrite(led,LOW);}
    

}

GRüße Ich
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
11.03.2015, 18:58 (Dieser Beitrag wurde zuletzt bearbeitet: 11.03.2015 19:30 von marcus.)
Beitrag #13
RE: Led soll zeitversetzt ausgehen
Hallo Affenbrot,

aus mehreren Programmen eins zu basteln wird meist unübersichtlich und dauert im Endeffekt länger als es neu zu schreiben :-) Dadurch kann man gelerntes besser reflektieren und behält später die Übersicht. Das mit dem Programmablaufplan hilft bei komplexeren Projekten ungemein. Aufgaben lassen sich leichter in Einzelschritte herunterbrechen und das Ziel Schritt für Schritt erreichen.

Mein letzter Codeschnippsel hat das geforderte ja quasi schon erfüllt: Bei Beginn des Blinken bzw. bei ausbleiben des Blinksignals passiert etwas.

Bei deinem Programm sehe ich diverse Problemchen wie z.B.
void loop(){{ oder ähnliche doppelte/offene Klammern.


Hier mal ein einfaches Beispiel basierend auf dem Blink-Code von mir.
Ich habe das in Ardusim zusammengewürfelt und einen "virtuellen" Blinker implementiert (so dass auch ein echter Arduino ein Signal "simuliert" und zeigt es an der eingebauten LED / Pin 13 anzeigt).

Nach dem folgenden Code dann noch die eigentliche, kürzere Version.

Code:
unsigned long zeitmerken;

boolean eingangssignal;

//------------
boolean blinkblink;  
unsigned long   kuenstlicherblinktimer;
//-------------

int    blinkFrequenz=500, Tolleranz=20;


byte eingang=3, led=4;

void setup()  
{
    
    
    
    
    pinMode(eingang,INPUT);
    pinMode(led,OUTPUT);
    
    //----------------------------------ggf.Löschen
    pinMode(11,INPUT); //künstl. Blinker
    pinMode(13,OUTPUT);
    //----------------------------------
    
    
}

void loop()
{



eingangssignal=digitalRead(eingang);  
//wird unten durch das "künstliche Relais" überschrieben
    
    
    //---------------------------------------------ggf.Löschen
    //künstliches Einganggsignal für UnoArduSim
    
    
    if(digitalRead(11)) //Wenn Schalter 11-> Blinken 0 / stoppen
    {    blinkblink=0;  
    }
    //Signal HIGH/LOW im Frequenzinterval
    else if(millis()  > kuenstlicherblinktimer+blinkFrequenz  ) //edit:besser millis()-1500 >zeit wg. overflow
    {
        blinkblink=!blinkblink;//HiGh zu low und umgekehrt
        digitalWrite(13,blinkblink); //LED zur visualisierung
        kuenstlicherblinktimer=millis(); //Zeit merken wann zuletzt geschaltet wurde
    }
        eingangssignal=blinkblink; //überschreibt das physische Eingangssignal, ggf. entfernen
    //
    //---------------------------------------------
    
    
    
    
    

    
    if(eingangssignal) //Wenns blinkt...
    {
        zeitmerken=millis(); //...merken wann es passiert ist
        digitalWrite(led,HIGH); //...LED erstmal anschalten
    }  
    
    
    
    if( (zeitmerken+blinkFrequenz+Tolleranz) < millis() ) //Wenn  das letzte Blinken schon länger als die Blinkfrequenz her ist
    {
        digitalWrite(led,LOW); //LED aus. Tolleranz könnte man entsprechend erhöhen.
    }
    
    
}



Mit externen Signal kannst du alles zischen den "----------"-Kommentaren löschen, das sieht dann so aus:

Code:
unsigned long zeitmerken;  //lange zahlen sind lang
boolean eingangssignal;  //TrueFalse
int    blinkFrequenz=1000, Tolleranz=20;    //Tolleranz könnte man auf 1500 setzen, dann leuchtet die LED nach
byte eingang=3, led=4; //Pinzuweisungen


void setup()  
{
    pinMode(eingang,INPUT); //Rein, raus
    pinMode(led,OUTPUT);
}

void loop()
{
    eingangssignal=digitalRead(eingang); //könnte man auch direkt in  IF packen

    if(eingangssignal) //Wenns blinkt...
    {
        zeitmerken=millis(); //...merken wann es passiert ist
        digitalWrite(led,HIGH); //...LED erstmal anschalten, es soll sich ja keiner im dunklen fürchten
    }  

    if( (zeitmerken+blinkFrequenz+Tolleranz) < millis() ) //Wenn  das letzte Blinken schon länger als die Blinkfrequenz her ist
    {
        digitalWrite(led,LOW); //LED aus. Toleranz könnte man entsprechend erhöhen. Und vielleicht in Zukunft auch richtig schreiben, ups :-)
    }
}

EDIT: Ich habe schon wieder x+y<millis() statt x<millis-y geschrieben. Bitte ignorieren/abändern.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
13.03.2015, 14:24
Beitrag #14
RE: Led soll zeitversetzt ausgehen
Hi Jungs,

eine Woche schlage ich mich mit dem Arduino rum und es gibt keinen neuen Ergebnisse.

um es Kurz zu machen ,ich verstehe es einfach mit den millis nicht .

Vergleichen der letzten Zeit mit der jetzigen...... und wenn größer millis etc......

ich bin zurzeit am ende meiner Laune :-(

habe heute morgen nochmal ein Diagramm versucht . das sieht jetzt besser aus .


Klick mich

Code:
if relais ein ( länge der relaisschaltung = y (sagen wir 1 sekunde).
{ dann liebe led , leuchte x sekunden und gehe aus }


if nach den x sekunden relais noch an
{dann led bleibe aus und warte bis Relais aufgehört hat}

if relais irgendwann aus
{setze funktion zurück}

So sehe ich die funktion die hinter dem ganzen stecken einfach und simple.

vielleicht könnt ihr mir hinweise geben ob ich auf dem richtigen weg bin .


z.b wie setze ich if. in welche Reinfolgen.

Gruß ich
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
13.03.2015, 14:39
Beitrag #15
RE: Led soll zeitversetzt ausgehen
Hi,
könntest Du das Bild direkt hier hochladen? Ich klicke nicht mehr auf diese Bilder-Hochlade-Seiten-Links.
Deinen Pseudocode verstehe ich nicht. Könntest Du nochmal auf ganz normalem Deutsch beschreiben, was Du eigentlich vorhast?
Gruß,
Thorsten

Falls ich mit einer Antwort helfen konnte, wuerde ich mich freuen, ein paar Fotos oder auch ein kleines Filmchen des zugehoerigen Projekts zu sehen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
13.03.2015, 15:03 (Dieser Beitrag wurde zuletzt bearbeitet: 13.03.2015 15:08 von Affenbrot.)
Beitrag #16
RE: Led soll zeitversetzt ausgehen
Hi


Die Pseudocodes sind einfach Hinweise für mich ob ich auf dem richtigen Dampfer bin.

   

In Deutsch :-)
Ein Blinksignal kommt. Die Led soll angehen und für x Sekunden leuchten und dann ausgehen,
Nach den x Sekunden sofort soll abgefragt werden ob das blinksignal noch da ist , Wenn ja Lampe solange auslassen bis Signal wirklich weg ist. Wenn nein Funktion zurücksetzen.

gruß ich
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.597 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.042 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.570 18.06.2013 09:53
Letzter Beitrag: peterunterhofer

Gehe zu:


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