Programm zur Kommunikation mit Mobiltelefon

Hallo Leute,

ich habe eine Frage zu meinem Programm. Hier mein Aufbau...

Die CNC-Graviermaschine soll über die Befehle M08 und M09 ein Signal an meinen Arduino UNO mit GSM Modul senden und dann soll mein Arduino über ein GSM-Modul eine SMS an mein Handy senden. Nur irgendwie funktioniert mein Programm nicht.

#include <SoftwareSerial.h> //Einbindung der Bibliothek von Arduino für serielle Datenkommunikation
SoftwareSerial mySerial(7, 9, 10); //Definition der verwendeten Pin´s
char msg;
int inPin = 7;              // Input pin für Arduino
int reading;               // Wert des Eingangs
int previous = LOW;    // Vorheiger Wert des Eingangs

// folgende Variablen müssen vom Typo unsigned long sein da millis() disen Variablentyp liefert.

unsigned long time = 0;         // letzter Zeitwert bei dem der Ausgangzustand wechselte.
unsigned long debounce = 200;   // Entprellzeit


void setup()//Grundeinstellungen der Ein- und Ausgangskanäle definiert
{
pinMode(inPin, INPUT);

 mySerial.begin(9600);   // Festlegung der übertragenen Symbole pro Zeiteinheit - Bautraute vom GSM Module  
 Serial.begin(9600);    // Festlegung der übertragenen Symbole pro Zeiteinheit - Bautraute vom Arduino
 Serial.println("GSM SIM900A BEGIN");
 Serial.println("Signal von CNC:");
 Serial.println("LOW : to send message");
 Serial.println();
 delay(100);
}

void loop()//Status Abfrage
{
reading = digitalRead(inPin);
                  // Beim Wechsel des Eingangs von LOW zu HIGH und nach der Entprellzeit: 
if (reading == HIGH && previous == LOW && millis() - time > debounce) {
  time = millis();    
  }

                  // Beim Wechsel des Eingangs von HIGH zu LOW und nach der Entprellzeit:
if (reading == LOW && previous == HIGH && millis() - time > debounce) {
  time = millis();    
  }
previous = reading;
 
 if (Serial.available()>0)
  switch(Serial.read())
 {
   case 'LOW':
     SendMessage();
     break;
 }
if (mySerial.available()>0)
Serial.write(mySerial.read());
}

void SendMessage()
{
 mySerial.println("AT+CMGF=1");    //Setzt the GSM Module in Text Mode
 delay(1000);  // Delay von 1000 milli sekunde oder 1 sekunde
 mySerial.println("AT+CMGS=\"+49XXX\"\r"); // Rufnummer an die gesendet werden soll
 delay(1000);
 mySerial.println("Hello");// Text der gesendet werden soll
 delay(100);
  mySerial.println((char)26);// ASCII Zeichen verwenden CTRL+Z
 delay(1000);
}

Hat einer eine Idee warum es nicht funktioniert?

Baril:
Hat einer eine Idee warum es nicht funktioniert?

Ja,

setze bitte deinen Sketch in Code-Tags.

Verwende dazu die Schaltfläche </> oben links im Editorfenster.
Das kannst du auch nachträglich machen.
Dazu den Sketch markieren und die Schaltfläche klicken.

Damit wird dieser für alle besser lesbar.

Was für eine Library (SoftwareSerial) verwendest du ?

Mir ist nur eine bekannt, die zwei Parameter für die Anschluss-Pins verwendet.

Prüfe das mal, evtl. ist dass schon der Fehler. Weiter habe ich nicht geschaut, da der Sketch so schlecht lesbar ist.

Bucht denn dein GSM überhaupt ein ?

Ok, das mit den Code-Tags hat ja schon prima funktioniert.

Jetzt noch mal zu den Fragen:

SoftwareSerial-Library ?

Bucht das GSM ein ?

Ist das GSM SIM900A original oder neu geflasht ?

Gut habe ich gemacht.

Ich benutze NewSoftSerial hoffe das beantwortet deine Frage. Hab den Code angehängt.

Mein Arduino und GSM funktionieren soweit habe ich schon ohne Signal von CNC probiert und sendet fleißig SMS. Aber jetzt mit dem CNC-Signal geht irgendwie nichts mehr.

SoftwareSerial.h (3.48 KB)

Baril:
Ich benutze NewSoftSerial hoffe das beantwortet deine Frage. Hab den Code angehängt.

Dann hast du die Library falsch deklariert. Und auch da werden nur 2 Pins verwendet.
Ich kann nicht glauben, dass das jemals funktioniert hat.

Mein Arduino und GSM funktionieren soweit habe ich schon ohne Signal von CNC probiert und sendet fleißig SMS. Aber jetzt mit dem CNC-Signal geht irgendwie nichts mehr.

Welches GSM hast du denn tatsächlich ?
Das SIM900A ?

Und zu einer Library gehören min. 2 Dateien, x.h und x.cpp

Die andere Datei habe ich auch angehängt.
Ich habe das GSM-Modul SIM900A.
Aber der Code stimmt soweit?

Mit diesem Code hat das SMS versenden funktioniert...

#include <SoftwareSerial.h> //Einbindung der Bibliothek von Arduino für serielle Datenkommunikation
SoftwareSerial mySerial(9, 10); //Definition der verwendeten Pin´s
char msg;

void setup()//Grundeinstellungen der Ein- und Ausgangskanäle definiert
{
  mySerial.begin(9600);   // Festlegung der übertragenen Symbole pro Zeiteinheit - Bautraute vom GSM Module  
  Serial.begin(9600);    // Festlegung der übertragenen Symbole pro Zeiteinheit - Bautraute vom Arduino
  Serial.println("GSM SIM900A BEGIN");
  Serial.println("Enter character for control option:");
  Serial.println("s : to send message");
  Serial.println();
  delay(100);
}

void loop()//Status Abfrage
{  
  if (Serial.available()>0)
   switch(Serial.read())
  {
    case 's':
      SendMessage();
      break;
  }
 if (mySerial.available()>0)
 Serial.write(mySerial.read());
}

void SendMessage()
{
  mySerial.println("AT+CMGF=1");    //Setzt the GSM Module in Text Mode
  delay(1000);  // Delay von 1000 milli sekunde oder 1 sekunde
  mySerial.println("AT+CMGS=\"+49XXX\"\r"); // Rufnummer an die gesendet werden soll
  delay(1000);
  mySerial.println("K-Modul");// Text der gesendet werden soll
  delay(100);
   mySerial.println((char)26);// ASCII Zeichen verwenden CTRL+Z
  delay(1000);
}

SoftwareSerial.cpp (13.1 KB)

Baril:
Die andere Datei habe ich auch angehängt.
Ich habe das GSM-Modul SIM900A.
Aber der Code stimmt soweit?

Nein, du hast 3 Pins im obigen Sketch definiert, SoftwareSerial benötigt nur 2 Pins.
Und du verwendest die Library "SoftwareSerial" nicht wie du geschrieben hast "NewSoftwareSerial".

Mit diesem Code hat das SMS versenden funktioniert...

Hier hast du ja auch nur zwei Pins definiert, so ist es richtig.

Warum verwendest du nicht diesen Sketch und änderst ihn für die neue Verwendung ab ?

Ich verwende 3 Pins nachdem ich einen PIN für das Signal von der CNC-Maschine brauche um das Signal auszulesen.Habe jetzt den Arduino+GSM-Aufbau und eben noch den PIN 7 für Enable Coolant von der CNC. Hab den Sketch als Basis genommen und ihn eben wie im nächsten Sketch gezeigt abgeändert um das CNC Signal zu setzen als Start Signal.

Also bin ich da jetzt vollkommen falsch unterwegs?

Baril:
Also bin ich da jetzt vollkommen falsch unterwegs?

Ja, sieh dir doch bitte die Beispiele und Dokumentation zur "SoftwareSerial" an.
Da steht nichts von 3 Pins. Was sollen die da ? Das ist Quatsch.

Zur Seriellen gehören 2 (RX und TX).

Dein Sketch kann so nicht funktionieren. Du hast zwei Abfragen, ob sich der Pin-Status ändert. Du hast keine Verknüpfung zwischen Pinabfrage und SMS-Senden. So wird niemals eine SMS gesendet. Es fehlen die Anweisungen, dass bei dem Wechsel eine SMS gesendet werden soll. Anstelle dessen fragst du anschließend die serielle Schnittstelle ab. Kommt da ein Low wird eine SMS gesendet.

Das könnte so aussehen:

void loop()//Status Abfrage
{
reading = digitalRead(inPin);
                  // Beim Wechsel des Eingangs von LOW zu HIGH und nach der Entprellzeit: 
if (reading == HIGH && previous == LOW && millis() - time > debounce) {
  time = millis();   
  Serial.println("Sende SMS")
  SendMessage();   
  }

                  // Beim Wechsel des Eingangs von HIGH zu LOW und nach der Entprellzeit:
if (reading == LOW && previous == HIGH && millis() - time > debounce) {
  time = millis();    
  }
previous = reading;
}

Empfehlenswert ist, dass zum Testen das Programm nur auf dem seriellen Monitor ausgibt, dass eine SMS gesendet werden soll, ohne dass es tatsächliche eine SMS sendet. Erst wenn das fehlerfrei funktioniert, stellst du den SMS-Versand "scharf".

Super danke das habe ich verstanden. Habe quasi nach den falschen Werten gefragt.

Gut habe ich gemacht bekomme aber jetzt eine Fehlermeldung wegen dem SendMessage Befehl...

expected ';' before 'SendMessage'

Muss ich den void SendMessage BLock vor den void loop setzen zur Status Abfrage? Macht doch irgendwie auch keinen Sinn.

#include <SoftwareSerial.h> //Einbindung der Bibliothek von Arduino für serielle Datenkommunikation
SoftwareSerial mySerial(9, 10); //Definition der verwendeten Pin´s
char msg;
int inPin = 7;              // Input pin für Arduino
int reading;               // Wert des Eingangs
int previous = LOW;    // Vorheiger Wert des Eingangs

// folgende Variablen müssen vom Typo unsigned long sein da millis() disen Variablentyp liefert.

unsigned long time = 0;         // letzter Zeitwert bei dem der Ausgangzustand wechselte.
unsigned long debounce = 200;   // Entprellzeit


void setup()//Grundeinstellungen der Ein- und Ausgangskanäle definiert
{
 pinMode(inPin, INPUT);

  mySerial.begin(9600);   // Festlegung der übertragenen Symbole pro Zeiteinheit - Bautraute vom GSM Module  
  Serial.begin(9600);    // Festlegung der übertragenen Symbole pro Zeiteinheit - Bautraute vom Arduino
  Serial.println("GSM SIM900A BEGIN");
  Serial.println("Signal von CNC:");
  Serial.println("LOW : to send message");
  Serial.println();
  delay(100);
}

void loop()//Status Abfrage
{
 reading = digitalRead(inPin);
                   // Beim Wechsel des Eingangs von LOW zu HIGH und nach der Entprellzeit: 
 if (reading == HIGH && previous == LOW && millis() - time > debounce) {
   time = millis(); 
   Serial.println("Sende SMS")
   SendMessage();    
   }
                   // Beim Wechsel des Eingangs von HIGH zu LOW und nach der Entprellzeit:
 if (reading == LOW && previous == HIGH && millis() - time > debounce) {
   time = millis();    
   }
 previous = reading;
}

void SendMessage()
{
  mySerial.println("AT+CMGF=1");    //Setzt the GSM Module in Text Mode
  delay(1000);  // Delay von 1000 milli sekunde oder 1 sekunde
  mySerial.println("AT+CMGS=\"+49XXX\"\r"); // Rufnummer an die gesendet werden soll
  delay(1000);
  mySerial.println("K-Modul");// Text der gesendet werden soll
  delay(100);
   mySerial.println((char)26);// ASCII Zeichen verwenden CTRL+Z
  delay(1000);
}

Das heißt einfach nur, dass ein Semikolon am Ende einer Zeile fehlt. Es ist das Serial.println("Sende SMS"), was ich eingefügt hatte.

Ah ok ja oftmals ist die Lösung so nah und doch so fern :-D...
Ich werde es heute Abend probieren.

Jetzt noch ein paar andere Fragen...

  1. Ist es auch möglich über den Arduino+GSM eine Email zu versenden?

Habe schon öfter darüber gelesen das die Datenmenge wegen der Email-Verschlüsselung zu groß ist und es deshalb nicht geht.

  1. Wäre dann nicht eine Lösung über einen Server nicht denkbar?

  2. Hat jemand einen Vorschlag wie man so etwas trotz Verschlüsselung umsetzen kann?

  3. Ist das versenden von Nachrichten auch per Whatsapp möglich?

Danke für eure Antworten!

Grüße
Baril

Baril:

  1. Ist es auch möglich über den Arduino+GSM eine Email zu versenden?

Habe schon öfter darüber gelesen das die Datenmenge wegen der Email-Verschlüsselung zu groß ist und es deshalb nicht geht.

Ja, ob es mit deinem auch funktioniert, findest du in der Dokumentation.

  1. Wäre dann nicht eine Lösung über einen Server nicht denkbar?

Wie meinst du das ? Emails werden doch immer an einen Sever gesendet.

  1. Hat jemand einen Vorschlag wie man so etwas trotz Verschlüsselung umsetzen kann?

  2. Ist das versenden von Nachrichten auch per Whatsapp möglich?

Das kann ich leider nicht beantworten.
Vermutlich könnte es mit dem richtigen GSM auch funktionieren.

Was meinst du damit ich finde es in der Dokumentation?

Also ich meinte das man zuerst die Nachricht an einen Webserver sendet und dort ein Email-Programm anspricht mit dem dann letzen Endes die Verschlüsselte Email versendet wird.

Was wäre den das richtige GSM-Modul? Bzw. ist das GSM900A ausreichend?

Baril:
Was meinst du damit ich finde es in der Dokumentation?

Dokumentation heißt Beschreibung oder Handbuch o.ä. zu deinem GSM-Modul.
Darin kannst du nachlesen, ob das SIM900A dafür geeignet ist.

Hallo nochmal,

also hab jetzt den Code nochmal getestet und es funktioniert alles einwandfrei.
Danke nochmal für eure Hilfe!

#include <SoftwareSerial.h> //Einbindung der Bibliothek von Arduino für serielle Datenkommunikation
SoftwareSerial mySerial(9, 10); //Definition der verwendeten Pin´s
char msg;
int inPin = 7;              // Input pin für Arduino
int reading;               // Wert des Eingangs
int previous = LOW;    // Vorheiger Wert des Eingangs

// folgende Variablen müssen vom Typo unsigned long sein da millis() disen Variablentyp liefert.

unsigned long time = 0;         // letzter Zeitwert bei dem der Ausgangzustand wechselte.
unsigned long debounce = 200;   // Entprellzeit


void setup()//Grundeinstellungen der Ein- und Ausgangskanäle definiert
{
 pinMode(inPin, INPUT);

  mySerial.begin(9600);   // Festlegung der übertragenen Symbole pro Zeiteinheit - Bautraute vom GSM Module  
  Serial.begin(9600);    // Festlegung der übertragenen Symbole pro Zeiteinheit - Bautraute vom Arduino
  Serial.println("GSM SIM900A BEGIN");
  Serial.println("Signal von CNC:");
  Serial.println("LOW : to send message");
  Serial.println();
  delay(100);
}

void loop()//Status Abfrage
{
 reading = digitalRead(inPin);
                   // Beim Wechsel des Eingangs von LOW zu HIGH und nach der Entprellzeit: 
 if (reading == HIGH && previous == LOW && millis() - time > debounce) {
   time = millis(); 
   Serial.println("Sende SMS");
   SendMessage();    
   }
                   // Beim Wechsel des Eingangs von HIGH zu LOW und nach der Entprellzeit:
 if (reading == LOW && previous == HIGH && millis() - time > debounce) {
   time = millis();    
   }
 previous = reading;
}

void SendMessage()
{
  mySerial.println("AT+CMGF=1");    //Setzt the GSM Module in Text Mode
  delay(1000);  // Delay von 1000 milli sekunde oder 1 sekunde
  mySerial.println("AT+CMGS=\"+49XXX\"\r"); // Rufnummer an die gesendet werden soll
  delay(1000);
  mySerial.println("K-Modul");// Text der gesendet werden soll
  delay(100);
   mySerial.println((char)26);// ASCII Zeichen verwenden CTRL+Z
  delay(1000);
}

Grüße
Baril

Baril:
also hab jetzt den Code nochmal getestet und es funktioniert alles einwandfrei.
Danke nochmal für eure Hilfe!

Danke für die Rückmeldung.

Würde mich dann auch als Dankeschön über Karma freuen.