mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Einmaliges Reagieren auf gleiche, sich mehrfach wiederholende Zustände


Autor: Gustav (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
durch die Überprüfung serieller Daten möchte ich gerne Befehle via SMS 
versenden. Sprich treten bestimmte Zeichenkombinationen in den zu 
untersuchenden Daten auf, soll eine Nachricht versendet werden.

Diese Zeichenkombinationen können mehrmals nacheinander vorkommen. 
Allerdings will ich, dass dabei nur eine Nachricht versand wird und 
nicht bei jedem Auftreten der Zeichenkombination. Ich hab mir gedacht, 
das nach dem Versenden der Nachricht solange gewartet werden soll, bis 
an den zu untersuchenden Stellen Null sind. Wenn ich die Zeichen 
detektiere, springe ich in…

if( sending_sms == 1 )
  {
    send("DANGER ALARM:");
    sending_sms = 0;
  }

Wenn allerdings die gleichen Zeichen mehrmals nacheinander auftreten, 
versende ich jedes Mal eine SMS. Mit welchem Mech. kann ich das 
vermeiden?
Wäre nett, wenn mir hier jemand weiterhelfen könnte.

VG,
Gustav

Autor: U.R. Schmitt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich bin mir nicht sicher ob ich dein Problem verstehe? Warum durchsuchst 
du nicht einfach alle Daten und merkst dir ob deine Schlüsselbegriffe 
vorgekommen sind. Erst am Ende entscheidest du dann welche SMS du senden 
musst.
Ansonsten konkretes Beispiel der Daten mit Beschreibung was genau 
passieren soll.

Autor: chrizz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
die gleiche Grundidee wie mein Vorposter, nur anders umgesetzt:
nach dem Senden der SMS Flag setzten und erst wieder löschen, wenn der 
gesamte Suchvorgang beendet wurde.

Kurz:
erst  "sending_sms = 0;"
ausführen, nachdem alles durchsucht wurde.

gruß
Chrizz

Autor: Gustav (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

wenn keine Alarmmeldung vorliegt, besteht der zu untersuchende Bereich 
aus Nullen.

"0000000000"

Dieser Teilstring repräsentiert eine Reihe an Alarmmeldungen. Ich 
untersuche diesen String auf diese möglichen Alarmmeldungen.

"1000000000" heißt bspw. Batterie schwach.
"3000000000" heißt Batterie Schwach und geringe Geschwindigkeit.
"5000000000" heißt Batterie schwach, geringe Geschwindigkeit und das 
Gerät
läuft im Backup-Modus. usw.

Die jeweiligen Kombinationen habe ich herausgefunden. Ich möchte nun 
eine Nachricht versenden, wenn die Batterie schwach ist.
Detektiere ich bspw.

"1000000000" so soll eine Nachricht versand werden. Allerdings kann 
anschließend

"3000000000"
"5000000000"
.
.
.
detektiert werden, die ebenfalls "Batterie schwach" beinhalten.
Auf der anderen Seite kann aber bspw. auch erst
"5000000000", dann "1000000000", "3000000000", usw. auftreten.

Erst wenn der String wieder Null ist, also "0000000000" soll es möglich 
sein, beim Auftreten einer neuen Alarmmeldung, eine SMS zu versenden

Meine Frage ist nun, wie kann ich das softwaretechnisch am besten 
realisieren. VG

Autor: Toni (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie schon die Vorposter schrieben:

Alarm-Meldung wird erkannt, SMS senden und ein
Flag setzen.
Solange Flag gesetzt keine weitere SMS senden,
auch wenn Alarm-Meldung erkannt wird.

Werden die 0-en erkannt Flag rücksetzen
und gut ist.

Autor: Tüll (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn ich das richtig verstanden habe:

- Erst mal garnichts senden, sondern alle Meldungen lesen

- Für erste Meldung ein Flage setzen (alarm_sms = 1, wobei 1 hier der 
prioritätsstufe entspricht)

- Wenn eine neue Meldung mit niedriger oder gleicher Priorität gefunden 
wird, ignorieren

- Wenn eine neue Meldung mit höherer Priorität gefunden wird, alarm_sms 
= neue Stufe

- Am Ende (wenn 000000 eingelesen) die SMS mit der Meldung entsprechend 
Flag schicken

Autor: Jörg H. (idc-dragon)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Binäroperationen könnten dein Freund sein. Ein XOR ("^" in C) meldet 
Veränderungen, mit AND ("&" in C) kann man das mit Bitmasken 
vergleichen.

Jörg

Autor: Gustav (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
danke für die Antworten.
Also verkürzt ausgedrückt, meint ihr das so, oder? VG


if(sms_send == 0)
{
    if( (data[0] == '1') ||
        (data[0] == '3') ||
        (data[0] == '5') )
    {
        send_sms("Low Battery");
        sms_send = 1;
    }

    if( (data[1] == '1') ||
        (data[1] == 'B') ||
        (data[1] == '4') )
    {
        send_sms("Time Base Fault");
        sms_send = 2;
    }
}

if(sms_send == 1)
{
  if(data[0] == '0');
  sms_send = 0;
}

if(sms_send == 2)
{
  if(data[1] == '0');
  sms_send = 0;
}

Autor: Gustav (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi zusammen,
also ich habs jetzt mal nach dem oben beschrieben Ansatz probiert. 
Allerdings klappts immer noch nicht richtig...Kann mir vielleicht jemand 
ein Tipp geben, was ich falsch mache?Bin für jeden Hinweis dankbar.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gustav schrieb:
> Hi zusammen,
> also ich habs jetzt mal nach dem oben beschrieben Ansatz probiert.
> Allerdings klappts immer noch nicht richtig...Kann mir vielleicht jemand
> ein Tipp geben, was ich falsch mache?Bin für jeden Hinweis dankbar.

Du brauchst für JEDE Alarmmeldung ein Flag, welches dir sagt, ob die 
entsprechende Alarmierung schon verschickt wurde oder nicht

Und du löscht sie, wenn die entsprechende Alarmierung in deiner 
Nachricht nicht mehr vorkommt
    if( (data[0] == '1') ||
        (data[0] == '3') ||
        (data[0] == '5') )
    {
      if( !BatteryLowSent )
      {
        send_sms("Low Battery");
        BatteryLowSent = 1;
      }
    }
    else
      BatteryLowSent = 0;


    if( (data[1] == '1') ||
        (data[1] == 'B') ||
        (data[1] == '4') )
    {
      if( !TimeBaseFaultSent )
      {
        send_sms("Time Base Fault");
        TimeBaseFaultSent = 1;
      }
    }
    else
      TimeBaseFaultSent = 0;

Autor: Gustav (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Sorry das ich euch nochmal mit meinen Anfängerproblemen nerve.

Ich habe mal den Ausschnitt angefügt der immer noch nicht richtig will. 
Wenn die beiden Stellen wieder Null sind, bzw. die Alarmmeldungen 
verschwunden sind,, soll es wieder möglich sein eine Nachricht zu 
verschicken. Ich werde noch verrückt... VG

Autor: Marcel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn ich das jetzt richtig verstanden habe, willst du nach dem Versenden 
der Nachricht warten, bis die beobachteten Zustände wieder Null sind. 
Dann soll dein Prog. wieder sendebereit sein.

Autor: Gustav (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Marcel,
richtig. Allerdings schlag ich mich immer noch damit herum, das nach dem 
erstmaligen detektieren das Programm wartet, bis der String wieder Null 
ist und ich komm nicht drauf.VG

Autor: Marcel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hmmm, soweit ich das beurteilen kann passt das soweit...

Autor: Gustav (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich komme nicht vorwärts...ich glaube das Problem liegt hier:


    if( ( alarm_data[0] == '2' ) ||
        ( alarm_data[0] == '6' ) ||
  ( alarm_data[0] == 'A' ) )

   {
        send_sms("Low Battery");
        low_battery_sent = 1;

         if(low_battery_sent == 1)
         {

           if( ( alarm_data[0] == '0' ) &&
               ( alarm_data[0] == '0' ) &&
         ( alarm_data[0] == '0' ))

               low_battery_sent = 0;
          }
   }


Wenn ich jetzt nur mal den Zustand low battery betrachte und nur einmal 
das Senden der Nachricht "Low Battery" realiseren will, bis die Zustände 
wieder Null sind... wie muss ich das genau machen. ich hänge total in 
der Luft.

Autor: Reiner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das so nicht funktionieren.
    if( ( alarm_data[0] == '2' ) ||
        ( alarm_data[0] == '6' ) ||
        ( alarm_data[0] == 'A' ) )
                                       <- Hier fehlt die Abfrage ob
                                          SMS gesendet
   {
        send_sms("Low Battery");
        low_battery_sent = 1;

         if(low_battery_sent == 1)    <- Dieses IF muss außerhalb stehen
         {

           if( ( alarm_data[0] == '0' ) && <- Dreimal das selbe ?
               ( alarm_data[0] == '0' ) &&
         ( alarm_data[0] == '0' ))

               low_battery_sent = 0;
          }
   }


So sollte es gehen.
Wichtig Klammer um die Oder Bedingung

  if( (alarm_data[0] == '2' ||
           alarm_data[0] == '6' ||
       alarm_data[0] == 'A') &&
       !low_battery_send )
   {
        send_sms("Low Battery");
        low_battery_send = 1;

  }

  if(low_battery_send)
  {
      if( alarm_data[0] == '0' )
        low_battery_send = 0;
   }

Viel Spaß

Autor: Gustav (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Reiner,
vielen Dank für deine Hilfe!
VG,
Gustav

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.