-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathPrototype 2 : Ensemble du programme avec ordinateur
310 lines (266 loc) · 10.3 KB
/
Prototype 2 : Ensemble du programme avec ordinateur
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
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
// 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
// Passage de 14 500 bytes à 13 682 bytes sur le sketch. Gain additionnel d'environ 10% en RAM
#include <SoftwareSerial.h>
#include <OneWire.h>
#include <Time.h>
#define DS18B20 0x28
#define BROCHE_ONEWIRE 4
#define SEUIL_BAS 15.0
#define SEUIL_HAUT 25.0
#define TEMPS_ATTENTE 30 // Temps d'attente en secondes entre deux mesures de la température (en sec)
#define TEMPS_ATTENTE_SECURITE 6 // Temps d'attente en secondes pour la mesure de vérification (en sec)
#define TEMPS_ATTENTE_VEILLE 20 // Temps d'attente en secondes entre deux vérifications du réseau (en sec)
#define NOMBRE_CAPTEURS_MAX 5 // Nombre maximum de capteurs en série autorisé (valeur >= 1)
#define SIM_PIN_CODE "0000" // Code Pin de la carte SIM
// Variables relatives aux capteurs
OneWire ds(BROCHE_ONEWIRE);
byte adresseCapteurs[NOMBRE_CAPTEURS_MAX][8]; // Adresse du premier capteur
float temperatureCapteurs[NOMBRE_CAPTEURS_MAX];
boolean intervalleCapteurs[NOMBRE_CAPTEURS_MAX];
time_t tempsPrecedentCapteurs[NOMBRE_CAPTEURS_MAX];
int nombre_capteurs = 0;
int capteurMesure = 0;
// Variables relatives au module GPRS
SoftwareSerial GPRS (7, 8); // GPRS : relatif au shield GPRS ; Serial : relatif à l'ordinateur
String phone_number = "+33647877083"; // Numéro par défaut
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
String numeroSMS;
String numeroTemp = phone_number;
boolean veille = true;
time_t tempsPrecedentVeille;
void setup()
{
delay (3000);
GPRS.begin(19200); // Fréquence du module
tempsPrecedentVeille = now();
// Setup Capteurs
int i=0;
Serial.begin(9600); // Initialisation du port série
ds.reset();
ds.reset_search();
while ((nombre_capteurs < NOMBRE_CAPTEURS_MAX) && (ds.search(adresseCapteurs[nombre_capteurs]))) // Recherche des différents capteurs
{
tempsPrecedentCapteurs[nombre_capteurs] = now(); // Initialisation des variables du capteur
temperatureCapteurs[nombre_capteurs] = (SEUIL_BAS + SEUIL_HAUT) / 2;
intervalleCapteurs[nombre_capteurs] = true;
nombre_capteurs++;
Serial.print("\nCapteur "); // Affichage des infos du capteur à l'ordinateur
Serial.print(nombre_capteurs);
Serial.print(" : ");
for(i=0; i < 8; i++)
{
Serial.print(adresseCapteurs[nombre_capteurs-1][i], HEX);
Serial.print(" ");
}
}
}
void loop()
{
if (GPRS.available()) {
executionGPRS();
}
else {
time_t time = now();
if ((time-tempsPrecedentVeille) >= TEMPS_ATTENTE_VEILLE)
{
reseauIndisponible(); // Vérification du réseau
tempsPrecedentVeille = time;
}
if (!veille) {
if ((time-tempsPrecedentCapteurs[capteurMesure]) >= TEMPS_ATTENTE)
{
mesureCapteur(capteurMesure); // Mesure sur le capteur
tempsPrecedentCapteurs[capteurMesure] = time;
}
capteurMesure++;
if (capteurMesure == nombre_capteurs) {
capteurMesure = 0;
}
}
}
}
void mesureCapteur (const int i) // Demande de la température du capteur i
{
getTemperature (&temperatureCapteurs[i], adresseCapteurs[i]);
Serial.print("T. capteur ");
Serial.print(i+1);
Serial.print(" : ");
Serial.println(temperatureCapteurs[i]);
if (intervalleCapteurs[i] & ((temperatureCapteurs[i] < SEUIL_BAS) | (temperatureCapteurs[i] > SEUIL_HAUT))) // On sort de l'intervalle acceptable
{
delay (TEMPS_ATTENTE_SECURITE*1000); // Attente
tempsPrecedentCapteurs[i] = now();
getTemperature (&temperatureCapteurs[i], adresseCapteurs[i]);
Serial.print("Verification : ");
Serial.println(temperatureCapteurs[i]);
if ((temperatureCapteurs[i] < SEUIL_BAS) | (temperatureCapteurs[i] > SEUIL_HAUT)) // Seconde vérification
{
Serial.println("* Sorti de l'intervalle");
reseauIndisponible(); // Vérification du réseau
tempsPrecedentVeille = now();
if (!veille) {
intervalleCapteurs[i]=false;
envoyerUnMessage (temperatureCapteurs[i], true, i+1);
Serial.println("* Message envoye avec succes\n");
}
else {
Serial.println("* Message non envoye\n");
}
}
}
else if (!intervalleCapteurs[i] & (temperatureCapteurs[i] > SEUIL_BAS) & (temperatureCapteurs[i] < SEUIL_HAUT)) // On rentre à nouveau dans cet intervalle
{
delay (TEMPS_ATTENTE_SECURITE*1000); // Attente
tempsPrecedentCapteurs[i] = now();
getTemperature (&temperatureCapteurs[i], adresseCapteurs[i]);
Serial.print("Verification : ");
Serial.println(temperatureCapteurs[i]);
if ((temperatureCapteurs[i] > SEUIL_BAS) & (temperatureCapteurs[i] < SEUIL_HAUT)) // Seconde vérification
{
Serial.println("* Retour dans l'intervalle");
reseauIndisponible(); // Vérification du réseau
tempsPrecedentVeille = now();
if (!veille) {
intervalleCapteurs[i]=true;
envoyerUnMessage (temperatureCapteurs[i], true, i+1);
Serial.println("* Message envoye avec succes\n");
}
else {
Serial.println("* Message non envoye\n");
}
}
}
}
void getTemperature (float *temp, const byte addr[])
{
byte data[2];
ds.reset();
ds.select(addr); // Sélectionne le capteur de température
ds.write(0x44,1); // Lance la mesure de température
delay(800);
ds.reset(); // Reset pour envoyer maintenant la demande de lecture
ds.select(addr);
ds.write(0xBE); // Demande de lecture du scratchpad
data[0] = ds.read(); // Lit les 2 premiers octets du scratchpad sur lesquels est contenue la température
data[1] = ds.read();
*temp = ((data[1] << 8) | data[0]) * 0.0625; // Conversion en degrés celsius
}
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("\n\n* 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("* Recherche du reseau");
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("\n* UN SMS A ETE RECU");
int iPos = msg.indexOf(",");
numeroSMS = msg.substring(iPos+1);
GPRS.print("AT+CMGR="); // Demande de lecture des informations du message
GPRS.println(numeroSMS);
}
if (msg.indexOf("+CMGR:") >= 0) { // Phase 2 : réception du numéro de l'expéditeur
int iPos = msg.indexOf("+33");
numeroTemp = msg.substring(iPos, iPos+12);
Serial.print("Exp : ");
Serial.println(numeroTemp);
CorpsSMS = true;
msg = "";
return; // Le prochain message contiendra le corps du SMS
}
if (CorpsSMS == 1) { // Phase 3 : corps du SMS
Serial.print("Corps du SMS : ");
Serial.println(msg);
traiterSMS(msg); // Traitement du corps du message
GPRS.print("AT+CMGD="); // Suppression du SMS pour ne pas encombrer la carte SIM
GPRS.println(numeroSMS);
delay(1000);
}
msg = ""; // Efface le contenu de la mémoire tampon des messages du GPRS shield.
CorpsSMS = false;
}
void traiterSMS(const String smsText)
{
boolean decode = false;
for (int i=0; i < nombre_capteurs; i++) {
if (smsText.indexOf("Temp "+String(i+1)) >= 0) { // Demande d'envoi de la température du capteur i
phone_number = numeroTemp; // Remplacement du numéro
Serial.print("* Demande de la temperature du capteur ");
Serial.print(i+1);
envoyerUnMessage (temperatureCapteurs[i], false, i+1);
Serial.println("* Message envoye avec succes\n");
decode = true;
delay(1000);
}
}
if (!decode) {
Serial.println("* Message non decode\n");
}
}
void envoyerUnMessage(const float temp, const boolean messageAutomatique, const int numeroCapteur)
{
delay(500);
Serial.println("\n* ENVOI D'UN SMS");
GPRS.print("AT+CMGS=\""); // Parametrage du numéro
GPRS.print(phone_number);
GPRS.print("\"\r\n");
while(GPRS.read()!='>');
if (messageAutomatique) { // Corps du SMS : 3 possibilités
if (!intervalleCapteurs[numeroCapteur-1])
{
GPRS.print("Attention, le seuil critique de temperature dans le capteur ");
GPRS.print(numeroCapteur);
GPRS.print(" a ete atteint. La temperature est de ");
}
else
{
GPRS.print("La temperature dans le capteur ");
GPRS.print(numeroCapteur);
GPRS.print(" est de nouveau acceptable. Elle est de ");
}
}
else {
GPRS.print("La temperature dans le capteur ");
GPRS.print(numeroCapteur);
GPRS.print(" est de ");
}
GPRS.print(temp, 2);
GPRS.print(" degres celsius.");
delay(500);
GPRS.write(0x1A); // Finalisation du SMS et envoi
GPRS.write(0x0D);
GPRS.write(0x0A);
delay(20000);
}
void reseauIndisponible() // Gère le réseau mobile
{
/* Commande pour vérifier l'enregistrement sur le réseau : AT+CREG? : datasheet p.77 */
GPRS.print("AT+CREG?\r\n"); // Demande de l'enregistrement sur le réseau
while (!GPRS.available());
while (GPRS.read() != 44); // Jusqu'à la virgule ','
veille = GPRS.read() != 49; // Analyse du résultat : '1' ou pas
if (veille) {
Serial.println("* Reseau perdu");
}
else {
Serial.println("* Reseau ok");
}
}