Doppelte Abfrage der Bedingung mit Wartezeit ohne Delay

Zur automatischen Aktivierung/Scharfschaltung einer Alarmanlage benutze ich die im Codeausschnitt befindliche Abfrage, die auch funktioniert.

Um kurzzeitiges unnötiges Scharfschalten bei kurzfristigem Ausbuchen des Smartphones zu vermeiden hätte ich gern eine doppelte Abfrage, die z.B. nach 1-2 Minuten nochmals prüft ob sich das Smartphone im WLAN-Netz befindet und erst dann die Scharfschaltung erfolgt.

Wichtig, das Ganze muss ohne delay realisiert werden, da das Programm weiterlaufen muss.

////////////////////////////////////////////////////////////////

if(Ping.ping(remote_ip)) {

Serial.println("Smartphone ist im WLAN");
digitalWrite(12, 1);

} else {

Serial.println("Smartphone ist nicht im WLAN");
digitalWrite(12, 0);
}

////////////////////////////////////////////////////////////////////

Du möchtest einen "endlichen Automaten" bauen.
Eine Ablaufsteuerung.

soluman:
.....
Wichtig, das Ganze muss ohne delay realisiert werden, da das Programm weiterlaufen muss.
.....

Wenn du es schon weist, warum fragst du dann ?

Ob dein Code-Fragment funktioniert, kann ich nicht sagen, da der Rest fehlt.
Ohne den Rest, keine Aussage möglich.

HotSystems:
Wenn du es schon weist, warum fragst du dann ?

Ob dein Code-Fragment funktioniert, kann ich nicht sagen, da der Rest fehlt.
Ohne den Rest, keine Aussage möglich.

Ich weiß nicht wie ich es hinbekomme, sonst würde ich nicht fragen.
Was ich weiß, ist das kein "Delay" hilft.

Ich stelle später den ganzen Code ein.

Danke trotzdem schonmal.

combie:
Du möchtest einen "endlichen Automaten" bauen.
Eine Ablaufsteuerung.

Ich möchte eine automatische Aktivierung der Alarmanlage sobald man sich mit dem Smartphone außerhalb des WLAN Netzes befindet.

Wie schon erwähnt, soll aber eine doppelte Abfrage eingebaut werden, damit sich die Anlage nicht sofort scharfschaltet. Als Beispiel, ich bringe den Müll raus und bin nur mal 2 Minuten aus der Reichweite. Dann soll also keine Scharfschaltung erfolgen.

"Delay" geht nicht, weil dieses im Programmablauf stört, bzw. dann die Auslösung des Alarms verspäten würde.

Ein essenzielles Problem der heutigen Zeit: Mann muß während des Müllraustragens telefonisch und über Sozialnetzwerke erreichbar sei. :wink: :wink: :wink: :wink:

Was ist wenn der Müll sich mal streubt und Du 2,02 Minuten Brauchst?

grüße Uwe

versuch es mal so

  uint32_t zeit;
  if (Ping.ping(remote_ip)) zeit = millis();
  if (!Ping.ping(remote_ip) && (millis() - zeit > 120000))
{
    Serial.println("Smartphone ist nicht im WLAN");
    digitalWrite(12, 0);

  } else 
  {
    Serial.println("Smartphone ist im WLAN");
    digitalWrite(12, 1);
  }

Edit: habe meine Fehler korrigiert

uwefed:
Ein essenzielles Problem der heutigen Zeit: Mann muß während des Müllraustragens telefonisch und über Sozialnetzwerke erreichbar sei. :wink: :wink: :wink: :wink:

Was ist wenn der Müll sich mal streubt und Du 2,02 Minuten Brauchst?

grüße Uwe

Hallo Uwe,

ich erlaube mir zu bemerken, dass Dein Kommentar nicht sehr zielführend ist.

Wenn Du nicht erkannt hast worum es geht, erkläre ich es hier nochmal.

Es geht nicht um "Erreichbarkeit in sozialen Netzwerken" sondern darum, dass die Scharfschaltung der Alarmanlage über die Erkennung/Nichterkennung des Smartphones im heimischen WLAN Netz realisiert werden soll.

Als anderes Beispiel nun folgendes Szenario, ich gehe auf meiner riesigen Terrasse spazieren (Smartphone am Mann, weil ich Musik über Kopfhörer höre) und in der hintersten Ecke ist kein WLAN. Zur Durchquerung der nicht abgedeckten Stelle brauche ich immer nur 1,95 Minuten.
In diesem Fall soll aber die Alarmanlage nicht scharf sein.

Besser? Problem erkannt?

Oder anderes Beispiel, ich starte mein Smartphone neu weil es sich aufgehangen hat. Dieses dauert 1,85 Minuten. In der Zeit ist es auch nicht durchgängig mit dem WLAN verbunden.

Die 2 Minuten stellen nur einen Bespielwert dar. Ich hätte also auch 3 oder 4 oder 5 Minuten schreiben können. Bei manchen wird ja die Mülltonne auch weiter weg stehen... :wink:

ardubu:
versuch es mal so

  if (!Ping.ping(remote_ip)) uint32_t zeit = millis();

if (!Ping.ping(remote_ip && (millis() - zeit > 120000))
{
    Serial.println("Smartphone ist nicht im WLAN");
    digitalWrite(12, 0);

} else
  {
    Serial.println("Smartphone ist im WLAN");
    digitalWrite(12, 1);
  }

Danke, ich werde es probieren und dann berichten.

Die Fehlermeldung 'zeit' was not declared in this scope sollte klar sein.
Aber wo genau fehlt die Klammer bei

  if (!Ping.ping(remote_ip && (millis() - zeit > 120000))

? :wink:

Nach remote_ip

if (!Ping.ping(remote_ip) && (millis() - zeit > 120000))

Gruß Tommy

Bei manchen wird ja die Mülltonne auch weiter weg stehen... :wink:

Die werden es begrüßen, wenn während des Müll-Raustragens jemand auf das Haus aufpasst. :wink:

Hauptsache, die Alarmanlage wird schnell genug wieder deaktiviert, wenn das Handy zurückkommt.
Und es gibt eine Möglichkeit, die Alarmanlage auch ohne Handy abzuschalten.

soluman:
Ich möchte eine automatische Aktivierung der Alarmanlage sobald man sich mit dem Smartphone außerhalb des WLAN Netzes befindet.

Wie schon erwähnt, soll aber eine doppelte Abfrage eingebaut werden, damit sich die Anlage nicht sofort scharfschaltet. Als Beispiel, ich bringe den Müll raus und bin nur mal 2 Minuten aus der Reichweite. Dann soll also keine Scharfschaltung erfolgen.

"Delay" geht nicht, weil dieses im Programmablauf stört, bzw. dann die Auslösung des Alarms verspäten würde.

Du möchtest einen "endlichen Automaten" bauen.
Eine Ablaufsteuerung.

Du möchtest einen "endlichen Automaten" bauen.

Falls der "endliche Automat"merkt, dass das Handy nach 1 Minute wieder zurück war, und 45 sek danach schon wieder weg, soll er natürlich dann neu anfangen zu zählen. (Egal wie du solch einen Zähler nennst)

"Doppelte Abfrage" (im Titel) führt dich in die Irre, @soluman. Es reicht, wenn du in jedem loop Durchlauf einmal ping machst. Du musst dir nur merken (über mehrere loop Durchläufe hinweg), seit wann das Handy schon weg ist.

Solche Zustandsinformation zu merken, wird hier gern mal "endlicher Automat" genannt, weil es nur eine begrenzte ("endliche") Anzahl solcher Zustände gibt.

Wenn du den Namen blöde findest, behalt das für dich :wink:

Vielleicht habe ich das ja auch nur falsch verstanden, und er/Sie/es möchte gar keinen endlichen Automaten bauen, sondern du sollst den bauen.

combie:
Du möchtest einen "endlichen Automaten" bauen.
Eine Ablaufsteuerung.

combie:
Du möchtest einen "endlichen Automaten" bauen.
Eine Ablaufsteuerung.

Du wiederholst Dich, muß ich mir Sorgen machen?

Es ginge auch retriggerbares Monoflop oder Totmannschaltung. Solange der Lokführer regelmäßig eine Taste drückt und losläßt, fährt der Zug weiter, sonst gibt es eine automtische Notbremsung.

ardubu:
versuch es mal so

Der Prozessor zwischen meinen Ohren vermutet ein Ausrufezeichen zu viel. Oder Du verschiebst die Zeitauffrischung nach else.

agmue:
Es ginge auch retriggerbares Monoflop oder Totmannschaltung. Solange der Lokführer regelmäßig eine Taste drückt und losläßt, fährt der Zug weiter, sonst gibt es eine automtische Notbremsung.

Früher war die Totmannschaltung ein Pedal. Viele Lockführer haben nachts im Schlaf das Pedal weiter getreten, was manches Mal nicht gut für den Bettgiebel war.

Gruß Tommy

Hi

So ganz verstehe ich den Sinn hinter der Alarm-Scharf-Schalterei noch nicht - wobei ich davon ausgehe, daß im späteren Ausbau durchaus mehrere Handys angepingt werden - wäre ja blöd, wenn die Frau plötzlich zum Einbrecher degradiert wird ...

Du merkst Dir, wann Du ZULETZT das Handy 'gesehen' hast.
Wenn die Zeit zwischen Zuletzt und Jetzt größer der Wartezeit ist, Alarm aktivieren (sofern extern gestattet - ich würde Da noch eine 'Arduino Not-Abschaltung' vorsehen).

Was ist, wenn Dir in der Nacht der Akku ausgeht?
Weck-Dienst Grün/Weiß??

Aber: Ja, Alles, was man machen kann, kann man machen - warum also nicht?
Genau dafür ist der Arduino da - also ran an den Speck.

MfG

ardubu:
versuch es mal so

  uint32_t zeit;

if (!Ping.ping(remote_ip)) zeit = millis();
  if (!Ping.ping(remote_ip) && (millis() - zeit > 120000))
{
    Serial.println("Smartphone ist nicht im WLAN");
    digitalWrite(12, 0);

} else
  {
    Serial.println("Smartphone ist im WLAN");
    digitalWrite(12, 1);
  }



Edit: habe meine Fehler korrigiert

So geht es leider nicht. Die Zeit läuft auf und dann funktioniert es nicht. Da muss doch noch irgendwo die abgelaufene Zeit wieder genullt werden, oder irre ich?

soluman:
Da muss doch noch irgendwo die abgelaufene Zeit wieder genullt werden, oder irre ich?

Siehe #15 am Ende!