Suche Hilfe beim proggen von SMS versenden via GSM Modul

Bernd Langner

Moderator
Teammitglied
Hallo

Ich möchte einen Arduino mit SIM 900 GSM Shield dazu bringen
an 10 Rufnummer eine SMS zu versenden.

Sim 900.jpg

Wozu soll das dienen ? als Alarmierung bei Einbruch.

Folgende Funktion soll bei Alarmierung passieren.
Der Arduino fragt ein Digiport ab wird der geschlossen ( das macht eien andere Komponete mit potfreien Ausgang)
soll eine SMS an bis zu 10 Rufnummern gesendet werden.
Die SMS hat immer den selben Wortlaut.

Ihr seht ja den Staub auf dem Modul ich hatte es einmal hinbekommen das eine MS an eine Rufnummer versendet
wird aber nicht an mehrere.
Eventuell hat ja jemand so ein Sketch geschrieben das ganze soll in das Vereinshaus eingebaut werden
da der Tel-anschluß zu teuer wird.

Gruß Bernd
 
Hallo Bernd,
habe das ähnliche GSM-Modul Fona808 am Arduino mehrfach erfolgreich eingesetzt.

Aus deinem Bild ergibt sich die erste Frage: Benutzt du einen Stützakku am GSM-Modul?

Neben einem geringen Leerlaufstrom zieht zumindest mein Modul bei einigen Aktionen wie Netzeinbuchung und SMS-Versand Stromspitzen bis 2A, die nicht über die normale Stromversorgung abgefedert werden können.
Bei meinem Modul gibt es einen ausgewiesenen Akkuanschlussstecker, über den der Lipo durch die Versorgungsspannung permanent geladen wird und im Bedarfsfall die Stromspitzen gefüllt werden.

Ansonsten teil doch mal den genauen Namen der Module mit und poste oder schick deinen Sketch.

Viele Grüße
Stefan
 
Habe das Modul im Netz gefunden, der erste Ansatzpunkt wäre der selbe: Die Stromspitzen
Ein Stützakku ist bei dem Modul nicht vorgesehen, wohl aber eine externe Spannungsquelle mit 5-9V und mind 2A.
Hattest du das so in Betrieb?
 

Bernd Langner

Moderator
Teammitglied
Hallo Stefan

Ich habe einmal mit dem Modul herumgespielt und auch geschafft ein SMS zu versenden habe dazu den Sketch
aus dem Arduino Handbuch benutzt (Alarmanlage mit GSM Modul)
Das Shield hat auch eine Backup Batterie
Alarm.jpg
Gebe zu das ich mich noch nicht weiter tiefgreifend damit beschäftigt habe da ich gehofft habe
das einer mal so eine SMS Funktion realisiert hat.
Wie gesagt mit dem Sketch aus dem Buch hat der Versand geklappt.
Nur wie löse ich das, das diese SMS an bis zu 10 Personen geschickt wird.
Bin aber ehrlich und sage das ich zwar die Arduinooberfläche starten kann und auch kleine Programme
abtippen kann aber gänzlich eigene zu schreiben nicht fähig bin.

Gruß Bernd
 

Anhänge

  • GSM.jpg
    GSM.jpg
    439,3 KB · Aufrufe: 157
  • Alarm.jpg
    Alarm.jpg
    411,6 KB · Aufrufe: 148
Zuletzt bearbeitet:

BOcnc

User
Hallo Bernd,

hast du probiert die Zeile "sms.SendSMS(..... 10 mal mit verschiedenen Telefonnummern einzufügen. Wahrscheinlich muss zwischen den Zeilen dann eine Wartezeit eingefügt werden bis eine SMS gesendet wurde.

Gruß
Werner
 

Bernd Langner

Moderator
Teammitglied
Hallo Werner

Die Idee hatte ich auch schon im Kopf ich werde das mal versuchen aber ich denke auch
das dazwischen ein kurze Wartezeit sein muß

Gruß Bernd
 

BOcnc

User
Hallo Bernd,
ich habe mir das noch mal angesehen. Eine Pause wirst du wahrscheinlich nicht brauchen. Die zweite Zeile mit print sagt ja das gesendet wurde.
Kann man ja mal mit 2 Zeilen und der gleichen Nummer probieren ob man das 2 mal bekommt.
Gruß
Werner
 

Bernd Langner

Moderator
Teammitglied
Hallo

Hole das Thema nochmal hoch da ich bis jetzt keine Lösung gefunden habe.
Eventuell ist ja jemand unter den Usern der mir mit Rat und Tat zur Seite stehen kann.
Hardware ist kein Problem Arduino IDE ist auch vorhanden.
Habe mehrere GSM 900 Module im Lager die an sich alle funktonieren sollten.

Ein Problem beim Arduino scheint der serielle Port zu sein auf D0 und D1 der wird auch intern
benötigt und kann nicht gleichzeitig das GSM Modul über den seriellen Port ansprechen.

Dazu muß ich per Software und Bibliothek eine seriellen Port zb Pin 7 und Pin 8 einrichten.
Jetzt meine Frage wenn der Arduino seriell Daten ausgibt werden die automatisch an die Ports
D0 und D1 sowie an D7 und D8 ausgegeben ?.

Ihr merkt schon das proggen ist nicht mein Ding und es tun sich etliche Problem auf.

Gruß Bernd
 

hsh

User
Nein,
egal ob du ein Arduino mit mehreren "echten" seriellen Ports (siehe [3]) verwendest, oder du dir mit einer entsprechenden Arduino-Library einen oder mehrere Software-UARTs erstellst, musst du dich in deinem Programmablauf selbst darum kümmern, was du von einer Schnittstelle zur anderen weiterleiten möchtest.
Kannst du mit diesen Informationen [1] und Beispielen [2] etwas anfangen?
Über welche Hilfsmittel verfügts du sonst? (Logik-Analyzer, Oszi,...)
Wenn du nur prüfen möchtest, was du an das Modul sendest, kannst du dir auch mit einem USB<>UART Adapterkabel behelfen, mit dessen RxD du and D1 mitlauschen kannst.

Mein Vorschlag wäre die Nutzung eines Arduino Leonardo mit dem ATmega32u4. Da hast du D0/D1 als Serial1 als unabhängigen UART und das erleichtert solche Entwicklungen meist deutlich ;)

mfg Harald

p.s. wie ist dein Entwicklungsstand? kannst du zumindest eine SMS senden?

[1] https://www.arduino.cc/en/Reference/SoftwareSerial
[2] https://docs.arduino.cc/tutorials/communication/TwoPortReceive
[3] https://www.arduino.cc/reference/en/language/functions/communication/serial/
 

Bernd Langner

Moderator
Teammitglied
Hallo Harald
Also SMS senden klappt ich verwende den Arduino Uno als GSM Modul dieses hier
Dabei ist ja das E-Book wenn ich danach verfahre und die GSM Bibliothek vonMartinez
benutze funzt das versenden. In der GSM.cpp werden die Port auf D7/8 gesetzt und am
Shield die Jumper entsprechend gesetzt.
das ist der Sketch
#include "SIM900.h"
#include <SoftwareSerial.h>
//If not used, is better to exclude the HTTP library,
//for RAM saving.
//If your sketch reboots itself proprably you have finished,
//your memory available.
//#include "inetGSM.h"

//If you want to use the Arduino functions to manage SMS, uncomment the lines below.
#include "sms.h"
SMSGSM sms;

//To change pins for Software Serial, use the two lines in GSM.cpp.

//GSM Shield for Arduino
//www.open-electronics.org
//this code is based on the example of Arduino Labs.

//Simple sketch to send and receive SMS.

int numdata;
boolean started=false;
char smsbuffer[160];
char n[20];

void setup()
{
//Serial connection.
Serial.begin(9600);
Serial.println("GSM Shield testing.");
//Start configuration of shield with baudrate.
//For http uses is raccomanded to use 4800 or slower.
if (gsm.begin(2400)) {
Serial.println("\nstatus=READY");
started=true;
} else Serial.println("\nstatus=IDLE");

if(started) {
//Enable this two lines if you want to send an SMS.
//if (sms.SendSMS("3471234567", "Arduino SMS"))
//Serial.println("\nSMS sent OK");
}

};

void loop()
{
if(started) {
//Read if there are messages on SIM card and print them.
/** deprecated method
if(gsm.readSMS(smsbuffer, 160, n, 20)) {
Serial.println(n);
Serial.println(smsbuffer);
}
**/
//get 1st sms
sms.GetSMS(1,n,20,smsbuffer,160);
Serial.println(n);
Serial.println(smsbuffer);

delay(1000);
}
};

Nun muß ich das auf mehrere Adressaten verteilen
dazu habe ich ein Codeschnipsel gefunden der das macht
#include "SoftwareSerial.h"
#define PIN_RESET 7
#define PIN_TX 10
#define PIN_RX 11

// replace with your own PIN of the Sim card
//const char SIM_PIN_NUMBER = "XXX";

// XX = country code, e.g. "49" for Germany and xxxxxxxxxxx = phone number
const char TELEFONE_NUMBER1[] = "+49XXX";
const char TELEFONE_NUMBER2[] = "+49XXX";

SoftwareSerial mySerial(PIN_TX, PIN_RX);

void setup()
{
pinMode(PIN_RESET, OUTPUT);
digitalWrite(PIN_RESET, HIGH);

Serial.begin(9600);
mySerial.begin(9600);

Serial.println("Initializing...");
delay(1000);

// Once the handshake test is successful, it will back to OK
mySerial.println("AT");
updateSerial();

mySerial.println("AT+CSQ");
updateSerial();

//mySerial.println("AT+CPIN=\""+String(SIM_PIN_NUMBER)+"\"");
// updateSerial();

SMS1();
delay(4500);
SMS2();

}

void loop() {}

void updateSerial()
{
delay(200);
while (Serial.available()) {
// Forward what Serial received to Software Serial Port
mySerial.write(Serial.read());
}
while(mySerial.available()) {
// Forward what Software Serial received to Serial Port
Serial.write(mySerial.read());
}
}

void SMS1() {
// Configuring TEXT mode
mySerial.println("AT+CMGF=1");
updateSerial();

mySerial.println("AT+CMGS=\""+String(TELEFONE_NUMBER1)+"\"");
updateSerial();

// SMS text content
mySerial.println("Hello from SIM800L GSM-Modul");
updateSerial();
mySerial.write(26);
}

void SMS2() {
// Configuring TEXT mode
mySerial.println("AT+CMGF=1");
updateSerial();

mySerial.println("AT+CMGS=\""+String(TELEFONE_NUMBER2)+"\"");
updateSerial();

// SMS text content
mySerial.println("Hello from SIM800L GSM-Modul");
updateSerial();
mySerial.write(26);
}
Hier ist mir aber nicht klar wie der Vorgang zum senden ausgelöst wird.
Da wird der Pin7 als reset definiert und als Output festgelegt und der Highpegel abgefragt.
Werden die SMS ausgelöst wenn ich diesen Pin auf Masse ziehe?

Im ersten Sketch wird das Senden der SMS vermutlich mit SMSGSM sms eingeleitet
im zweiten Sketch geht das scheinbar alles über die AT Befehle.
Wie gesagt proggen ist nicht mein Ding ich muß das aus schnipseln irendwie
zusammensetzen.

Gruß Bernd
 

hsh

User
Hallo Bernd,
im ersten Sketch dürfte eigentlich keine SMS versendet werden, sondern lediglich vom Modul empfangene gelesen und ausgegebn werden?! bist du dir sicher, dass du den Sketch erfolgreich geflasht hast?
Das Senden sollte eigentlich in den auskommentierten Zeilen //if (sms.SendSMS("3471234567", "Arduino SMS")) //Serial.println("\nSMS sent OK"); erfolgen. Diese Zeilen sollten sich auch nutzen lassen, um hintereinander weiterer Nachrichten zu senden.

Der zweite Sketch scheint für das SIM800L geschrieben worden zu sein. Wenn beide Boards ein GSM Modul mit den gleichen AT-Befehlen nutzen kann das funktionieren, sofern du die GPIOs für den Software-UART ebenfalls korrekt konfigurierst.
Mit digitalWrite(PIN_RESET, HIGH); wird kein Pegel abgefragt, sondern der GPIO auf HIGH gesetzt (vgl. [1]). Mangels Zeit, Schaltplänen und Datenblättern kann ich vorerst nur vermuten, dass das Modul damit aktiviert wird. Ob das bei deinem Shield notwendig/möglich ist und vermutlich im Hintergrund erfolgt kann ich nicht sagen, die Definitionen in [2], Zeile #46 deuten aber darauf hin.
Die SMS bei diesem Sketch werden durch die beiden Funktionen SMS1() und SMS2() gesendet.

Ich würde dir empfehlen mit dem Sketch und den Libraries weiter zu tüfteln, mit denen du zumindest einen SMS senden kannst. Gefühlt ist hier der erste die besser Ausgangsbasis.
Soweit ich dein Anliegen verstehe, müsste das durch mehrfachen Aufruf der Methode SMSGSM::SendSMS(char *number_str, char *message_str) [3] in deinem ersten Sketch funktionieren. Die Methode sendet ja auch nur die gleichen AT-Befehle wie die Funktionen SMSx(), allerdings mit ein paar Sicherheitsabfragen die wahrscheinlich nicht schaden.

mfg Harald

[1] https://www.arduino.cc/reference/de/language/functions/digital-io/digitalwrite/
[2] https://github.com/MarcoMartines/GSM-GPRS-GPS-Shield/blob/GSMSHIELD/GSM.h
[3] https://github.com/MarcoMartines/GSM-GPRS-GPS-Shield/blob/GSMSHIELD/sms.cpp
 

Bernd Langner

Moderator
Teammitglied
Hallo Harald

Also die beiden auskommentierten Zeilen habe ich natürlich aktiviert und dann wurde die SMS auch versendet.
Ja die Module haben ein Pin womit sie mehr oder weniger dazu gebracht werden sich ins Netz einzuloggen

Um für spätere Experimente gerüstet zu sein, definiere auch den
Start- und Reset-Pin in der Datei "GSM.h" wie folgt:
#define GSM_ON 9 // connect GSM Module turn ON to pin 77
#define GSM_RESET 6 // connect GSM Module RESET to pin 35
Wenn der Pin 9 Kurz High wird und dann wieder low dann startet das GSM Modul das einloggen.
Kann auch manuell erfolgen über den Taster auf dem Shield.

Sim900.jpg
Ich habe auch das Schaltbild des Moduls sowie alle weiteren Unterlagen falls da jemand was benötigt.
Scheinbar sind es aber wenige die sich damit beschätigen.

Gruß Bernd
 

hsh

User
ok. Das klingt ja soweit ganz gut.
Was wäre jetzt dein konkretes Problem bei dem du Unterstützung brauchst?
Hast du durch kopieren und anpassen der Zeilen //Enable this two lines if you want to send an SMS. //if (sms.SendSMS("3471234567", "Arduino SMS")) //Serial.println("\nSMS sent OK"); getestet, ob du zwei SMS versenden kannst?

Wenn das nicht funktioniert, ist Hilfe über das Forum eher schwer.
Wenn das Senden von zwei SMS funktioniert, funktionieren auch beliebig viele. Allerdings sollte der Funktionsaufruf (in Abhängigkeit des Alarmeingangs) dann in loop() und nicht mehr einmalig in setup() erfolgen.

Wenn du für die Abfrage des Pegels eines GPIOs neben [1],[2] weitere Unterstützung brauchst, müsstest du bitte im Gegenzug auch Informationen zu dem potentialfreien Steuersignalgeber zur Verfügung stellen (Optokoppler? Relais?) und deinen gewünschten Programmablauf bitte noch einmal etwas genauer beschreiben.
Liege ich richtig mit der Annahme, dass die Logikschaltungen in Beitrag #4 die Infrastruktur eurer Alarmanlage darstellt, und du Q3 der Anlage mit dem Arduino verbinden möchtest?

[1] https://www.arduino.cc/reference/en/language/functions/digital-io/digitalread/
[2] https://www.arduino.cc/reference/en/language/functions/digital-io/pinmode/
 

Bernd Langner

Moderator
Teammitglied
Hi

Von deinem Rechner aus wird es funktonieren aber wenn ich hier klicke passiert nichts
Aber trotzdem Danke für den Suchbegriff ich werde das gleich mal testen.

Gruß Bernd
 

Bernd Langner

Moderator
Teammitglied
Hi
Mal eben in der Arduino geschoben und getestet mit zwei Rufnummern
es klappt. Jetzt nur noch umfrickeln und ein Schließerkontakt einbauen.
Auch die Aktivierung des GSM Shields fehlt noch im Sketch
Aktivierung über Pin D9

Gruß Bernd
 

Bernd Langner

Moderator
Teammitglied
Morgen

Hier jetzt mal der Sketch
#include <SoftwareSerial.h>
SoftwareSerial SIM900(7, 8); // gsm module connected here
String textForSMS;
int data = 0;

int sensor = A1; // LDR is connected with the analog pin A1 of the Arduino


// cell numbers to which you want to send the security alert message
String f1001 = "+49"; //Bernd
String f1002 = "+49"; //Jörg
String f1003 = "+49"; //Manni
String f1004 = "+177"; //Andre
String f1005 = "+49"; //Olli
String f1006 = "+49"; //Christoph
String f1007 = "+49";
String f1008 = "+49";
String f1009 = "+49";

void setup() {


randomSeed(analogRead(0));
Serial.begin(9600);
SIM900.begin(9600); // original 19200. while enter 9600 for sim900A
Serial.println(" logging time completed!");
pinMode(sensor, INPUT);
delay(5000); // wait for 5 seconds

}

void loop() {

data = analogRead(sensor);
Serial.println(data);

if ( data < 400) //
{
textForSMS = "\Alarm bei Phoenix Lohne";
//sendSMS(textForSMS);
sendsms(textForSMS, f1001); // you can use a variable of the type String
Serial.println(textForSMS);
Serial.println("message sent.");
delay(5000);

sendsms("Alarm bei Phoenix Lohne", f1002); // you can also write any message that you want to send.
Serial.println(textForSMS);
Serial.println("message sent.");
delay(5000);

sendsms("Alarm bei Phoenix Lohne", f1003); // you can also write any message that you want to send.
Serial.println(textForSMS);
Serial.println("message sent.");
delay(5000);

sendsms("Alarm bei Phoenix Lohne", f1004); // you can also write any message that you want to send.
Serial.println(textForSMS);
Serial.println("message sent.");
delay(5000);

sendsms("Alarm bei Phoenix Lohne", f1005); // you can also write any message that you want to send.
Serial.println(textForSMS);
Serial.println("message sent.");
delay(5000);

sendsms("Alarm bei Phoenix Lohne", f1006); // you can also write any message that you want to send.
Serial.println(textForSMS);
Serial.println("message sent.");
delay(5000);

sendsms("Alarm bei Phoenix Lohne", f1007); // you can also write any message that you want to send.
Serial.println(textForSMS);
Serial.println("message sent.");
delay(5000);

sendsms("Alarm bei Phoenix Lohne", f1008); // you can also write any message that you want to send.
Serial.println(textForSMS);
Serial.println("message sent.");
delay(5000);

sendsms("Alarm bei Phoenix Lohne", f1009); // you can also write any message that you want to send.
Serial.println(textForSMS);
Serial.println("message sent.");
delay(5000);
}
}


void sendsms(String message, String number)
{
String mnumber = "AT + CMGS = \""+number+"\"";
SIM900.print("AT+CMGF=1\r");
delay(1000);
SIM900.println(mnumber); // recipient's mobile number, in international format

delay(1000);
SIM900.println(message); // message to send
delay(1000);
SIM900.println((char)26); // End AT command with a ^Z, ASCII code 26
delay(1000);
SIM900.println();
delay(100); // give module time to send SMS
// SIM900power();
}

das muß jetzt umgefrickelt werden das statt des Analogeinganges ein Digitaleingang verwendet wird.
Ich denek der muß auch per Software ein Pullup Widerstand bekommen da ich den Eingang gegen Masse schalten
muß. Zusätlich muß ich den PN D9 kurzzeitig auf Plus schalten damit das GSM Shiled sich einloggt.

Ich werde das mal einfach testen müssen bis es funktoniert. Falls jemand das in windeseile umsetzen kann
wäre ich natürlich sehr froh. So wie der Sketch jetzt ist funktioniert die Schleife und es werden 6 SMS gesendet.

Gruß Bernd
 

wno158

User
...ein Digitaleingang verwendet wird.
Ich denke der muß auch per Software ein Pullup Widerstand bekommen da ich den Eingang gegen Masse schalten
muß.
Den "Software-Pullup" aktivierst Du, wenn Du den Eingangspin in der setup()-Funktion als INPUT_PULLUP deklarierst.
Das ist das gängige Verfahren in der Arduino-Welt bei externen Schaltern, Tastern, Gebern die nach Masse schalten:
pinMode(sensor, INPUT_PULLUP);
 
Ansicht hell / dunkel umschalten
Oben Unten