1°) Matériel :
* Une carte Arduino Leonardo,
* Une carte GSM Siemens TC 35 (http://www.sainsmart.com/arduino-compatibles-1/gps-gprs-gsm-module/siemens-tc35-sms-gsm-module-voice-adapter.html)
* Un bloc transformateur 5v DC
2°) Branchements : Il est nécessaire de raccorder la masse (GND) de la carte TC35 à la masse de la carte Arduino (fil jaune). Puis de raccorder le port TX de la TC35 (fil vert) à un port digital de la carte Arduino (ici le port 9) et de raccorder le port RX de la TC35 (fil bleu) au port digital (ici 10) de la carte Arduino. ATTENTION : pour la carte Leonardo pour le port RX seules les broches 8, 9, 10, 11, 14 (MISO), 15 (SCK), 16 (MOSI) peuvent être utilisées. L’alimentation de la TC35 doit être de 5v DC, point central positif. Il est nécessaire d’allumer la carte TC35 en appuyant sur le bouton à gauche du port RS232, la led rouge clignotera alors lentement dans le cas où tout est ok (carte SIM valide).
#include <SoftwareSerial.h>
#define rxPin 10
#define txPin 9
// set up a new serial port for Leonardo
SoftwareSerial mySerial = SoftwareSerial(rxPin, txPin);
char recu[150]; // Array for entering message
String message=""; //string we're sending
int i;
void setup()
{//--For Leonardo
Serial.begin(9600);
while (!Serial){
}
// set the data rate for the SoftwareSerial port
mySerial.begin(9600);
delay(5000);
Serial.println("Hello, tapez votre SMS en terminant par un point");
}
void loop()
{
i = 0 ;
while ( Serial.available()>0 )
{recu[i] = Serial.read();
message += recu[i];
i++;
//-- 46 is the Ascii code for "."
if (recu[i-1]==46)
{
Serial.println("Envoi du SMS...");
SendTextMessage();
ShowSerialData();
delay(1000);
Serial.println("\r"); //-- Carriage return
Serial.println("SMS parti !");
message="";
i=0;
}
}
}
///SendTextMessage()
///this function is to send a sms message
void SendTextMessage()
{ mySerial.print("AT+CMGF=1\r"); //Because we want to send the SMS in text mode
delay(1000);
mySerial.print("AT+CMGS=\"+336xxxxxxxx\"\r");
delay(1000);
mySerial.println(message);
mySerial.print("\r");
delay(1000);
mySerial.println((char)26);//the ASCII code of the ctrl+z is 26
mySerial.println();
}
void ShowSerialData()
{
while(mySerial.available()!=0)
Serial.write(mySerial.read());
}
#include <SoftwareSerial.h>
SoftwareSerial mySerial(10, 9);
char recu[150]; // Array for entering message
int i;
String message="";
void setup()
{//--For Leonardo
Serial.begin(9600);
while (!Serial){
}
mySerial.begin(9600);
delay(5000);
Serial.println("Started!");
Serial.println("Hello, tapez votre commande en terminant par un point");
//-- Choose SIM memory and show the SMS in MEMORY
//-> AT+CPMS="SM". //mySerial.println( "AT+CPMS=\"SM\"" );
//-- Ask for all the SMS
//-> AT+CMGL="ALL".// mySerial.println( "AT+CMGL=\"ALL\"" );
//-> AT+CMGR=2. // Read the 2nd message
//-> AT+CMGD=2. // Delete the 2nd message
//-> AT+CNMI=?. //-- Test received message
}
void loop()
{
i = 0 ;
while ( Serial.available()>0 )
{recu[i] = Serial.read();
if ((recu[i]!=46)&&(recu[i]!=13)&&(recu[i]!=10))
message += char(recu[i]);
i++;
if (recu[i-1]==46)
{
Serial.println("Envoi de la commande ["+message+"]");
SendCmdMessage();
ShowSerialData();
Serial.println("Commande finie,tapez votre commande en terminant par un point");
message="";
i=0;
}
}
}
void ShowSerialData()
{
while(mySerial.available()!=0)
{
Serial.print(char(mySerial.read()));
}
}
void SendCmdMessage()
{ mySerial.println(message);
delay(1000);
}
#include <SoftwareSerial.h>
SoftwareSerial mySerial(10, 9);
char recu[150]; // Array for entering message
int i;
int dp=0;
char c;
String message="";
String cmd="";
String cReturn="";
int nReturn=0;
int nPremier=0;
//--Pin of the LED to turn ON and OFF
int ledPin = 5;
void setup()
{//--For Leonardo
Serial.begin(9600);
while (!Serial){
}
mySerial.begin(9600);
delay(5000);
Serial.println("Started!");
Serial.println("Hello, Pour commencer taper Envoyer");
message="AT+CPMS=\"SM\"";
Serial.println("Envoi de la commande ["+message+"]");
SendCmdMessage();
ShowSerialData();
Serial.println(nReturn);
nPremier=nReturn;
pinMode( ledPin, OUTPUT );
digitalWrite( ledPin, LOW);
//-- Choose SIM memory and show the SMS in MEMORY
//-> AT+CPMS="SM". //mySerial.println( "AT+CPMS=\"SM\"" );
//-- Ask for all the SMS
//-> AT+CMGL="ALL".// mySerial.println( "AT+CMGL=\"ALL\"" );
//-> AT+CMGR=2. // Read the 2nd message
//-> AT+CMGD=2. // Delete the 2nd message
//-> AT+CNMI=?. //-- Test received message
}
void loop()
{
while ( Serial.available()>0 )
{ message="AT+CPMS=\"SM\"";
SendCmdMessage();
ShowSerialData();
Serial.print("Nombre de SMS : ");
Serial.println(char(nReturn+48));
if (nReturn>nPremier)
{Serial.println("Nouveau SMS !");
//nPremier=nReturn-1;
Serial.print(nReturn);
Serial.print(" ");
Serial.println(nPremier);
digitalWrite( ledPin, HIGH);
delay(1000);
//--Read the nReturn message
message="";
message=nReturn+message;
message="AT+CMGR="+message;
Serial.println("Envoi de la commande ["+message+"]");
SendCmdMessage();
ShowSmsData();
delay(1000);
//--Delete the nReturn message
message="";
message=nReturn+message;
message="AT+CMGD="+message;
Serial.println("Envoi de la commande ["+message+"]");
SendCmdMessage();
ShowSmsData();
message="";
delay(1000);
digitalWrite( ledPin, LOW);
}
}
}
void ShowSerialData()
{ cReturn="";
while(mySerial.available()!=0)
{
//Serial.print(char(mySerial.read()));
c=char(mySerial.read());
switch(dp){
case 1 :
if (c==44)///-- Acii code for Comma
dp=2;
else
cmd+=c;
break;
case 2 :
if (cmd!="")
{ cmd.trim();
//Serial.println("Mem SMS ["+cmd+"]");
cReturn=cmd;
if (cReturn.length()==1)
{c=cReturn.charAt(0);
nReturn=c-0;
nReturn=nReturn-48;}
else
nReturn=0;
}
dp=0;
cmd="";
break;
default :
if (c==58) //-- Acii code for :
dp=1;
break;
}
}
}
void ShowSmsData()
{
while(mySerial.available()!=0)
{
//Serial.print(char(mySerial.read()));
c=char(mySerial.read());
switch(dp){
case 1 :
if (c==13)///-- Acii code for Return
dp=2;
else
cmd+=c;
break;
case 2 :
if (cmd!="")
Serial.println("Mem SMS ["+cmd+"]");
dp=0;
cmd="";
break;
default :
if (c==58) //-- Acii code for :
dp=1;
break;
}
}
}
void SendCmdMessage()
{ mySerial.println(message);
delay(1000);
}
//////////////////////////////////////////////////////
// Delete all SMS in SIM Memory then :
// Wait for SMS, if SMS=OK Light PIN 5
// if SMS=OFF light off PIN 5
// if SMS=? give a status (ON or OFF) of PIN 5
// Otherwise return to the SMS sender a message
// If the AT command as an error light PIN 3
// If the AT command is ok light PIN 4
///////////////////////////////////////////////////////
#include <SoftwareSerial.h>
SoftwareSerial mySerial(10, 9);
int dp=0;
int i=0;
int dpLed=0;
char c;
String message="";
String Res="";
String TxtSms="";
String NumSms="";
String cReturn="";
int nReturn=0;
int nPremier=0;
//--Pin of the LEDs
int ledPinRel = 5; //-- Led Action Or Relay
int ledPinOk = 4; //-- Led OK
int ledPinErr = 3; //-- Led Error
void setup()
{
mySerial.begin(9600);
delay(5000);
//-- SMS in text mode
message="AT+CMGF=1";
SendCmdMessage();
ShowSerialData();
//-- Print storage status
message="AT+CPMS=\"SM\"";
SendCmdMessage();
ExtractSmsNumber();
//--Delete all the SMS
for (i=nReturn; i>0; i--)
{ message="";
message=i+message;
message="AT+CMGD="+message;
SendCmdMessage();
ShowSerialData();
}
//-- Print storage status
message="AT+CPMS=\"SM\"";
SendCmdMessage();
ExtractSmsNumber();
nPremier=nReturn;
//-- Initialize LED PIN
pinMode( ledPinRel, OUTPUT );
digitalWrite( ledPinRel, LOW);
pinMode( ledPinErr, OUTPUT );
digitalWrite( ledPinErr, LOW);
pinMode( ledPinOk, OUTPUT );
digitalWrite( ledPinOk, HIGH);
}
void loop()
{
message="AT+CPMS=\"SM\"";
SendCmdMessage();
ExtractSmsNumber();
dp=0;
if (nReturn>nPremier)
{//--Read the nReturn message
message="";
message=nReturn+message;
message="AT+CMGR="+message;
SendCmdMessage();
ShowSmsData();
if (TxtSms=="ON")
dp=1;
if (TxtSms=="OFF")
dp=2;
if (TxtSms=="?")
dp=3;
switch (dp) {
case 1 :
{digitalWrite( ledPinRel, HIGH);
dpLed=1;
break;}
case 2 :
{digitalWrite( ledPinRel, LOW);
dpLed=0;
break;}
case 3 :
{if (dpLed==1)
message="La LED est ON";
else
message="La LED est OFF";
SendSms();
message="AT+CMGD=1";
SendCmdMessage();
ShowSerialData();
break;
}
default :
{message="Erreur, tapez ON, OFF ou ?, merci !";
SendSms();
message="AT+CMGD=1";
SendCmdMessage();
ShowSerialData();
break;}
}
//--Delete the nReturn message
message="";
message=nReturn+message;
message="AT+CMGD="+message;
SendCmdMessage();
ShowSerialData();
delay(1000);
}
}
void ExtractSmsNumber()
{cReturn="";
Res="";
nReturn=1;
dp=0;
while(mySerial.available()!=0)
{
c=char(mySerial.read());
//if ((c!=13) && (c!=10))
// Res+=c;
switch(dp){
case 1 :
if (c==44)///-- Acii code for Comma
dp=2;
else
Res+=c;
break;
case 2 :
if (Res!="")
{ Res.trim();
cReturn=Res;
if (cReturn.length()==1)
{c=cReturn.charAt(0);
nReturn=c-0;
nReturn=nReturn-48;}
else
nReturn=0;
}
dp=0;
Res="";
break;
default :
if (c==58) //-- Acii code for :
dp=1;
break;
}
}
Res.toUpperCase();
if (Res.indexOf("OK")>0)
{digitalWrite( ledPinOk, HIGH);
digitalWrite( ledPinErr, LOW);
}
if (Res.indexOf("ERROR")>0)
{digitalWrite( ledPinOk, LOW);
digitalWrite( ledPinErr, HIGH);
}
}
void ShowSmsData()
//-- Read the sender number (NumSms) and the text message (TxtSms)
//-- The return code format is : [+CMGR: "REC READ","+336xxxxxxxx",,"13/06/10,22:18:35+08"<CR><LF>Message<CR>]
{dp=0;
TxtSms="";
NumSms="";
Res="";
while(mySerial.available()!=0)
{
c=char(mySerial.read());
if ((c!=13) && (c!=10))
Res+=c;
if ((c==44) && (dp==0))///-- 44 Ascii code for ','
{//-- Entering Phone Number
c=char(mySerial.read()); //-- Reading '"'
c=char(mySerial.read());
dp=1;}
if ((c==34) && (dp==1))///-- 34 Ascii code for '"'
{//-- Leaving Phone Number
dp=2;}
if ((c==13) && (dp==2))///-- 13 Ascii code for <CR>
{//-- Entering Message zone
c=char(mySerial.read()); //-- Reading <LF>
dp=3;}
if ((c==13) && (dp==3))///-- 13 Ascii code for <CR>
{//-- Leaving Message zone
dp=4;}
switch(dp){
case 1 :
NumSms+=c;
break;
case 3 :
TxtSms+=c;
break;
}
}
TxtSms.toUpperCase();
TxtSms.trim();
Res.toUpperCase();
if (Res.indexOf("OK")>0)
{digitalWrite( ledPinOk, HIGH);
digitalWrite( ledPinErr, LOW);
}
if (Res.indexOf("ERROR")>0)
{digitalWrite( ledPinOk, LOW);
digitalWrite( ledPinErr, HIGH);
}
}
void SendSms()
{
mySerial.println("AT+CMGS="+NumSms);
delay(1000);
mySerial.println(message);
delay(1000);
mySerial.println((char)26);//the ASCII code of the ctrl+z is 26
delay(1000);
ShowSerialData();
delay(1000);
}
void SendCmdMessage()
{
mySerial.println(message);
delay(1000);
}
void ShowSerialData()
{Res="";
while(mySerial.available()!=0)
{c=char(mySerial.read());
if ((c!=13) && (c!=10))
Res+=c;
}
Res.toUpperCase();
if (Res.indexOf("OK")>0)
{digitalWrite( ledPinOk, HIGH);
digitalWrite( ledPinErr, LOW);
}
if (Res.indexOf("ERROR")>0)
{digitalWrite( ledPinOk, LOW);
digitalWrite( ledPinErr, HIGH);
}
}
Merci pour ce tuto il va m’aider à exploiter mon TC35.
As-tu une astuce pour commander le micro-switch « d’allumage » logiciellement? A priori c’est un contact masse sur IGT (voir JP3) qui déclenche l’initialisation ?
On doit aussi pouvoir récupérer la réception d’un appel ? RING0 sur ce même JP3.
Pour le micro-switch, effectivement la broche IGT devrait fonctionner. Pour le soft, je pense que la fonction que j’utilise pour la SIM900 est adapté https://andrologiciels.wordpress.com/arduino/gsm-sim-900/
Par contre, pour la réception d’un appel, j’utilise uniquement le soft (la commande ATA) https://andrologiciels.wordpress.com/arduino/gsm-carte-siemens-tc35/repondre-a-un-appel/
Je n’ai pas réussi à connecter un HP et un MICRO, si tu as des infos sur ce sujet, je suis preneur !
En fait le ‘Voice Adapter’ était fourni avec mon shield. Quand à la partie Ring, l’objectif était de notifier l’arduino pour éviter de faire systématiquement des commandes AT
Peut on alimenter la carte TC35 par la carte Arduino Uno ?
Non, mais j’ai réalisé une prise mâle en « T » sur l’alimentation afin de desservir la carte Arduino et la carte GSM…
Non mais tu peux faire l’inverse, alimenter L’arduino via les sorties disponibles sur la TC35
Veux-tu dire que je peux prendre les 5V nécessaires à l’arduino sur le trou désigné par vcc au revers de la carte?
Je tiens à remercier l’auteur de ce tuto et signaler :
1) qu’il vaut mieux utiliser un adapteur de niveaux logiques car le HIGH de l’arduino est à 5V et celui de la TC35 à 2V8. La TC35 risque de ne pas aimer sans ce petit circuit.
2) J’ai traversé pas mal de galères de néophytes avant d’atteindre le succès; il n’est peut-être pas inutile de faire partager aux béotiens de mon acabit quelques évidences qui ne le sont devenues pour moi qu’après bien des errances :
a) bien raccorder TX à TX et RX à RX, sans croiser
b) désactiver le PIN de la SIM, sinon la TC35 ne clignote pas comme il faut (flash brefs, longues pauses) et ne marche pas
c) s’il a plus de 9 messages sur la SIM, il faut modifier le code ci-dessus pour qu’il parvienne à vider la carte.
J’ai moi même cette carte mais j’ai une question: Si on envoi a cette carte AT ou ATI est ce qu’elle répond « OK » comme indiqué dans la doc? Quel est le débit du port serie par defaut?
En gros je n’arrive pas a lui faire dire autre chose que error au bout d’un moment, lorsque j’envois les commandes pour envoyer un sms directement depuis mon terminal.
Lorsque la sim est en place j’ai au démarrage un clignotement regulier toutes les secondes puis un clignotement bref mais plus lent.
J’ai evidement enlevé la demande du code sim (depuis un autre portable) mais rien n’y fait, une idée?
Le débit de la carte est de 9600 bauds, oui la carte retourne un ok suivi ou pas d’information.
Le clignotement doit signifier que tout est ok.
Ma carte ne répond pas ok, donc déja un souci à ce niveau, est ce qu’elle répond ok si la carte sim n’est pas présente? Je suspecte peut etre ma carte sim free. Enfin je sais pas trop…
J’ai un peu avancé, je reçoit bien les ok lorsque j’envois les commande AT, j’ai testé votre 1er programme mais je n’obtiens pas d’envoi de sms, malgré le message suivant dans le terminal série :
Hello, tapez votre SMS en terminant par un point
Envoi du SMS…
AT+CMGF=1
OK
AT+CMGS= »06myphone »
> test
test.
SMS parti !
Envoi du SMS…
Une idée?
Apparemment ça ne fonctionne pas avec les sim de chez free mais ok chez virgin mobile.
Curieux
Je n’ai pas de problème avec la carte SIM Free pour envoyer des SMS.
As-tu supprimé le code pin?
Il faut respecter l’ordre des commandes AT
et le format du numéro de téléphone « +336XXXXXXXX »
Tu retrouveras le pendant de cet article ici
http://www.sainsmart.com/siemens-tc35-sms-gsm-module-voice-adapter.html
Comme le précise Stéphane, cela fonctionne bien avec une sim Free et la commande d’envoi doit être « AT+CMGS=\ »+336xxxxxxxx\ »\r »
Pour ceux qui serais intéressée le problème venait du numéro de centre de message qui n’était pas le bon sur 2 cartes sim free dont je disposais, une fois modifié c’est ok.
Personnellement j’utilise le logiciel sscom32e que le vendeur m’a proposé qui gére bien la liaison ce qui ne semble pas être le cas de l’hyperterminal de windows, ou du terminal fournis dans le compileur ccs et même le terminal du logiciel arduino ne permet pas d’envoyer le code de fin en hexa 1A qui permet de valider la fin du message.
Je suis assez étonné de ne pas pouvoir utiliser l’hyperterminal, je n’obtiens pas de retour lorsque j’envoi at
Stéphane> Merci je viens de lire ton lien, et effectivement les problèmes que j’ai rencontré avec mon terminal sont décrit…En gros personne ne semble utiliser l’hyperterminal qui semble buggé.
J’ai un problème de microphone:
lorsque je décroche (avec la commande ATA) un appel entrant, j’ai le son sur le jack AUD du « voice adapter », mais le microphone ne fonctionne pas. J’ai essayé sans succès de brancher un microphone sur le jack MIC, et également d’utiliser un kit piéton avec un jack 4 pôles branché sur la prise AUD. J’ai essayé aussi de bidouiller avec des commandes AT^SNFS et AT^SAIC, toujours en vain.
Quelqu’un a-t-il une solution?
Hello,
Désolé de déterrer ce sujet.. 😉
Quelqu’un aurait-il pourrait m’indiquer une solution pour activer « automatiquement » la carte GSM depuis l’arduino sans avoir à appuyer sur le micro switch ?
merci par avance,
Christophe
A priori via la broche igt/ign cela doit être possible
#include
SoftwareSerial gsmSerial(2,3);
void setup() {
Serial.begin(9600);
gsmSerial.begin(9600);
//— turn on TC35 —
// wire pin 8 Arduino to IGT pin on TC35
// it grounds IGN pin for 100 ms
// this is the same as pressing the button
// on the TC35 to start it up
pinMode(8, INPUT);
digitalWrite(8, LOW);
pinMode(8, OUTPUT);
delay(100);
pinMode(8, INPUT);
}//—— End setup ——-
Merci beaucoup ! Je vais tenter cela dès que j’aurai reçu ma carte ! Et reviendrai confirmer ou infirmer 😉
Bonsoir,j’ai tout le matériels qui faut(siemens tc 35,arduino uno,relais),le problème c’est que je doit ouvrir un relais grâce a un sms code,et si le sms ne convient pas au code la porte(relais)restera toujours fermé.quelqu’un pourrait m’aider a trouver la solution svp!!
Bonjour
Je veux transmettre vers un téléphone mobile, sous forme des SMS, à chaque intervalle de temps, la température et l’humidité à l’intérieure d’un locale. J’ai une arduino uno, un capteur DHT11 et un module TC35. Je n’arrive encore de trouver le programme (code) à téléverser. Est-ce que quelqu’un peut m’aider à trouver le programme?
Merci beaucoup!