Problem Bluetooth,Button dauerhaft eingeschaltet lassen

Hallo,
mein Problem besteht darin,das ich das gesendete Signal (in diesem Fall 'a' ),solange eingeschaltet werden soll,bis das Signal ('d')gesendet wird.
Wie aus dem Sketch zu erkennen,soll damit eine Alarmanlage über Bluetooth eingeschaltet werden.
(WLan,433MhZ-Sender usw.können nicht zum Einsatz kommen).
void Alarm soll auch noch weiter ausgeführt werden,wenn aktiviert,wenn die BT-Verbindung nicht mehr vorhanden ist.(Also Alarm eingeschaltet und dann vom Einsatzort entfernen)
(Später soll dann noch per SMS ein Signal gesendet werden,falls es beachtet werden muss)

Mein Problem ist das ich die Schleife nicht hinbekomme,das "void alarm" so lange ausgeführt werden soll,bis eben das Signal ('d')gesendet wird.

ALarm.ino (1.38 KB)

Damit alle helfen können, setze deinen Sketch bitte in Code-Tags ins Forum.
Verwende dazu die Schaltfläche </> oben links im Editor-Fenster.
Dann kann der Sketch von allen, auch den mobilen Usern besser gelesen werden und du hast mehr Helfer.

[quote author=michiarduino date=1583254610 link=msg=4500049]
Hallo,
mein Problem besteht darin,das ich das gesendete Signal (in diesem Fall 'a' ),solange eingeschaltet werden soll,bis das Signal ('d')gesendet wird.
Wie aus dem Sketch zu erkennen,soll damit eine Alarmanlage über Bluetooth eingeschaltet werden.
(WLan,433MhZ-Sender usw.können nicht zum Einsatz kommen).
void Alarm soll auch noch weiter ausgeführt werden,wenn aktiviert,wenn die BT-Verbindung nicht mehr vorhanden ist.(Also Alarm eingeschaltet und dann vom Einsatzort entfernen)
(Später soll dann noch per SMS ein Signal gesendet werden,falls es beachtet werden muss)

Mein Problem ist das ich die Schleife nicht hinbekomme,das "void alarm" so lange ausgeführt werden soll,bis eben das Signal ('d')gesendet wird.
[int Alarmausgang = 3; //digital3
int Horn = 4; //digital4
int bewegung = 7; //digital7
int bewegungsstatus = 0;
#include "HC05.h"

void setup() {
  Serial.begin(9600);
  pinMode(Alarmausgang, OUTPUT);
  pinMode(Horn, OUTPUT);
  pinMode(bewegung, INPUT);
}

void alarm() 
{
  bewegungsstatus = digitalRead(bewegung);
  if (bewegungsstatus == HIGH)
  {Serial.println("Alarmausgang");
    digitalWrite(Alarmausgang, HIGH);
    digitalWrite(Horn, HIGH);
    delay(500);
    digitalWrite(Horn, LOW);
    delay(500);
     digitalWrite(Horn, HIGH);
    delay(500);
    digitalWrite(Horn, LOW);
    delay(500);
    digitalWrite(Horn, HIGH);
    delay(500);
    digitalWrite(Horn, LOW);
    delay(500);
     digitalWrite(Horn, HIGH);
    delay(500);
    digitalWrite(Horn, LOW);
    delay(500);
    digitalWrite(Alarmausgang, LOW);
  }
  else
  {
    digitalWrite(Alarmausgang, LOW);
    digitalWrite(Horn, LOW);
  }
}


void alarmaus() {
  digitalWrite(Horn, HIGH);
  delay(100);
  digitalWrite(Horn, LOW);
  delay(200);
  digitalWrite(Horn, HIGH);
  delay(100);
  digitalWrite(Horn, LOW);
  digitalWrite(Alarmausgang, LOW);
}

void loop() {
  if (Serial.available() > 0)
  { char data = Serial.read();

    if (data == 'a')  {                 //EmpfangBluetooth
      alarm();

     }
    if (data == 'd')  {                 //EmpfangBluetooth
      alarmaus();
    }
  }
}
]
int Alarmausgang = 3; //digital3
int Horn = 4; //digital4
int bewegung = 7; //digital7
int bewegungsstatus = 0;
#include "HC05.h"

void setup() {
  Serial.begin(9600);
  pinMode(Alarmausgang, OUTPUT);
  pinMode(Horn, OUTPUT);
  pinMode(bewegung, INPUT);
}

void alarm() 
{
  bewegungsstatus = digitalRead(bewegung);
  if (bewegungsstatus == HIGH)
  {Serial.println("Alarmausgang");
    digitalWrite(Alarmausgang, HIGH);
    digitalWrite(Horn, HIGH);
    delay(500);
    digitalWrite(Horn, LOW);
    delay(500);
     digitalWrite(Horn, HIGH);
    delay(500);
    digitalWrite(Horn, LOW);
    delay(500);
    digitalWrite(Horn, HIGH);
    delay(500);
    digitalWrite(Horn, LOW);
    delay(500);
     digitalWrite(Horn, HIGH);
    delay(500);
    digitalWrite(Horn, LOW);
    delay(500);
    digitalWrite(Alarmausgang, LOW);
  }
  else
  {
    digitalWrite(Alarmausgang, LOW);
    digitalWrite(Horn, LOW);
  }
}


void alarmaus() {
  digitalWrite(Horn, HIGH);
  delay(100);
  digitalWrite(Horn, LOW);
  delay(200);
  digitalWrite(Horn, HIGH);
  delay(100);
  digitalWrite(Horn, LOW);
  digitalWrite(Alarmausgang, LOW);
}

void loop() {
  if (Serial.available() > 0)
  { char data = Serial.read();

    if (data == 'a')  {                 //EmpfangBluetooth
      alarm();

     }
    if (data == 'd')  {                 //EmpfangBluetooth
      alarmaus();
    }
  }
}

ALarm.ino (1.38 KB)

Was ich erkennen kann, sind viele delay() in deinem Sketch.
Diese sind kontraproduktiv und sollten entfernt werden.

Anstatt der delay() solltest du die Funktion "millis()" einsetzen.
Sieh dir dazu das Beispiel "BlinkWithoutDelay" in der IDE an.

delay() blockiert deine Sketch und damit ist keine weiter Bedienung möglich.

Um deine Funktion zu ermöglichen, brauchst du eine Statusvariable die den Zustand speichert und solange die Funktion ausführt, bis sich deren Zustand ändert.

Danke,schon mal für die Antwort.
Delay bearbeiten ist erstmal 2.rangig für mich.

Eine Statusvariable die den Zustand speichern und solange die Funktion ausführt, bis sich deren Zustand ändert.

Kleinen Tip für mich?

int alarmVal = 0
input alarmVal = 0

if (input alarmVal (data == 'a'))
{
(data == 'b')
}

In diese Richtung?

michiarduino:
Delay bearbeiten ist erstmal 2.rangig für mich.

Das wird dir sofort auf die Füße fallen.

Kleinen Tip für mich?

bool alarmVal = false

if (data == 'a')
{
  alarmVal = true;
}

// andere Funktion

if (data == 'b')
{
  alarmVal = false;
}

In der loop fragst du dann immer alarmVal ab

Hi

äääh ... Häh??

Du möchtest:
Mit einem 'a' die Überwachung EINschalten - Das so lange, bis ein 'd' Das wieder abschaltet.
DAS wäre somit die Satus-Variable.
mit 'a' setzen, mit 'd' löschen.
Wenn die Variable gesetzt ist, wird überprüft, OB eine Bewegung erkannt wird - wenn JA, setzen wir die nächste Status-Variable 'Einbrecker=true;'.
Wenn nun die Status-Variable der Überwachung true ist UND Einbrecher true ist, DANN wird geschaut, in welchem Step wir beim Alarm brüllen sind.

Wie sieht Dein Alarm aus?
digitalWrite(Alarmausgang, HIGH);
digitalWrite(Horn, HIGH);
delay(500);
digitalWrite(Horn, LOW);
delay(500);
Also, sobald der Einbrecher erkannt wird, wird der Alarm-Ausgang auf HIGH gesetzt.
Das Horn erschlagen wir in der 'Alarm-bruellen' Funktion.

  • Zeit-Merkzeit>=500ms -> aktuelle Zeit merken, Hupe umschalten

Im Else-Zwei der Alarm-Bruell-Funktion setzen wir die Hupe wieder auf LOW (Ruhe is ...)

Dann würde ich noch einen weiteren Buchstaben nehmen 'r' - um die Anlage zu resetten - Das löscht 'Einbrecher' , aber auch nur, wenn die Alarmanlage nicht mehr scharf ist.

ALLES ohne delay() - auch, wenn Dir Das nicht so sonderlich wichtig ist - sofern Du die Hupe zeitnah ausbekommen willst und Das nicht erst durch uniformierte in Auftrag gestellt werden soll und dann per Hammer geschehen wird - würde ich auf delay() verzichten.
(Du wirst kaum den Zeitpunkt erwischen, wo Du NICHT in einem delay() fest hängst und auf Dein hilflos gesendetes 'd' reagiert wird)

MfG

PS: Weiter haben Alarm-Anlagen in -D- nach einer gewissen Zeit Ruhe zu halten - vollkommen sch??? egal, Wer da Was klaut.
Sonst bekommst Du Ärger von den netten uniformierten Herren.

Vielen Dank für die Tips.
Bin mit der Variante von HOT SYSTEMS schon auf dem richtigen Weg.
Kommt dann noch die Variante mit den Millis dazu.
Melde mich noch mal,wenn Fragen aufkommen bzw. mit dem fertigen Sketch.

Das in D die Alarmfunktion nach 60 sek. unterbrochen werden muss,ist mir bekannt,muss aber erst mal ein Problem nach dem anderen angehen.

Also,vielen Dank erst mal bis hierher.

michiarduino:
Also,vielen Dank erst mal bis hierher.

Alles klar und viel Erfolg.

So,habe den Code jetzt so weit fertig,bis auf das senden der SMS bei Alarmauslösung.
Da der Alarm ja nur 10 sek. durch den Infrarotmelder (int bewegungsstatus=7) ausgelöst,und dann wieder neu abfragt,ob eine bewegung da ist,sollte es mit dem Gesetzgeber auch kein Problem geben.

Könnte jemand sich den Code mal ansehen,ob es noch Probleme gibt?
Läuf bei mir gut,Alarm kann jeder Zeit abgebrochen werden.
Die Delay-Zeiten sollen nur als Erkennung sein,das der Alarm ausgeschaltet ist,so wie bei US-Autos das Doppelhupen.
Void Alarmaus ist glaube ich überflüssig,oder?

int Alarmausgang = 3; //digital3
int Horn = 4; //digital4
int bewegung = 7; //digital7
int bewegungsstatus = 0;
#include "HC05.h"
bool alarmVal = false;

int Horm = LOW;
unsigned long Hornzeit = 0;
#define laufzeitHorn   234UL

void setup() {
  Serial.begin(9600);
  pinMode(Alarmausgang, OUTPUT);
  pinMode(Horn, OUTPUT);
  pinMode(bewegung, INPUT);
  unsigned long currentMillis = millis();
  
  
}
void SMS() 
{digitalWrite(Alarmausgang, HIGH);
delay(30);
digitalWrite(Alarmausgang, LOW);
}

void alarm() 
{ 
  bewegungsstatus = digitalRead(bewegung);
  if (bewegungsstatus == HIGH)
  {Serial.println("Alarmausgang");
    if (millis() - Hornzeit >= laufzeitHorn) {
  Hornzeit = millis();
  digitalWrite(Horn, digitalRead(Horn) ^ 1);
}
SMS();
}
  else
  {digitalWrite(Horn, LOW);
  }
}
void alarmaus() {
  digitalWrite(Alarmausgang, LOW);
    digitalWrite(Horn, LOW);
}

void loop() {
 if (Serial.available() > 0)
  { char data = Serial.read();
if (data == 'a')  {                 //EmpfangBluetooth
      alarmVal = true;
}
    if (data == 'd')  {         //EmpfangBluetooth
     digitalWrite(Horn, HIGH);
  delay(100);
  digitalWrite(Horn, LOW);
  delay(200);
  digitalWrite(Horn, HIGH);
  delay(100);
  digitalWrite(Horn, LOW);
  digitalWrite(Alarmausgang, LOW);
     alarmVal = false;
   }
  }
  if (alarmVal == true)
  alarm();
    }

michiarduino:
Könnte jemand sich den Code mal ansehen,ob es noch Probleme gibt?
Läuf bei mir gut,Alarm kann jeder Zeit abgebrochen werden.

Was mir beim Durchscrollen aufgefallen ist: Du solltest einheitlicher und besser lesbar formatieren und Dich auf passende Datentypen beschränken. Für eine Konstante (eine Pin-Nr.) ein int zu verbraten, ist Verschwendung.

Wenn es gut läuft, kannst Du das aber auch bleiben lassen.

Gruß

Gregor