SIM900 Arduino UNO Email Versenden

Hallo,

ich habe ein Problem beim Versenden von eMails mit dem SIM900.

Wenn ich über die Beispiel Library mit dem folgenden Code die AT Commands in der richtigen Reihenfolge laut Datenblatt eingebe, klappt alles wunderbar und die Mail wird versendet.

Hier der Beispiel Code für den Serial Monitor zur AT Kommando Eingabe:

#include "SIM900.h"
#include <SoftwareSerial.h>
//#include "inetGSM.h"
//#include "sms.h"
//#include "call.h"

//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 communicate with SIM900 through AT commands.

//InetGSM inet;
//CallGSM call;
//SMSGSM sms;

int numdata;
char inSerial[40];
int i=0;


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(9600))
          Serial.println("\nstatus=READY");
     else Serial.println("\nstatus=IDLE");
};

void loop()
{
     //Read for new byte on serial hardware,
     //and write them on NewSoftSerial.
     serialhwread();
     //Read for new byte on NewSoftSerial.
     serialswread();
};

void serialhwread()
{
     i=0;
     if (Serial.available() > 0) {
          while (Serial.available() > 0) {
               inSerial[i]=(Serial.read());
               delay(10);
               i++;
          }

          inSerial[i]='\0';
          if(!strcmp(inSerial,"/END")) {
               Serial.println("_");
               inSerial[0]=0x1a;
               inSerial[1]='\0';
               gsm.SimpleWriteln(inSerial);
          }
          //Send a saved AT command using serial port.
          if(!strcmp(inSerial,"TEST")) {
               Serial.println("SIGNAL QUALITY");
               gsm.SimpleWriteln("AT+CSQ");
          } else {
               Serial.println(inSerial);
               gsm.SimpleWriteln(inSerial);
          }
          inSerial[0]='\0';
     }
}

void serialswread()
{
     gsm.SimpleRead();
}

Hier die verwendeten AT Kommandos.
AT+SAPBR=3,1,“Contype”,“GPRS”
AT+SAPBR=3,1,“APN”,“web.vodafone.de
AT+SAPBR =1,1
AT+SAPBR=2,1
AT+EMAILCID=1
AT+EMAILTO=30
AT+SMTPSRV=“mail.smtp2go.com”,2525
AT+SMTPAUTH=1,“user”,“pass”
AT+SMTPFROM="aaaa@bbbbb.de",“Test”
AT+SMTPRCPT=0,0,"xxxxx@yyyy.de",“R”
AT+SMTPSUB=“MySubject”
AT+SMTPBODY
(Beenden mit CTG + Z)
AT+SMTPSEND

Wie bekomme ich diese AT Kommandos jetzt in einen Code übersetzt?

Die Komponenten sind aktuell wie auf dem Bild verbunden. Ich habe hier ein anscheinend ein Verständnisproblem mit dem HardwareSerial und den SoftwareSerial. Kann mir das jemand genauer erklären?

Laut S.13 von dem Arduino GPRS Shield.pdf kann am Arduino UNO die Verbindung über SoftwareSerial nicht über die PINS 7 und 8 erfolgen. Ich verstehe dann allerdings wieso ich über den Serial Monitor dann die AT Commands problemlos übermittelt bekomme.

Bildschirmfoto 2018-07-15 um 00.44.57.png

Arduino GPRS Shield.pdf (838 KB)

Dann poste uns doch mal, welches SIM900 du verwendest. Poste einen Hyperlink, keine URL.

Dein Bildschirmfoto zeigt ein anderes Modul als das zitierte in der Beschreibung.

Ebenso kann ich in der Beschreibung nicht finden, das SoftwareSerial nicht an den Pins 7 und 8 gehen soll. Dafür sehe ich keinen Grund, ausser die Pins werden für andere Dinge verwendet.

Hier der Link zu dem Modul.

Hier mein aktueller Code, der bis auf ein Problem auch zum Erfolg führt. Das Problem welches aktuell noch besteht ist, dass nach der Eingabe des Mailinhalts eigentlich Ctrl + Z betätigt werden muss oder ich (char)26 ASCII übermitteln muss. Das funktionier noch nicht.

#include <OneWire.h> 
#include "SIM900.h"         //SIM900
#include <SoftwareSerial.h> //SIM900

boolean started = false;


void setup(void) {
  Serial.begin(9600);
  GSM900PowerOn();                      // Power on GSM shield
}

void loop(void) {
  Serial.println("AT");
  gsm.SendATCmdWaitResp(F("AT"), 1000, 50, "OK", 5);
  delay(1000);
  Serial.println("AT+SAPBR=3,1,\"Contype\",\"GPRS\"");
  gsm.SendATCmdWaitResp(F("AT+SAPBR=3,1,\"Contype\",\"GPRS\""), 2000, 50, "OK", 5);
  delay(1000);
  Serial.println("AT+SAPBR=3,1,\"APN\",\"web.vodafone.de\"");
  gsm.SendATCmdWaitResp(F("AT+SAPBR=3,1,\"APN\",\"web.vodafone.de\""), 2000, 50, "OK", 5);
  delay(1000); 
  Serial.println("AT+SAPBR =1,1");
  gsm.SendATCmdWaitResp(F("AT+SAPBR =1,1"), 3000, 50, "OK", 5);
  delay(1000);
  Serial.println("AT+EMAILCID=1");
  gsm.SendATCmdWaitResp(F("AT+EMAILCID=1"), 2000, 50, "OK", 5);
  delay(1000);
  Serial.println("AT+EMAILTO=30");
  gsm.SendATCmdWaitResp(F("AT+EMAILTO=30"), 2000, 50, "OK", 5);
  delay(1000);
  Serial.println("AT+SMTPSRV=\"mail.smtp2go.com\",2525");
  gsm.SendATCmdWaitResp(F("AT+SMTPSRV=\"mail.smtp2go.com\",2525"), 1000, 50, "OK", 5);
  delay(1000);
  Serial.println("AT+SMTPAUTH=1,\"USER\",\"PASS\""); 
  gsm.SendATCmdWaitResp(F("AT+SMTPAUTH=1,\"USER\",\"PASS\""), 1000, 50, "OK", 5);
  delay(1000);
  Serial.println("AT+SMTPFROM=\"MAILFROM\",\"NAME\""); 
  gsm.SendATCmdWaitResp(F("AT+SMTPFROM=\"MAILFROM\",\"NAME\""), 1000, 50, "OK", 5);
  delay(1000);  
  Serial.println("AT+SMTPRCPT=0,0,\"MAILTO\",\"NAME\""); 
  gsm.SendATCmdWaitResp(F("AT+SMTPRCPT=0,0,\"MAILTO\",\"NAME\""), 1000, 50, "OK", 5);
  delay(1000);
  Serial.println("AT+SMTPSUB=\"MySubject\""); 
  gsm.SendATCmdWaitResp(F("AT+SMTPSUB=\"MySubject\""), 1000, 50, "OK", 5);
  delay(1000);
  Serial.println("AT+SMTPBODY=\"Inhalt\""); 
  gsm.SendATCmdWaitResp(F("AT+SMTPBODY=\"Inhalt\""), 3000, 50, "OK", 5);
  delay(1000);
  Serial.println("AT+SMTPSEND"); 
  gsm.SendATCmdWaitResp(F("AT+SMTPSEND"), 7000, 50, "OK", 5);
  delay(20000);
  Serial.println("Mail versendet");
    delay(20000);
  }

  /*** Funktion zum Einschalten GSM Shield via Software ***/
void GSM900PowerOn()
{
    Serial.println("Starting GSM Modul...");
    //Einschalten des GSM Moduls mittels Software
    digitalWrite(GSM_ON, LOW);
    delay(1000);                         // 1s HIGH switch SIM900 ON or OFF
    digitalWrite(GSM_ON, HIGH);
    delay(2000);        
    digitalWrite(GSM_ON, LOW);
    delay(3000);                         // Wait 3s until chip is initialized
     //Starte Netwerksuche
        if (gsm.begin(9600)) {
            Serial.println("Status=READY");
            started=true;
        } else {
            Serial.println("Status=IDLE");        
        }
         delay(2000); 
}

Welche SIM900-Lib verwendest Du denn? Link bitte, denn es gibt verschiedene.

Gruß Tommy