From f3d8bf268dfcd03b8027a9b8b0a2e7a124a1fd43 Mon Sep 17 00:00:00 2001 From: fabrice Date: Sun, 18 Jun 2017 21:36:42 +0200 Subject: [PATCH] fichiers finaux --- arduino/progr_final.ino | 281 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ fpga/Capture.PNG | Bin 0 -> 74809 bytes fpga/Sheet1.SchDoc | Bin 0 -> 41472 bytes site web/page.html | 109 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ websocket/websocket.c | 123 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 513 insertions(+), 0 deletions(-) create mode 100644 arduino/progr_final.ino create mode 100644 fpga/Capture.PNG create mode 100644 fpga/Sheet1.SchDoc create mode 100644 site web/page.html create mode 100644 websocket/websocket.c diff --git a/arduino/progr_final.ino b/arduino/progr_final.ino new file mode 100644 index 0000000..75b5b31 --- /dev/null +++ b/arduino/progr_final.ino @@ -0,0 +1,281 @@ +//programme principal + +#define Lampe 3 +#define venti 4 +#define photocellPin 0 + +#include + +#define SLAVE_ADDRESS 0x12 +int dataReceived = 0; + +int temp;//en dégres > Reception de la Raspberry +int lum; // en pourcent +int vent; // en pourcent + + +int temp_m;//envoie vers la raspb +int lum_m; +int hum_m; + +int photocellReading; +int envoie; +/* brochage de la carte arduino + */ +const byte resitanceChauf= A0; +const byte ventilateur=A1; + + +/** Broche "DATA" du capteur */ +const byte BROCHE_CAPTEUR = 5; + +/* Code d'erreur de la fonction readDHT11() et readDHT22() */ +const byte DHT_SUCCESS = 0; // Pas d'erreur +const byte DHT_TIMEOUT_ERROR = 1; // Temps d'attente dépassé +const byte DHT_CHECKSUM_ERROR = 2; // Données reçues erronées + +void setup() { + // put your setup code here, to run once: + Serial.begin(9600); + Wire.begin(SLAVE_ADDRESS); + Wire.onReceive(receiveData); + Wire.onRequest(sendData); + pinMode(Lampe,OUTPUT); + pinMode (venti,OUTPUT); + + /* Place la broche du capteur en entrée avec pull-up */ + pinMode(BROCHE_CAPTEUR, INPUT_PULLUP); + +} + + + +void loop() { + + float temperature, humidity; + + // création des trames pour la com rasp + + //lecture des données + temp = dataReceived/1000000; + vent = (dataReceived /1000)-temp; + lum= dataReceived -vent -temp; + cmd_vent(vent); + cmd_lampe(lum); + if ( temp_m >= temp ) + { + cmd_temp(false); + } + else + { + + cmd_temp(true); + } + + + + /* Lecture de la température et de l'humidité, avec gestion des erreurs */ + // N.B. Remplacer readDHT11 par readDHT22 en fonction du capteur utilisé ! + switch (readDHT11(BROCHE_CAPTEUR, &temperature, &humidity)) { + case DHT_SUCCESS: + + /* Affichage de la température et du taux d'humidité */ + /*Serial.print(F("Humidite (%): ")); + Serial.println(humidity, 2); + Serial.print(F("Temperature (^C): ")); + Serial.println(temperature, 2);*/ + temp_m=temperature; + hum_m=humidity; + break; + + case DHT_TIMEOUT_ERROR: + Serial.println(F("Pas de reponse !")); + break; + + case DHT_CHECKSUM_ERROR: + Serial.println(F("Pb de communication !")); + break; + } + lum=cpt_lum(); + + // envoie des données ic2 + envoie = temp_m * 1000000 + hum_m *1000 +lum_m; + /* Pas plus d'une mesure par seconde */ +} +int cpt_lum() +{ + photocellReading = analogRead(photocellPin); + + //faire la conversion valeur vers lux + + return photocellReading; + +} +void cmd_lampe(float lum) +{ + + // conversion vent a faire une fois le dome concu + lum = (lum/100)*255 ;// commande en pourcentage pour l'instant + analogWrite(Lampe,lum); + +} +void cmd_vent(float vent) +{ + + // conversion vent a faire une fois le dome concu + vent = (vent/100)*255 ;// commande en pourcentage pour l'instant + analogWrite(ventilateur,vent); + +} +void cmd_temp(bool actif) +{ + if ( actif) + { + analogWrite(resitanceChauf,200); + } + else + { + analogWrite(resitanceChauf,0); + } + } +// communication i2c entre raspeberrry et arduino +void receiveData(int byteCount){ + while(Wire.available()) { + dataReceived = Wire.read(); + } +} + +void sendData(){ + Wire.write(envoie); +} + + /* + * Lit la température et le taux d'humidité mesuré par un capteur DHT11. + * + * @param pin Broche sur laquelle est câblée le capteur. + * @param temperature Pointeur vers la variable stockant la température. + * @param humidity Pointeur vers la variable stockant le taux d'humidité. + * @return DHT_SUCCESS si aucune erreur, DHT_TIMEOUT_ERROR en cas de timeout, ou DHT_CHECKSUM_ERROR en cas d'erreur de checksum. + */ +byte readDHT11(byte pin, float* temperature, float* humidity) +{ + + /* Lit le capteur */ + byte data[5]; + byte ret = readDHTxx(pin, data, 18, 1000); + + /* Détecte et retourne les erreurs de communication */ + if (ret != DHT_SUCCESS) + return ret; + + /* Calcul la vraie valeur de la température et de l'humidité */ + *humidity = data[0]; + *temperature = data[2]; + + /* Ok */ + return DHT_SUCCESS; +} + +/** + * Fonction bas niveau permettant de lire la température et le taux d'humidité (en valeurs brutes) mesuré par un capteur DHTxx. + */ +byte readDHTxx(byte pin, byte* data, unsigned long start_time, unsigned long timeout) +{ + data[0] = data[1] = data[2] = data[3] = data[4] = 0; + // start_time est en millisecondes + // timeout est en microsecondes + + /* Conversion du numéro de broche Arduino en ports / masque binaire "bas niveau" */ + uint8_t bit = digitalPinToBitMask(pin); + uint8_t port = digitalPinToPort(pin); + volatile uint8_t *ddr = portModeRegister(port); // Registre MODE (INPUT / OUTPUT) + volatile uint8_t *out = portOutputRegister(port); // Registre OUT (écriture) + volatile uint8_t *in = portInputRegister(port); // Registre IN (lecture) + + /* Conversion du temps de timeout en nombre de cycles processeur */ + unsigned long max_cycles = microsecondsToClockCycles(timeout); + + /* Evite les problèmes de pull-up */ + *out |= bit; // PULLUP + *ddr &= ~bit; // INPUT + delay(100); // Laisse le temps à la résistance de pullup de mettre la ligne de données à HIGH + + /* Réveil du capteur */ + *ddr |= bit; // OUTPUT + *out &= ~bit; // LOW + delay(start_time); // Temps d'attente à LOW causant le réveil du capteur + // N.B. Il est impossible d'utilise delayMicroseconds() ici car un délai + // de plus de 16 millisecondes ne donne pas un timing assez précis. + + /* Portion de code critique - pas d'interruptions possibles */ + noInterrupts(); + + /* Passage en écoute */ + *out |= bit; // PULLUP + delayMicroseconds(40); + *ddr &= ~bit; // INPUT + + /* Attente de la réponse du capteur */ + timeout = 0; + while(!(*in & bit)) { /* Attente d'un état LOW */ + if (++timeout == max_cycles) { + interrupts(); + return DHT_TIMEOUT_ERROR; + } + } + + timeout = 0; + while(*in & bit) { /* Attente d'un état HIGH */ + if (++timeout == max_cycles) { + interrupts(); + return DHT_TIMEOUT_ERROR; + } + } + + /* Lecture des données du capteur (40 bits) */ + for (byte i = 0; i < 40; ++i) { + + /* Attente d'un état LOW */ + unsigned long cycles_low = 0; + while(!(*in & bit)) { + if (++cycles_low == max_cycles) { + interrupts(); + return DHT_TIMEOUT_ERROR; + } + } + + /* Attente d'un état HIGH */ + unsigned long cycles_high = 0; + while(*in & bit) { + if (++cycles_high == max_cycles) { + interrupts(); + return DHT_TIMEOUT_ERROR; + } + } + + /* Si le temps haut est supérieur au temps bas c'est un "1", sinon c'est un "0" */ + data[i / 8] <<= 1; + if (cycles_high > cycles_low) { + data[i / 8] |= 1; + } + } + + /* Fin de la portion de code critique */ + interrupts(); + + /* + * Format des données : + * [1, 0] = humidité en % + * [3, 2] = température en degrés Celsius + * [4] = checksum (humidité + température) + */ + + /* Vérifie la checksum */ + byte checksum = (data[0] + data [1] + data[2] + data[3]) & 0xff; + if (data[4] != checksum) + return DHT_CHECKSUM_ERROR; /* Erreur de checksum */ + else + return DHT_SUCCESS; /* Pas d'erreur */ + +} + diff --git a/fpga/Capture.PNG b/fpga/Capture.PNG new file mode 100644 index 0000000..e7781ff Binary files /dev/null and b/fpga/Capture.PNG differ diff --git a/fpga/Sheet1.SchDoc b/fpga/Sheet1.SchDoc new file mode 100644 index 0000000..dbe0e1f Binary files /dev/null and b/fpga/Sheet1.SchDoc differ diff --git a/site web/page.html b/site web/page.html new file mode 100644 index 0000000..9c4edd0 --- /dev/null +++ b/site web/page.html @@ -0,0 +1,109 @@ + + +

BANC TEST DE STATION METEOROLOGIQUE

+ +

Commande des paramètres

+ + +

Vent

+
+ +
+ + +

Lumière

+
+ +
+ + +
+

+ + +

+
+ + +
+

+ + +

+
+ + + +

Données lues sur la Station testée

+ + + +
+

+ + +

+
+ + +

Lumiére

+
+ +
+ + + + +

Vent

+
+ +
+ + + + + + + +

Humidité

+
+ +
+ + + + + +

Température

+
+ +
+ + + + + + + diff --git a/websocket/websocket.c b/websocket/websocket.c new file mode 100644 index 0000000..97f438b --- /dev/null +++ b/websocket/websocket.c @@ -0,0 +1,123 @@ +#include +#include +#include +#include +#include + +#include "serial.h" + + +#define SERIAL_DEVICE "/dev/ttyACM0" +#include + +#define MAX_FRAME_SIZE 1024 +#define WAIT_DELAY 50 + +int sd; + +//balek de ça +static int callback_http(struct libwebsocket_context *this,struct libwebsocket *wsi,enum libwebsocket_callback_reasons reason,void *user,void *in,size_t len) +{ + return 0; +} + +//le plus important est ici +static int callback_my(struct libwebsocket_context * this,struct libwebsocket *wsi,enum libwebsocket_callback_reasons reason,void *user,void *in,size_t len) +{ + + static char *message=NULL; + static int msize=0; + + + + switch(reason) + { + case LWS_CALLBACK_ESTABLISHED: / + printf("connection established\n"); + message=NULL; + + libwebsocket_callback_on_writable(this,wsi); + break; + case LWS_CALLBACK_RECEIVE: + + printf("received data: %s\n",(char *)in); + + message=malloc(len+LWS_SEND_BUFFER_PRE_PADDING+LWS_SEND_BUFFER_POST_PADDING); + + if(message==NULL) + { + perror("callback_my.malloc"); exit(EXIT_FAILURE); + } + e + le début du buffer d'envoi "LWS_SEND_BUFFER_PRE_PADDING" + memcpy(message+LWS_SEND_BUFFER_PRE_PADDING,in,len); + + msize=len; + // on envoie a l'arduiono la valeur envoyé par le site web + write(sd,message,(len+LWS_SEND_BUFFER_PRE_PADDING+LWS_SEND_BUFFER_POST_PADDING)); + libwebsocket_callback_on_writable(this,wsi); + break; + case LWS_CALLBACK_SERVER_WRITEABLE: + + if(message!=NULL) + { + + read(sd,message,len+LWS_SEND_BUFFER_PRE_PADDING+LWS_SEND_BUFFER_POST_PADDING); + + char *out=message+LWS_SEND_BUFFER_PRE_PADDING; + + + libwebsocket_write(wsi,(unsigned char *)out,msize,LWS_WRITE_TEXT); + + free(message); + message=NULL; + } + break; + default: + break; + } + return 0; +} + +static struct libwebsocket_protocols protocols[] = { + { + "http-only", // name + callback_http, // callback + 0, // data size + 0 // maximum frame size + }, + {"myprotocol",callback_my,0,MAX_FRAME_SIZE}, + {NULL,NULL,0,0} + }; + + + +int main(void) +{ + int port=9000; + struct lws_context_creation_info info; + memset(&info,0,sizeof info); + info.port=port; + info.protocols=protocols; + info.gid=-1; + info.uid=-1; + struct libwebsocket_context *context=libwebsocket_create_context(&info); + + // communication port série arduino + int c=0; + sd=serialOpen(SERIAL_DEVICE,SERIAL_BOTH); + serialConfig(sd,B9600); + + if(context==NULL) + { + fprintf(stderr, "libwebsocket init failed\n"); + return -1; + } + printf("starting server...\n"); + + while(1) + { + libwebsocket_service(context,WAIT_DELAY); + } + libwebsocket_context_destroy(context); + return 0; +} -- libgit2 0.21.2