Go Down

Topic: Türöffner auslösen wenn 3 mal klingeln (Read 3 times) previous topic - next topic

Andi1982

Hallo zusammen,

ich will dass unser Türöffner automatisch öffnet, sobald jemand innerhalb von 2 Sekunden 3 mal klingelt. Der Code (sketch) ist kein Problem für mich. Eher was ich dann triggern muss wenn die Bedingungen zutreffen.

Es handelt sich um eine ganz normale Klingelanlage mit Gegensprechfunktion. Ich hatte mir das eigentlich ganz einfach gedacht, der Klingelknopf wird gleichzeitig mit dem Arduino als Input verbunden. Wenn dann dreimal ein Signal innerhalb von 2 Sekunden rein kam, würde ich über einen digitalen Ouput das auslösen des "Türöffner-Summer-Knopfes" triggern.

Und genau da ist jetzt die Frage, wie? Dazu braucht man dann sicher ein Relais oder? Was würde sich da anbieten?

Fällt euch auf anhieb irgendetwas auf wo ich auf Probleme stoßen könnte? Da es eine wohnung im Miethaus ist würde ich ungern die ganze Anlage zerschießen.

Über Anregungen würde ich mich freuen!

Viele Grüße
Andi

guntherb

Die meisten Klingelanlagen arbeiten mit Wechselspannung.

Wenn du die direkt auf den Arduino legst wirst du den töten.

Du mußt das Eingangssignal zuerst gleichrichten (diode), dann glätten (kondensator) und auf Arduino taugliche Werte runterteilen (Spannungsteiler) und sicherheitshalber noch eine Z-Diode zum Schutz.
Der Ausgang, wie du schon richtig geschreiben hast, über ein Relais.
Grüße
Gunther

SheepMike

Hallo Andi1982,

eventuell kann ich dir als "alter Postler" weiterhelfen. Gibt es zu der Gegensprechstelle ein Typenschild und/ oder Name (Bezeichnung)? Vor DIREKTEN Eingriffen in die Anlage sei gewarnt ... schlimmstenfalls ist der Kauf einer neuen nötig - zudem können durch äußere Einwirkungen der Arduino (und somit DEINE Arduino-Anlage) zerstört werden. Zur Potentialtrennung zwischen beiden ist also mindestens ein Relais nötig, eventuell kann das Signal auch "direkt" in der Sprechanlage abgenommen werden.

Mit Gruß aus Badisch-Landen
Michel



Andi1982

Hey,

danke für die schnelle Antwort. Es war wohl etwas zu naiv zu glauben dass der Klingelknopf wirklich nur ein Knopf ist der durchschaltet oder auch nicht. Hast du einen Link für ein Relais?

guntherb


Hey,

danke für die schnelle Antwort. Es war wohl etwas zu naiv zu glauben dass der Klingelknopf wirklich nur ein Knopf ist der durchschaltet oder auch nicht. Hast du einen Link für ein Relais?


Manchmal hilft Google

Und hier hat das jemand schonmal gelöst:
http://www.mikrocontroller.net/topic/269913

und es gibt auch fertige Module mit Relais zu kaufen:
2 Kanal 5V Relais Module
Grüße
Gunther

Andi1982

Also,

ich habe das ganze jetzt mal auf einem Steckbrett simuliert. Als "Klingelschalter" habe ich nun erstmal einen push-button benutzt der über einen Digital-Pin eingelesen wird. Bei drei mal drücken innerhalb von 2 Sekunden wird dann über einen anderen Digital-Pin ein Relais (JRC-21F 5VDC / 220VAC 3A) geschalten. Das funktioniert auf dem Steckbrett alles bestens.

Nun habe ich mir Gedanken gemacht wie ich den Push-Button durch das Schaltsignal an der Sprechanlage ersetzen kann. Das ganze ist ja eigentlich ein anderer Stromkreis den ich eigentlich nicht unterbrechen will. ich möchte ja nur das Signal abfangen wenn in dem Stromkreis strom fließt und dem Aruino über ein Digital-Pin mitteilen dass da jetzt was rein kommt.

Kann ich mich in den Stromkreis der Türklingel einfach parallel schalten mit Diode und Spannungsteiler um dann in den Pin des Arduinos gehen?

Gruß
Andi

Udo Klein

Optokoppler + Vorwiderstand. Danach ein Tiefpass mit ausreichend großer Zeitkonstante. Den Tiefpass kann man auch in Software abbilden (z.B. wie hier: http://blog.blinkenlight.net/experiments/dcf77/binary-clock/).

Ggf. musst Du mit der Auslöseschwelle etwas spielen, also statt dem Originalcode eher so:

Code: [Select]

void low_pass_filter() {
    // http://en.wikipedia.org/wiki/Low-pass_filter#Continuous-time_low-pass_filters

    // I will use fixed point arithmetics with 5 decimals
    const uint16_t decimal_offset = 10000;
    static uint32_t smoothed = 0*decimal_offset;

    const uint32_t input = digitalRead(sample_pin) * decimal_offset;

    // compute N such that the smoothed signal will always reach 50% of
    // the input after at most 50 samples (=50ms).
    // N = 1 / (1- 2^-(1/50)) = 72.635907286
    const uint16_t N = 72;
    smoothed = ((N-1) * smoothed + input) / N;

    // introduce some hysteresis
    static uint8_t square_wave_output = 0;

    if ((square_wave_output == 0) == (smoothed >= decimal_offset/3)) {
        // smoothed value more >= 33%
        // ==> switch output
        square_wave_output = 1-square_wave_output;
        // ==> max the smoothed value in order to introduce some
        //     hysteresis, this also ensures that there is no
        //     "infinite memory"
        smoothed = square_wave_output? decimal_offset: 0;
    }

    digitalWrite(filtered_pin, square_wave_output);   
}


In Hardware brauchst Du stattdessen einfach einen Kondensator und einen Widerstand. Wie man die Zeitkonstanten ausrechnet findest Du im Netz ("RC Filter").
Check out my experiments http://blog.blinkenlight.net

guntherb


Kann ich mich in den Stromkreis der Türklingel einfach parallel schalten mit Diode und Spannungsteiler um dann in den Pin des Arduinos gehen?


ja, kannst du.

die beiden Drähte, die an der Kingel angeschlossen sind kanst du einfach anzapfen.
Dann, wie du geschrieben hast, mit Diode gleichrichten und über Spannungsteiler runterteilen.
Unbedingt nötig: Kondensatur zum glätten, sonst kriegst du alle 20ms einen Puls (Weil Wechselspannung)
Sehr empfehlenswert: Eine Z-Diode, um den Arduino zu schützen.

sicherer ist der von Udo vorgeschlagene Optokoppler, der braucht aber die gleiche Eingangsspannung wie der Arduino.
Grüße
Gunther

michael_x

#8
May 21, 2013, 11:24 am Last Edit: May 21, 2013, 11:43 am by michael_x Reason: 1
Quote
der braucht aber die gleiche Eingangsspannung wie der Arduino


Nicht ganz richtig:
Ein Optokoppler ist eingangsseitig eine LED, käme also auch mit weniger aus als der Arduino, verträgt aber auch bei entsprechendem Vorwiderstand mehr als der Arduino. Ein Klingeltrafo liefert eigentlich immer genug/zuviel Spannung für den Arduino direkt.

Einen Optokoppler kannst du ausgangsseitig als "Open Collector" direkt an den Input-Pin mit internem Pullup anschliessen.

Die 50 Hz Pulse kannst du auch ausnutzen, um zu zählen, wie lang die Klingel gedrückt wurde. Das vereinfacht die elektrische Seite, und ob du millis() oder 20millis Einheiten benutzt, ist ja praktisch egal.


Das Problem ist eher die zulässige Sperrspannung der Opto-LED --> Die erwähnte Diode (oder eine echte LED, dann sieht man auch was) antiparallel.

Nachtrag: s. Bild.

Andi1982

Danke michael_x für die Zeichnung, das macht es schon viel einfacher für mich. Anfangs habe ich nur Bahnhof verstanden als der  Optokoppler ins Spiel kam.

Ich habe das mit dem Signal aus einem anderen Stromkreis jetzt mal ganz schlicht versucht zu simulieren auf dem Steckbrett. Dazu habe ich einen 9V-Stromkreis (gleichstrom) mit einer LED, Pushbutton und Vorwiderstand aufgesetzt.

Vom PushButton geht dann noch eine Leitung zum Digitalen-Eingangspin des Arduinos.

Das sollte einfach nur mal zum Ausprobieren sein. Aber wenn ich mir mal im Serial-Monitor anzeigen lasse was da so rein kommt über den Pin, dann sehe ich ganz viele 1 und 0 abwechselnd. Muss ich da noch irgendwas zum GRND des Arduinos legen? Also eine Art pulldown-Widerstand?


michael_x


Andi1982

ne das war kein prellen, sonst hätte nach spätestens einer Sekunde drücken ein vernünftiges Signal kommen müssen. Aber die 0 und 1 kam auch wenn garnicht gedrückt wurde. Ich nehm heute mittag wenn ich zu Hause bin mal einen Widerstand zu Ground mit rein. Vielleicht bringt das dann was:


michael_x

#12
May 21, 2013, 01:39 pm Last Edit: May 21, 2013, 01:57 pm by michael_x Reason: 1
Normalerweise verbindet man den Minus einer Batterie mit GND. Die + 9V sind aber zuviel für den Arduino.

Ich würde den R1 z.B. in einen 470 Ohm und einen 220 Ohm Widerstand aufteilen.
Also 9V Batterie + an 470 an (x) an 220 an LED + und LED - mit Batterie - and GND.
Wenn die LED ca.2V Spannungsabfall hat, teilen sich die restlichen 7 V ca 5 : 2 auf.
An (x) ist dann etwas mehr als 4V, das ist genau richtig für den Arduino.

So wie du es vorher hattest, war das Ganze ohne GND- Verbindung, d.h. mehr eine Antenne für irgendwas.
Sorry, hab ich nicht genau hingeguckt...



Der LED2 fehlt auch ein Vorwiderstand!

Andi1982

Danke michael_x,

das model mit dem 9V Stromkreis durchschalten hat wunderbar funktioniert.

Nun habe ich an der Türklingel gemessen, da kommen 13,8V Wechselstrom an. Diese müsste ich gleichrichten und auf die knapp über 4V herunterbrechen. Ich habe das mit PSPice probiert zu simulieren. Dazu eine Diode und einen Kondensator genommen:



R2 ist quasi die Türklingel, da hätte ich mich dran gehängt.

Mit diesem Beispiel bin zwar bei Gleichstrom angekommen, aber knapp über 13V. Ich habe nun auch schon mit verschiedenen Widerständen herumgespielt (vor der Diode, hinter der Diode, vor dem Kondensator, usw.). Ich glaube ich stehe nun einfach auf dem Schlauch.

Wie müsste ich hier eingreifen um rechts bei 4,x V herauszukommen und dennoch einigermaßen geglättete Kurven zu haben?

Gruß
Andi

michael_x

#14
May 23, 2013, 11:56 pm Last Edit: May 24, 2013, 12:18 am by michael_x Reason: 1
Na, mit einem Spannungsteiler. Der darf bei dir natürlich nicht deine 13V peak dritteln, sondern muss auf den Effektivwert einer Halbwellen-Gleichrichtung angepasst sein.

( oder -- mit LTspice -- hinfummeln: statt 1/3 der Eingangsspannung (2:1 teilen)  eher 2/3 (also 1:2 teilen ) )


Kannst auch 2 Kondensatoren nehmen, ich würde es allerdings ganz ohne machen und eher per Software prüfen: wenn seit 50 msec kein Puls mehr kommt, ist die Klingel aus.

Noch ein Nachtrag: 4.8 oder 5.1 V Zenerdiode parallel zum Kondensator, wie gunther empfohlen hat...

Go Up