Schalterstatus Auswerten und Ausgang schreiben

Mahlzeit zusammen,

ich bin auch relativ neu ich arduino programmierung, und stehe bei einem aktuellen Projekt grade auf dem Schlauch.

Ziel : Alarmanlage - Funktioniert soweit mit der Alarmauswertung und Signalgeberansteuerung über ein Relais.

Nun habe ich folgendes Problem:

Der Arduino wird über ein Funkrelais scharf bzw unscharf geschaltet (HIGH oder LOW für scharf bzw nicht scharf)

Wenn ich nun vor der Wohnungstür stehe hätte ich gerne eine Akustische Rückmeldung wenn das Relais zieht bzw abfällt, d.h ich möchte von außen hören ob das scharf bzw unscharfschalten erfolgreich war.

Dazu war meine Idee ( vorerst Probeaufbau mit simuliertem Schalter), dass wenn sich die Schalterstellung ändert, ein Piezzosummer für 5sec angesteuert wird.

Jetzt piept der Summer allerdings nur wenn ich von der einen in die andere Schalterposition schalte, zurück jedoch nicht - kann mir jemand eine Lösung für eine Funktion vorschlagen, um dieses Problem zu lösen?

Mein bisheriger Ansatz der nur halb funktioniert:

void sus() // scharf unscharf Auswertung
{
 int Schalterstatus = digitalRead(Schalter); // HIGH oder LOW aktuelle Stellung des Schalters
 delay(1000);
 if(Schalterstatus != digitalRead(Schalter))
 {
   digitalWrite(Summer, LOW); // scharf-unscharf Status 5sec Akustik
   delay(1000);
   digitalWrite(Summer, HIGH); // Summer nach 5sec wieder aus
 }

versuch es mal so:

void sus() // scharf unscharf Auswertung
{
  bool Schalterstatus_alt = Schalterstatus;
  bool Schalterstatus = digitalRead(Schalter); // HIGH oder LOW aktuelle Stellung des Schalters
  delay(5);
  if(Schalterstatus != Schalterstatus_alt)
  {
    digitalWrite(Summer, LOW); // scharf-unscharf Status 5sec Akustik
    delay(1000);
    digitalWrite(Summer, HIGH); // Summer nach 5sec wieder aus
  }

ob allerdings das delay bei einer Alarmanlage sinnvoll ist, bezweifel ich.

Generell ist es eine schlechte Lösung mit "delay()" zu arbeite, während dieser Wartezeit nimmt der Controller keine Aktionen eines Tasters an.

Damit dein Piezo auch so arbeitet, wie du es möchtest, solltest du eine Flankenauswertung einbauen. Die eben nur bei steigender oder fallender Flanke reagiert.

Hi

Deine Kommentare passen nicht immer zum Code (5 Sec Akustik mit einem delay(1000);). Nach dem Code müsste der Summer bei jeder Änderung, sofern der Summer AUS ist, Diese erkennen und den Summer für 1 Sek auf LOW schalten. Während der Abfrage und dem Summ-Ton bist Du in den delay() gefangen, ein Umschalten während der Taster abgefragt wurde bis zum Ende des Summers wird frühestens 'in der nächsten Runde' erkannt. Der Summer ist dann wohl zwischen Vcc und Pin geschaltet bzw. wird versorgt, wenn der Pin auf LOW geht.

In der sus()-Funktion bist Du 2 Sekunden gefangen - wenn Das nicht stört ... kann Das auch so bleiben :/

Rein Interessehalber: Du schaltest diese Alarm-Funktionalität mittels Funk? Wie sicher ist Es, daß Da kein Anderer 'Zwischenfunkt'?

MfG

PS: Trotzdem sehe ich NICHT, warum der Summer nur in einem der Fälle reagiert - laut Code müssten beide Fälle abgedeckt sein.

Das soll erstmal ein Testaufbau sein, wenn es so realisiert werden sollte, brauche ich eine möglichkeit von außen scharfzuschalten, aber ich kann leider vor die Wohnungstür keine Dose setzen, wo ich dann mit einer Scharfschalteinrichtung arbeiten könnte oder zB über RFID;

Zu den falschen Kommentaren im Code - ja ich bin gerade am rumprobieren da ich wirklich erst mit der Programmierung angefangen habe.

Der Code der gepostet wurde Funktioniert leider auch nicht - es geht bei der Fragestellung wirklich erstmal rein um die Lösung, wie ich es realisieren kann einfach das umschalten des Schalters wahrzunehmen, und jedes mal bei einer Statusänderung den Summer für einige Sekunden ertönen lassen kann.

MfG ecka

ecka: ..... wirklich erstmal rein um die Lösung, wie ich es realisieren kann einfach das umschalten des Schalters wahrzunehmen, und jedes mal bei einer Statusänderung den Summer für einige Sekunden ertönen lassen kann.

Dann lies doch auch meinen Post #2 durch.

HotSystems: Dann lies doch auch meinen Post #2 durch.

Könntest du mir einen Ansatz geben wie ich das realisieren kann? Stehe grad auf dem Schlauch

MfG ecka

Hier z.B. in Post #3: Flankenauswertung

ecka: Der Code der gepostet wurde Funktioniert leider auch nicht

Das liegt daran, dass nur lokale dynamische Variable verwendet werden. Damit kann man sich den alten Status nicht merken. Zumindest eine muss als statische Variable definiert werden, damit der Wert vom vorherigen Aufruf erhalten bleibt:

 bool Schalterstatus_alt = Schalterstatus;
 static bool Schalterstatus = digitalRead(Schalter); // HIGH oder LOW aktuelle Stellung des Schalters

Das delay-Problem ist unabhängig davon, und Du musst selbst entscheiden ob Du 2 Sekunden 'Blindheit' bezüglich des Schalterstatus ( und allem was sonst noch so im Sketch abgefragt wird ) tolerieren kannst.

Danke erstmal für eure schnellen Antworten!!

Ich hab jetzt nochmal mit euren Anregungen rumprobiert aber kriege das nicht ans laufen.

Könntet ihr vielleicht mal komplett eine Funktion aufschreiben die ich dann in der loop aufrufen kann?

Variablennamen müssen ja jetzt nicht mit denen aus meinem Sketch übereinstimmen.

Also konkret wie ihr die Funktion schreiben würdet als Quellcode - ich glaube das würde mir am meisten bringen sonst steige ich nicht dahinter xD

Danke euch schonmal für eure Hilfe.

Hi

Nein

Zeig, was Du hinbekommen hast, damit wir erkennen,. daß Du nicht nur die gebratenen Tauben haben willst.

Ein 'mimimi, ich bekomms nicht hin heul' führte vll. im Kindergarten dazu, daß Dir die Arbeit abgenommen wurde - hier aber eher weniger.

Viel Erfolg, trotzdem

MfG

das

#define Schalter 2 //Schalter zwischen Pin 2 und GND
#define Summer   8 //Summer zwischen Pin 8 und GND

void setup() {
  pinMode (Summer, OUTPUT);
  pinMode (Schalter, INPUT_PULLUP);

}

void loop() {
  sus();
}
void sus() // scharf unscharf Auswertung
{
  static bool Schalterstatus;
  bool Schalterstatus_alt = Schalterstatus;
  Schalterstatus = digitalRead(Schalter); // HIGH oder LOW aktuelle Stellung des Schalters
  delay(5);
  if(Schalterstatus != Schalterstatus_alt)
  {
    digitalWrite(Summer, HIGH); // scharf-unscharf Status 5sec Akustik
    delay(1000);
    digitalWrite(Summer, LOW); // Summer nach 5sec wieder aus
  }
}

läuft eigentlich.

Es hilft dem Verständnis, gerade von Anfängern, wenn der Kommentar zum Code passt. Kommentar 5 Sekunden -- delay(1000)

Gruß Tommy