Commit f3d8bf268dfcd03b8027a9b8b0a2e7a124a1fd43
1 parent
782c28c5
fichiers finaux
Showing
5 changed files
with
513 additions
and
0 deletions
Show diff stats
@@ -0,0 +1,281 @@ | @@ -0,0 +1,281 @@ | ||
1 | +//programme principal | ||
2 | + | ||
3 | +#define Lampe 3 | ||
4 | +#define venti 4 | ||
5 | +#define photocellPin 0 | ||
6 | + | ||
7 | +#include <Wire.h> | ||
8 | + | ||
9 | +#define SLAVE_ADDRESS 0x12 | ||
10 | +int dataReceived = 0; | ||
11 | + | ||
12 | +int temp;//en dégres > Reception de la Raspberry | ||
13 | +int lum; // en pourcent | ||
14 | +int vent; // en pourcent | ||
15 | + | ||
16 | + | ||
17 | +int temp_m;//envoie vers la raspb | ||
18 | +int lum_m; | ||
19 | +int hum_m; | ||
20 | + | ||
21 | +int photocellReading; | ||
22 | +int envoie; | ||
23 | +/* brochage de la carte arduino | ||
24 | + */ | ||
25 | +const byte resitanceChauf= A0; | ||
26 | +const byte ventilateur=A1; | ||
27 | + | ||
28 | + | ||
29 | +/** Broche "DATA" du capteur */ | ||
30 | +const byte BROCHE_CAPTEUR = 5; | ||
31 | + | ||
32 | +/* Code d'erreur de la fonction readDHT11() et readDHT22() */ | ||
33 | +const byte DHT_SUCCESS = 0; // Pas d'erreur | ||
34 | +const byte DHT_TIMEOUT_ERROR = 1; // Temps d'attente dépassé | ||
35 | +const byte DHT_CHECKSUM_ERROR = 2; // Données reçues erronées | ||
36 | + | ||
37 | +void setup() { | ||
38 | + // put your setup code here, to run once: | ||
39 | + Serial.begin(9600); | ||
40 | + Wire.begin(SLAVE_ADDRESS); | ||
41 | + Wire.onReceive(receiveData); | ||
42 | + Wire.onRequest(sendData); | ||
43 | + pinMode(Lampe,OUTPUT); | ||
44 | + pinMode (venti,OUTPUT); | ||
45 | + | ||
46 | + /* Place la broche du capteur en entrée avec pull-up */ | ||
47 | + pinMode(BROCHE_CAPTEUR, INPUT_PULLUP); | ||
48 | + | ||
49 | +} | ||
50 | + | ||
51 | + | ||
52 | + | ||
53 | +void loop() { | ||
54 | + | ||
55 | + float temperature, humidity; | ||
56 | + | ||
57 | + // création des trames pour la com rasp | ||
58 | + | ||
59 | + //lecture des données | ||
60 | + temp = dataReceived/1000000; | ||
61 | + vent = (dataReceived /1000)-temp; | ||
62 | + lum= dataReceived -vent -temp; | ||
63 | + cmd_vent(vent); | ||
64 | + cmd_lampe(lum); | ||
65 | + if ( temp_m >= temp ) | ||
66 | + { | ||
67 | + cmd_temp(false); | ||
68 | + } | ||
69 | + else | ||
70 | + { | ||
71 | + | ||
72 | + cmd_temp(true); | ||
73 | + } | ||
74 | + | ||
75 | + | ||
76 | + | ||
77 | + /* Lecture de la température et de l'humidité, avec gestion des erreurs */ | ||
78 | + // N.B. Remplacer readDHT11 par readDHT22 en fonction du capteur utilisé ! | ||
79 | + switch (readDHT11(BROCHE_CAPTEUR, &temperature, &humidity)) { | ||
80 | + case DHT_SUCCESS: | ||
81 | + | ||
82 | + /* Affichage de la température et du taux d'humidité */ | ||
83 | + /*Serial.print(F("Humidite (%): ")); | ||
84 | + Serial.println(humidity, 2); | ||
85 | + Serial.print(F("Temperature (^C): ")); | ||
86 | + Serial.println(temperature, 2);*/ | ||
87 | + temp_m=temperature; | ||
88 | + hum_m=humidity; | ||
89 | + break; | ||
90 | + | ||
91 | + case DHT_TIMEOUT_ERROR: | ||
92 | + Serial.println(F("Pas de reponse !")); | ||
93 | + break; | ||
94 | + | ||
95 | + case DHT_CHECKSUM_ERROR: | ||
96 | + Serial.println(F("Pb de communication !")); | ||
97 | + break; | ||
98 | + } | ||
99 | + lum=cpt_lum(); | ||
100 | + | ||
101 | + // envoie des données ic2 | ||
102 | + envoie = temp_m * 1000000 + hum_m *1000 +lum_m; | ||
103 | + /* Pas plus d'une mesure par seconde */ | ||
104 | +} | ||
105 | +int cpt_lum() | ||
106 | +{ | ||
107 | + photocellReading = analogRead(photocellPin); | ||
108 | + | ||
109 | + //faire la conversion valeur vers lux | ||
110 | + | ||
111 | + return photocellReading; | ||
112 | + | ||
113 | +} | ||
114 | +void cmd_lampe(float lum) | ||
115 | +{ | ||
116 | + | ||
117 | + // conversion vent a faire une fois le dome concu | ||
118 | + lum = (lum/100)*255 ;// commande en pourcentage pour l'instant | ||
119 | + analogWrite(Lampe,lum); | ||
120 | + | ||
121 | +} | ||
122 | +void cmd_vent(float vent) | ||
123 | +{ | ||
124 | + | ||
125 | + // conversion vent a faire une fois le dome concu | ||
126 | + vent = (vent/100)*255 ;// commande en pourcentage pour l'instant | ||
127 | + analogWrite(ventilateur,vent); | ||
128 | + | ||
129 | +} | ||
130 | +void cmd_temp(bool actif) | ||
131 | +{ | ||
132 | + if ( actif) | ||
133 | + { | ||
134 | + analogWrite(resitanceChauf,200); | ||
135 | + } | ||
136 | + else | ||
137 | + { | ||
138 | + analogWrite(resitanceChauf,0); | ||
139 | + } | ||
140 | + } | ||
141 | +// communication i2c entre raspeberrry et arduino | ||
142 | +void receiveData(int byteCount){ | ||
143 | + while(Wire.available()) { | ||
144 | + dataReceived = Wire.read(); | ||
145 | + } | ||
146 | +} | ||
147 | + | ||
148 | +void sendData(){ | ||
149 | + Wire.write(envoie); | ||
150 | +} | ||
151 | + | ||
152 | + /* | ||
153 | + * Lit la température et le taux d'humidité mesuré par un capteur DHT11. | ||
154 | + * | ||
155 | + * @param pin Broche sur laquelle est câblée le capteur. | ||
156 | + * @param temperature Pointeur vers la variable stockant la température. | ||
157 | + * @param humidity Pointeur vers la variable stockant le taux d'humidité. | ||
158 | + * @return DHT_SUCCESS si aucune erreur, DHT_TIMEOUT_ERROR en cas de timeout, ou DHT_CHECKSUM_ERROR en cas d'erreur de checksum. | ||
159 | + */ | ||
160 | +byte readDHT11(byte pin, float* temperature, float* humidity) | ||
161 | +{ | ||
162 | + | ||
163 | + /* Lit le capteur */ | ||
164 | + byte data[5]; | ||
165 | + byte ret = readDHTxx(pin, data, 18, 1000); | ||
166 | + | ||
167 | + /* Détecte et retourne les erreurs de communication */ | ||
168 | + if (ret != DHT_SUCCESS) | ||
169 | + return ret; | ||
170 | + | ||
171 | + /* Calcul la vraie valeur de la température et de l'humidité */ | ||
172 | + *humidity = data[0]; | ||
173 | + *temperature = data[2]; | ||
174 | + | ||
175 | + /* Ok */ | ||
176 | + return DHT_SUCCESS; | ||
177 | +} | ||
178 | + | ||
179 | +/** | ||
180 | + * Fonction bas niveau permettant de lire la température et le taux d'humidité (en valeurs brutes) mesuré par un capteur DHTxx. | ||
181 | + */ | ||
182 | +byte readDHTxx(byte pin, byte* data, unsigned long start_time, unsigned long timeout) | ||
183 | +{ | ||
184 | + data[0] = data[1] = data[2] = data[3] = data[4] = 0; | ||
185 | + // start_time est en millisecondes | ||
186 | + // timeout est en microsecondes | ||
187 | + | ||
188 | + /* Conversion du numéro de broche Arduino en ports / masque binaire "bas niveau" */ | ||
189 | + uint8_t bit = digitalPinToBitMask(pin); | ||
190 | + uint8_t port = digitalPinToPort(pin); | ||
191 | + volatile uint8_t *ddr = portModeRegister(port); // Registre MODE (INPUT / OUTPUT) | ||
192 | + volatile uint8_t *out = portOutputRegister(port); // Registre OUT (écriture) | ||
193 | + volatile uint8_t *in = portInputRegister(port); // Registre IN (lecture) | ||
194 | + | ||
195 | + /* Conversion du temps de timeout en nombre de cycles processeur */ | ||
196 | + unsigned long max_cycles = microsecondsToClockCycles(timeout); | ||
197 | + | ||
198 | + /* Evite les problèmes de pull-up */ | ||
199 | + *out |= bit; // PULLUP | ||
200 | + *ddr &= ~bit; // INPUT | ||
201 | + delay(100); // Laisse le temps à la résistance de pullup de mettre la ligne de données à HIGH | ||
202 | + | ||
203 | + /* Réveil du capteur */ | ||
204 | + *ddr |= bit; // OUTPUT | ||
205 | + *out &= ~bit; // LOW | ||
206 | + delay(start_time); // Temps d'attente à LOW causant le réveil du capteur | ||
207 | + // N.B. Il est impossible d'utilise delayMicroseconds() ici car un délai | ||
208 | + // de plus de 16 millisecondes ne donne pas un timing assez précis. | ||
209 | + | ||
210 | + /* Portion de code critique - pas d'interruptions possibles */ | ||
211 | + noInterrupts(); | ||
212 | + | ||
213 | + /* Passage en écoute */ | ||
214 | + *out |= bit; // PULLUP | ||
215 | + delayMicroseconds(40); | ||
216 | + *ddr &= ~bit; // INPUT | ||
217 | + | ||
218 | + /* Attente de la réponse du capteur */ | ||
219 | + timeout = 0; | ||
220 | + while(!(*in & bit)) { /* Attente d'un état LOW */ | ||
221 | + if (++timeout == max_cycles) { | ||
222 | + interrupts(); | ||
223 | + return DHT_TIMEOUT_ERROR; | ||
224 | + } | ||
225 | + } | ||
226 | + | ||
227 | + timeout = 0; | ||
228 | + while(*in & bit) { /* Attente d'un état HIGH */ | ||
229 | + if (++timeout == max_cycles) { | ||
230 | + interrupts(); | ||
231 | + return DHT_TIMEOUT_ERROR; | ||
232 | + } | ||
233 | + } | ||
234 | + | ||
235 | + /* Lecture des données du capteur (40 bits) */ | ||
236 | + for (byte i = 0; i < 40; ++i) { | ||
237 | + | ||
238 | + /* Attente d'un état LOW */ | ||
239 | + unsigned long cycles_low = 0; | ||
240 | + while(!(*in & bit)) { | ||
241 | + if (++cycles_low == max_cycles) { | ||
242 | + interrupts(); | ||
243 | + return DHT_TIMEOUT_ERROR; | ||
244 | + } | ||
245 | + } | ||
246 | + | ||
247 | + /* Attente d'un état HIGH */ | ||
248 | + unsigned long cycles_high = 0; | ||
249 | + while(*in & bit) { | ||
250 | + if (++cycles_high == max_cycles) { | ||
251 | + interrupts(); | ||
252 | + return DHT_TIMEOUT_ERROR; | ||
253 | + } | ||
254 | + } | ||
255 | + | ||
256 | + /* Si le temps haut est supérieur au temps bas c'est un "1", sinon c'est un "0" */ | ||
257 | + data[i / 8] <<= 1; | ||
258 | + if (cycles_high > cycles_low) { | ||
259 | + data[i / 8] |= 1; | ||
260 | + } | ||
261 | + } | ||
262 | + | ||
263 | + /* Fin de la portion de code critique */ | ||
264 | + interrupts(); | ||
265 | + | ||
266 | + /* | ||
267 | + * Format des données : | ||
268 | + * [1, 0] = humidité en % | ||
269 | + * [3, 2] = température en degrés Celsius | ||
270 | + * [4] = checksum (humidité + température) | ||
271 | + */ | ||
272 | + | ||
273 | + /* Vérifie la checksum */ | ||
274 | + byte checksum = (data[0] + data [1] + data[2] + data[3]) & 0xff; | ||
275 | + if (data[4] != checksum) | ||
276 | + return DHT_CHECKSUM_ERROR; /* Erreur de checksum */ | ||
277 | + else | ||
278 | + return DHT_SUCCESS; /* Pas d'erreur */ | ||
279 | + | ||
280 | +} | ||
281 | + |
73.1 KB
No preview for this file type
@@ -0,0 +1,109 @@ | @@ -0,0 +1,109 @@ | ||
1 | +<!DOCTYPE html> | ||
2 | +<html> | ||
3 | +<H1> BANC TEST DE STATION METEOROLOGIQUE</H1> | ||
4 | + | ||
5 | +<H2> Commande des paramètres </H2> | ||
6 | + | ||
7 | + | ||
8 | +<p> Vent </p> | ||
9 | + <FORM> | ||
10 | + <SELECT name="nom" size="1"> | ||
11 | + <OPTION>null | ||
12 | + <OPTION>faible | ||
13 | + <OPTION>moyen | ||
14 | + <OPTION>fort | ||
15 | + </SELECT> | ||
16 | + </FORM> | ||
17 | +</html> | ||
18 | +<script language="javascript" src="p1.js"> </script> | ||
19 | +<p> Lumière </p> | ||
20 | + <FORM> | ||
21 | + <SELECT name="nom" size="1"> | ||
22 | + <OPTION>Noir | ||
23 | + <OPTION>Sombre | ||
24 | + <OPTION>Lumineux | ||
25 | + <OPTION>Très lumineux | ||
26 | + </SELECT> | ||
27 | + </FORM> | ||
28 | +</html> | ||
29 | + | ||
30 | +<form method="post" action="traitement.php"> | ||
31 | + <p> | ||
32 | + <label for="temp_donnée">Température: </label> | ||
33 | + <input type="text" name="temp_donnée" id="temp_donnée" placeholder="Ex : 20" size="10" maxlength="4" /> | ||
34 | + </p> | ||
35 | +</form> | ||
36 | + | ||
37 | + | ||
38 | +<form method="post" action="traitement.php"> | ||
39 | + <p> | ||
40 | + <label for="humidité_donnée">Humidité: </label> | ||
41 | + <input type="text" name="humidité_donnée" id="humidité_donnée" placeholder="Ex : 15" size="10" maxlength="4" /> | ||
42 | + </p> | ||
43 | +</form> | ||
44 | +</html> | ||
45 | + | ||
46 | + | ||
47 | +<H2> Données lues sur la Station testée </H2> | ||
48 | + | ||
49 | +</html> | ||
50 | + | ||
51 | +<form method="post" action="traitement.php"> | ||
52 | + <p> | ||
53 | + <label for="modèle station météo">Référence: </label> | ||
54 | + <input type="text" name="code" id="code" size="10" maxlength="4" /> | ||
55 | + </p> | ||
56 | +</form> | ||
57 | + | ||
58 | +<script language="javascript" src="p1.js"> </script> | ||
59 | +<p> Lumiére </p> | ||
60 | + <FORM> | ||
61 | + <SELECT name="nom" size="1"> | ||
62 | + <OPTION>Fonctionne | ||
63 | + <OPTION>Ne fonctionne pas | ||
64 | + </SELECT> | ||
65 | + </FORM> | ||
66 | +</html> | ||
67 | + | ||
68 | + | ||
69 | +<script language="javascript" src="p1.js"> </script> | ||
70 | +<p> Vent </p> | ||
71 | + <FORM> | ||
72 | + <SELECT name="nom" size="1"> | ||
73 | + <OPTION>Fonctionne | ||
74 | + <OPTION>Ne fonctionne pas | ||
75 | + </SELECT> | ||
76 | + </FORM> | ||
77 | +</html> | ||
78 | + | ||
79 | + | ||
80 | + | ||
81 | +</html> | ||
82 | + | ||
83 | +<script language="javascript" src="p1.js"> </script> | ||
84 | +<p> Humidité </p> | ||
85 | + <FORM> | ||
86 | + <SELECT name="nom" size="1"> | ||
87 | + <OPTION>Fonctionne | ||
88 | + <OPTION>Ne fonctionne pas | ||
89 | + </SELECT> | ||
90 | + </FORM> | ||
91 | +</html> | ||
92 | + | ||
93 | + | ||
94 | + | ||
95 | +<script language="javascript" src="p1.js"> </script> | ||
96 | +<p> Température </p> | ||
97 | + <FORM> | ||
98 | + <SELECT name="nom" size="1"> | ||
99 | + <OPTION>Fonctionne | ||
100 | + <OPTION>Ne fonctionne pas | ||
101 | + </SELECT> | ||
102 | + </FORM> | ||
103 | + | ||
104 | + <input type="button" value="Validez" onclick="alert("Validez")"> | ||
105 | +</html> | ||
106 | + | ||
107 | +</html> | ||
108 | + | ||
109 | + |
@@ -0,0 +1,123 @@ | @@ -0,0 +1,123 @@ | ||
1 | +#include <stdio.h> | ||
2 | +#include <stdlib.h> | ||
3 | +#include <string.h> | ||
4 | +#include <unistd.h> | ||
5 | +#include <termios.h> | ||
6 | + | ||
7 | +#include "serial.h" | ||
8 | + | ||
9 | + | ||
10 | +#define SERIAL_DEVICE "/dev/ttyACM0" | ||
11 | +#include <libwebsockets.h> | ||
12 | + | ||
13 | +#define MAX_FRAME_SIZE 1024 | ||
14 | +#define WAIT_DELAY 50 | ||
15 | + | ||
16 | +int sd; | ||
17 | + | ||
18 | +//balek de ça | ||
19 | +static int callback_http(struct libwebsocket_context *this,struct libwebsocket *wsi,enum libwebsocket_callback_reasons reason,void *user,void *in,size_t len) | ||
20 | +{ | ||
21 | + return 0; | ||
22 | +} | ||
23 | + | ||
24 | +//le plus important est ici | ||
25 | +static int callback_my(struct libwebsocket_context * this,struct libwebsocket *wsi,enum libwebsocket_callback_reasons reason,void *user,void *in,size_t len) | ||
26 | +{ | ||
27 | + | ||
28 | + static char *message=NULL; | ||
29 | + static int msize=0; | ||
30 | + | ||
31 | + | ||
32 | + | ||
33 | + switch(reason) | ||
34 | + { | ||
35 | + case LWS_CALLBACK_ESTABLISHED: / | ||
36 | + printf("connection established\n"); | ||
37 | + message=NULL; | ||
38 | + | ||
39 | + libwebsocket_callback_on_writable(this,wsi); | ||
40 | + break; | ||
41 | + case LWS_CALLBACK_RECEIVE: | ||
42 | + | ||
43 | + printf("received data: %s\n",(char *)in); | ||
44 | + | ||
45 | + message=malloc(len+LWS_SEND_BUFFER_PRE_PADDING+LWS_SEND_BUFFER_POST_PADDING); | ||
46 | + | ||
47 | + if(message==NULL) | ||
48 | + { | ||
49 | + perror("callback_my.malloc"); exit(EXIT_FAILURE); | ||
50 | + } | ||
51 | + e + le début du buffer d'envoi "LWS_SEND_BUFFER_PRE_PADDING" | ||
52 | + memcpy(message+LWS_SEND_BUFFER_PRE_PADDING,in,len); | ||
53 | + | ||
54 | + msize=len; | ||
55 | + // on envoie a l'arduiono la valeur envoyé par le site web | ||
56 | + write(sd,message,(len+LWS_SEND_BUFFER_PRE_PADDING+LWS_SEND_BUFFER_POST_PADDING)); | ||
57 | + libwebsocket_callback_on_writable(this,wsi); | ||
58 | + break; | ||
59 | + case LWS_CALLBACK_SERVER_WRITEABLE: | ||
60 | + | ||
61 | + if(message!=NULL) | ||
62 | + { | ||
63 | + | ||
64 | + read(sd,message,len+LWS_SEND_BUFFER_PRE_PADDING+LWS_SEND_BUFFER_POST_PADDING); | ||
65 | + | ||
66 | + char *out=message+LWS_SEND_BUFFER_PRE_PADDING; | ||
67 | + | ||
68 | + | ||
69 | + libwebsocket_write(wsi,(unsigned char *)out,msize,LWS_WRITE_TEXT); | ||
70 | + | ||
71 | + free(message); | ||
72 | + message=NULL; | ||
73 | + } | ||
74 | + break; | ||
75 | + default: | ||
76 | + break; | ||
77 | + } | ||
78 | + return 0; | ||
79 | +} | ||
80 | + | ||
81 | +static struct libwebsocket_protocols protocols[] = { | ||
82 | + { | ||
83 | + "http-only", // name | ||
84 | + callback_http, // callback | ||
85 | + 0, // data size | ||
86 | + 0 // maximum frame size | ||
87 | + }, | ||
88 | + {"myprotocol",callback_my,0,MAX_FRAME_SIZE}, | ||
89 | + {NULL,NULL,0,0} | ||
90 | + }; | ||
91 | + | ||
92 | + | ||
93 | + | ||
94 | +int main(void) | ||
95 | +{ | ||
96 | + int port=9000; | ||
97 | + struct lws_context_creation_info info; | ||
98 | + memset(&info,0,sizeof info); | ||
99 | + info.port=port; | ||
100 | + info.protocols=protocols; | ||
101 | + info.gid=-1; | ||
102 | + info.uid=-1; | ||
103 | + struct libwebsocket_context *context=libwebsocket_create_context(&info); | ||
104 | + | ||
105 | + // communication port série arduino | ||
106 | + int c=0; | ||
107 | + sd=serialOpen(SERIAL_DEVICE,SERIAL_BOTH); | ||
108 | + serialConfig(sd,B9600); | ||
109 | + | ||
110 | + if(context==NULL) | ||
111 | + { | ||
112 | + fprintf(stderr, "libwebsocket init failed\n"); | ||
113 | + return -1; | ||
114 | + } | ||
115 | + printf("starting server...\n"); | ||
116 | + | ||
117 | + while(1) | ||
118 | + { | ||
119 | + libwebsocket_service(context,WAIT_DELAY); | ||
120 | + } | ||
121 | + libwebsocket_context_destroy(context); | ||
122 | + return 0; | ||
123 | +} |