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.
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;
}
}
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.
habe mir das GSM-Shild auch bestellt und warte gerade schon sehnsüchtig
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?
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());
}
}
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 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.