Beim öffnen eines Schalters sollen zwei kurze Impuls ausgegeben werden

Hallo, vielleicht kann mir jemand helfen,
ich möchte meine vorhandene Alarmanlage etwas modifizieren. Beim Scharfschalten mit einer FB erscheint ein kurzer Alarmimpuls und beim deaktivieren erscheinen 2 kurze Impulse an die Sirene. Diese Impulse für mich etwas lange und dadurch zu laut sind. Ich will den Alarmausgang über den arduino modifizieren. Der Code funktioniert soweit für das Scharfschalten (schließen des Schalters) mit einem Impuls sehr gut, nur weiß ich nicht wie das umgekehrt programiert wird, das beim wieder auschalten des Schalters, zwei kurze Impulse ausgegeben werden.
Für Info´s wäre ich sehr Dankbar.
Gruß
Firecode

const byte ledPin = 13;      // LED pin
const byte schalter = 8;   // Schalter pin
bool oneShot = true;
bool aktSchalterZustand;
bool altSchalterZustand;
bool trigger;
unsigned long previousMillis;

void setup() {
  pinMode(ledPin, OUTPUT);
  pinMode(schalter, INPUT);
}

void loop()
{
  if (oneShot) {
    aktSchalterZustand = digitalRead(schalter);
    if (aktSchalterZustand && !altSchalterZustand) {
      trigger = true;
      previousMillis = millis();
      digitalWrite(ledPin, HIGH);
    }
    altSchalterZustand = aktSchalterZustand;
    if (trigger && (millis() - previousMillis > 500)) {
      digitalWrite(ledPin, LOW);
      oneShot = true;
    }
  }
}

Ich rate Dir die Alarmanalge nicht zu modifizieren.
Zum Schluß funktioniert die Sirene neicht mehr.
Grüße Uwe

Zum Thema modifizieren: Wie funktioniert denn später die Sirene? Du müsstest die ja komplett abtrennen.
Mir egal. Du wirst wissen, was Du tust.
Was ich nicht verstehe, gehst Du an den Schalter und fragst den ab?

Du kannst nicht unterscheiden, ob die Anlage scharf oder unscharf ist, wenn der Arduino startet.
Das geht nur, wenn Du das piepen abfragst, ob innerhalb einer bestimmten Zeit erneut ein Impuls ausgelöst wird.

Die Sireneausgabe des Alarmsystems wird abgetrennt und soll dann über den Arduino ausgewertet und getriggert weden (High oder Low). Zusätzlich werden die dauer der Impulse für aktiviert oder deaktiviert modifizert.
Der Schalter ist jetzt nur Symbolisch.

ich wurde mit der Versicherung sprechen den bei versagen der Alarmanlage sagt dir die Versicherung nix da, wen Du die vergisst die einschalten ist eine andere Seite

Vorschlag - ungetestet, weil mir die Sirene fehlt :wink:

const byte ledPin = 13;      // LED pin
const byte schalter = 8;   // Schalter pin
bool oneBeep = false;
bool lastSchalter = false;
unsigned long lastMillis;

void setup()
{
  Serial.begin(115200);
  Serial.println(F("Start..."));
  pinMode(ledPin, OUTPUT);
  pinMode(schalter, INPUT);
}

void piep()
{
  digitalWrite(ledPin, HIGH);
}
void loop()
{
  if (digitalRead(schalter))
  {
    if (!lastSchalter)
    {
      if (oneBeep)
      {
        //doppelpiep
        oneBeep = false;
      }
      else
      {
        oneBeep = true;
      }
      lastMillis = millis();
      lastSchalter = true;
    }
  }
  else
  {
    lastSchalter = false;
  }
  if ((lastMillis - millis() > 1000) && oneBeep)
  {
    // einfachpiep
    oneBeep = false;
  }
  if ((lastMillis-millis()> 2000) && digitalRead(schalter)) // - hier muss noch an der Bedingung gearbeitet werden - sonst löst die aus....
  {
    // DAUERSIRENE 
  }
}

Die Versicherung ist nicht relevant. Die Anlage wird dann in mein Wohnmobil eingebaut.
Letzten Monat in Italien wurde eingebrochen und Sachen gestohlen. Ist nur für mich eine Sicherheit.

OK nix gesagt :wink:

Danke für den Code den ich gerade mit Proteus getestet habe. Ausser das Start im Terminal erscheint, ist keine Funktion der LED (Sirene) beim Schalten des Schalters erkennbar.

Na ist doch richtig :slight_smile: Ich habe gedacht, das Du es selbst rausliest.
An den Stellen, wo ich es kommentiert habe, musst Du noch das jeweilige Sirenenpiepen, bzw. die LED einbauen.
Zum Testen gehts auch mit delay - später dann mit ner Funktion.

Ich hab das mal nur mit dem SerMon gemacht - Achtung mein Input ist mit einem PULLUP und test geht nach GND.

const byte ledPin = 13;      // LED pin
const byte schalter = 8;   // Schalter pin
bool oneBeep = false;
bool lastSchalter = false;
unsigned long lastMillis;

void setup()
{
  Serial.begin(115200);
  Serial.println(F("Start..."));
  pinMode(ledPin, OUTPUT);
  pinMode(schalter, INPUT_PULLUP);
}

void piep()
{
  digitalWrite(ledPin, HIGH);
}
void loop()
{
  if (!digitalRead(schalter))
  {
    if (!lastSchalter)
    {
      if (oneBeep)
      {
        Serial.println(F("Doppelpiep"));
        oneBeep = false;
      }
      else
      {
        oneBeep = true;
      }
      lastSchalter = true;
    }
    lastMillis = millis();
  }
  else
  {
    lastSchalter = false;
  }
  if ((millis() - lastMillis > 1000) && oneBeep)
  {
    Serial.println(F("Einfachpiep"));
    oneBeep = false;
  }
  if ((millis() - lastMillis > 2000) && digitalRead(schalter))
  {
    // DAUERSIRENE
  }
}

WOW
Super!
Funktionert soweit.
Vielen Dank für die Hilfe.
Das ist besser als ich mir das vorgestellt habe. Damit kann ich den Einfachpiep (Scharfgeschaltet) und Doppelpiep (deaktiviert) von der Alarmanlage auswerten und umsetzen.
Nur noch ein Sache, im moment werden die impulse (Input) gegen GND mit PULLUP geschaltet. Meine Alarmanlage liefert aber ein High für Impulse und Dauersignal.
Wie kann das geändert werden?
Den Rest bekomme ich hin.

Die Frage ist: liefert sie auch ein LOW-Signal?
Wenn nicht, und davon gehe ich aus, musst Du das in Hardware machen.
Zusatzfrage: wie bekommst Du Dein Signal an PIN 8?
Optokoppler? Spannungsteiler?

Im einfachsten Fall einen Widerstand von GND nach PIN 8. Irgendwas um die 10K reichen im Normalfall.
Wenn Du sowieso mit Spannungsteiler arbeitest, sollte sich das erübrigen.

Dann im Code: im Setup wieder zurück nach INPUT und im loop

nur ändern in

if (digitalRead(schalter))

Das sollte es gewesen sein.

Wenns dioe Lösung war, dann freut sich auch die Nachwelt, wenn es als solche markiert ist :wink:

Danke nochmal für die Hilfe.
Ich habe das geändert aber Irgenwie funktioniert das jetzt nicht.

Ziel ist:

Ein kurzer HIGH Impuls auf Pin 8 = Ausgabe Einfachpiep
Zwei kurze HIGH Impuse inerhalb 1 Sec auf Pin 8 = Ausgabe Doppelpiep
Dauer HIGH ab 2 Sec auf Pin 8 = Ausgabe Dauersirene (20 Sec.)
Danach kann das ganze von vorne beginnen.

Ich werde Pin 8 dann mit einem Spannungsteiler versorgen.

const byte ledPin = 13;      // LED pin
const byte schalter = 8;   // Schalter pin
bool oneBeep = false;
bool lastSchalter = false;
unsigned long lastMillis;

void setup()
{
  Serial.begin(9600);
  Serial.println(F("Start..."));
  pinMode(ledPin, OUTPUT);
  pinMode(schalter, INPUT);
}

void piep()
{
  digitalWrite(ledPin, HIGH);
}
void loop()
{
  if (digitalRead(schalter))
  {
    if (!lastSchalter)
    {
      if (oneBeep)
      {
        Serial.println(F("Doppelpiep"));
        oneBeep = false;
      }
      else
      {
        oneBeep = true;
      }
      lastSchalter = true;
    }
    lastMillis = millis();
  }
  else
  {
    lastSchalter = false;
  }
  if ((millis() - lastMillis > 1000) && oneBeep)
  {
    Serial.println(F("Einfachpiep"));
    oneBeep = false;
  }
  if ((millis() - lastMillis > 2000) && digitalRead(schalter))
  {
      Serial.println(F("Dauersirene"));
      
  }
}

Wenn Du das auf dem Breadboard gebaut hast, musst Du einen Widerstand von GND nach PIN8 einsetzen. Irgendwas zwischen 2k und 10k - Wert ist unproblematisch - sonst geht der Pin nicht nach LOW.

Das habe ich gemacht. Ein 10K Widerstand von Pin 8 auf GND und Pin 8 mit High ansteuern, passiert gar nichts. Überhaupt kein Ausgabe ausser "Start". Bestimmt muss da mehr geändert werden im letzten Code. Simulieren tue ich es mit Proteus.

Hm.
Also ich hab das jetzt ganz wild aufgebaut - und musste mir eikn entprellen noch da mit reinbasteln.
Geht.
Ich ziehe mit R'nach GND und mit nem Draht an 5V.

const byte ledPin = 13;      // LED pin
const byte schalter = 8;   // Schalter pin
bool oneBeep = false;
bool lastSchalter = false;
unsigned long lastMillis;

void setup()
{
  Serial.begin(115200);
  Serial.println(F("Start..."));
  pinMode(ledPin, OUTPUT);
  pinMode(schalter, INPUT);
}

void loop()
{
  if (digitalRead(schalter))
  {
    if (!lastSchalter)
    {
      if (oneBeep)
      {
        Serial.println(F("Doppelpiep"));
        oneBeep = false;
      }
      else
      {
        oneBeep = true;
      }
      lastSchalter = true;
    }
    lastMillis = millis();
  }
  else
  {
    if (millis()-lastMillis>100) lastSchalter = false;
  }
  if ((millis() - lastMillis > 1000) && oneBeep)
  {
    Serial.println(F("Einfachpiep"));
    oneBeep = false;
  }
  /*
  if ((millis() - lastMillis > 2000) && digitalRead(schalter))
  {
      Serial.println(F("Dauersirene"));
      
  }
  */
}

Ausgabe:

14:14:18.622 -> Start...
14:14:21.572 -> Doppelpiep
14:14:25.380 -> Doppelpiep
14:14:29.954 -> Einfachpiep
14:14:32.904 -> Einfachpiep

(Stimmt) - drauf achten, ich habe 115200 zur Ausgabe auf dem SerMon.

Vielen Dank.
Jetzt gehts. Sorry, ich hatte in der Schaltung einen Draht vergessen.
Eine letzt Frage noch. Wie bekomme ich jetzt noch nach > 2 Sec. HIGH an Pin 8, die Ausgabe Dauersirene?

Vielleicht so:

const byte ledPin = 13;      // LED pin
const byte schalter = 8;   // Schalter pin
bool oneBeep = false;
bool lastSchalter = false;
bool alarmMerker = false;
unsigned long lastMillis;

void setup()
{
  Serial.begin(115200);
  Serial.println(F("Start..."));
  pinMode(ledPin, OUTPUT);
  pinMode(schalter, INPUT);
}

void loop()
{
  if (digitalRead(schalter))
  {
    if (!lastSchalter)
    {
      if (oneBeep)
      {
        Serial.println(F("Doppelpiep"));
        oneBeep = false;
      }
      else
      {
        oneBeep = true;
      }
      lastSchalter = true;
    }
    lastMillis = millis();
    alarmMerker = true;
  }
  else
  {
    if (millis() - lastMillis > 100)
    {
      lastSchalter = false;
      alarmMerker = false;
    }
  }
  if ((millis() - lastMillis > 1000) && oneBeep)
  {
    Serial.println(F("Einfachpiep"));
    oneBeep = false;
  }
  if ((millis() - lastMillis > 2000) && alarmMerker)
  {
    Serial.println(F("Dauersirene"));
  }
}

Nochmals Danke für die Geduld und Zeit.
Hier wird man super geholfen.
Ich habe es natürlich sofort ausprobiert.
Leider bekomme ich keine Dauersirene angezeigt wenn Pin 8 länger als 2 Sec HIGH ist.
Alles andere wird angezeigt (Einfachpiep und Doppelpiep).

const byte ledPin = 13;      // LED pin
const byte schalter = 8;   // Schalter pin
bool oneBeep = false;
bool lastSchalter = false;
bool alarmMerker = false;
unsigned long lastMillis;
unsigned long alarmMillis;

void setup()
{
  Serial.begin(115200);
  Serial.println(F("Start..."));
  pinMode(ledPin, OUTPUT);
  pinMode(schalter, INPUT);
}

void loop()
{
  if (digitalRead(schalter))
  {
    if (!lastSchalter)
    {
      if (oneBeep)
      {
        Serial.println(F("Doppelpiep"));
        oneBeep = false;
      }
      else
      {
        oneBeep = true;
      }
      lastSchalter = true;
    }
    lastMillis = millis();
    if (!alarmMerker) {alarmMillis = millis(); alarmMerker=true;}
  }
  else
  {
    if (millis() - lastMillis > 100)
    {
      lastSchalter = false;
      alarmMerker = false;
    }
  }
  if ((millis() - lastMillis > 1000) && oneBeep)
  {
    Serial.println(F("Einfachpiep"));
    oneBeep = false;
  }
  if ((millis() - alarmMillis > 2000) && alarmMerker)
  {
    Serial.println(F("Dauersirene"));
  }
}

Du musst jetzt dafür sorgen, das sich das Dauersignal natürlich auch hält, bis entsperrt....