Alarmanlage, mehrer Eingänge zeitversetzt SMS senden

Hallo

Meine Alarmanlage hat 7 Eingänge. Wenn die Anlage aktiv ist und z.B. der Eingänge 1 auf high geht wird ein SMS versendet. Das Versenden der einzelnen Texte der Türen ist mit Switch gelöst. Jetzt soll 5min gewartet werden, bis wieder eine SMS gesendet wird.
Wie löse ich das, wenn Eingang 5 auf high geht nach z.B. 10s nach Eingang 1. Jetzt läuft ja die zweite Zeit auch 5min. Wird Eingang 1 nach 3min = low wird eine SMS versendet, dass Eingang 1 zu ist.

Kann mir bitte jemand einen Ansatz geben, denn sonst gibt das unendlich viel Code, wenn ich jeden Eingang einzeln ausprogrammiern muss (was natürlich möglich ist, aber keinen Sinn macht und mehrfach gleicher Code hat).

Danke im Voraus
Gruss Miller

Das kannst du mit der Funktion “millis” lösen.
Um mehr zu sagen, müssen wir deinen Sketch sehen.
Poste den bitte in Code-Tags (Schaltfläche </>, oben links im Editor)

Hi, danke
Werde ich in den nächsten Tagen machen...

Hallo

Ist es irgendwie möglich die Uhrzeit des Events zu erfassen und diese mit der aktuellen Uhrzeit zu vergleichen und darauf zu reagieren?

Danke im Voraus
Gruss Miller

mickmiller:
Hallo

Ist es irgendwie möglich die Uhrzeit des Events zu erfassen und diese mit der aktuellen Uhrzeit zu vergleichen und darauf zu reagieren?

Danke im Voraus
Gruss Miller

das geht schon, aber wenn es richtig und genau sein soll, brauchst du eine RTC-DS3231

Du musst halt einfach über eine Variable das Mehrfachsenden unterbinden und nach 5 Minuten wieder freigeben. Auch ist es dann ratsam, alle Alarminfos in die sms zu packen.

RTC ist per Paketpost unterwegs...

mickmiller:
RTC ist per Paketpost unterwegs...

Bringt aber in deinem Fall nicht wirklich was.

Wie meinst du das: alle Alarminfos in die sms zu packen.
Ein SMS mit den Status aller 7 Eingänge und eines mit allen 7 Ausgängen?

Je konkreter deine Frage ist, desto konkreter werden die Antworten seun. Zu einer konjreten Frage gehört zumindest dein Sketch.

Prinzipiell speicherst du einfach alle Ereignisse in Variablen oder iin einem array. (du kannst ergänzend einen Zeitstempel abspeichern) Du kannst da auch jedes neue Ereignis in die selbe Stelle des arrays speichern, alle vorher gehenden Ereignisse eine Position weiter schieben und das jeweils älteste hinten runter fallen lassen.

Alle 5min überträgst du das array. Die Übersetzung der einzelnen Werte in Klartext kannst du dann auch im Empfänger machen.

Wenn du den Text als solchen Senden willst, mit Zeitstempel, dann mußt du es auf mehrere SMS verteilen oder eben nur die letzten 5- 10 Texte übertragen.

mickmiller:
Wie meinst du das: alle Alarminfos in die sms zu packen.
Ein SMS mit den Status aller 7 Eingänge und eines mit allen 7 Ausgängen?

Zum Beispiel. Da die sms an dich geht, weißt du dann genau was los ist.

Pseudocode:

uint32_t dauer;
bool alarmflag;

.
.
.
im loop():

if (irgendeinsensorhatangeschlagen) {
alarmflag=1;
dauer=0;     // erste sms sofort
}
if(allesensorenok) alarmflag=0;

INTERVAL(dauer) 
{dauer=300000 // alle 5 Minuten
if (alarmflag) sendsms();
}

hallo

hier ein Auszug aus dem Sketch:

// -- Alarmanlage Begin --------------------------------------------------------------------------
  if (input52Value == HIGH) {    
    if (AlarmAktivPrint == 0){
      Serial.print("Alarmanlage ist aktiviert! Status Digitalport 52: ");
      Serial.println(input52Value); 
    }

    // 
    if (AlarmAktivDekrement==0){
      // Print, ob die Alarmanlage aktiv ist, nur einmalig
      if (AlarmAktivPrint == 0){
        Serial.println("Alarmanlage ist aktiv! ");
      }
      AlarmAktivPrint = 1;

        int input47Value = digitalRead(47);
        int input46Value = digitalRead(46);
        int input45Value = digitalRead(45);
        int input44Value = digitalRead(44);
        int input43Value = digitalRead(43);
        int input42Value = digitalRead(42);
        int input41Value = digitalRead(41);

        // dR steht für 'digitalRead(41);'
        for (int dR = 40; dR <= 47; dR++){
          Serial.print("schreibe ");
          Serial.println(dR);
          globalDoor = digitalRead(dR);
          if (globalDoor == HIGH){
            Serial.println("globalDoor = high");
            Serial.println(dR);
            switch (dR) {
              case 40:
                Serial.print("Case 40 Value: ");
                Serial.println(dR);
                message = 20;
                sendSMS(message);
                break;
              case 41:
                Serial.print("Case 41 Value:");
                Serial.println(dR);
                message = 30;
                sendSMS(message);
                break;
              case 42:
                Serial.print("Case 42 Value:");
                Serial.println(dR);
                message = 40;
                sendSMS(message);
                break;
              case 43:
                Serial.print("Case 43 Value:");
                Serial.println(dR);
                message = 50;
                sendSMS(message);
                break;  
              case 44:
                Serial.print("Case 44 Value:");
                Serial.println(dR);
                message = 60;
                sendSMS(message);
                break;
              case 45:
                Serial.print("Case 45 Value:");
                Serial.println(dR);
                message = 70;
                sendSMS(message);
                break;
              case 46:
                Serial.print("Case 46 Value:");
                Serial.println(dR);
                message = 80;
                sendSMS(message);
                break;                
              case 47:
                Serial.print("Case 47 Value:");
                Serial.println(dR);
                message = 90;
                sendSMS(message);
                break;      
          }

....

int sendSMS(int m){

  switch (m) {
    case 20:    
        Serial.print("Garagetor wurde geoeffnet: Einbruch!");
        messageToSend = "Garagetor wurde geoeffnet: Einbruch!";
        break;
     case 21:    
        Serial.print("Garagetor wurde geschlossen.");
        messageToSend = "Garagetor wurde geschlossen";
        break;

      usw.

  sms.beginSMS(remoteNum);
  sms.print(messageToSend);
  sms.endSMS();

    }
}

dann nimm bei case das break raus, und setze alle Fehler mit
messageToSend += "\rGaragetor wurde geschlossen";
anstatt nur
messageToSend = "Garagetor wurde geschlossen";
zusammen und setz das in die von mir o.a. INTERVAL(dauer);dauer=300000;

dann wird solange kein Alarm ist, der INTERVAL immer ausgeführt, aber nichts gesendet. Sobald Alarm ist, wird sofort gesendet (weil dauer=0), dann wird ja dauer=300000 (=5 Min.), somit alle 5 Minuten der zusammengebaute messageToSend gesendet.
Sobald der Alarm wieder LOW ist, stellst du dauer wieder auf 0, damit beim nächsten Alarm wieder sofort gesendet wird.
Wenn ein zweiter Alarmkontakt dazu kommt, wird allerdings nicht sofort gesendet. Wenn das auch soll, dann wird es etwas komplexer.