Hallo funky34,
ohne Grundlagen geht es nun mal nicht.
vielleicht hilft das etwas weiter?:
https://www.rahner-edu.de/grundlagen.../timer-ic-555/
Gruß
Hallo funky34,
ohne Grundlagen geht es nun mal nicht.
vielleicht hilft das etwas weiter?:
https://www.rahner-edu.de/grundlagen.../timer-ic-555/
Gruß
Mit einem 555 wird das nicht so ohne weiteres gehen.
Erstell erst mal mit einem 555 ein retriggerbares Monoflop.
Der Ausgang geht beim Start von OFF auf ON (je nach Spannung die verwendet wird z.B. von 0V auf 5V).
Und bei Ablauf der Zeit auf ON auf OFF.
Retriggerbar heist, das wenn innerhalb der ON-Zeit ein neuer Startimpuls kommt der Timer zurückgesetzt wird und die ON-Zeit entsprechend länger wird.
Danach nimmt man ein Latch (Flankengesteuertes Flip Flop) bei jedem Wechsel (OFF nach ON oder ON nach OFF) wird der Ausgang des Latch von OF auf ON gesetzt.
Jetzt benötigt man eine Verzögerungskette (das kann ein zweiter 555 sein) die nach einer Sekunde das Latch zurücksetzt.
So bekommt man ein paar Nanosekunden nach dem Auslösereigniss einen 1S Puls und am Ende der eingestellten Zeit einen zweiten 1S Puls.
Wobeoi man die Länge des Pulses der beim Flankenwechsel auftritt auch einstellen kann wenn er nur kürzer ist als die kürzeste Zeit des ersten Monoflops.
Wie gesagt in dem genannten Video über den 555, ab 4:44 wird der Monoflop erklärt.
https://www.youtube.com/watch?v=i0SNb__dkYI
Wenn das mit dem Verständniss bei der Hardware Entwicklung noch hängt oder das Elektronik wissen nicht ausreicht, wäre die µC Variante allerdings wirklich eine Überlegung wert.
Eventuell mal den:
"Digispark Mini, ATtiny85, USB"
ansehen.
(ich selbst habe keine Erfahrung mit dem)
Der soll mit der Arduino IDE direkt per USB programimerbar sein, ist klein und kostet nicht die Welt.
Wenn die eine Sekunde langen Pulse nicht auf die Nanosekunde genau sein muß, ist ein Programm auch nicht all zu komplex.
Mit dem Triggerereigniss (und wenn Merkvariable2 nicht gesetzt ist) wird der aktuelle Wert des freilaufenden Timers in eine Variable1 geschrieben
Eine Merkvariable2 wird gesetzt und der Ausgang3 gesetzt.
Bei jedem Programmdurchlauf wird der Timer mit der Variable1 + eine Sekunde verglichen.
Bei Erreichen oder Überschreiten wird Ausgang3 gelöscht.
Ebenfalls bei jedem Programmdurchlauf wird der freilaufende Timer mit dem Wert der Varibale1 + der Zeit die bis zum zweiten Puls vergehen soll verglichen.
Ist das erreicht oder überschritten wird der Timer in eine Variable4 eingelesen und der Ausgang3 gesetzt, bei jedem Programmdurchlauf wird der Timer mit der Variable4 + eine Sekunde verglichen.
Bei Erreichen oder Überschreiten wird Ausgang3 gelöscht und die Merkvariable2 gelöscht.
Erfolgt ein Triggerereigniss wärend die Merkvariable2 gesetzt ist, wird Variable1 auf den aktuellen Timerwert gesetzt aber nicht der der Programmteil für den ersten ein Sekunden Puls durchlaufen.
Diese Variante hat gegenüber delay() (eine Funktion der Arduino IDE) den Vorteil, daß der µC wärend der ganzen Zeit weiter Daten verarbeitet und nicht blokiert ist. Theoretisch kann der also noch etwas anderes parallel machen, solange die Zykluszeit für den Programmdurchlauf dadurch nicht zu lang wird. Falls doch müsste man einen Interrupteingang nuzten und ggf. Timer-IRQs nutzen.
Das wäre im groben die Programmlogik.
Kosten wären bei dieser Variante nur, knapp 13 € wenn man bei Reichelt kauft (andere Anbieter könnten ggf. günstiger sein).
Die Arduino IDE kann man kostenlos runterladen.
Eine Eingangs- und eine Ausgangsschaltung müsste man ggf. genauso bauen wie bei der Hardware Variante auch.
(Anpass- und Schuzschaltung für den Eingang und Lestungstreiber/Anpaßschaltung für den Ausgang)
Geändert von i_make_it (13.03.2018 um 08:11 Uhr)
Mit der Überlegung über einen µC könnte ich mich anfreunden.
Du hast mr nun schon den möglichen Programmablauf recht detailreich beschrieben. Kannst du mir nicht die Programmzeilen zu Papier bringen. Ich werde mir den vorgeschlagenen Typ bei Reichelt bestellen.
Und danke für die Tipps
lg Funky
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 11:45 Uhr)
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.
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"
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.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) }
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 10:34 Uhr)
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
Lesezeichen