- 12V Akku mit 280 Ah bauen         
Ergebnis 1 bis 10 von 37

Thema: suche eine geeignete Zeitverzögerungsschaltung

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Robotik Einstein Avatar von i_make_it
    Registriert seit
    29.07.2008
    Ort
    Raum DA
    Alter
    56
    Beiträge
    2.814
    Ich kann wenn überhaupt frühestens am Wochenende mal was versuchen (Familinetermine).
    Da ich mich mit dem Board nicht auskenne, muß ich erst mal nach Doku suchen damit ich weis welche Pins was können.

    Wenn das triggerSignal lang genug ansteht, reicht ja ein digitalRead(). Steht das nur kurz an, brauchts einen Interrupteingang und eine ISR (Interrupt Service Routine).

    Kann also sein, das ich was schreibe, das bei mir (nano, uno, due, mega) funktioniert, aber nicht an dem "Digispark Mini, ATtiny85, USB".
    Das wäre dann anpassarbeit.
    Und wie schon geschrieben, eine eventuell notwendige Eingangs und Ausgangsbeschaltung sollte man nicht vergessen.
    Wäre doof so ein Teil wegen in paar gesparter Cent zu toasten.

    https://s3.amazonaws.com/digistump-r...kSchematic.pdf

    https://www.google.de/url?sa=t&rct=j...EtAIxFbzGqNLO6

    http://www.cboden.de/mikro-controlle...-dem-digispark

    https://arduino.ua/images/DPC254-2.jpg

    Code:
    // Digispark Mini, ATtiny85, USB
    // Test 1 - Feste Zeiten mit Delay
    
    void setup() {                
      pinMode(0, INPUT);
      pinMode(1, OUTPUT);  
    }
    
    void loop() {
      int trigger = digitalRead(0);
      if (trigger <> 0)
      {
        digitalWrite(1, HIGH);
        delay(1000);             //1 Sekunde an
        digitalWrite(1, LOW);
        delay(10000);         //10 Sekunden aus
        digitalWrite(1, HIGH);
        delay(1000);             //1 Sekunde an
        digitalWrite(1, LOW); 
      }
    }
    Code:
    NICHT FERTIG
    // Digispark Mini, ATtiny85, USB
    // Test 2 -
    
    unsigned long prev1micros = 0;
    int trigger = 0;
    int togglesatate = LOW;
    
    void setup() {                
      pinMode(0, INPUT);
      pinMode(1, OUTPUT);  
      // attachInterrupt(0, Eingang, LOW);
    }
    
    void loop() {
      int trigger = digitalRead(0);
      if (trigger <> 0 && togglestate == LOW)
      {
        togglestate = HIGH;
        unsigned long cur1micros = millis();
          
      }
      if (trigger <> 0 && togglestate == HIGH)
      {
        unsigned long cur1micros = millis();
          
      }  
      digitalWrite(1, HIGH);
      digitalWrite(1, LOW);
    }
    Code:
    // Digispark Mini, ATtiny85, USB
    // Test 3 -
    #
    Geändert von i_make_it (16.03.2018 um 10:45 Uhr)

  2. #2
    Neuer Benutzer Öfters hier
    Registriert seit
    03.03.2018
    Beiträge
    12
    Also, ich werde das Teil ja erst mal bestellen und da habe ich es auch sicher nicht vor dem WE, also ein Zeitproblem gibts nicht. Das Eingangssignal stammt vom Dämmerungsschalter und liegt minimal eine Minute an. Da der Dämmerungsschalter Hochspannung liefert, muss da erst noch ein Relais her.

    Also, wenns erst nächste Woche oder später wird, würde ich mich trotdem über die Programmzeilen freuen, ich übernehme sie nicht ungesehen, versprochen, sondern nur als Einstieg für meine Versuche mit dem Teil. Aber eine Supergrundlage wäre das bestimmt. Quellen für die notwendigen Infos habe ich Dank eurer Hilfe bekommen.

  3. #3
    Erfahrener Benutzer Robotik Visionär Avatar von 021aet04
    Registriert seit
    17.01.2005
    Ort
    Niklasdorf
    Alter
    37
    Beiträge
    5.091
    Zitat Zitat von funky34 Beitrag anzeigen
    Da der Dämmerungsschalter Hochspannung liefert, muss da erst noch ein Relais her.
    Das ist keine Hochspannung, Hochspannung ist über 1000V. Nennen wir diese Spannung einfach Netzspannung. Gefährlich ist diese Spannung aber trotzdem.

    Wenn du es mit einem Relais machen willst (am Einfachsten), achte darauf das du ein Signalrelais verwendest und kein Leistungsrelais, sonst kann es zu Problemen kommen.


    Ich würde eine Flankenerkennung einbauen und auf diese Flanke reagieren. Hier als Pseudocode (mit teilweise C-Code weil ich in C programmiere):
    Bewegungsmelder = BM
    "Sollwert" ist die Pause zwischen den beiden Impulsen
    != bedeutet "ist nicht"
    == bedeutet "ist gleich"
    ++ bedeutet "erhöhen um 1"
    Code:
    Dauerschleife
    {
       BM einlesen
    
       Flankenerkennung: (BM != BM_alt) & (BM == geschalten)       => dadurch hast du eine Flankenerkennung auf eine positive Flanke
       {
          Status = 1
       }
    
       switch (Status)
       {
          case 1:
             Ausgang setzen
             Status = 2
             "switch" Abbruch
          case 2:
             Ausgang löschen
             Status = 3
             "switch" Abbruch
          case 3:
             Zähler ++
             Wenn Zähler >= Sollwert: Status = 4, Zähler = 0
             "switch" Abbruch
          case 4:
             Ausgang setzen
             Status = 5
             "switch" Abbruch
          case 5:
             Ausgang löschen
             Status = 0
             "switch" Abbruch
       }
    
       BM_alt = BM
       Pause (1s)
    }
    Zuerst wird erkannt ob der BM geschalten hat (Flankenerkennung), wenn ja wird in "case 1" der Ausgang gesetzt, durch die Pause am Ende der Dauerschleife wird der Ausgang 1s später wieder gelöscht (case 2). Die eigentliche Zeit zwischen den beiden Impulsen wird mit "case 3" gemacht, der Zähler wird bei jedem Schleifendurchlauf um 1 erhöht (dadurch hast du ein vielfaches des Schleifendurchlaufes). Wenn der Zähler den Sollwert erreicht wird in case 4 und case 5 der Impuls erzeugt.

    Beim switch kannst du noch nach "case 5" ein "default" einfügen, das wird immer ausgeführt wenn bei Status keine der cases zutrifft (z.B. nach "case 5" da dort Status auf 0 gesetzt wird).

    Du kannst auch die Pausenzeit ändern (z.b. 100ms), dann musst du aber eventuell noch zwischen den beiden Cases für Ausgang setzen bzw löschen ein weiteres Case einsetzen und mit einem Zähler versehen (wie bei case 3). Dann hast du:
    Case 1 Ausgang setzen
    Case 2 Zähler (Impulslänge)
    Case 3 Ausgang löschen
    Case 4 Zähler (Pause zwischen Impulsen)
    Case 5 Ausgang setzen
    Case 6 Zähler (Impulslänge)
    Case 7 Ausgang löschen

    MfG Hannes
    Geändert von 021aet04 (14.03.2018 um 09:34 Uhr)

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    03.03.2018
    Beiträge
    12
    Danke für eure Vorschläge. jetzt muss ich warten, bis das Teil da ist. Danach bin ich erst mal unterwegs. Ich werde mich später sicher nochmal melden, wenn ich vielleicht noch nen Tipp brauche.

    Lg Funky

  5. #5
    HaWe
    Gast
    mit Arduino API Funktionen (millis, delay) geht das doch wirklich noch 1000mal einfacher....!

  6. #6
    Erfahrener Benutzer Robotik Einstein Avatar von i_make_it
    Registriert seit
    29.07.2008
    Ort
    Raum DA
    Alter
    56
    Beiträge
    2.814
    Wenn man kein retriggerbares Monoflop braucht, geht natürlich auch delay().
    Code:
    // Digispark Mini, ATtiny85, USB
    // Test 1 - Feste Zeiten mit Delay
    
    void setup() {                
      pinMode(0, INPUT);
      pinMode(1, OUTPUT);  
    }
    
    void loop() {
      int trigger = digitalRead(0);
      if (trigger <> 0)
      {
        digitalWrite(1, HIGH);
        delay(1000);             //1 Sekunde an
        digitalWrite(1, LOW);
        delay(10000);         //10 Sekunden aus
        digitalWrite(1, HIGH);
        delay(1000);             //1 Sekunde an
        digitalWrite(1, LOW); 
      }
    }
    Sobald der Trigger ausgelöst ist, wird das stur abgearbeitet.
    Ob währenddessen ein zweiter Trigger kommt, der den Zyklus verlängern soll, wird nicht registriert.

    Bei Retriggerbarkeit, wird der erste 1 Sekunden Puls erzeugt, wenn während oder nach dem Impuls ein neuer Trigger kommt wird die Zeit für das Monoflop zurückgesetzt und die Gesammtzeit ist dann die schon verstrichene Zeit plus die Zeit auf die der Timer eingestellt ist. Wie bei einem Treppenhauslicht kann man damit die Zeit bis zum zweiten 1 Sekunden Puls beliebig verlängern, wenn mann innerhalb der Zeit immer wieder neu triggert.

    Es kommt halt auf die exakte Aufgabenstellung an, was man benötigt.

  7. #7
    HaWe
    Gast
    genau, zum Retriggern verwendet man nicht delay sondern stoppt/überwacht millis() in einer eigenen while() loop:

    zum Retriggern wird einfach vorher die Systemzeit millis gestoppt,
    dann wird ein Zielwert der gestoppten Zeit + 10000 milli-sek (oder was auch immer) zwischengespeichert.
    In der while-Schleife wird dann solange geloopt, bis millis den Zielwert erreicht oder überschritten hat.

    In der Loop wird parallel weiterhin trigger=digitalRead(0) abgefragt, und wenn ein Tastendruck erfolgt ist, wird erneut der Zielwert um 10000milli-sek erhöht.

Ähnliche Themen

  1. Suche geeignete Steuerung für Videoüberwachungssystem
    Von allexus im Forum Suche bestimmtes Bauteil bzw. Empfehlung
    Antworten: 0
    Letzter Beitrag: 26.01.2010, 11:44
  2. Suche geeignete Funkstrecke
    Von the_Ghost666 im Forum Elektronik
    Antworten: 3
    Letzter Beitrag: 04.07.2007, 20:37
  3. suche geeignete sensoren!
    Von macinstyle im Forum Sensoren / Sensorik
    Antworten: 11
    Letzter Beitrag: 20.08.2006, 14:39
  4. [ERLEDIGT] suche geeignete kamera
    Von im Forum Sensoren / Sensorik
    Antworten: 12
    Letzter Beitrag: 02.11.2004, 11:40
  5. Antworten: 3
    Letzter Beitrag: 24.04.2004, 19:40

Stichworte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

12V Akku bauen