[erledigt] Sim900 - SMS wird nicht vollständig gesendet

Hallo alle zusammen :)

Ich bin dabei mir mit einem UNO und einem SIM900 GSM-Shield eine Steuerung für meine Standheizung zu bauen.
Die Standheizung soll eingeschaltet werden wenn ich dem Arduino eine SMS mit dem Inhalt "HEIZUNG AN" sende bzw. ausgeschaltet werden mit dem Befehl "HEIZUNG AUS".
Das ein und ausschalten funktioniert auch alles wunderbar aber er soll mir auch eine Antwort senden, sozusagen um mir zu sagen das er verstanden hat bzw. das der Arduino/Sim900 überhaupt arbeitet.

Nun zum Problem....

Er sendet zwar eine Antwort aber nicht den vollständigen Text.
const char txt_H_AN[30] = "Heizung wurde eingeschaltet!";
sollte eigentlich ankommen aber als Antwort kommt immer nur "Heizung w".
Habe schon alles mögliche ausprobiert aber komme seit Tagen nicht weiter....

Wenn ich mir den String im Serial.Monitor ausgeben lasse ist alles gut, es erscheint der vollständige Text
aber in der SMS steht immer nur "HEIZUNG W"

bin langsam am verzweifeln :'(
Habt ihr vllt. ne Idee woran es liegen könnte oder wie ich das in den griff bekomme?

Variable

const char txt_H_AN[30] = "Heizung wurde eingeschaltet!";

void loop()

if (ankommende_SMS == "Heizung an") {
digitalWrite(Standheizung, HIGH);
sms.beginSMS(ABSENDER);
sms.print(txt_H_AN);
sms.endSMS();
}

evtl. ein kleines delay vor     sms.endSMS();
? ( Ist mir eigentlich aber auch schleierhaft )


  if (ankommende_SMS == "Heizung an") {

das ist doch sicher nur "PseudoCode"

ankommende_SMS könnte ein String Objekt sein. Dann geht das

michael_x:
evtl. ein kleines delay vor     sms.endSMS();
? ( Ist mir eigentlich aber auch schleierhaft )

auch das hab ich alles schon probiert.... leider ohne erfolg :confused:

michael_x:

  if (ankommende_SMS == "Heizung an") {

das ist doch sicher nur "PseudoCode"

Ja, ist es :smiley:
Habs einfach mal umgeschrieben für meinen Threat weil das original bischen undurchsichtig ist ^^

Dann zeig uns doch mal den kompletten Sketch ohne Änderungen.

HotSystems:
Dann zeig uns doch mal den kompletten Sketch ohne Änderungen.

Ihr werdet die Hände über dem Kopf zusammen schlagen und euch fragen was ich da teilweise für nen Mist zusammen geschrieben habe :smiley:
Naja, hier mal der komplette Code....

Ach und nicht wundern wenn da ein paar Sinnlose Variablen oder so im Code auftauchen :stuck_out_tongue: ich räume meistens erst auf wenn das Programm komplett funktioniert....

#include <GSM.h>   
#define PIN ""     

GSM GSM_Verbindung;
GSM_SMS sms;

byte GSM_ON = 8;     //GSM Shield wird über Digital Pin8 eingeschaltet
char CODE;           //Variable für die Sicherheitsabfrage
//String NACHRICHT;    //Buffer für die Antwort per SMS
char TEXT[15];       //Register in dem die SMS Buchstabe für Buchstabe hinterlegt wird
byte x;              //Zähler Variable für das TEXT Array 
String WERT;         //Buffer für den aus dem Array gespeicherten Wert
char ABSENDER[20];   //Buffer für die Nummer des Absenders
const char txt_H_AN[30] = "Heizung wurde eingeschaltet!";
const char txt_H_AUS[30] = "Heizung wurde ausgeschaltet!";

//Pin-Belegung für die einzelnen I/O´s
int HEIZUNG = 13;

//Variable für die Status abfrage
int STATUS_HEIZUNG;



void setup() {

 //I/O´s
 pinMode(HEIZUNG, OUTPUT);




 //Zählervariable für Text Array auf "0" setzen 
 x = 0;   

 //Den Wert des Schalters auf "0" setzen
 WERT = "";

/*
 
 //GSM Modul anschalten                    //---FÜR TESTPHASE DEAKTIVIERT!!!
 pinMode(GSM_ON, OUTPUT);             //---FÜR TESTPHASE DEAKTIVIERT!!!
 digitalWrite(GSM_ON, HIGH);            //---FÜR TESTPHASE DEAKTIVIERT!!!
 delay(500);                                //---FÜR TESTPHASE DEAKTIVIERT!!!
 digitalWrite(GSM_ON, LOW);          //---FÜR TESTPHASE DEAKTIVIERT!!!
 */  

 //GSM Modul Start
boolean nichtVerbunden = true;
 while (nichtVerbunden) {
   if (GSM_Verbindung.begin(PIN) == GSM_READY) {
     nichtVerbunden  = false;
   } 
   }
}


void loop() {
 
 //wenn eine SMS empfangen wurde
 if (sms.available()) {
   
   //Nummer des Absenders registrieren für Antwort
   sms.remoteNumber(ABSENDER, 20);
   
   //Cursor wieder an den anfang des Arrays setzen und Array leeren
   x = 0 ;    
   while (x < 16) {
   TEXT[x] = ' ';
   x = x + 1;
  }
   x = 0 ;

   //Sicherheitsabfrage (Nachricht nur beachten wenn sie mit einem "?" anfängt)
   CODE = sms.read();
   if (CODE == '?') {  
     while (TEXT[x] = sms.read()) {
       x = x + 1;
   }
   } else {
     sms.flush();
   }
   
   //Macht aus dem Befehl der SMS eine Zahl
   WERT = TEXT[0] + TEXT[1] + TEXT[2] + TEXT[3] + TEXT[4] + TEXT[5] + TEXT[6] + TEXT[7] + TEXT[8] + TEXT[9] + TEXT[10] + TEXT[11] + TEXT[12] + TEXT[13] + TEXT[14];


   //Schalter für HEIZUNG und Antwort an den Absender
   if (WERT == "841") {
     digitalWrite(HEIZUNG, HIGH);
     sms.beginSMS(ABSENDER);     
     sms.print(txt_H_AN);
     sms.endSMS(); 
   }

   if (WERT == "899") {
     digitalWrite(HEIZUNG, LOW);
     sms.beginSMS(ABSENDER);
     sms.print(txt_H_AUS);
     sms.endSMS();
   }

 }

sms.flush();

}

Was soll denn dieser Schwachsinn?

WERT = TEXT[0] + TEXT[1] + TEXT[2] + TEXT[3] + TEXT[4] + TEXT[5] + TEXT[6] + TEXT[7] + TEXT[8] + TEXT[9] + TEXT[10] + TEXT[11] + TEXT[12] + TEXT[13] + TEXT[14];

if (WERT == "841") 

...

if (WERT == "899")

Das ist vollkommen sinnfrei

Mal ungeachtet wie der Sketch aufgebaut ist, da er ja sendet, ist die Grundfunktion vorhanden.

Was hast du denn an deinem GSM-Shield für eine Spannungsversorgung dran?

Da ist sehr oft der Fehler.
Ich hoffe du nimmst eine eigene Versorgung und nicht die aus dem Arduino.
Beim Senden wird meist ein recht hoher Strom gebraucht, den der Arduino nicht liefern kann.

HotSystems:
Mal ungeachtet wie der Sketch aufgebaut ist, da er ja sendet, ist die Grundfunktion vorhanden.

Danke! :smiley: Wie ich schon vorher geschrieben habe: "hr werdet die Hände über dem Kopf zusammen schlagen und euch fragen was ich da teilweise für nen Mist zusammen geschrieben habe"
Aber es funktioniert ja ^^

HotSystems:
Was hast du denn an deinem GSM-Shield für eine Spannungsversorgung dran?

Da ist sehr oft der Fehler.
Ich hoffe du nimmst eine eigene Versorgung und nicht die aus dem Arduino.
Beim Senden wird meist ein recht hoher Strom gebraucht, den der Arduino nicht liefern kann.

Habe am Uno ein Netzteil (9V mit 2A)...
Ich denke aber wenn es an der Spannungsversorgung liegen würde, würde ehr garnix ankommen als nur die häfte weil die Versorgung ja vorher zusammenbrechen würde bevor die Nachricht raus ist...
Habe mittlerweile ca. 30 SMS auf meinem Handy in denen einfach nur "Heizung w" steht :confused:

Habe am Uno ein Netzteil (9V mit 2A)...
Ich denke aber wenn es an der Spannungsversorgung liegen würde, würde ehr garnix ankommen als nur die häfte weil die Versorgung ja vorher zusammenbrechen würde bevor die Nachricht raus ist...

Also, du solltest dem GSM-Teil auf jeden Fall eine eigene Stromversorgung geben! Der Arduino-Spannungsregler ist dem Stromhunger nicht gewachsen, normalerweise braucht ein GSM-Shield bis zu 1000mA.
Das wurde ja auch schon erwähnt. Auf der Arduino-Seite des GSM-Shields steht auch:

Power
It is recommended that the board be powered with an external power supply that can provide between 700mA and 1000mA.

Für "kurze Zeit" kann ein erhöhter Strombedarf eventuell vom Arduino gedeckt werden, dann aber könnte die Spanung einbrechen.

duke306:
Habe am Uno ein Netzteil (9V mit 2A)...
Ich denke aber wenn es an der Spannungsversorgung liegen würde, würde ehr garnix ankommen als nur die häfte weil die Versorgung ja vorher zusammenbrechen würde bevor die Nachricht raus ist...
Habe mittlerweile ca. 30 SMS auf meinem Handy in denen einfach nur "Heizung w" steht :confused:

Das ist genau der Grund, warum es nicht funktioniert.
Wie uxomm geschrieben hat, reicht das nicht.
Du beziehst die 5 Volt vom Uno und das schafft der Regler nicht.
Ich hatte dich schon darauf hingewiesen, das GSM braucht eine eigene Spannungsversorgung.
Während des Sendens wird der Stromverbrauch so hoch und die Spannung bricht zusammen.

Zeig uns doch mal einen Link deines Moduls.

ich räume meistens erst auf wenn das Programm komplett funktioniert....

Wenn das Programm komplett funktioniert, würde ich nicht mehr aufräumen :wink:

Wenn etwas sich unerklärlich verhält (und es nicht an der Stromversorgung liegen sollte :wink: )
hilft es oft, das Problem in einen Minimal-Sketch zu isolieren. Oft ist der Fehler weg, oder es fällt einem selber auf, oder man kann das Ganze zumindest leichter analysieren...
Dann kann man immer noch schrittweise vom funktionierenden Minimal-Sketch zum Komplett-Sketch erweitern und sehen, ab wann es hakt.

HotSystems:
Das ist genau der Grund, warum es nicht funktioniert.
Wie uxomm geschrieben hat, reicht das nicht.
Du beziehst die 5 Volt vom Uno und das schafft der Regler nicht.
Ich hatte dich schon darauf hingewiesen, das GSM braucht eine eigene Spannungsversorgung.
Während des Sendens wird der Stromverbrauch so hoch und die Spannung bricht zusammen.

Habe vorhin noch ein Netzteil gefunden auf Arbeit mit 5V 4,5A und direkt mal ausprobiert...
Uno und Shield getrennt voneinander in Parallelschaltung an das Netzteil gehangen und die Serielle verbindung zwischen Uno und Shield hergestellt.....

Ergebnis per SMS -> "Heizung w"

Also ein Problem mit der Spannungsversorgung ist jetzt definitiv ausgeschlossen!!!

michael_x:
Wenn etwas sich unerklärlich verhält (und es nicht an der Stromversorgung liegen sollte :wink: )
hilft es oft, das Problem in einen Minimal-Sketch zu isolieren. Oft ist der Fehler weg, oder es fällt einem selber auf, oder man kann das Ganze zumindest leichter analysieren...
Dann kann man immer noch schrittweise vom funktionierenden Minimal-Sketch zum Komplett-Sketch erweitern und sehen, ab wann es hakt.

Danke für den Tip ^^ hätte ich auch mal von selbst drauf kommen können :smiley:
Jedenfalls weiß ich jetzt garnicht mehr weiter :confused:
habe jetzt den sketch auf die überlebenswichtigen Funktionen reduziert und als Antwort vom Uno (per SMS) kommt..... -> HEIZUNG W <- so macht das keinen Spaß :frowning:

sieht jetzt so aus:

#include <GSM.h>
#define PIN ""
GSM GSM_Verbindung;
GSM_SMS sms;

const char txt_H_AN[30] = "Heizung wurde eingeschaltet!";
int taster = 10;

void setup() {

pinMode(taster, INPUT);
digitalWrite(taster, HIGH);

boolean nichtVerbunden = true;
while (nichtVerbunden) {
if (GSM_Verbindung.begin(PIN) == GSM_READY) {
nichtVerbunden = false;
}
}
}

void loop() {

if (digitalRead(taster) == LOW) {
sms.beginSMS("meine Handynummer hab ich jetzt mal hier entfernt");
sms.print(txt_H_AN);
delay(1000);
sms.endSMS();
}
}

keine Ahnung woran das jetzt noch liegen könnte....
Die GSM Beispiele ReceiveSMS und SendSMS funktionieren auch völlig Problemlos....

Wenn die Beispiele funktionieren, würde ich doch darauf aufbauen.
Bei anderen GSM Modulen musste noch zusätzlich ein großer Elko auf die Betriebsspannung gelötet werden.

HotSystems:
Wenn die Beispiele funktionieren, würde ich doch darauf aufbauen.

Ich habe das ja nun schon soweit reduziert das es im Endeffekt nur noch das GSM Beispiel Sketch für das senden einer SMS ist.

Das versteh ich jetzt nicht.
Du hast geschrieben, das Beispiel funktioniert.
Warum nimmst du das nicht und erweiterst es um deinen Text und anderen Funktionen.

ERLEDIGT!!!

Ich habe nicht die geringste Ahnung warum aber anscheinend wird nach einem kleinen "w" ein Nullterminierung ausgeführt und der String direkt nach dem "w" abgeschnitten.

Deswegen kam bei mir auch immer nur "Heizung w" an und nix weiter :smiley:
Hab´s jetzt irgendwie durch zufall rausgefunden weil ich den zu sendenden Text durch
"HALLO WELT hallo welt XYZ123456" ersetzt habe und angekommen bei mir ist "HALLO WELT hallo w" O.o
Text wieder geändert in "HEIZUNG WURDE EINGESCHALTET" und siehe da... es kommt jetzt alles an :slight_smile:

Jetzt kann ich endlich an dem Punkt weiter arbeiten...

Trotzdem danke für eure Lösungsansätze :slight_smile:

Na das ist doch ein "Hammerding".
Damit rechnet keiner.

Ich habe nicht die geringste Ahnung warum aber anscheinend wird nach einem kleinen "w" ein Nullterminierung ausgeführt und der String direkt nach dem "w" abgeschnitten.

Sehr schräg!!

Ich kanns kaum glauben....
Mein SIM800L versendet gerne kleine "w"!
Auch gerne viele davon.....

Ich vermute:
Da läuft irgendwas anderes schief, bzw. ist schief gelaufen....