-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathFonction de base : Réception et traitement de SMS
135 lines (102 loc) · 4.38 KB
/
Fonction de base : Réception et traitement de SMS
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
// Ce code permet la réception de SMS, leur traitement et l'éventuel envoi d'une réponse.
// Il reprend, en partie, le code fait par mchobby disponible à cette adresse : http://mchobby.be/wiki/index.php?title=SmsCommand
// Modifier Buffer Arduino : dans un terminal entrer la commande : sudo gedit /usr/share/arduino/libraries/SoftwareSerial/SoftwareSerial.h
// Modifier la valeur de MAX_RX_BUFF à 256
#include <SoftwareSerial.h>
SoftwareSerial GPRS (7, 8); // mySerial : relatif au shield GPRS ; Serial : relatif à l'ordinateur
// Variables relatives au module GPRS
String phone_number = "+33647877083"; // Numéro par défaut
String SIM_PIN_CODE = "0000"; // Code Pin de la carte SIM
String msg = ""; // Mémoire tampon de la communication avec le module GPRS
int CorpsSMS = false; // Est mis à 1 quand le prochain message du shield GPRS contiendra le contenu du SMS
float temperatureCapteur1 = 20.0;
void setup()
{
GPRS.begin(19200); // Fréquence du module
Serial.begin(19200);
}
void loop()
{
if (GPRS.available()) {
executionGPRS();
}
}
void executionGPRS ()
{
char SerialInByte = (unsigned char)GPRS.read(); // Réception du caractère envoyé par le module GPRS
// Serial.print(SerialInByte); // Afficher directement à l'ordinateur le caractère
if (SerialInByte == 13) { // Si le message se termine par un <CR> alors on traite le message
gestionCommunicationGPRS();
}
else if (SerialInByte != 10) { // On ignore le caractère interligne (line feed)
msg += String(SerialInByte); // Stockage du caractère dans la mémoire tampon
}
}
void gestionCommunicationGPRS () // Interprete le message du GPRS shield et agit en conséquence
{
if (msg.indexOf("+CPIN: SIM PIN")>=0) { // Demande du code Pin de la carte SIM
Serial.println("*** Envoi du code Pin... ***");
GPRS.print("AT+CPIN="); // Envoi du code Pin
GPRS.println( SIM_PIN_CODE );
}
if (msg.indexOf("Call Ready")>=0) { // Le réseau mobile est disponible
Serial.println("*** Le module GPRS est maintenant enregistre sur le reseau. ***\n");
GPRS.println("AT+CMGF=1"); // Utilisation du mode texte pour la gestion des messages SMS
}
// Opérations relatives à la réception d'un SMS
if (msg.indexOf("+CMTI")>= 0) { // Phase 1 : début de réception d'un SMS
Serial.println("*** UN SMS A ETE RECU ***");
int iPos = msg.indexOf(",");
String SmsStorePos = msg.substring( iPos+1 );
GPRS.print("AT+CMGR="); // Demande de lecture des informations du message
GPRS.println( SmsStorePos );
}
if (msg.indexOf("+CMGR:")>=0) { // Phase 2 : réception du numéro de l'expéditeur
int iPos = msg.indexOf("+33");
phone_number = msg.substring(iPos, iPos+12); // Mise à jour du numéro d'envoi des messages par le dernier numéro connu
Serial.println("*** Numero de l'expediteur ***");
Serial.println(phone_number);
CorpsSMS = true;
msg = "";
return; // Le prochain message contiendra le corps du SMS
}
if (CorpsSMS == 1) { // Phase 3 : corps du SMS
Serial.println("*** Corps du SMS ***");
Serial.println(msg);
traiterSMS(msg); // Traitement du corps du message
}
msg = ""; // Efface le contenu de la mémoire tampon des messages du GPRS shield.
CorpsSMS = false;
}
void traiterSMS(String smsText)
{
if (smsText.indexOf("Temp 1")>=0) { // Demande d'envoi de la température du capteur 1
Serial.println("*** Une demande de la temperature du capteur 1 a ete faite. ***");
envoyerUnMessage (temperatureCapteur1);
Serial.println("*** Message envoye avec succes. ***\n");
}
else {
Serial.println("*** Le message ne peut pas etre decode. ***\n");
}
}
void envoyerUnMessage(float temp)
{
delay(500);
GPRS.print("AT+CMGF=1\r\n"); // Préconfiguration du mode texte
delay(500);
GPRS.print("AT+CMGS=\""); // Parametrage du numéro
GPRS.print(phone_number);
GPRS.print("\"\r\n");
while(GPRS.read()!='>');
GPRS.print("La temperature est de "); // Corps du SMS
GPRS.print(temp, 2);
GPRS.print(" degres celsius.");
Serial.print("La temperature est de "); // Corps du SMS
Serial.print(temp, 2);
Serial.println(" degres celsius.");
delay(500);
GPRS.write(0x1A); // Finalisation du SMS et envoi
GPRS.write(0x0D);
GPRS.write(0x0A);
delay(20000);
}