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
}
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.
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.
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.
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.