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
13.03.2015, 15:17 (Dieser Beitrag wurde zuletzt bearbeitet: 13.03.2015 17:33 von marcus.)
Beitrag #17
RE: Led soll zeitversetzt ausgehen
Hallo Affenbrot,

hilft das letzte Beispiel nicht?
Ich weiß dass man gerne gleich ein Projekt fertig stellen möchte, aber Anfangs sollte man einen Gang zurück schalten und ein paar Beispielprojekte umsetzen. Sonst verliert man den Faden, weiß nicht was das Programm eigentlich macht.

Ich hoffe in der Schnelle ist alles richtig, ich habe mein letztes Programm nur um drei Dinge erweitern müssen:

-Der Arduino muss sich den Start des ersten Blinkens und wann zuletzt geblinkt wurde seperat "merken". Da "zeiteinmalmerken" dann nicht aktualisiert wird, geht die LED nach der vorgegebenen Zeit aus.

-Wenns Blinken auch aufgehört hat "zeiteinmalmerken" wieder zurücksetzen

-Zudem habe ich Toleranz nun richtig geschrieben und Ausschaltennach eingeführt.

Code:
    if(eingangssignal && !zeiteinmalmerken) //Wenns blinkt und die Startzeit noch nicht gemerkt wurde...
    {
        zeiteinmalmerken=millis(); //...merken wann es begann zu blinken
        digitalWrite(led,HIGH); //...LED erstmal anschalten
    }  

    if(eingangssignal){    zeitimmermerken=millis();} //immer merken wann es das letzte mal geblinkt hat
    

    
    if( (zeiteinmalmerken+blinkFrequenz+Toleranz+Ausschaltennach) < millis() ) //Wenn  das erste Blinken schon länger her ist als die Ausschaltzeit plus Blinkfreq...
    {
        digitalWrite(led,LOW); //...dann LED aus.  
        
        if(zeitimmermerken+Toleranz+blinkFrequenz<millis() ) //wenns länger garnicht mehr geblinkt hat
        {    zeiteinmalmerken=0;   } // Zurücksetzen. Nur so kanns von vorne beginnen
    }

Komplett mit "Blinkersimulation"
Code:
//Schalter zum anschalten des "künstlichen Blinkers" an Pin 11, sonst Relayeingang an pin 3 und code zwischen --- entfernen
unsigned long zeitimmermerken, zeiteinmalmerken;

boolean eingangssignal;

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

int    blinkFrequenz=50, Toleranz=10, Ausschaltennach=200;
//edit: Weil UnoArduSim so langsam bei mir läuft habe ich diese Werte eingesetzt.
//besSer wäre z.B.: int    blinkFrequenz=500, Toleranz=40, Ausschaltennach=2500;


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);
    pinMode(10,OUTPUT);//teststatus
    //----------------------------------
    
    
}

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 && !zeiteinmalmerken) //Wenns blinkt...
    {
        zeiteinmalmerken=millis(); //...merken wann es begann zu blinken
        digitalWrite(led,HIGH); //...LED erstmal anschalten
    }  
    if(eingangssignal){    zeitimmermerken=millis();} //immer merken wenns blinkt
    
    
    if( (zeiteinmalmerken+blinkFrequenz+Toleranz+Ausschaltennach) < millis() ) //Wenn  das erste Blinken schon länger her ist...
    {
        digitalWrite(led,LOW); //...dann LED aus.  
        
        if(zeitimmermerken+Toleranz+blinkFrequenz<millis() ) //wenns länger nicht mehr geblinkt hat
        {    zeiteinmalmerken=0;   } //wenn lange genug aus, Zurücksetzen
    }
    
    
}


...und zum Spaß noch mal als "Pseudocode"
Code:
if (Signal &&  signalAnfang==0)________
| signalAnfang=aktuelleZeit //einmal merken (ist dann nicht mehr 0!)
| LED an
_______________________________________


if (Signal)________________
| letztesSignal=aktuelleZeit //immer merken
| ___________________________


    
if(aktuelleZeit > signalAnfang+Blinkdauer+LEUCHTDauer)_____ //zeit größer signalAnfang+Leuchtdauer
|
| LED aus
|
|   if(zeit > letztesSignal+Blinkdauer)____  //letztes Blinken länger her als Blinkfrequenz
|   | signalAnfang auf 0
|   |______________________________________
|
|_____________________________________________________________

Was genau ist dir an millis() unklar? Da könnte auch ein Postit-Block mit "22,5 Sekunden" zum abreissen liegen, um es mal zu visualisieren. Man kann sich immer die aktuell vergangene Zeit holen und vergleichen oder in Variablen speichern. Dann kann man vergleichen wie viel Zeit vergangen ist, ob der Blinker schon länger nicht mehr an war, etc.

//edit: Weil UnoArduSim so langsam bei mir läuft habe ich kleine Zeitwerte eingesetzt.
//besSer wäre z.B.: int blinkFrequenz=500, Toleranz=40, Ausschaltennach=2500;
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
13.03.2015, 15:25
Beitrag #18
RE: Led soll zeitversetzt ausgehen
Hi,
...was auch immer "Funktion zurücksetzen" bedeutet. Na egal. Ich versuch's mal mit meinen Worten:
Du hast einen Eingang "Blinksignal" genannt. Wenn der Eingang von LOW nach HIGH geht (oder andersrum?), dann soll eine LED angehen. Egal was passiert, sie soll x Sekunden anbleiben. Wenn nach den x Sekunden der Eingang immer noch HIGH ist, dann soll uns das nicht interessieren. Erst wenn der Eingang wieder auf LOW geht, dann soll der nächste Übergang von LOW nach HIGH wieder die LED einschalten usw.
Korrekt? Ich nehme mal an: ja.
Das ganze kann man extrem vereinfachen: "Bei einer aufsteigenden Flanke schalte eine LED für x Sekunden an."
Damit braucht man auch kein millis() oder sowas (außer Du unterschlägst was). Das Coding sieht dann ungefähr so aus:
Code:
void loop() {
  static int oldState = LOW;
  int newState = digitalRead(blinksignal);
  if(newState && !oldState) {
    digitalWrite(LED, HIGH);
    delay(x * 1000);
    digitalWrite(LED, LOW);
  };
  oldState = newState;
};

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:34 (Dieser Beitrag wurde zuletzt bearbeitet: 13.03.2015 15:43 von marcus.)
Beitrag #19
RE: Led soll zeitversetzt ausgehen
Hallo Thorsten,

das Problem mit delay(); war dass Affenbrot später zwei Signale auswerten will. Wenns nur ein Autoblinker ist (war anfangs aber nicht spezifiziert!) dürfte das mit delay natürlich egal sein :-) Die Signale dürften dann idR. nicht zeitnah/parallel eingehen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
13.03.2015, 15:39
Beitrag #20
RE: Led soll zeitversetzt ausgehen
(13.03.2015 15:34)marcus schrieb:  das Problem mit delay(); war dass Affenbrot später zwei Signale auswerten will. Wenns nur ein Autoblinker ist (war anfangs aber nicht spezifiziert!) dürfte das natürlich egal sein :-) Die Signale dürften dann idR. nicht zeitnah/parallel eingehen.
Tja, dann hätte er das sagen müssen. Egal, ich würde trotzdem dazu raten erstmal meine einfache Version zum Laufen zu bringen. Das delay() daraus loszuwerden wäre dann ja einfach. Ich würde das aber erstmal abwarten.
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:46
Beitrag #21
RE: Led soll zeitversetzt ausgehen
Hi Thorsten .

Die Lampe soll ja nach X Zeit ausgehen / Während der Eingang Blinksignal kontinuierlich weiter läuft.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
13.03.2015, 15:48 (Dieser Beitrag wurde zuletzt bearbeitet: 13.03.2015 15:50 von marcus.)
Beitrag #22
RE: Led soll zeitversetzt ausgehen
Ja. Mittlerweile sind die Ziele ja zum Glück klarer und die Diagramme helfen auch sehr.
Mit Millis() statt Delay sind es ja auch nur ~8 Zeilen Programm im loop.
Überschaubar. Die Kommentare blähen es eben auf.

Das Problem ist es als "Anfänger" sicher das alles zu verstehen. Das ging uns wohl allen so... Am Anfang möchte man am liebsten gleich die Tutorials überspringen und seine Projektidee umsetzen und verzettelt sich mit der Komplexität.


Hallo Affenbrot,
(13.03.2015 15:46)Affenbrot schrieb:  Hi Thorsten .

Die Lampe soll ja nach X Zeit ausgehen / Während der Eingang Blinksignal kontinuierlich weiter läuft.

Sketch schon ausprobiert?
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
13.03.2015, 15:58 (Dieser Beitrag wurde zuletzt bearbeitet: 13.03.2015 16:03 von Affenbrot.)
Beitrag #23
RE: Led soll zeitversetzt ausgehen
Da haste recht. Man verzettelt sich ganz schön. Es ist wie das Autofahren . Man benötigt auch länger um es gut zu beherschen :-)

aber bei deinem Code marcus, da leuchtet nichts ??

gruß

habe es gefunden hast kein variable für digitalRead gesetzt
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
13.03.2015, 16:07 (Dieser Beitrag wurde zuletzt bearbeitet: 13.03.2015 16:08 von Thorsten Pferdekämper.)
Beitrag #24
RE: Led soll zeitversetzt ausgehen
(13.03.2015 15:46)Affenbrot schrieb:  Die Lampe soll ja nach X Zeit ausgehen / Während der Eingang Blinksignal kontinuierlich weiter läuft.
Ja und? Macht das mein Coding nicht? Probier's doch mal aus.

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
Antwort schreiben 


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

Gehe zu:


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