Siemens TC35 GSM Modul

Hallo Leute

Ich habe neulich ein Siemens TC35 GSM Modul günstig für 10€ bei ebay erstanden. Solch eins:
http://www.ebay.de/itm/Neu-GSM-SIEMENS-TC35-SMS-drahtlos-Module-UART-232-Free-Voice-Adapter-For-Arduino-/250922333972?pt=SPS_Bus_Logiksysteme&hash=item3a6c22f714

Nun stellt sich mir die Frage wie ich das Teil mit der Arduino Software, bzw in Verbindung mit dem Arduino Benutzen kann.
Ich habe 5V angeschlossen und eine SIM Karte mit deaktivierten PIN eingelegt. Wenn ich einen Anruf auf die Nummer tätige dann klingelt es auch am Tel. Ein Pin an dem Teil hat die bezeichnung Ring0 , dort habe ich testweise eine LED angeschlossen und diese leuchtet schwach und wenn ich die Nummer anrufe dann blinkt sie auch. Nun würde ich gerne damit die SSerial2Mobile Lib nutzen um damit eine SMS zu senden. Ich weiss leider nur nicht wie ich das anstellen soll. Vielleicht habt ihr ein paar Tips wie ich da was realisieren kann bzw das ganze anschliessen kann, den im moment weiss ich nicht genau wo ich ansetzten soll.
Ziel des ganzen soll später sein das ein Wasser und Gas Sensor dran hängt zb. und das ganze dann im Keller installiert ist, und er im Notfall meldung per SMS erstattet wenn Gasgeruch auftritt oder Wasser im Keller steht.

Danke für alle Tips.

Greeez Oli

http://www.google.com/search?q=arduino+tc35&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:de:official&client=firefox-a

Auf die Idee zu Googlen bin ich auch als erstes gekommen, und hätte ich da was verwertbares gefunden hätte ich sicher hier nicht so eine Frage gestellt.

Mittlerweile habe ich das ksgsm.pde getestet und bin aber nicht wirklich weiter gekommen.

Ich habe Pin7 an TX am TC35 DEV-Board hängen und Pin6 am RX des DEV-Board, zusätzlich noch GND vom Arduino.
Das TC35 Board hängt an einer externen Stromversorgung 5V.

Wenn ich jetzt den kdgsm Sketch benutze und den Serial Monitor aufrufe bekomme ich das:

GSM: OK

Arduino: Reset modem to factory default setting, wait..

GSM: OK

Enable modem's debug message, wait..

GSM: OK

----- Arduino GSM Control Menu -----

Press "s" to send SMS 

Press "d" to dial a phone call 

Press "e" to end a phone calll 

----- ------------------------ -----

Wrong Input

----- Arduino GSM Control Menu -----

Press "s" to send SMS 

Press "d" to dial a phone call 

Press "e" to end a phone calll 

----- ------------------------ -----

Weiter gehts dann nicht, egal was ich eingebe , keine Reaktion.

Hier noch der Sketch:

// serial speed to use with phone
#define PHONE_SERIAL_BUAD 9600
//  Puts teh phone into SMS texting mode ( as opposed to MMS, etc.)
#define PHONE_SET_SMS_TXT_MODE_COMMAND "AT+CMGF=1" 
//  Command used to send a message
#define PHONE_SEND_MSG "AT+CMGS=" 
// Command to dial a call
#define PHONE_DIAL_CALL "ATD" 
#define PHONE_END_CALL "ATH" 
#define BUFFSIZ 90 // plenty big


#define ARDUINORX 6
#define ARDUINOTX 7
#include <NewSoftSerial.h>
NewSoftSerial gsmSerial(ARDUINORX, ARDUINOTX);
char buffer[BUFFSIZ];
//char *parseptr;
char buffidx;


void setup()  
{
  Serial.begin(9600);
  Serial.println("Hello PC");

  // set the data rate for the NewSoftSerial port
  gsmSerial.begin(PHONE_SERIAL_BUAD);
  delay(500);
  ATTest();
  Serial.println("Arduino: Reset modem to factory default setting, wait..");
  gsmSerial.println("AT&F");  wait4OK();
  Serial.println("Enable modem's debug message, wait..");
  gsmSerial.println("AT+CMEE=2"); wait4OK();
}

void loop()                     // run over and over again
{
  char  input = 'n';
  Serial.println("----- Arduino GSM Control Menu -----");
  Serial.println("Press \"s\" to send SMS ");
  Serial.println("Press \"d\" to dial a phone call ");
  Serial.println("Press \"e\" to end a phone calll ");
  Serial.println("----- ------------------------ -----");
  
  while(Serial.available()<=0){
    delay(200);
  }
  readline();
  input = buffer[0];
  
  switch(input){
    case 's': 
            char phoneNum[40];
            char smsContent[40];
            Serial.println("Target Phone number:");
                readline();
                strcpy(phoneNum, buffer);
                  Serial.println(phoneNum);
              Serial.println("SMS Content");
                readline();
                strcpy(smsContent, buffer);
                  Serial.println(smsContent);
                  //-----------------------------------------------
               gsmSerial.println(PHONE_SET_SMS_TXT_MODE_COMMAND);
               delay(500);
             gsmSerial.print(PHONE_SEND_MSG);
              gsmSerial.println(phoneNum);
                delay(500);
                gsmSerial.print("\"");
              gsmSerial.print(smsContent);
              gsmSerial.print("\"");
              gsmSerial.print((char)26);
              //-----------------------------------------------
              Serial.println("SMS is sending...");
//              delay(4000);
//              wait4OK();
  if (wait4OK()==1)  {
  Serial.println("Done! SMS Sent");
  }
  else{
     Serial.println("Failed..SMS Fail");
  }
              break;
    case 'd': Serial.println("Dialing a call");
                 //char phoneNum[40];
                   Serial.println("Target Phone number:");
                readline();
                strcpy(phoneNum, buffer);
                  Serial.println(phoneNum);
                  //-----------------------------------------------
                  gsmSerial.print(PHONE_DIAL_CALL);
              gsmSerial.print(phoneNum);
               gsmSerial.println(";");
               //-----------------------------------------------
               Serial.println("Calling... use the voice adapter to talk as usual");
                delay(500);
                //wait4OK();
              break;
        case 'e': 
        gsmSerial.print(PHONE_END_CALL);
        break;
    default: Serial.println("Wrong Input");
              break;
  }
/*
  if (gsmSerial.available()>0) {
      Serial.print((char)gsmSerial.read());
  }
  if (Serial.available()>0) {
      gsmSerial.println((char)Serial.read());
  }
*/  
  delay(500);
}

void ATTest(){
  Serial.println("Arduino: Test modem Communication..wait..(if >5sec..fail..)");
  gsmSerial.println("AT");
  if (wait4OK()==1)  {
  //Serial.println("Arduino: OK");
  }
  else{
     Serial.println("Arduino: Fail!, please check connection! ");
     Serial.print("Connect pin"); Serial.print(ARDUINOTX); Serial.print("to GSM RX, ");Serial.print(ARDUINORX); Serial.print(" to GSM TX");
  }
}

int wait4OK() {
  int returnVal=0;
  
       GSMreadline();
       Serial.print("GSM: ");
       Serial.println(buffer);
       if (strncmp(buffer, "OK",2) == 0) {
          returnVal=1;
       } else  {
	 returnVal=-1;
  }
        return returnVal;
}

void GSMreadline(void) {
  char c;
  
  buffidx = 0; // start at begninning
  int crCount=0;
  while (1) {
    
      c=gsmSerial.read();
      
      if (c == -1){
       delay(500);
        continue;
      }
      if (c == '\n')
        continue;
        

      if((int) c == 13){
      crCount++;
      
        if (crCount==1 || crCount==2)
          continue;
         if (crCount==3){
          buffer[buffidx] = 0;
          return; 
         }
       }
       
      
      if (buffidx == BUFFSIZ-1){
        buffer[buffidx] = 0;
        return;
      }
             if (crCount==2){
        buffer[buffidx++]= c; 
       }
//      buffer[buffidx++]= c; //org
  }
  Serial.println("END WAIT");
}

void readline(void) {
  char c;
  
  buffidx = 0; // start at begninning
  while (1) {
      c=Serial.read();

      if (c == -1){
       delay(500);
        continue;
      }
       if(((int)c == 13) || (int)c == 10){
       buffer[buffidx] = 0;
       return; 
     }
      if (buffidx == BUFFSIZ-1){
        buffer[buffidx] = 0;
        return;
      }
      buffer[buffidx++]= c;
  }
}

Bin mit meinen Latein am Ende. Jemand eine Idee?

Greeez Oli

Welcher Sketch wird nur in diesem Video verwendet und wo finde ich ihn?

Hi @ all ;),

habe mir auch das tc 35 Modul geholt und wollte mal fragen, ob sich da schon was getan hat.

mfg

Ist mir nichts bekannt, währe aber weiterhin auch interessiert.

Also gefunden habe ich mittlerweile noch was auch funktioniert mit dem TC35.
http://code.google.com/p/gsm-shield-arduino/downloads/detail?name=BETA_GSM_GPRS_GPS_IDE100_v302.zip.zip&can=4&q=

Aber alles halt merkwürdig. Habe den AT Sketch getestet. Manchmal funktioniert er und man kann mit dem TC35 über die Serielle Konsole schön plaudern mit ihm aber manchmal auch nicht das der blos irgendwelche Blöcke anzeigt als wenn was mit der seriellen Kommunikation nicht hinhaut.
Vielleicht kann der ein oder andere das hier auch mal testen und berichten.

LG Oli

Hey,

habe mir das GSM-Shild auch bestellt und warte gerade schon sehnsüchtig :wink:
Hast du mittlerweile schon eine stabil laufende Lösung mit dem Code hinbekommen und das Problem mit der Verbindung Lösung können? Weißt du in etwa wieviel das GSM-Shild an Strom benötigt und könnte man das auch über eine Batterie betreiben eventuell sogar an die 5V des Arduinos hängen?

Mit freundlichen Grüßen
mrlowalowa

Stromverbrauch des Moduls liegt bei ca 50-70mA und wenn es telefoniert so bei 100mA
Hier mal mein funktionierender Code unter dem es bei mir als Alarmanlage mit einem Infarotbewegungsmelder DYP-ME003 und Türkontakt läuft:

#include <NewSoftSerial.h>

// Pin`s to TC 35 ,    RX/TX
NewSoftSerial mySerial(2, 3);

// Door Switch
const int buttonPin = 9; 
int buttonState = 0;

// DYP-ME003 Pin
int PIRpin=10;
int irstate = 0;


void setup()  
{
  Serial.begin(9600);
  Serial.println("Starte...");

  // set the data rate for the NewSoftSerial port
  mySerial.begin(4800);
  mySerial.println("at");
  
 pinMode(buttonPin, INPUT);
 pinMode(PIRpin,INPUT); 
 
 pinMode(13, OUTPUT); 
 pinMode(12, OUTPUT); 

}

void loop()                     // run over and over again
{


irstate = digitalRead(PIRpin);  
buttonState = digitalRead(buttonPin);

if (irstate == HIGH) {     
    
    digitalWrite(13, HIGH);
    digitalWrite(12, LOW);
    Serial.println("ALARM!");
    delay(2000);
    mySerial.println("ATD12345;"); //12345 = your Tel Number
    delay(10000);
    mySerial.println("ATH"); 
    digitalWrite(PIRpin, LOW);
  } 
  else {
    digitalWrite(13, LOW);
    digitalWrite(12, HIGH);
    Serial.println("Alles OK");
  }


if (buttonState == HIGH) {     
    digitalWrite(13, HIGH);
    digitalWrite(12, LOW);  
    Serial.println("ALARM!");
    delay(2000);
    mySerial.println("ATD12345;"); //12345 = your Tel Number
    delay(10000);
    mySerial.println("ATH"); 
  } 
  else {
    digitalWrite(13, LOW);
    digitalWrite(12, HIGH);
    Serial.println("Alles OK");
  }


  if (mySerial.available()) {
      Serial.print((char)mySerial.read());
  }
  if (Serial.available()) {
      mySerial.print((char)Serial.read());
  }
  
}

Nach Tage lagen rumwurscheln hab ich es endlich geschaft =D Die Ausgabe von empfangenen Sms mit dem Siemens TC35 GSM Modul: Sieht dann so aus...

AltSoftSerial Test Begin

+CMGL: 1,"REC READ","+49#########",,"15/01/03,19:33:23+04"
Test
+CMGL: 2,"REC READ","+49#########",,"15/01/03,19:56:10+04"
Hallo

OK

--------------------- Hier der Code -------------------------------

AltSoftSerial
TX an Pin 46 (Arduino Mega)
RX an Pin 48 (Arduino Mega)

#include <AltSoftSerial.h>
AltSoftSerial altSerial;

void setup() {
Serial.begin(9600);
while (!Serial) ; // wait for Arduino Serial Monitor to open
Serial.println("AltSoftSerial Test Begin");
altSerial.begin(9600);
altSerial.println("AT+CMGL="ALL"");
}

void loop() {
char c;

if (Serial.available()) {
c = Serial.read();
altSerial.print(c);}

if (altSerial.available()) {
c = altSerial.read();
Serial.print(c);}
}

Problem ist jetzt nur, dass das Script jedes Zeichen einzeln ausgibt und ich es deswegen nicht mit einer if Funktion abfragen kann. z.b if (c == 'Test') dann licht an... Kann mir jemand helfen wie ich das in eine Zeichenkette umwandele um es dann abfragen zu können?!?

Den Code dafür gab es hier schon zig mal:
http://forum.arduino.cc/index.php?topic=289028.msg2021875#msg2021875

Den Puffer müsstest du bei dir etwas größer als 16 Zeichen machen.

Beachte dabei dass man C Strings nicht mit == vergleicht, sondern mit strcmp(). Oder strncmp() wenn man nur die ersten n Zeichen vergleichen möchte.
Und dass man C Strings in doppelten Anführungszeichen schreibt. Einzelne Anführungszeichen sind nur ein Zeichen.

Wenn ich das richtig sehe, dann kommt da am Ende ein LF und/oder CR zurück, da die Ausgabe in mehreren Zeilen erfolgt. Dann funktioniert der Code so. Der fragt auf c == '\n' ab um zu merken dass er fertig ist. Wenn das nicht der Fall wäre, müsste man das Zeilen-Ende anders feststellen, oder einen Timeout einbauen.