GSM Modul mit Arduino stürzt ab/hängt

Hallo zusammen,

Dachte mir ich schreibe mal hier ins Forum weil ich ein Problem mit meinem GSM Modul habe das ich verbaut habe und ich einfach nicht auf die Lösung komme.

Ich habe eine Pumpensteuerung entwickelt mit 5V Eingängen am Mega 2560 und einem Ausgang mit einem Relais Modul direkt von Arduino. Gesteuert wird das ganze per SMS also GSM Modul (Seeedstudio v3).
Mein Schaltnetzteil ist mit 3A auch ausreichend dimensioniert bzgl. der Stromaufnahmen.

Mein Problem besteht nun darin, dass nach 24h oder auch etwas später mal sich der Arduino aufhängt bzw. keine empfangenen SMSen mehr annimmt, weder schaltet oder sonst noch was tut.
Es kam auch schon vor das er in die if-Anweisung if((strcmp("SniffenOn", smsin)) == 0) oder if((strcmp("SniffenOff", smsin)) == 0) gesprungen ist obwohl nie ein Befehl von mir, also Testingenieur, gekommen ist.

Mit void ReceiveSMS(char sms_buffer[20]) werden die SMSen empfangen und abgespeichert und wieder zurückgegeben.

In void deletesms(char smstodelete[20]) werden diese gelöscht bzw. auf 0 gesetzt damit keine if-Anweisung mehr gültig ist nachdem diese einmal durchwandert wurde.

Hättet ihr evtl. noch Ideen woran es liegen könnte, dass sich der Arduino so verhält? Ich habe bereits den Mega 2560, die Relais und das GSM Modul getauscht, selbiges berhalten.
Kann es evtl auch am unsigned long currentMillis = millis(); das ich aus dem Blink-Beispiel habe liegen? Hier führe ich den Inhalt nur alle 24h aus, falls ein Eingang anliegen sollte.

Wäre auch wirklich über jede einzelne Hilfestellung dankbar!!

pump_control.ino (26 KB)

Da du uns alle daran beteiligten Komponenten verschweigst, ist ein Aussage kaum möglich.
Schreibe mal Hyperlinks aller Teile die du verwendest oder Angaben von technischen Daten.

Mein erster Tipp wäre z.B. deine Pumpe bringt dein System zum Absturz.
Also Pumpe entstören.

Mein erster Tipp wäre z.B. deine Pumpe bringt dein System zum Absturz.
Also Pumpe entstören.

Oder statt echter Pumpe/Relaismodul nur eine LED zum Test.

Hey,

Danke für eure Antworten!

Also als Board habe ich den Arduino Mega 2560.
Das GSM Modul ist von Seeedstudio GSM Shield
Das Relais Relais Shield
Eingangs-Relais 30.22.7 Relais Eingang
Die Pumpe selbst ist eine Industriepumpe mit 230V wobei diese im Schaltschrank durch ein 12V Relais ein- und ausgeschaltet werden kann. Dies funktioniert auch reibungslos. Ebenso wie die Sensoren die mittels Relais im Schaltschrank zur Verfügung stehen.

Das Schaltungsprinzip ist wie folgt: Ein Sensor "Trockenlaufschutz" Hochstrombereich schaltet ein 12V Relais das Ausgangsseitig Spannungsfrei ist. Hier lege ich 5V an und schalte somit mein Eingangsrelais wie oben gezeigt. Am Ausgang dieses Relais schalte ich den Eingangspin entweder gegen Masse oder nicht. Durch den internen PullUp an den Eingangspin des Arduino werden diese dann nach Vcc gezoogen falls das Relais nicht durchgeschaltet ist auf GND.

Es wird eine SMS ausgeschickt das die Pumpe freigegeben wurde - falls der Trockenlaufschutz natürlich nicht aktiv ist. Kommt dann nochmals eine SMS daher mit EinP1 wird die Pumpe 1 eingeschalten in dem mit dem Relais Shield der Pin 12 auf High gesetzt wird. Am Shield wird ein Relais geschalten und am Spannungsfreien Ausgang des Relais liegen 12V für ein weiteres Relais für den Hochstrombereich an der dann die Pumpe schaltet.

Ist das Netzteil genügend dimensioniert?
Grüße Uwe

Sorry, aber deine Relaisschaltungen verstehe ich nicht.

Damit das klarer wird, solltest du ein Schaltbild liefern, in dem alles genau zu erkennen ist.

Und wieso schaltest du Sensoren mit einem Relais ?

Edit:
Immer noch könnte die Pumpe dein Problem sein.
Hast du am Relais für die Pumpe einen Snubber angeschlossen ?
Was ist das für ein Relais ?

Danke für eure Antworten!

Ja das Netzteil ist mit 3A genügend dimensioniert (Netzteil).

woran machst du das fest, was ist die letzte Serial Ausgabe die du siehst? Wenn du nicht weist wo es hängt, ist die Analyse schwierig bis unmöglich. Also protokolliere mit, in welchem Zweig deines Programms es zum hänger kommt.

Bzgl der aufhänger/das sich nichts mehr steuern lässt bzw. keine SMSen mehr empfangen werden komme ich darauf, dass der Arduino weder auf gesendete Nachrichten von meinem Handy zum GSM Modul reagiert, noch Nachrichten oder Meldungen auf mein Handy schickt. Demnach findet auch keine steuerung statt. Leider kann ich nicht 24h vor der Steuerung stehen da sie sich an einem schwer zugänglichen Ort befindet. Deshalb sehe ich auch keine serielle Ausgabe. Evtl. das man hier einen Logger an die Serielle Schnittstelle anschließt?

Wird zwar nicht die Ursache sein, aber auch mal deine Variablen überarbeiten.
Du verwendest relativ oft int, und ich unterstelle, viele diese Variablen brauchen keine vorzeichenbehafteten zwei Byte.

Danke kann ich machen. Ist INT nicht ein Doppelwort, also 4 byte? Was schlägst du sonst vor bei nicht all zu großen Daten, evtl. BYTE?

Dann: du bist auf einem MEGA, der hat 4 Hardwarserial, also wozu SoftSerial? Such dir ein Tutorial für dein Shield das mit Hardware-Serial am MEGA arbeitet.

Hier habe ich wirklich viel versucht die HardwareSerial Schnittstelle zu verwenden, da ich einiges negatives bzgl. der SoftwareSerial Schnittstelle gelesen habe. Habe mich dann jedoch trotzdem für SoftwareSerial entschieden, da bereits viele der Bibliotheken vom Sim900 Chip von Seeedstudio zur Verfügung standen und hier SoftwareSerial benutzt wurde (Bibliotheken).

Das Schaltbild befindet sich im Anhang. Frei skizziert geht immer noch am schnellsten/flexiblesten. Hoffe es ist verständlich. Am EIngang des Arduino an Pin 49 & 45 befinden sich noch zwei Relais mit dem selben Schema wie die der Sensoren.

Immer noch könnte die Pumpe dein Problem sein.
Hast du am Relais für die Pumpe einen Snubber angeschlossen ?
Was ist das für ein Relais ?

Nein, einen Snubber habe ich nicht verwendet. Aber Danke für den Hinweis! Das könnte hilfreich sein!
Das Sensor-Relais im Relais Hochtrombereich (Hier) Funktioniert jedoch einwandfrei.
Ebenso einwandfrei funktioniert die Ansteuerung des Relais für die Pumpe, welches folgendes ist (Pumpe Relais) (Hier).

Pumpe_0001.pdf (281 KB)

Das Schaltbild ist so ok.
Auch wenn du schreibst, es funktioniert einwandfrei, solltest du dem nicht vertrauen.

Wie schon geschrieben, empfehle ich die Verwendung eines Snubbers am Relaiskontakt der Pumpe.
Ebenso sollten alle Relaisspulen mit einer Freilaufdiode versehen werden.
Mit den genannten Vorgehensweisen werden vermeintliche Störungen reduziert die evtl. die Ursache für dein Problem sein könnten.
Wenn das alles nichts hilft, muss man weiter suchen.

Okay Danke für die Rückmeldung.

Dann werde ich bei den Eingangsrelais (Finder) jeweils eine Diode 1N4148 parallel zur Spule verbauen. Das Relais Modul für die Pumpe besitzt bereits die genannte Freilaufdiode. Hier zusätzlich noch ein Snubber dazu?

Da muss ich wohl weiter auf die suche gehen.

Snubber und Freilaufdiode dienen unterschiedlichen Zwecken.
Die Freilaufdiode "schließt die Abschaltspannung der Relaisspule kurz", der Snubber unterdrückt Störungen beim Anschalten des Lastkreises an den Kontakten.

Gruß Tommy

Thor2018:
Da muss ich wohl weiter auf die suche gehen.

Informationen zum Snubber findest du hier.

Hallo zusammen,

Nachdem ich nun Snubber, Freilaufdioden und alles verbaut hatte und erneut Fehler aufgetreten sind habe ich mich dazu entschieden alles einmal zu Hause in Ruhe durchzutesten.

Ich habe jetzt die gesamte Steuerung zu Hause aufgebaut, die Sensoren wie Trockenlaufschutz etc. simuliere ich mit einem weiteren Arduino (Leonardo). Das heißt alle 30min. schaltet sich der Trockenlaufschutz ein und weitere 30min. später wieder aus. Das heißt an den Pins des Mega 2560 (die Hauptsteuerung) sind der Leonardo angeschlossen.
Das ganze funktioniert genau so wie es sein soll. Am ersten Abend also von Vorgestern auf Gestern lief alles reibungslos, bis um 0:20 Uhr plötzlich der Mega nicht mehr auf Empfangene SMS reagiert hatte. Hier kam wieder der wie Anfangs beschrieben aufhänger wo keine SMS mehr empfangen werden können. Nachdem ich fernab vom Brunnen bin kann es schon mal nicht an der Versorgung liegen!

Wohlgemerkt wird das ganze zu Hause über einen USB Hub versorgt (Serielle Schnittstelle) und parallel dazu mit einem Schaltnetzteil Netzteil.
Zeitgleich lasse ich mir alles per serielle Schnittstelle ausgeben. Auch hier konnte ich nichts feststellen, er hört plötzlich um 0:20 Uhr ebenfalls auf etwas auf die serielle Schnittstelle auszugeben.

Danach habe ich folgendes geändert:

  • Ich habe statt SoftwareSerial Hardware Serial (Serial3) am Mega 2560 verwendet. Die verwendete Library ist (nach Anpassung) immer noch dieselbe wie weiter oben beschrieben.
  • Die Baud RAte habe ich auf 9600Baud geändert um hier einen typischen Standardwert zu besitzen. Davor hatte ich 19200Baud.
    -Die Puffergrüße von smsbuffer[] und smsin[] habe ich auf 160 Zeichen erhöht.

Das ganze rannte wieder von Gestern auf heute in der Nacht und erneut bekam ich um 0:15 Uhr herum den selben Fehler. Eben das der Arduino nicht mehr auf Empfangene SMSen reagierte. Als ob er immer einfrieren würde.
Das Interessante daran, ich habe den Testlauf bereits gegen Mittag gestartet (im Gegensatz zum Vortag Testlauf wo ich diesen erst um 21Uhr gestartet hatte) und es trat beinahe zur selben Uhrzeit dieser Fehler auf. Selbiges Problem trat ebenfalls am Brunnen um ca. Mitternacht auf, weshalb der PC schon mal ausscheiden würde als Fehlerquelle.

Der Auto-Reset wurde schon seit dem alles in Betrieb ist und im Brunnen verbaut wurde disabled (Pad am Mega 2560 Board cutted). An diesem kann es auch nicht liegen.

Kann es an der Bibliothek liegen oder der Art und Weise wie ich die SMS abrufe?
Denn am Beispiel-Sketch von Seeedstudio "Gprs SMSRead" ist folgendes zu lesen:

There are two methods to read SMS:

    1. GPRS_LoopHandle.ino -> in order to recieve "+CMTI: "SM""*
  • may be you need to send this command to your shield: "AT+CNMI=2,2,0,0,0"*
    1. GPRS_SMSread.ino -> you have to check if there are any*
  • UNREAD sms, and you don't need to check serial data continuosly*

Hier benutze ich die 2. Variante, eben diese welche auch im Beispiel Sketch verwendet wird.

Wäre über jeden Gedankengang dankbar!

Hier nochmal der gesamte Beispiel-Code von Seeedstudio (dem Hersteller meines GSM Moduls)

/*
GPRS SMS Read

This sketch is used to test seeeduino GPRS_Shield's reading SMS 
function.To make it work, you should insert SIM card
to Seeeduino GPRS Shield,enjoy it!

There are two methods to read SMS:
  1. GPRS_LoopHandle.ino  -> in order to recieve "+CMTI: "SM"" 
      may be you need to send this command to your shield: "AT+CNMI=2,2,0,0,0"
  2. GPRS_SMSread.ino -> you have to check if there are any 
      UNREAD sms, and you don't need to check serial data continuosly

create on 2015/05/14, version: 1.0
by op2op2op2(op2op2op2@hotmail.com)
*/

#include <GPRS_Shield_Arduino.h>
#include <SoftwareSerial.h>
#include <Wire.h>

#define PIN_TX    7
#define PIN_RX    8
#define BAUDRATE  9600

#define MESSAGE_LENGTH 160
char message[MESSAGE_LENGTH];
int messageIndex = 0;

char phone[16];
char datetime[24];

GPRS gprs(PIN_TX,PIN_RX,BAUDRATE);//RX,TX,PWR,BaudRate

void setup() {
  gprs.checkPowerUp();
  Serial.begin(9600);
  while(!gprs.init()) {
      Serial.print("init error\r\n");
      delay(1000);
  }
  delay(3000);  
  Serial.println("Init Success, please send SMS message to me!");
}

void loop() {
   messageIndex = gprs.isSMSunread();
   if (messageIndex > 0) { //At least, there is one UNREAD SMS
      gprs.readSMS(messageIndex, message, MESSAGE_LENGTH, phone, datetime);
      //In order not to full SIM Memory, is better to delete it
      gprs.deleteSMS(messageIndex);
      Serial.print("From number: ");
      Serial.println(phone);  
      Serial.print("Datetime: ");
      Serial.println(datetime);        
      Serial.print("Recieved Message: ");
      Serial.println(message);    
   }
}

Thor2018:
Danke für eure Antworten!

Ja das Netzteil ist mit 3A genügend dimensioniert (Netzteil).

ok, Das Netzteil ist genügend dimensioniert.
Das Ding, das die 12V auf 5V bringt auch???
Grüße Uwe

Hallo Uwe,
Wenn du den Spannungsregler meinst ja dieser auch. Da habe ich diesen hier verbaut: Spannungsregler
Mit passendem Kühlkörper u Wärmeleitpaste wird der Regler ausreichend gekühlt.

Thor2018:
Hallo Uwe,
Wenn du den Spannungsregler meinst ja dieser auch. Da habe ich diesen hier verbaut: Spannungsregler
Mit passendem Kühlkörper u Wärmeleitpaste wird der Regler ausreichend gekühlt.

Was macht der Spannungsregler, wenn von diesem 2 A verlangt wird ?
Hast du mal die Spannung mit einem Oszi gemessen, wenn das GSM sendet ?

Ich könnte mir vorstellen, dass die 5 Volt kurzfristig zusammen brechen und damit der Arduino evtl. resettet.
Geeigneter ist da ei Stepdown-Regler der auch problemlos die 2 A liefert.

Ich hatte so ein gsm modul auch mal an einem arduino und labor Netzteil mit 2,5a.

Beim sms senden ist es oft ausgefallen.
Teilweise auch schon beim einloggen ins netz.

Abhilfe hat ein größerer kondensator direkt zwischen 5v und gnd gebracht.

Falls du einen kondensator hast, kannst du das ja mal probieren.

Wenn DU auch 12V brauchst ist es einfacher ein Netzteil der früher zu einem ATA zu USB Adapter mitgeliefert wurde zu nehmen. Die haben 5 und 12V Ausgangsspanung.
Ich meine sowas (Foto als Beispiel):

Grüße Uwe

Danke für eure Rückmeldung!

Leider bin ich im Moment an meinem Zweitwohnsitz wo ich weder Oszi noch ein geeignetes Netzteil habe. Werde mir aber sofort ein passendes bestellen inkl. einigen Kondensatoren damit ich eine Fehlerquelle eindeutig ausschließen kann.

Habe jetzt die 12V des Schaltnetzteils an den Vin des GSM Moduls probeweise angeschlossen. Hier befindet sich (daran habe ich nicht gedacht) ein Step-Down Converter am Vin Pin und liefert 5V am Ausgang zu 2A (LMZ120022-A). Das wäre im Moment einen Versuch wert bis die neuen Bauteile am Dienstag wenn ich sie noch heute bestelle ankommen.