Problem mit negativer Flanke

Moin Moin, habe folgendes Problem: Ich bekomme von einer Kleinsteuerung Signale ob bestimmte Sensoren ausgelöst haben. Am Arduino Mega habe ich die Eingänge mit Pullup geschaltet und die Kleinsteuerung schaltet mir praktisch die Eingänge am Arduino auf LOW.
Wenn das der Fall ist, möchte ich eine SMS bekommen. Funktioniert alles super soweit. Ich möchte aber nur eine SMS bekommen solagne das Signal ansteht. Also habe ich es mit einer negativen Flanke versucht. Es funktioniert, dass wenn ich den eingang auf Masse leg, eine SMS versendet wird. Sobald ich aber die Masse wieder abziehe und der Eingang zurück auf HIGH geht bekomme ich nochmal eine SMS. Ich komm nicht drauf woran das liegt. Unten der Code dazu. Vielleicht sieht wer meinen Fehler.
Es geht rein um das Problem, dass ich zwei SMS bekomme. Einmal wenn der Eingang auf LOW gezogen wird und das andere mal wenn er wieder auf HIGH wechselt.
Danke schon mal

#include <SoftwareSerial.h>
#include "SIM900.h"
#include "sms.h"
SMSGSM sms;

//-------------------------------------------------------------------------------------------
//###########Variablendeklraration###########
//-------------------------------------------------------------------------------------------

//Pin Variablen
const int frost = 49;//Temperatur
const int leer = 48;//Zisterne
const int pumpe = 47;//Motorschutz Pumpe

//GSM Variablen
boolean started=false;//GSM Authentifizierung OK
int numdata;
char smsbuffer[160];//Textarray
char n[20];//Telefonnummerarray

//Flanken Variablen
int stateFrost = HIGH;
int laststateFrost = HIGH;
int stateLeer = HIGH;
int laststateLeer = HIGH;
int statePumpe = HIGH;
int laststatePumpe = HIGH;

//-------------------------------------------------------------------------------------------
//###########Initialisierung###########
//-------------------------------------------------------------------------------------------

void setup() 
{
  
//-----------------------------------------------------------------------------------------
//###########PIN Setup###########
//-----------------------------------------------------------------------------------------
  pinMode(frost, INPUT_PULLUP);
  pinMode(leer, INPUT_PULLUP);
  pinMode(pumpe, INPUT_PULLUP);
  
//------------Serial connection------------
  Serial.begin(9600);
  Serial.println("GSM Shield testing.");

  if (gsm.begin(2400))
  {
//------------Parallelausgabe auf LCD------------
    Serial.println("\nstatus=READY");
    //PirntLCD
    started=true;  
  }

//------------Parallelausgabe auf LCD------------
  else Serial.println("\nstatus=IDLE");
      //PrintLCD
  
}

//-------------------------------------------------------------------------------------------
//###########Hauptprogrammschleife########### 
//-------------------------------------------------------------------------------------------

void loop()
{

  //Zustandsabfrage Inputpins
  stateFrost = digitalRead(frost);
  stateLeer = digitalRead(leer);
  statePumpe = digitalRead(pumpe);

    //Frostschutz, Fühler Pt100
    if(started && (laststateFrost == HIGH && stateFrost == LOW))//Ergekennung negative Flanke
    {

        if (sms.SendSMS("xxxxxxxxxxxxxxx", "Achtung Bodenfrost! Anlage umgehend Entwaessern!"))
        Serial.println("\nSMS sent OK");
         //PrintLCD
    }
    
    //Zisterne leer
    else if(started && (laststateLeer == HIGH && stateLeer == LOW))//Ergekennung negative Flanke
      {
         if (sms.SendSMS("xxxxxxxxxxxx", "Zisterne leer. Umschalten auf externe Wasserversorgung"))
         //PrintLCD
         Serial.println("\nSMS sent OK");
    
      }
      
    //Störung Pumpe, Motorschutz  
    else if(started && (laststatePumpe == HIGH && statePumpe == LOW))//Ergekennung negative Flanke
     {
        if (sms.SendSMS("xxxxxxxxxxx", "Stoerung Pumpe. Bewaesserung ausgefallen!!"))
        //PrintLCD
        Serial.println("\nSMS sent OK");
     
      }

   //letzten Zustand merken
   laststateFrost = stateFrost;
   laststateLeer = stateLeer;
   laststatePumpe = statePumpe;
   
}

sketch_mar18a.ino (3.04 KB)

Dann ist ein Fehler in deinem Sketch, den ich leider nicht lesen kann.
Bitte setze den hier in Code-Tags rein, dann können auch mobile Geräte den ansehen.
Verwende die Schaltfläche </> oben links im Editorfenster.

Erledigt

EJ_0815:
Erledigt

Ja, ok.
Du darfst keine "if/else-Abfrage" machen, sondern nur zwei "if-Abfragen".
Und ich würde das der Übersicht wegen in Funktionen auslagern.

Den SMS-Text per if-Abfrage erstellen und dann in einer weiteren Funktion die SMS -senden.

Danke für die fixe Antwort. Leider kann ich dir nicht ganz folgen :confused:
Warum darf ich keine if/else Abfrage machen?
Wie meinst du das mit nur zwei If abfragen? Auf die Abfragen der 3 Pins bezogen, oder auf die zwei If abfragen ineinander von der negativen Flanke und der Sms generierung?.
Du meinst dann die ##
if (sms.SendSMS("xxxxxxxxxxxxxxx", "Achtung Bodenfrost! Anlage umgehend Entwaessern!"))
Serial.println("\nSMS sent OK");
//PrintLCD##

auslagern?

EJ_0815:
Warum darf ich keine if/else Abfrage machen?

Weil der else-Zweig nur ausgeführt wird, wenn die if-Abfrage nicht zutrifft.
Also beim wegfallen des LOW-Signals.

Wie meinst du das mit nur zwei If abfragen?

Tippfehler, ich meinte die 3 if-Abfragen.

  //Zustandsabfrage Inputpins
  stateFrost = digitalRead(frost);
  stateLeer = digitalRead(leer);
  statePumpe = digitalRead(pumpe);

Wenn das prellende Signale sind, sollten sie entprellt werden.

@agmue
Wie würdest du die Kontakte entstellen?
Über Delay oder diese bounce library?

Alle 30ms mittels millis() abfragen hat sich bei mir zum Entprellen bewährt und ist nicht blockierend.

Ok danke. Mit millis () muss ich mich nochmal einlesen. Das hat das letzte mal leider gar nicht funktioniert:(

Schau Dir mal die prellMillis an.

Da mir gerade danach war, habe ich mir den Spaß gegönnt, und es mal so gebaut, wie es bei mir aussehen würde. Zumindest so in Etwa.

Ob dir das hilft?
KA…
Mach was draus, oder ignoriere es… ist mir beides vollkommen recht.

Den SMS Code habe ich größtenteils weg gelassen, …
Nur einen Kommentar dort gesetzt, wo gesendet werden müsste.

#include <CombiePin.h>
#include <CombieTimer.h>
#include <CombieTools.h>


template<byte pin,unsigned long entprellZeit,char *meldung>
class Melder
{
  private:
    Combie::Pin::TasterGND<pin>     input;
    Combie::Timer::EntprellTimer  * entprellen;
    Combie::Tools::FlankenErkennung flanke;
  public:
    Melder()
    {
      entprellen = new Combie::Timer::EntprellTimer(entprellZeit);
    }
    
    void init()
    {
      input.initPullup();  
    }
    void run()
    {
      if(flanke = *entprellen = input)
      {
        Serial.println(meldung);
        //sms.SendSMS("xxxxxxxxxxxx",meldung);  
      }
    }
};

char meldungFrost[] = "Achtung Bodenfrost! Anlage umgehend Entwaessern!";
char meldungLeer[]  = "Zisterne leer. Umschalten auf externe Wasserversorgung";
char meldungPumpe[] = "Stoerung Pumpe. Bewaesserung ausgefallen!!";

Melder<49,30,meldungFrost> frostMelder; 
Melder<48,30,meldungLeer>  leerMelder; 
Melder<47,30,meldungPumpe> pumpeMelder; 


void setup() 
{
  Serial.begin(9600);
  Serial.println("Start");
  frostMelder.init();
  leerMelder.init();
  pumpeMelder.init();
}

void loop() 
{
  frostMelder.run();
  leerMelder.run();
  pumpeMelder.run();
}

CombieLib.zip (31.3 KB)