-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathPrototype 1 : Ensemble du programme sans ordinateur
158 lines (149 loc) · 6.18 KB
/
Prototype 1 : Ensemble du programme sans 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
#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 600 // Temps d'attente en secondes entre deux mesures de la température (en sec)
#define TEMPS_ATTENTE_SECURITE 60 // Temps d'attente en secondes pour la mesure de vérification (en sec)
// Variables relatives aux capteurs
OneWire ds(BROCHE_ONEWIRE);
byte adresseCapteur1 [8]; // Adresse du premier capteur
float temperatureCapteur1 = (SEUIL_BAS + SEUIL_HAUT) / 2;
boolean intervalleCapteur1 = true;
time_t tempsPrecedentCapteur1;
// 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 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
String numeroSMS;
String numeroTemp = phone_number;
void setup() {
GPRS.begin(19200); // Fréquence du module
// Setup Capteurs
Serial.begin(9600); // Initialisation du port série
ds.reset();
ds.search(adresseCapteur1); // Recherche et stock l'adresse du capteur 1
tempsPrecedentCapteur1 = now();
}
void loop() {
if (GPRS.available()) {
executionGPRS(); }
else {
time_t time = now();
if ((time-tempsPrecedentCapteur1) >= TEMPS_ATTENTE)
{
mesureCapteur1();
tempsPrecedentCapteur1 = time;
}
}
}
void mesureCapteur1 () {
getTemperature (&temperatureCapteur1, adresseCapteur1); // Demande la température du capteur 1
if (intervalleCapteur1 & ((temperatureCapteur1 < SEUIL_BAS) | (temperatureCapteur1 > SEUIL_HAUT))) // On sort de l'intervalle acceptable
{
delay (TEMPS_ATTENTE_SECURITE*1000); // Attente
tempsPrecedentCapteur1 = now();
getTemperature (&temperatureCapteur1, adresseCapteur1);
if ((temperatureCapteur1 < SEUIL_BAS) | (temperatureCapteur1 > SEUIL_HAUT)) { // Seconde vérification
intervalleCapteur1=false;
envoyerUnMessage (temperatureCapteur1, true); }
}
else if (!intervalleCapteur1 & (temperatureCapteur1 > SEUIL_BAS) & (temperatureCapteur1 < SEUIL_HAUT)) // On rentre à nouveau dans cet intervalle
{
delay (TEMPS_ATTENTE_SECURITE*1000); // Attente
tempsPrecedentCapteur1 = now();
getTemperature (&temperatureCapteur1, adresseCapteur1);
if ((temperatureCapteur1 > SEUIL_BAS) & (temperatureCapteur1 < SEUIL_HAUT)) { // Seconde vérification
intervalleCapteur1=true;
envoyerUnMessage (temperatureCapteur1, true);}
}
}
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
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
GPRS.print("AT+CPIN="); // Envoi du code Pin
GPRS.println( SIM_PIN_CODE );
}
if (msg.indexOf("Call Ready")>=0) { // Le réseau mobile recherche le réseau
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
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);
CorpsSMS = true;
msg = "";
return; // Le prochain message contiendra le corps du SMS
}
if (CorpsSMS == 1) { // Phase 3 : corps du SMS
traiterSMS(msg); // Traitement du corps du message
GPRS.print("AT+CMGD="); // Suppression du SMS pour ne pas encombrer la carte SIM
GPRS.println(numeroSMS);
}
msg = ""; // Efface le contenu de la mémoire tampon des messages du GPRS shield.
CorpsSMS = false;
}
void traiterSMS(const String smsText) {
if (smsText.indexOf("Temp 1")>=0) { // Demande d'envoi de la température du capteur 1
phone_number = numeroTemp; // Remplacement du numéro
envoyerUnMessage (temperatureCapteur1, false);
}
// Le message ne peut pas être décodé
}
void envoyerUnMessage(const float temp, const boolean messageAutomatique) {
delay(500);
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 (!intervalleCapteur1) {
GPRS.print("Attention, le seuil critique de temperature ");
GPRS.print("dans le capteur 1 a ete atteint. La temperature");
GPRS.print(" est de ");
}
else {
GPRS.print("La temperature est de nouveau acceptable. Elle est de "); }
}
else {
GPRS.print("La temperature dans le capteur 1 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(25000);
}