Morse Code Türoffnung

Hallo liebe Community,

ein neuer Unerfahrener braucht Hilfe.

Folgendes, ich möchte meinen Türoffner, in der Haustür, mit einem Morsecode, an der Klingel bedienen können.

Das Klingelsignal fange ich ab, indem ich die Spannung des Haustelefons Messe, diese Steigt, wenn geklingelt wird.

Da ich sehr unerfahren bin, bleibt mir erstmal nur übrig, fertige Codes zu modifizieren. Also habe ich mir einen Morse encoder runter geladen(Link am Ende), den input geändert und die Verzögerung zu den neuen Buchstaben etwas vergrößert. Funktionert auch so weit gut.

Nun fehlt noch die Passwortabfrage, das ist die Stelle, wo ich Hilfe brauche, da ich nichts passendes im Netz gefunden habe.

Folgend habe ich mir die Funktion vorgestellt.
Wird nach 3 Sekunden keine neue Eingabe getätigt, wid das decodierte in den Passwort Void übertragen.
Ist das Passwort richtig, wird ein Transistor geschaltet und wieder aus, dann zurück in den loop Teil. Ist das Passwort falsch, geht es direkt zurück in den loop.

So in der Art habe ich mir das Vorgestellt. Ich lerne erst seit einem Monat, deswegen seid nicht böse, wenn etwas unverständlich ist. Ich werde mich in solch einem Fall weiter erklären.
Unten schreibe ich noch den Code hin, wie ich Ich es denke, dass er einfach unten mit an den kopierten mit dran kann.

Vielen Dank im voraus.
Mfg Mike

void passwortabfrage()
{
 if (passwort == "XXX")
 { 
   digitalWrite(20, HIGH);
   delay(20);
   digitalWrite(20, LOW);
   loop();
 }
else
  {
   loop();
  }

}

Hi

Code bitte in Code-Tags. (geht auch nachträglich)

Dein Snipped wird allerdings nicht lange laufen - Du rufst dort loop() auf - und von Da kommen wir.
Im Arduino werden die Funktionen setup() und loop(), jeweils vom typ void (= hat keinen Rückgabewert), aufgerufen.
setup() nur 1x, loop() danach immer und immer wieder.
In setup() machst Du Dinge, Die nur 1x gemacht werden müssen - DIsplay einrichten, Ein/Ausgänge konfigurieren, so Zeug.
In loop() machst Du, was Du IMMER machen musst.
Hier z.B. schauen, ob jetzt gerade Jemand klingelt.
Oder eben nicht, um die Dauer der Klingeln zu erfassen.
Wenn 3 Sekunden nicht geklingelt wurde (und zuvor geklingelt wurde), wird das aufgezeichnete Muster decodiert - also die Funktion wird aus der loop() aus aufgerufen.
Wenn die Funktion beendet ist, läuft das Programm in loop() weiter - deshalb ist es äußerst schädlich, wenn Du loop() selber aufrufst (Stack-Überlauf, reboot des Arduino, unerklärliches Verhalten).

Schaue Dir bitte die Beispiele an, Die die IDE mitbringt - dort ist zwar auch oft delay() in Benutzung (was man Sich schnell abgewöhnen sollte, Stichwort: Blink_without_delay), aber sonst sind die Dinger ganz brauchbar.

Dein Haustelefon benutzt 5V ??

MfG

else
  {
   loop();
  }

Du kannst nicht loop() aus einer anderen Funktion heraus aufrufen. Das ist rekursives Aufrufen und müllt schnell den Stack zu. Der Arduino blockiert dann.

Du solltes Dich dazu hinreisen lassen Arduino zu lernen und etwas C. Dann kannst Du die Projekte ganz alleine nach Deinen Wünschen machen ohne von anderen abhängig zu sein.

Grüße Uwe

Meiketch:
ein neuer Unerfahrener braucht Hilfe.

Ich stimme Uwe zu. Arbeite Dich ein bisschen in das Programmierthema ein.

Ein guter Anfang ist IMO, wenn Du Dir mal anguckst, was ein Programmablaufplan ist. Dann kannst Du versuchen, Dein Vorhaben in Schritte aufzuteilen, die Du programmieren kannst (bzw. anhand denen Du lernen kannst, wie man programmiert). Du kannst auch schon recht viel lernen, indem Du Dir nur die Beispiele in der IDE anguckst.

Aller Anfang ist schwer, aber man sagt, dass der erste Schritt der halbe Weg ist. Und ein gutes Forum hast Du ja schon gefunden :slight_smile:

Gruß

Gregor

Hey,

schonmal danke für die vielen Antworten in der Kurzen Zeit.

@postmaster. Ich habe mir schon so gedacht, dass das mit dem befehl loop unter Umständen nicht klappen könnte.

Mein Haustelefon läuft mit 14 Volt, wird geklingelt liegen 22 Volt an. Ich weiß ist komisch ist aber so.

@Uwefed. Ich lerne ja gerade, aktuell 1 Monat erst, teils gelesen, aber größter Teil learning by doing.
Lediglich ein bisschen Grundwissen zum Thema elektrische Bauteile bringe ich schon mit.

@gregorss Meinen Programablaufplan habe ich ja bereits beschrieben und er ist auch fest in meinem Kopf verankert.

Nun bräuchte ich dieses mal eine Erklärung für Blöde, wie ich das Ergebnis aus der Converterfunktion in die Passwortabfrage übertrage, so dass ich dann auch diesen Timeout von 3 Sekunden habe.

Ich hoffe ich habe nichts wichtiges vergessen. Das mit den Codes Tags werde ich mir merken.

MFG Mike

Meiketch:
@gregorss Meinen Programablaufplan habe ich ja bereits beschrieben und er ist auch fest in meinem Kopf verankert.

Das Blöde ist, dass so ein Programmablaufplan, der nur im Kopf existiert, falsch sein kann - was man manchmal erst herausbekommt, wenn man den Ablauf aufzeichnet.
Als ich mir einmal einen (eigentlich sehr einfachen) Algorithmus nicht vorstellen konnte, habe ich erst beim Zeichnen bemerkt, warum mein Hirn nicht wollte: Da war ein ziemlich dämlicher Denkfehler drin.

Auch wenn Du denkst, dass Dein Ablauf ja supersimpel und klar wie Kloßbrühe ist, kannst Du Dich durchaus irren. Isso.

Meiketch:
Nun bräuchte ich dieses mal eine Erklärung für Blöde, wie ich das Ergebnis aus der Converterfunktion in die Passwortabfrage

Fang' am besten mal damit an, dass Du den vollständigen, übersetzbaren (compilierbaren) Sketch zeigst, den Du bislang hast. Dein Schnipsel sagt IMO nicht so irre viel aus.

Gruß

Gregor

Meiketch:
.....
Meinen Programablaufplan habe ich ja bereits beschrieben und er ist auch fest in meinem Kopf verankert.

Nun bräuchte ich dieses mal eine Erklärung für Blöde, wie ich das Ergebnis aus der Converterfunktion in die Passwortabfrage übertrage, so dass ich dann auch diesen Timeout von 3 Sekunden habe.
.....

Und warum zeigst du uns den nicht ?
Das was du im ersten Post beschrieben hast, ist nur eine grobe Vorstellung der von dir gewünschten Funktion.
Das erkenne ich daran: "So in der Art habe ich mir das Vorgestellt"
Das ist kein Programmablaufplan.

Zudem solltest du auch deinen kopierten Sketch "Decoder" lesen und verstehen.

Wenn du dir auch den von dir verwendeten Decoder richtig ansehen würdest, müsstest du erkennen, dass die von dir gewünschte Auswertung da schon eingebaut ist. Die musst du nur auf deine Bedürfnisse erweitern.

Und das als Anfänger ohne den von Gregor angesprochenen Programablaufplan zu realisieren, halte ich schon für eine ziemliche Herausforderung.

gregorss:
Das Blöde ist, dass so ein Programmablaufplan, der nur im Kopf existiert, falsch sein kann - was man manchmal erst herausbekommt, wenn man den Ablauf aufzeichnet.
Als ich mir einmal einen (eigentlich sehr einfachen) Algorithmus nicht vorstellen konnte, habe ich erst beim Zeichnen bemerkt, warum mein Hirn nicht wollte: Da war ein ziemlich dämlicher Denkfehler drin.
...

TOP!
Ich bevorzuge für mein Konzept auch Bleistift, Radiergummi und Papier. Es bringt mir gefühlt eine andere Qualität der Konzentration. Das war vor 10 Jahren noch nicht so.

https://www.google.com/search?q=programm+ablauf+plan

mde110:
TOP!
Ich bevorzuge für mein Konzept auch Bleistift, Radiergummi und Papier. Es bringt mir gefühlt eine andere Qualität der Konzentration. Das war vor 10 Jahren noch nicht so.

Konzentrationsprobleme waren für mich der Hauptgrund, weshalb ich so gerne mit PAPs spiele. Ein nur knapp nicht so wichtiger Grund für das Kritzeln von PAPs war bzw. ist, dass man das vollkommen stromlos und in einem Cafe tun kann. Ein Cappuccino, eine Nussecke und eine Aussicht mit viel Himmel sind mein ideales Setting für gute Einfälle. Es ist halt wie bei Drogen aller Art: Set und Setting müssen stimmen :slight_smile:

Leibniz (der Mathefuzzi, die Kekse schreibt man mit tz) hatte seine besten Ideen wohl, wenn er in der Natur unterwegs war.

Gruß

Gregor

PS: Echt geil fand ich ja mal, als eine Bekannte mit meiner Hilfe aufs Abi gelernt hat. Da gab's eine Geometrie-Aufgabe, die man nur dann ordentlich lösen konnte, wenn man sehr konzentriert und genau gezeichnet hat (das ist genau das, worauf die wenigsten Leute Bock haben). Für Leute, die meinen, alles mit einem schnellen Gekritzel lösen zu können, war das eine echt fiese Fallgrube. Diese Aufgabe hätte ich mir kopieren sollen.

Meiketch:
Ich habe mir schon so gedacht, dass das mit dem befehl loop unter Umständen nicht klappen könnte.

loop() ist kein Befehl. Wenn du alles nur als Befehle siehst verschleierst du was wirklich gemacht wird. Und da machst es dir sehr schwierig mit Google oder in Büchern nach Erklärungen zu suchen, da du nicht die richtigen Begriffe verwendest.

Das ist ein Funktionsaufruf und wenn man nachschlägt was dabei passiert sieht man auch wieso das so falsch ist:

Da taucht zwar das Wort "Befehl" auf, aber das ist eine Ebene tiefer als C/C++, da es sich auf den aus deinem Code erzeugten Assembler-Code bezieht

Hallo,

was meinst Du eigendlich mit Password Abfrage ? ist das die Stelle wo dein Morsecode ausgewertet werden soll ?

Ansonsten kann ich mich der allgemeinen Meinung hier nur anschliessen, erst mal einen Ablaufplan erstellen und zwar auf Papier nicht im Kopf , das ist nur was für geübte. Mach Ihn so fein wie möglich, das macht es einfacher die einzelnen Zeilen dann in Code umzusetzen.

Mit den von Dir gemessenen Spannungen wirst Du auch Problemchen bekommen. Handelt es sich um Wechselspannung oder Gleichspannung , oder beides, beim telefonieren Gleichspannung beim Klingeln Wechselspannung. Ist der Minus an dem Du jetzt misst wirklich der Minus. ?

So wie es aussieht kannst Du den uP so nicht einfach daran anschliessen. Da wird zusätzliche Hardware nötig sein. Optokoppler oder Relais eventuell mit Gleichrichter und einen klienen Konsensator wenn Du aus Wecheslspannung erst mal Gliechspannung machen must.

Wenn das nicht deine eigene Klinge-Sprechanlage ist dann lass die Finger davon bevor Du das Ding noch abgefackelt hast.

Heinz

Ich habe unsere DingDong- Klingel an unserer Haussprechanlage (14 Parteien) auch gewechselt.
Deswegen finde ich die "Morse" Idee ganz gut, da ich auch mit dem Gedanken gespielt hatte, über ein Klingelsignal den Türöffner anzusteuern.

Ich parasitäre mir den Wechselstrom über dem Türöffnerkontakt als Versorgungsspannung für den ESP und puffere das auch in einem Akku. Sobald die 13VAC fehlen, wird der Türöffner aktiv von einer Partei betätigt. Damit kann ich überwachen, ob irgendein Türöffner hängt. Das kommt schon ab aund an mal vor.

Die beiden Klingelsignale 13VAC Wohnung und Haustüre greife ich mit einer Gleichrichter-Optokoppler Kombination ab.
Ein DFPlayer MP3 Modul spielt mir dann unterschiedliche Melodien ab...

Bis jetzt habe ich es aber den "Morsekodeöffner" noch nicht umgesetzt.

Meiketch, meinst mit Passwort sicherlich, dass er 123 mit der Klingel "morst" und dann der Türöffner angesteuert wird.

Hallo Leute,

der Code ist nun fertig und funktioniert.

Um nochmal auf die Bedenken von euch bezüglich der Spannung zurück zu kommen.
Es liegt im idle definitiv 17 Volt DC an, wird geklingelt liegen 22V an. Dies ist auch mein Indikator.

Zu gucken, ob der Strom dann nicht doch AC wird, wenn jemand Klingelt habe ich noch nicht bedacht, werde ich auf jeden Fall prüfen.

Ich habe einen L78S12CV vor die Spannungsversorgung des Arduino gesetzt.
Nun habe ich noch folgendes Problem, dass das Programm nicht mehr funktioniert, wenn geklingelt wird und der Arduino an den 12 Volt hängt.
Mir ist aufgefallen, dass die Betriebsled flimmert, wenn gekingelt wird.

Deswegen habe ich nachgemessen.
Im ide liegen an dem Arduino 12V an, wenn geklingelt wird, liegen nurnoch 11V an.
Laut Internet, kann das schon mal sein, dass dann der Code nicht mehr läuft.
Betrieben an der USB Schnittstelle funktioniert das Programm einwandfrei. Morsecode Türöffner - YouTube

Ich habe nun gedacht dieses Defizit mit einem Kondensator zu überbrücken und gut ist.
Eure Ideen und Meinungen dazu sind gern erwünscht.

Nun nochmal ein Bild und zum Schluss der Code.

Im Bild zeige ich euch meinen Schaltplan.
Oben Links soll das Spannungssensor Modul darstellen.

Rechts daneben ist besagter Spannungswandler.
Unten Links mein Controller.
Rechts daneben das Relais, welches den Türöffner überbrückt.
S = Signalpin auf Arduino

Nun der Code.
Diesen habe ich nicht alleine angefertigt und verstehe ihn deswegen noch nicht 100%.
Die Zeiten für den Morsecode müssten auch noch individuell angepasst werden, dieser ist eher was für langsamere Morser.

Morsedecoder by https://www.instructables.com/id/Morse-Code-Decoder/

unsigned long signal_len,t1,t2,t3;   //time for which button is pressed
int inputPin = A1;                 //input pin for push button
int ledPin = 18;                   //outpu pin for LED
String code = "";                 //string in which one alphabet is stored
String passwort;
int x=0;
char buf[8];

void setup()

{
 Serial.begin(9600);
 pinMode(inputPin,INPUT); 
 pinMode(ledPin,OUTPUT);
 pinMode(20, OUTPUT);
 digitalWrite(20, HIGH);
}


void loop()
{
NextDotDash:
 while (analogRead(inputPin) < 700) {    
   if(millis() - t3 > 5000){
   passwort=buf;
   Serial.print("t");
   Serial.println(passwort);
   passwortabfrage();  
   memset (buf, 0, sizeof(buf));
   passwort="";
   x=0;
   
  }
 }
 t1 = millis();                            //time at button press
 digitalWrite(ledPin, HIGH);               //LED on while button pressed
 while (analogRead(inputPin) > 700) {t3 = millis();}
 t2 = millis();                            //time at button release
 
 digitalWrite(ledPin, LOW);                //LED off on button release
 signal_len = t2 - t1;                     //time for which button is pressed
 if (signal_len > 50)                      //to account for switch debouncing
 {
   code += readio();                       //function to read dot or dash
 }
 while ((millis() - t2) < 1000)           //if time between button press greater than 1sec, skip loop and go to next alphabet
 {     
   if (analogRead(inputPin) > 700)
   {
     goto NextDotDash;
   }
   
 }
 convertor();                          //function to decipher code into alphabet
    
 
 Serial.println(t3);
}

char readio()
{
 if (signal_len < 600 && signal_len > 50)
 {
   return '.';                        //if button press less than 0.6sec, it is a dot
 }
 else if (signal_len > 600)
 {
   return '-';                        //if button press more than 0.6sec, it is a dash
 }
}

void convertor()
{
 static String letters[] = {".-", "-...", "-.-.", "-..", ".", "..-.", "--.", "....", "..", ".---", "-.-", ".-..", "--", "-.", "---", ".--.", "--.-",
                            ".-.", "...", "-", "..-", "...-", ".--", "-..-", "-.--", "--..", "E"
                           };
 int i = 0;
 if (code == ".-.-.-")
 {
   Serial.print(".");        //for break
 }
 else
 {
   while (letters[i] != "E")  //loop for comparing input code with letters array
   {
     if (letters[i] == code)
     {
       Serial.print(char('A' + i));
       buf[x] = char('A' + i);        
       break;
     }
     i++;
   }    
   if (letters[i] == "E")
   {
     Serial.println("ERROR");  //if input code doesn't match any letter, error
   }
 }
 code = "";                            //reset code to blank string
 x++;  
}

void passwortabfrage()
{  
 if (passwort == "XXX" || passwort == "XXX" || passwort == "XXX"){
  
   Serial.println("Passwort OK");
   digitalWrite(20, LOW);
   delay(500);
   digitalWrite(20, HIGH);
 }else{
   
 }
}

Hänge Bilder bitte direkt ins Forum, auf fremden Servern werden sie irgendwann gelöscht und hier fehlen dann die Zuammenhänge.

  1. Schritt: Bild(er) als Attachment an den Beitrag anhängen und den Beitrag speichern
  2. Schritt: Den Beitrag editieren und den Link vom Attachment in den Image-Tag einfügen

Gruß Tommy

  1. Erst mal musst du richtig messen, was du für eine Spannung abgreifen willst. AM besten mit dem Oszi.
    Ob AC oder DC macht einen großen Unterschied.

  2. Dann ist zu klären, wofür die Spannung von der Sprechanlage verwendet wird? Wo geht sie sonst hin?

Dass sich die Spng beim Klingeln erhöht, ist untypisch und nicht logisch. Außer du misst den DC einer AC Versorgung und dein Messgerät bekommt die Werte nicht richtig gemessen.

  1. Zeichne einen ausführlichen Schaltplan.
    Dieses Post-it Ding ist unfug.

Hallo,

hier die Bilder, weshalb ich von DC Spannung ausgehe.

Misst du die Spannung der Gegensprechanlage?

Wofür wird die Spannung verwendet, die du da misst?

Meiketch:
Im ide liegen an dem Arduino 12V an, wenn geklingelt wird, liegen nurnoch 11V an.
Laut Internet, kann das schon mal sein, dass dann der Code nicht mehr läuft.

Wenn anstatt 12V nur 11V am Vin des Arduino XXX (welchen verwendest du?) liegen, dann ist das kein Grund für einen Reset.
Vermutlich ist die DC evtl. nicht mehr glatt sondern "brummt".

Einmal schreibst du es liegen 17V zu 22V an, jetzt schreibst du am Arduino liegen 12V zu 11V an?
Dein Messgerät zeigt 14,4V?
Evtl. reicht der Strom nicht für das Relais?

Dein L78S12CV ist natürlich ein bisschen unglücklich gewählt, wenn du Spng zw 22V und 11V zu erwarten sind.
Besser wäre ein StepDown/ DC Buck.
Die sehen so aus:
https://www.amazon.de dc+buck

Ein 470µ Elko könnte helfen, dann aber mit Diode, damit nichts zurückfließt...

Hi,
ich benutze den Sparkfun pro Micro

Die gemessene Spannung von 14 Volt liegt an dem Haustelefon an, wird geklingelt liegen 17V an. So ist es richtig.

Die Spannung wird genutzt, um das Haustelefon zu versorgen, um den Klingeimpuls abzufangen und soll meinen Arduino mit Strom versorgen.

Dein L78S12CV ist natürlich ein bisschen unglücklich gewählt, wenn du Spng zw 22V und 11V zu erwarten sind.
Besser wäre ein StepDown/ DC Buck.
Die sehen so aus:
https://www.amazon.de dc+buck

Ein 470µ Elko könnte helfen, dann aber mit Diode, damit nichts zurückfließt...

Danke für diesen Hinweis

Was für ein Haustelefon hast du?
Hersteller und Bezeichnung?
Foto von der Platine.

Ist das digital??