You are on page 1of 39

2012

Station mto autonome

MAITRE Ghyslain et VERNEAUX Roland Licence 3 REL EEA 05/05/2012

Station mto autonome 2012


I.
II. III. IV. V. A. B. C. D. VI. A. B. VII. A. B. C. D. VIII. A. B. 1. 2. C. D. IX. A. B. C. D. E. X. A. B. XI. A. B. C. XII. XIII. XIV. XV.

Table des matires


Introduction ............................................................................................................................................................................................ 2 Cahier des charges ............................................................................................................................................................................. 2 Schma Synoptique de la station mto ........................................................................................................................................... 2 Le microcontrleur .................................................................................................................................................................................. 3 Choix du microcontrleur .................................................................................................................................................................. 3 Prise en main du microcontrleur ..................................................................................................................................................... 4 Schma du microcontrleur avec la LED ............................................................................................................................................ 4 Programme pour faire clignoter la LED .............................................................................................................................................. 5 Lcran LCD ........................................................................................................................................................................................ 5 Schma du microcontrleur avec lcran LCD ................................................................................................................................... 5 Programme pour lcran LCD ............................................................................................................................................................. 6 Le capteur dhumidit........................................................................................................................................................................ 7 Caractristiques du capteur dhumidit ............................................................................................................................................ 7 Configuration du microcontrleur ..................................................................................................................................................... 9 Le schma du microcontrleur avec le capteur dhumidit ............................................................................................................. 11 Programme pour la mesure de lhumidit ....................................................................................................................................... 11 Le capteur de temprature .............................................................................................................................................................. 13 Le protocole I2C ............................................................................................................................................................................... 13 Caractristique du DS1621 .............................................................................................................................................................. 14 Spcificit des commandes ........................................................................................................................................................ 14 Dialogue I2C pour avoir la temprature ..................................................................................................................................... 16 Le schma du microcontrleur avec le capteur de temprature ..................................................................................................... 17 Programme pour la mesure de la temprature ............................................................................................................................... 17 Lanmomtre ................................................................................................................................................................................. 19 Conception ...................................................................................................................................................................................... 19 Mesure de la priode sur le microcontrleur .................................................................................................................................. 20 Etalonnage de lanmomtre .......................................................................................................................................................... 22 Le schma du microcontrleur avec lanmomtre ........................................................................................................................ 23 Programme pour la mesure de la vitesse du vent ........................................................................................................................... 24 Simulation, une station mto autonome ............................................................................................................................................ 26 La structure du programme ............................................................................................................................................................. 26 La simulation ................................................................................................................................................................................... 27 Transmission des donnes par liaison ZigBee .................................................................................................................................. 28 Schma lectrique du module Xbee ................................................................................................................................................ 29 Envoi des donnes la liaison Usart ................................................................................................................................................... 29 Programme denvoi des donnes par liaison Usart ......................................................................................................................... 30 Estimation du cot du projet ........................................................................................................................................................... 31 English summary.............................................................................................................................................................................. 32 Conclusion ....................................................................................................................................................................................... 33 ANNEXES.......................................................................................................................................................................................... 34

Station mto autonome 2012


II. Introduction

Dans le cadre de notre formation L3 EEA (lectrotechnique lectronique automatique), il nous a t demand de concevoir et raliser un systme pluridisciplinaire de notre choix partir dun cahier des charges. Un projet o il faut organiser son travail, et tre capable de le prsenter par crit (rapport) et oralement. Lobjectif principal de ce travail est de faire le lien entre lensemble des enseignements disciplinaire et de valider notre autonomie. Dans ce rapport nous prsenterons notre projet, une station mto autonome conue et programme par nos soins. Nous dtaillerons chaque fonction de la station avec, dans chaque partie son schma, son programme associ et lexplication des points importants. Nous finirons par une conclusion, qui rappellerons les grandes lignes de notre projet, les connaissances et les acquis apport par ce module ainsi que le ressenti et notre avis suite au projet.

III.

Cahier des charges

Le projet dune station mto autonome est constitu de plusieurs objectifs clairs et bien prcis, qui nous ont permis de progresser par tape : Mettre en uvre un capteur dhumidit (liaison analogique). Conception et mise en uvre dun anmomtre (Mesure dune frquence convertie en vitesse (m/s)) Mettre en uvre deux capteurs de temprature numriques (DS1621) mesurant la temprature intrieure et extrieure (la liaison avec le capteur de temprature se fera directement sur le PC). Affichage des donnes sur un cran LCD. Une liaison sans fil type Xbee pour envoyer les donnes aux PC. Affichage des donnes sur un cran PC sous labview.

On remarquera que chaque capteur utilise une technologie diffrente, ce qui en fait un projet polyvalent.

IV.

Schma Synoptique de la station mto

Pour plus de comprhension, nous avons commenc, partir du cahier des charges, le synoptique complet de la station mto. On y trouve tous les lments cits prcdemment dans le cahier des charges.

Station mto autonome 2012


Capteur dhumidit Ecran LCD

Microcontrleur
Capteur de temprature extrieure

Emetteur ZigBee

PIC16F876
Rcepteur ZigBee

PC

Anmomtre Capteur de temprature intrieure

V.

Le microcontrleur
A. Choix du microcontrleur

Comme on peut voir prcdemment que le microcontrleur choisi, est un PIC16F876 (cf. figure 1) celui-ci nous as t conseill par notre quipe pdagogique. Nous avons quand mme pris soin de vrifier globalement si le nombre dentre et de sortie taient suffisants pour le nombre dlments utiliss, en survolant pour chacun dentre eux leur datasheet.

Figure 1 : Schma du PIC16F876.

Station mto autonome 2012


B. Prise en main du microcontrleur

Nayant jamais programm sur un microcontrleur, notre quipe pdagogique nous a conseill de commencer par nous familiariser avec le PIC laide dun mini TP. Ce TP dinitiation propos par le logiciel Mikroelektronika, marque du logiciel utilis pour programmer le PIC (MikroC), consiste faire clignoter une LED. Pour le quartz, qui dfinit la frquence dhorloge, on nous a donn un 20Mhz. Pour choisir les condensateurs, nous avons regard dans la datasheet du quartz :

Au vue de cette datasheet nous avons pris des condensateurs de 22pF car ils taient notre disposition.

C.

Schma du microcontrleur avec la LED

Nous avons donc commenc par implanter les composants et les cbler entre eux sur la platine quon nous a fourni. Comme vous pouvez le voir sur la figure 2, le schma de la partie LED tabli sur le logiciel Proteus ISIS 7.8. Cest ce Logiciel qui nous a permis tout au long du projet de faire les schmas et les simulations.

Figure 2 : Schma avec la LED.

On peut voir sur le schma de la figure 2 quil ya un bornier brancher sur les bornes RB6, RB7 et Vpp. Il reprsente en fait le cble USB qui va au PC. Ce cble nous permet de transfrer le programme. Par la suite nous ne le reprsenterons plus, de mme pour chaque partie nous reprsenterons que les capteurs en question. Ceci pour un souci de clart.

Station mto autonome 2012


D. Programme pour le clignotement de la LED

Nous avons ensuite laide du TP et du logiciel MikroC, programm le microcontrleur pour faire clignoter une LED. Une initiation qui nous a permis de comprendre un peu mieux le fonctionnement de celui-ci notamment au niveau des dclarations des bornes. Voici le programme tablit avec a description :
void main() { PORTC=0; //Initialisation du port C PORTB=0; //Initialisation du port B TRISC=0; TRISB=0; //Le port C affect en sortie //Le port B affect en sortie

while(1)//Boucle infinie { PORTC.F7 = ~PORTC.F7; //Allume/teint la LED Delay_ms(1000); //Temporisation de 1 seconde } }

VI.

Lcran LCD

Ensuite nous sommes rentr dans le vif du sujet, nous avons install, programm lcran LCD et essay dafficher des caractres dessus. Nous avons aussi rajout un bouton poussoir en vue de prparer le terrain pour la suite du projet.

A.

Schma du microcontrleur avec lcran LCD

Figure 3 : schma avec cran LCD et le bouton poussoir.

Station mto autonome 2012


Pour cbler lcran LCD nous nous sommes aids de sa datasheet ainsi que laide du logiciel MikroC. Le point qui nous semble important est la borne R(read)/W(write). On peut voir quelle est connecte la masse. En effet, pour crire sur lcran il faut mettre R/W = 0, pour lire on le met 1.

B.

Programme pour lcran LCD

Voici un petit exemple de programme qui utilise la fois le bouton poussoir et qui affiche du texte sur lcran LCD :
void main() { int cond=0, BP=0; /******************Initialisation et affectation des ports**************************/ PORTB=0; PORTA=0; TRISB=0; TRISA = 0xFF; ADCON1 = 0x84; //Initialisation du port B //Initialisation du port A //Le port B affect en sortie //Port A en entre //RA2 en entre

/******************Configuration et initialisation de l'cran LCD*******************/ Lcd_Config(&PORTB, 0, 1, WR, 5, 4, 3, 2); Lcd_Init(&PORTB); Lcd_Cmd(Lcd_CURSOR_OFF); Lcd_Cmd(Lcd_CLEAR); //Configure l'cran //initialisation du LCD //Enlve le curseur //Efface l'cran

/**********************Boucle infini*****************************************/ while(1) {cond=cond+1; switch(BP) {case 0: if(PORTA.F2==1) {BP=1; Delay_ms(250); } if(cond==1000) {Lcd_Cmd(Lcd_CLEAR); Lcd_Out(1, 1, "Bonjour..."); } break; case 1: if(PORTA.F2==1) {BP=0; Delay_ms(250); } if(cond==1000) {Lcd_Cmd(Lcd_CLEAR); Lcd_Out(1, 1, "Mme Leymarie !"); } break ; } } }

//Ces if permet de changer la valeur de BP //Temps qu'on relche bien le bouton

//Affiche Bonjour ligne 1 colonne 1

Station mto autonome 2012


Fonctionnement de ce programme : Affiche bonjour sur lcran LCD Appuie sur le BP Affiche Mme Leymarie ! sur lcran LCD Appuie sur le BP Affiche bonjour sur lcran LCD Etc.

Les fonctions de lcran LCD sont expliques dans laide du logiciel MikroC. La variable cond est une condition pour ne pas afficher le mot chaque boucle mais tous les 1000 itrations ce qui permet de ne pas faire clignoter lcran. ADCON1 sera expliqu la suite de ce rapport.

VII. Le capteur dhumidit


Aprs avoir pris en main lcran LCD ainsi que le logiciel, nous avons dcid dinstaller le capteur dhumidit. On nous a mis disposition un capteur dhumidit de rfrence HIH4000-001. Cest un capteur qui renvoie une tension analogique (cf. figure 4). Nous avons commenc par chercher sa datasheet et regarder les proprits du capteur.

Figure 4 : Capteur d'humidit HIH 4000-001

A.

Caractristiques du capteur dhumidit

Voici les proprits importantes du capteur donne par la notice : Gamme d'humidit : 0% 100% RH (Relative Humidity) avec une Prcision de 3.5% RH Gamme de tension d'alimentation : 4V 5.8V Temprature de fonctionnement : -40C +85C (-40 F to 185 F) Courant, alimentation : 500A Sortie Analogique

Station mto autonome 2012


Pour ce qui est lquation de la tension en fonction de lhumidit, le constructeur nous donne la courbe dtalonnage suivante (cf. figure 5) : De cette courbe nous en avons tir les valeurs suivantes (cf. figure 6) :

Figure 6 : tableau de mesure.

Figure 5 : Courbes donne par le constructeur.

Nous avons ensuite dcid de la retracer sur Excel et den tirer lquation qui sera utilis dans le programme du microcontrleur.

Figure 7 : Courbe trac sur Excel.

On voit quExcel nous donne lquation suivante : U=0.031*H +0.81 Donc H= (U-0.81)/0.031 De plus nous multiplierons par 1000 la valeur de H pour pouvoir rcuprer les chiffres dcimales, et les rentrer dans une chaine de caractres et les afficher sur lcran LCD : H= (U*810)/0.031 La valeur maximum de H est donc de 100 000 nous la dclarerons donc en long (une dclaration en int ne serais pas suffisant : -32768 32767).

Station mto autonome 2012


Nous avons remarqu sur la courbe ainsi quen simulation, que le capteur peut avoir des valeurs suprieur 100% et infrieur 0%. Il faudra donc mettre deux conditions pour ne pas dpasser la plage de valeur.

B.

Configuration du microcontrleur

Maintenant nous arrivons point important de cette partie celle de la configuration des ports du microcontrleur. En effet le PIC16F876 est constitu dun module convertisseur 5 entres. Ces entres sont situes sur les bornes RA0 RA1 RA2 RA3 et RA5 (cf. figure1). Le rsultat de la conversion est cod sur 10 bits. Cest une valeur comprise entre h000 et h3FF : h3FF = b1 1111 1111 = d1023 Pour mesurer la tension il faut la convertir dans la structure du programme en sachant que la valeur est comprise entre 0 et 1023 et que la tension maximum est de 5V. On en tire cette quation : U = (Valeur lue sur le CAN * 5)/1023 Pour les mme raison que lquation du capteur dhumidit nous avons multipli par 1000 la tension nous obtenons donc : U= (Valeur lue sur le CAN * 5000)/1023 Il faut ensuite rgler les entres analogiques avec les registres ADCON0 et ADCON1 en sachant que nous avons dcid de brancher le capteur sur la bornes RA0 :

Bit 7 et bit 6 : ADSC1 et ADSC0 = Clock Select bits. Ces 2 bits permettent de choisir la vitesse de conversion : 00= Fosc (Frquence doscillation)/2. 01= Fosc/8. 10= Fosc/32. 11= Oscillateur RC interne. Pour que la conversion soit correct il faut que T(ad) soit au minimum de 1.6s. nous disposons dun quartz de 20Mhz => 20Mhz/32 => 1.6s. Nous mettrons donc le bit 7 1 et le 6 0. Bit 5 bit4 et bit 3 : CHS2 CHS1 et CHS0 = Channel Select bits. Ces 3 bits permettent de choisir l'entre qui va tre convertie.

Station mto autonome 2012


Nous voulons convertir lentre RA0 pour cela il faut mettre les bits 5, 4, 3 0. Bit 2 : GO/DONE : Status bit si ADON=1. 1 = Dmarre la conversion A/D. Ce bit est remis "0" par hard. 0 = La conversion A/D est termine. Il nous faut dmarrer la conversion. Bit 1 : Bit non implant. Bit 0 : ADON : A/D on bit. 1= Convertisseur A/D en service. 0 = Convertisseur A/D l'arrt. Il nous faut mettre le convertisseur en service. ADCON0 = b1000 0101 = h85

Bit 7 : ADFM = A/D Result format. 1 = Justifi droite. 0 = Justifi gauche. Nous avons justifi droite. Bit 6 bit 5 et bit 4 : Bits non implments. Bit 3 bit 2 bit 1 et bit 0 : PCFG3 PCFG2 PCFG1 et PCFG0 Bits de contrle de la configuration des Ports. Ces bits permettent de choisir le partage entre entres analogiques et digitales sur les PORTS A et E. On a choisi dactiver RA0, RA1 et RA3 en entre analogique les autres resteront en digitales, ce qui signifie quau vue de la datasheet, il faut mettre le bit 2 1 et les autres 0. ADCON1 = b10000100 = h84

10

Station mto autonome 2012


C. Le schma du microcontrleur avec le capteur dhumidit

Voici le schma de cblage du capteur dhumidit uniquement. A noter que le capteur est remplac par un potentiomtre ntant pas dans la librairie de Proteus. On constate quil est bien branch sur RA0.

Figure 8 : Schma de cblage du capteur d'humidit.

D.

Programme pour la mesure de lhumidit

Voici le programme pour mesurer lhumidit, avec les affectations dcrites ci-dessus ainsi que les quations de conversions :
/******************Dclaration des fonctions****************************************/ void humidite(int *cond); void lcd(int li, int co, int nb, char receive[11]); /******************************************************************************/ void main() { /*****************************dclaration des variables*****************************/ int cond=0; //Condition pour l'affichage sur l'cran LCD /******************Initialisation et affectation des ports******************************/ PORTB=0; //initialisation TRISB=0; //Port B dclarer en sortie TRISA = 0xFF; //Port A en entre ADCON1 = 0x84; //Justifi droite active RA0/RA1/RA3 analogique ADCON0 = 0x85; //Fosc/32 sur PA0 en service /******************Configuration et initialisation de l'cran LCD***********************/ Lcd_Config(&PORTB, 0, 1, WR, 5, 4, 3, 2); //Configure l'cran Lcd_Init(&PORTB); //initialisation du LCD Lcd_Cmd(Lcd_CURSOR_OFF); //Enlve le curseur Lcd_Cmd(Lcd_CLEAR); //Efface l'cran

11

Station mto autonome 2012


/*****************************Boucle infinie****************************************/ while(1) { cond=cond+1; //Incrmente la variable cond humidite(&cond); //Appel la fonction humidit } } /*******************************Fonction humidit*********************************/ void humidite(int *cond) { long H, U, VL; //Dclaration des variables char HH, hum[8], humtxt[]="Humidite :"; VL=Adc_read(0); //Valeur lue sur RA0(humidit) U=(VL*5000)/1023; //Convertit la valeur lue en tension x1000 H=(U-810)/(0.031); //Convertit la tension en humidit x1000 if(H>100000) { H=100000; } if(H<0) { H=0; } hum[0]=(H/100000)+48; HH=(H/10000)%10; hum[1]=HH+48; HH=(H/1000)%10; hum[2]=HH+48; hum[3]=44;//Virgule affect en ascii HH=(H/100)%10; hum[4]=HH+48; HH=(H/10)%10; hum[5]=HH+48; hum[6]=37; if(*cond==1000)//Appel la fonction LCD tous les 1000 { lcd(1, 1, 10, humtxt); lcd(2, 1, 7, hum); *cond=0; } //Si H > 100%(impossible) alors = 100%

//Si H < 0%(impossible) alors = 0%

//Valeur des centaines affect en ascii(48=0) //Valeur des dizaines affect en ascii //Valeur des units affect en ascii

//Valeur de la premire dcimale affect en ascii //Valeur de la deuxime dcimale affect en ascii //Pourcentage affect en ascii

//Affiche la chaine de caractre humtxt sur le LCD //Affiche la chaine de caractre hum sur le LCD //Remise a 0 de la condition

} /*******************************Fonction affichage***********************************/ void lcd(int li, int co, int nb, char receive[11]) { int i; for(i=0; i<=nb ; i++)//Boucle for { Lcd_chr(li, (co+i), receive[i]); } }

//Affiche les caractres jusqu' i

On remarque que pour lire la valeur on utilise la fonction Adc_Read(n de la borne relever).

12

Station mto autonome 2012


VIII. Le capteur de temprature
A prsent, comme toute station mto, nous avons install un capteur de temprature le DS1621. Ce capteur communique avec le microcontrleur grce au protocole I2C.

A.

Le protocole I2C

Figure 9 : schma du DS1621.

Le bus I2C (Inter Integrated Circuit) a t dvelopp au dbut des annes 80 par Philips semiconductors, pour permettre de relier facilement un microprocesseur les diffrents circuits d'un tlviseur moderne. Le bus I2C permet de faire communiquer entre eux des composants lectroniques trs divers, grce seulement trois fils : Un signal de donne (SDA), un signal d'horloge (SCL), et un signal de rfrence lectrique (Masse) Ceci permet de raliser des quipements ayant des fonctionnalits trs puissantes (En apportant toute la puissance des systmes micro programms) et conservant un circuit imprim trs simple, par rapport un schma classique (8bits de donnes, 16 bits d'adresse + les bits de contrle). Les donnes sont transmises en srie 100Kbits/s en mode standard et jusqu' 400Kbits/s en mode rapide. Ce qui ouvre la porte de cette technologie toutes les applications o la vitesse n'est pas primordiale. Voici un exemple de protocole quutilise le bus I2C :

1. 2. 3. 4. 5. 6. 7. 8. 9.

Pour initier le dialogue, le matre cre une condition Start Le matre envoie l'adresse de l'esclave (1010100) suivi du bit 0 (bit Write) L'esclave rpond (accus de rception : bit Acknowledge) Le matre envoie l'adresse du registre (0x04) crire L'esclave rpond (accus de rception : bit Acknowledge) Le matre envoie la donne (0x27) crire L'esclave crit la donne puis envoie un accus de rception (bit Acknowledge) Le matre termine le dialogue avec une condition Stop Le bus I2C est maintenant libre (SCL = 1, SDA = 1 : niveaux de repos).

13

Station mto autonome 2012


B. Caractristique du DS1621

Comme on peut voir sur la figure 9 le capteur est compos de 8 bornes : SDA => Liaison srie entre sortie. SCL => Signal dhorloge Tout => Signal de sortie du thermostat (inutile dans notre cas) GND => Masse VDD => Alimentation +5V A0, A1, A2 => Entre dadressage (dans notre cas les 3 la masse car nous navons quun module I2C)

Les circuits connects sur un bus I2C ont des sorties de type drain ouvert (ou collecteur ouvert). Deux rsistances de pull-up sont bien sr places entre les lignes SDA, SCL et l'alimentation (VDD).Quand le bus n'est pas utilis, SDA et SCL sont au niveau haut (niveau de repos). 1. Spcificit des commandes

Tous dialogue du matre(PIC16F876) avec un DS1621 esclave doit dbuter par lenvoi dun mot de contrle :

Le matre envoi ensuite une commande, suivi ou non de donnes. Voici la liste des commandes avec leur description :

Les commandes AC, EE et 22 ne sont pas suivies de l'envoi de donnes. Par contre la commande AA qui nous intresse est suivie de lenvoi par le DS1621 de 2 octets reprsentant la temprature.

14

Station mto autonome 2012


Voici le registre de configuration(AC) quil nous faut dterminer :

DONE : "1" = conversion finie. "0" = conversion en cours. En mode 1 SHOT uniquement. THF : Flag seuil haut du thermostat. Passe "1" et y reste si temprature suprieure TH. TLF : Flag seuil bas du thermostat. Passe "1" et y reste si temprature infrieure TL. NVB : "1" = mmoire EEPROM en criture. "0" = mmoire EEPROM criture termine. Nous nactiverons pas lcriture de la mmoire. POL : Polarit de Tout (pin 3). "1" = actif sera un niveau HAUT. "0" = actif sera un niveau BAS. Il faut activer la polarit donc nous le mettons 1. ONE SHOT : "0" = conversion en continu. "1" = conversion 1 fois. Nous le mettons en mode continu. AC = b00001010 = h0A

La commande AA qui permet de lire la temprature renvoie 2 octets : MSB (Most Significant Bit) : Nombre sign donnant la temprature entre +125 et -55C. LSB (Least Significant Bit ) : Seul le bit 7 de cet octet est significatif. Si "1" temprature MSB +0,5C.

Pour bien comprendre comment est cod un nombre sign, un tableau avec des exemples de valeurs tait notre disposition dans la notice :

15

Station mto autonome 2012


2. Dialogue I2C pour avoir la temprature

Voici un schma qui montre le dialogue effectuer entre le microcontrleur et le capteur pour avoir la temprature. Cest grce ce mme schma que nous avons pu programmer le PIC :

16

Station mto autonome 2012


C. Le schma du microcontrleur avec le capteur de temprature

Voici le schma du capteur de temprature uniquement. Le capteur est branch sur les borne SCL(RC3) et SDA(RC4) du PIC; Quelles soient dclares en entre ou en sortie les bornes SCL et SDA sont fonctionnelles. Il ne faut pas oublier les rsistances de tirages (R1 et R3). Ladressage A0 A1 A2 toutes misent la masse car nous navons quun seul capteur I2C reli au PIC et le Tout (thermostat) inutile car nous faisons juste un relev de temprature :

Figure 10 : Schma de cblage avec le capteur de temprature.

D.

Programme pour la mesure de la temprature

/******************Dclaration des fonctions********************************************/ void temperature(int *cond); void lcd(int li, int co, int nb, char receive[14]); /***********************************************************************************/ void main() { /*****************************dclaration des variables*********************************/ int cond=0;//Condition pour l'affichage sur l'cran LCD /******************Initialisation et affectation des ports***********************************/ PORTB=0; //initialisation PORTC=0; TRISB=0; //Port B dclarer en sortie TRISC = 0xFF; //Port C en entre /******************Configuration et initialisation de l'cran LCD****************************/ Lcd_Config(&PORTB, 0, 1, WR, 5, 4, 3, 2); //Configure l'cran Lcd_Init(&PORTB); //initialisation du LCD Lcd_Cmd(Lcd_CURSOR_OFF); //Enlve le curseur Lcd_Cmd(Lcd_CLEAR); //Efface l'cran /******************Initialisation du module I2C******************************************/ I2C_Init(100000); //initialisation de la communication I2C I2C_Start(); //Dtermine si l'I2C est libre et lance le signal I2C_Wr(0x90); //Mode de contrle en mode criture I2C_Wr(0xAC); //Accs au registre de configuration I2C_Wr(0x0A); //Registre de configuration mesure en continu I2C_Stop(); //Arrt du signal I2C_Start(); I2C_Wr(0x90); //Dtermine si l'I2C est libre et lance le signal //Mode de contrle en mode criture

17

Station mto autonome 2012


I2C_Wr(0xEE); I2C_Stop();//Arrt du sigal //Dbut de la conversion

/*****************************Boucle infinie****************************************/ while(1) { cond=cond+1; //Incrmente la variable cond temperature(&cond); //Appel la fonction humidit } } /****************************Fonction temprature***********************************/ void temperature(int *cond) { char temp[7], temptxt[]="Temperature :", LSB; signed char MSB; I2C_Start(); I2C_Wr(0x90); I2C_Wr(0xAA); I2C_Stop(); I2C_Start(); I2C_Wr(0x91); MSB = I2C_Rd(1); LSB = I2C_Rd(0); I2C_Stop(); if(MSB<0) { MSB = abs(MSB); Temp[0]=45; } else { Temp[0]=43; } Temp[1]=(MSB/10)+48; Temp[2]=(MSB%10)+48 ; Temp[3]=44 ; if (LSB==128) { Temp[4]='5'; } Else { Temp[4]='0'; } Temp[5]=223; Temp[6]=67; if(*cond==10) { lcd(1, 1, 13, temptxt); lcd(2, 1, 6, temp); *cond=0; } //Dtermine si l'I2C est libre et lance le signal //Mode de contrle en mode criture //Lecture de la temprature //Arrt du signal //Dtermine si l'I2C est libre et lance le signal //Mode de contrle en mode lecture //Nombre sign donnant la temprature entre +125 et -55C //Si bit 7 = 1 temprature MSB +0,5C //Arrt du signal

// Si temprature ngative valeur absolue de MSB //Signe - affect en ascii

//signe + affect en ascii //Valeur des dizaines affect en ascii //Valeur des units affect en ascii //Virgule affect en ascii //Si bit 7 1 alors +0.5

//Si bit 7 0 alors +0.0

// degr affect en ascii //C affect en ascii //Appel la fonction LCD tous les 1000 //Affiche la chaine de caractre humtxt sur le LCD //Affiche la chaine de caractre hum sur le LCD //Remise a 0 de la condition

} /*******************************Fonction affichage***********************************/ void lcd(int li, int co, int nb, char receive[14]) { int i; for(i=0; i<=nb ; i++)//Boucle for { Lcd_chr(li, (co+i), receive[i]); //Affiche les caractres jusqu' i } }

Le schma prcdent est bien respect, comme on peut le voir cest trs facile programmer grce aux librairies I2C du logiciel MikroC.

18

Station mto autonome 2012


IX. Lanmomtre
A. Conception

Pour lanmomtre, lquipe pdagogique nous a juste fourni lhlice du capteur donc il a fallu concevoir toute la partie lectronique. Lide est dinstaller une diode et un transistor photonique par de l lhlice et lorsquelle tourne elle vient couper le faisceau. Succinctement le transistor envoit soit 1 soit 0 sur le PIC. Le but est de relever la frquence laquelle tourne lhlice puis la convertir en vitesse (cf. figure 11).

Figure 11 : schma descriptif de l'anmomtre.

La photodiode choisie est de rfrence SD5455-3. Ce choix a t fait car langle du faisceau est de 20, pour que le flux infrarouge soit bien concentr sur le phototransistor, pour un fonctionnement optimal. Comme on le voit sur le schma de principe (cf. figure 11), il a fallu dimensionner la rsistance qui sert rguler le courant qui circule dans la LED, avec les informations donnes par la documentation technique, nous avons pu la calculer. Forward voltage : VF = 1.7V et IF = 0.1A Ualim = 5V RD = (Ualim UF)/IF = (5 1.7)/0.1 RD = 33

Pour le phototransistor, nous avons choisi celui qui allait avec la diode de rfrence SE5455-3. Cette fois la valeur de la rsistance nous tait donn par le constructeur. RL=1000 Lors des sances nous avons implant la diode et le transistor sur le support du capteur. Pour des raisons pratiques et esthtiques nous avons spar la partie anmomtre et la partie platine par des borniers (cf. figure 12).

Figure 12 : Notre anmomtre.

19

Station mto autonome 2012


B. Mesure de la priode sur le microcontrleur

Le but est de relever la priode du signal envoyer par lanmomtre, pour cela le PIC est quip dun mode capture. Le principe est de recopier un moment voulu la valeur du timer 1. La capture peut avoir lieux chaque front descendant, chaque front montant, tous les 4 ou tous les 16 fronts montants. Quand la capture a eu lieu, un flag est mis "1". Il suffit ensuite de relever la valeur et la transformer en vitesse. Dans un premier temps il nous faut configurer le timer 1 : Le timer 1 est un compteur sur 16 bits constitu de 2 registres de 8 bits TMR1H et TMR1L, que l'on peut lire ou crire. Le registre TMR1 (constitu de TMR1H et TMR1L) s'incrmente de h'0000' jusqu' h'FFFF' et repasse ensuite h'0000' pour continuer le comptage. Quand il y a dbordement, une interruption peut tre gnre si on la autorise par TMR1IE =1 (bit 0 de PIE1) et le Flag TMR1IF (bit 0 de PIR1) passe "1". Le contrle du timer 1 ce fait par le registre T1CON.

Bit 7 et bit 6 : bits non implments. Bit 5 et bit 4 : T1CKPS = Slection du pr diviseur plac avant le TIMER. Vu quon a un quartz lev nous avons dcid de choisir un pr-diviseur de 8, donc F=Fosc/(4*8). Pour cela mettre les bit 4 et 5 1. Bit 3 : T1OSCEN : Bit d'autorisation de l'oscillateur du Timer 1. 1 = oscillateur autoris 0 = oscillateur stopp. Oscillateur interne inutile donc bit 3 0. Bit 2 : T1SYNC : Bit de contrle de la synchronisation du CLK externe. 1 = Pas de synchronisation de l'horloge externe. 0 = Synchronisation de l'horloge externe. Nous nous mettrons en mode synchrone. Bit1 : TMR1CS : Bit de slection de la source horloge. 1 = Mode Compteur: Clk externe sur la broche PC0 ou Quartz entre PC0 et PC1 0 = Mode Timer: Clk interne = Fosc/4.

20

Station mto autonome 2012


On mettra ce bit 0 car on utilise le mode Timer. Bit 0 : TMR1ON : Bit d'autorisation du Timer 1. 1 = Timer 1 en service. 0 = Timer 1 stopp. Il faut videmment mettre la timer 1 en service. Nous avons aussi autoris le dbordement du timer 1 pour avoir plus de prcisions, pour cela il faut mettre la commande PIE1.TMR1 1.

Il nous faut ensuite activer le mode capture, pour cela il faut utiliser le module CCP1 qui sert aussi pour le mode compare et PWM. Pour configurer ce module il faut paramtrer le registre CCP1CON.

Bit 7 et Bit 6 : bits non implments. Bit 5 et Bit 4 : CCP1X et CCP1Y : Bits non utiliss en modes Compare et Capture. Ce sont les 2 bits LSB pour le Duty cycle en mode PWM. Les 8 bits MSB sont dans le registre CCPR1L. Bit a 0 car on ne les utilise pas en mode capture. Bit 3 Bit 0 : CCP1M3 CCP1M0 : bits de slection du mode. Nous avons slectionn le mode capture sur chaque front montant. Pour cela nous avons mis les bits 1 et 3 0 et les bits 0 et 2 1. Pour savoir si un front montant eu lieu, le flag CCP1F est mis 1. Ce flag doit tre remis 0 par lutilisateur. La valeur des 16 bits des registres du Timer 1, TMR1L (bit de poids faible) et TMR1H (bit de poids fort) sont recopies dans les registres CCPR1, CCPRIH (bit de poids faible) et CCPR1L (bit de poids fort). Nous avons programm le mode capture de faon afficher sur lcran LCD la valeur du registre CCPR1, cest--dire la priode du signal de lanmomtre. Il ne nous reste maintenant plus qu talonner notre anmomtre.

21

Station mto autonome 2012


C. Etalonnage de lanmomtre

Pour talonner le capteur nous avons commenc par savoir quelle frquence correspond la valeur releve par le mode capture. Pour cela nous avons branch un GBF la place du capteur et avec un oscilloscope, nous avons compar leurs valeurs :

Nous avons ensuite trac laide des valeurs du tableau, la courbe F(Hz) en fonction du compteur. De cette courbe nous relevons lquation :

F = 671310*compteur^(-1.01) Soit environ : F = 671310/compteur

Puis, nous avons branch notre anmomtre sur le microcontrleur. Cela dans le but de relever sa priode sur lcran LCD, laide dune soufflerie variable et du manomtre GDH (rf : 121552 200-13), nous avons compar leurs valeurs pour connaitre ltalonnage de notre capteur. Nous avons not plusieurs valeurs puis trac diffrentes courbe pour trouver les quations qui nous permettrons de calculer la vitesse dans notre programme.

22

Station mto autonome 2012


Voici les valeurs que nous avons releves puis la courbe trace sur Excel :

De cette courbe nous obtenons lquation : Vitesse du vent = 0.179*F + 0.629 Nous les multiplierons par 100 pour rcuprer les dcimales et les implanter dans une chaine de caractre : Vitesse du vent = 17.9*F + 62.9 Nous avons prsent, notre disposition toutes les quations, ncessaires pour pouvoir convertir la valeur releve par le mode capture en une vitesse.

D.

Le schma du microcontrleur avec lanmomtre

Figure 13 : Schma avec l'anmomtre.

On voit sur le schma que le capteur est bien reli sur la borne RC2. Nous avons aussi reprsent les borniers J1 et J2. A droite tous ce qui est sur le support et gauche tous ce qui est sur la platine.

23

Station mto autonome 2012


E. Programme pour la mesure de la vitesse du vent

Voici le programme pour mesurer la vitesse du vent, avec les affectations dcrites ci-dessus ainsi que les quations de conversions :
/******************Dclaration des fonctions****************************************/ void vent(int *cond); void lcd(int li, int co, int nb, char receive[20]); /*******************************************************************************/ void main() { /*****************************dclaration des variables*****************************/ int cond=0; /******************Initialisation et affectation des ports******************************/ PORTB=0; //initialisation PORTC=0; //initialisation TRISC=0x04; //Port C dclarer en sortie sauf RC2 en mode capture TRISB=0; //Port B dclarer en sortie /************************Configuration du mode capture****************************/ T1CON=0x31; //Configuration du timer1 CCP1CON=0x05; //Paramtrage du mode capture PIE1.TMR1IE=1; //Autorise les dbordements du timer 1 /******************Configuration et initialisation de l'cran LCD************************/ Lcd_Config(&PORTB, 0, 1, WR, 5, 4, 3, 2); //Configure l'cran Lcd_Init(&PORTB); //Initialisation du LCD Lcd_Cmd(Lcd_CURSOR_OFF); //Enlve le curseur Lcd_Cmd(Lcd_CLEAR); //Efface l'cran /*****************************Boucle infinie**************************************/ while(1) { cond=cond+1; vent(&cond); } } /*******************************Fonction vent************************************/ void vent(int *cond) { unsigned long tl, th, per; int vit,freq; char vent[13], txtvent[]="vitesse du vent:", VV; if(PIR1.CCP1IF==1) { TMR1H=0; TMR1L=0; th=CCPR1H; tl=CCPR1L; th=th<<8; per = th|tl; PIR1.CCP1IF=0; if(PIR1.TMR1IF==1) { per=65535+per; PIR1.TMR1IF=0; } } freq=671310/per; vit=freq*17.9 + 69.2; //Test si front montant lieu //Initialisation du timer1 bit de point fort //Initialisation du timer1 bit de point faible //Les valeurs sont copi dans des variables //Dcalage car th => bit de point fort //On concatne les deux valeurs, nous obtenons la priode //Remise a 0 du drapeau //Si dpassement du timer 1 //On ajoute une retenue lorsqu'on a fait un tour (16bit) //Remise a 0 du drapeau "dpassement"

//Calcul de la frquence //Calcul de la vitesse que l'on x100

24

Station mto autonome 2012


if(vit<200) { vit=0; } vent[0]=(vit/10000)+48; VV=(vit/1000)%10; vent[1]=VV+48; VV=(vit/100)%10; vent[2]=VV+48; VV=(vit/10)%10; vent[3]=44; vent[4]=VV+48; VV=vit%10; vent[5]=VV+48; vent[6]=109; vent[7]=47; vent[8]=115; if(*cond==1000) { lcd(1, 1, 16, txtvent); lcd(2, 1, 8, vent); *cond=0; } } /*******************************Fonction affichage***********************************/ void lcd(int li, int co, int nb, char receive[20]) { int i; for(i=0; i<=nb ; i++) //Boucle for { Lcd_chr(li, (co+i), receive[i]); //Affiche les caractres jusqu' i } } //En dessous 2m/s la mesure est alatoire cause du 2me dbordement

//Valeur des centaines affect en ascii(48=0) //Valeur des dizaines affect en ascii //Valeur des unit affect en ascii //Virgule affect en ascii //Valeur de la 1er dcimale affect en ascii //Valeur de la 2me dcimale affect en ascii //m affect en ascii // / affect en ascii //s affect en ascii //Appel la fonction LCD tous les 1000 //Affiche la chaine de caractre humtxt sur le LCD //Affiche la chaine de caractre hum sur le LCD //Remise a 0 de la condition

25

Station mto autonome 2012


X. Simulation, une station mto autonome

Maintenant que tous nos capteurs sont installs, nous allons mettre profit le bouton poussoir install dans la partie LCD. Cest--dire que nous allons rassembler tous les programmes prcdents pour nen faire quun. Il suffira dappuyer sur le bouton poussoir pour faire dfiler les diffrentes valeurs comme une vraie station mto.

A.

La structure du programme

/*****************************Boucle infinie****************************************/ while(1) { cond=cond+1; switch(BP) { case 0: humidite(&cond); if(PORTA.F2==1) { BP=1; Lcd_Cmd(Lcd_CLEAR); Delay_ms(250); } break; case 1: temperature(&cond); if(PORTA.F2==1) { BP=2; Lcd_Cmd(Lcd_CLEAR); Delay_ms(250); } break; case 2: vent(&cond); if(PORTA.F2==1) { BP=0; Lcd_Cmd(Lcd_CLEAR); Delay_ms(250); } break; } } }

//Incrmente la variable cond

//Appel la fonction humidit //Ces if permet de changer la valeur de BP

//Temps qu'on relche bien le bouton

//Appel la fonction temprature

//Appel la fonction vent

Nous avons choisi dutiliser un Switch, nous avons donc juste rajout une variable BP. Lorsquil y a appui sur le bouton poussoir, la variable BP sincrmente et le programme passe une autre case et donc utilise une nouvelle fonction. La temporisation nous donne le temps de relcher le bouton pour viter de faire dfiler le menu sans le vouloir.

26

Station mto autonome 2012


B. La simulation

Etant donn que nous ne pouvions pas prendre le matriel avec nous, il tait impratif de pouvoir faire des simulations. Pour cela nous avons utilis un logiciel trs utile, Proteus ISIS. Ce logiciel possde une trs grande librairie et permet de rentrer nos programmes sur le PIC virtuel gnr par le logiciel. Pour simuler le capteur dhumidit nous avons utilis un potentiomtre. Pour celui de lanmomtre comme pour nos mesures, nous avons branch virtuellement un GBF sur la borne associ et observ son signal laide dun oscilloscope. Voil un aperu de la simulation effectu sur ISIS :

Vrification thorique de lhumidit : H= (3.15-0.81)/0.031 H=75.48%

Vrification thorique temprature :

de

la

La valeur affiche correspond bien aux 27C slectionn sur le capteur.

Vrification thorique du vent : Vitesse du vent = 0.179* 37 + 0.629 Vitesse du vent = 7.657m/s

27

Station mto autonome 2012


XI. Transmission des donnes par liaison ZigBee

ZigBee est un protocole de haut niveau permettant la communication de petites radios, consommation rduite, base sur le standard IEEE 802.15.4. Cette technologie a pour but la communication de courte distance telle que le propose dj la technologie Bluetooth, tout en tant moins chre, plus simple et avec une fiabilit assez leve. Dans notre projet nous nous servirons de ZigBee pour permettre une transmission par ondes de nos donnes de la station mto vers un ordinateur. Pour cela nous avons, 2 modules Xbee pro, 2 platines dinterfaces, une avec des pattes (liaison platine) et lautre avec une sortie RS232 (liaison pc). Caractristique lectrique :

Les signaux Xbee ont une amplitude de 3,3V mais sont aliments en 5V (tension de notre source USB), cbls sur la bornes VIN ( Power input, from 6-12Vdc @ 300mA or higher ). Mais notre source ntant pas assez puissante pour alimenter toute notre installation. Nous utiliserons donc une source externe de 5V qui sera utilise pour alimenter les 2 systmes Xbee. Description des Bornes du Xbee qui nous intresse :

28

Station mto autonome 2012


A. Schma lectrique du module Xbee

Nous avons cbl la sortie TX du microcontrleur qui met un signal jusqu la borne RX du Xbee qui rceptionne ce signal. Aprs la transmission se fait par onde entre les 2 modules Xbee. Pour le module qui reoit le signal, un cble RS232 suffit faire la liaison entre celui-ci et le PC.

B.

Envoi des donnes la liaison Usart

Un USART (Universal synchronous & Asynchronous Receiver Transmitter), est un metteurrcepteur universel. En langage courant, c'est le composant utilis pour faire la liaison entre l'ordinateur et le port srie. L'ordinateur envoie les donnes en parallle (autant de fils que de bits de donnes). Il faut donc transformer ces donnes pour les faire passer travers une liaison srie qui utilise un mme fil pour faire passer tous les bits de donnes. Constitution d'une trame USART : un bit de start toujours 0 : servant la synchronisation du rcepteur les donnes : la taille peut varier (gnralement entre 5 et 9 bits) ventuellement un bit de parit paire ou impaire et un bit de stop toujours 1 (la dure peut varier entre 1, 1,5 et 2 temps bit) Le niveau logique de repos est le 1.

Figure 14 : Trame USART

29

Station mto autonome 2012


Afin de faciliter les liaisons entre priphriques (PC, microcontrleur, modem, ) des vitesses de transmission sont normalises, l'unit baud correspondant un temps bit. Dans notre cas nous choisirons une vitesse de transmission de 9600bps.

C.

Programme denvoi des donnes par liaison Usart

Grce la librairie de MikroC, il est trs facile denvoyer des donnes par liaison Usart. Cela fonctionne comme pour envoyer des caractres sur lcran LCD. Il faut juste ensuite choisir la vitesse de transmission qui sera 9600bps. Voici la fonction et un morceau du programme qui sert envoyer les caractres sur Xbee et de Xbee un HyperTerminal :

/*******************************Fonction humidit***********************************/ void humidite(int *cond) { long H, U, VL; //Dclaration des variables char HH, hum[8], humtxt[]="Humidite :"; . Xbee(8, hum) ; //Envoi la chane de caractre hum dans la fonction xbee } /**************************************Usart****************************************/ void xbee(int nb, char receive[20]) { int i; Usart_Init(9600); for(i=0; i<=nb ; i++) { Usart_Write(receive[i]); } }

//Vitesse de transmission //Boucle for //Envoi les caractres sur lHyperTerminal jusqu' i

30

Station mto autonome 2012


XII. Estimation du cot du projet
Composant
Quartz 20.000MHz Capacit 22pF PIC 16F876 LCD MODULE Potentiomtre 10K Rsistance 33 Rsistance 10 K Rsistance 1 K LED rouge DS1621 Bouton poussoir Module Xbee Platine d'interface (XBEE) RS232 Platine d'interface (XBEE) Capteur dhumidit Transistor Diode Totales

Quantit Prix (TVA inclus)


1 2 1 1 1 1 2 3 1 1 1 2 1 1 1 1 1 1 1,11 0,10 4,27 15,75 6,18 0,35 0,70 1,05 0,13 6,50 0,60 40,00 18,90 13,64 26,92 5,61 3,25 145,06

Liens
Lien lien lien lien lien lien lien lien lien lien lien lien lien lien lien lien lien

On peut voir sur ce tableau que le prix de reviens pour les lments que nous avons utilis est de 145.06 TTC. Ce qui est plutt onreux compar aux stations mto du march qui oscille entre 6 et 400. En sachant que la ntre est loin dtre finalis (finition, esthtique, ergonomie et ajout de nouvelle fonction comme la date et lheure).

31

Station mto autonome 2012


XIII. English summary
During our formation in license electronic electrotechnical automatic. We were asked to do a project. There were many choice like control (asservisement) speed MCC, Battery charger by solar panels...but we chose autonomous weather station for increase our level in electronic. Indeed we come an electrotechnical sector. Our weather station can measure the temperature indoor. Its also possible to measure humidity and wind speed. Then its possible to display measures on LCD display and to pass these measures using pushbutton. There is also a liaison between weather station and a computer to retrieve measurements. This liaison is Xbee connection. During this project we started by to choose our components. Then, we put our components on the platin, it's to say the temperature sensor outdoor, the humidity sensor, the lcd display, the push button and the microcontroller. The wind speed sensor is outside to the platin. It is connected on the platin with wires. And we crafted this sensor us even. The principle is easy, there is a beam between a diode and a transistor. When anemometer turns and cuts the beam, the system sends a signal. The microcontroller is the brain of our system. It calculates and manages data to send by sensors. We programmed the microcontroller by our care. The program is the main work to our project. For us it was very hard because it was first time that we programed on microcontroller. The language used it is C language but with specific libraries for every sensors. It was necessary to read and to understand data sheets of different sensors. It was a fairly complex project because we had 3 sensors for to manage. This project gave us a computer and microcontroller skills. More Its very interesting because for once we often were very independently and to follow this project to beginning at the end. This project asked a lot of discipline, patience and time but it were very rewarding.

32

Station mto autonome 2012


XIV. Conclusion
Ce projet sur la conception dune station mto autonome qui nous a t confi a t trs enrichissant. Il nous a permis de mettre en relations les connaissances acquises durant lanne, mais aussi acqurir de nouvelles connaissances comme le fonctionnement dun microcontrleur. En effet nous navions jamais programm sur microcontrleur. Il a fallu sadapter et apprendre utiliser des nouveaux logiciels tels que Proteus, MikroC ainsi que Labview. De cette exprience nous avons aussi appris tre autonome. Nous avons saisi que la comprhension des documents techniques et des librairies tait un point essentiel de notre projet. En programmation nous navions pas le droit lerreur car la moindre faute pouvait conduire le systme un dysfonctionnement. Ce projet nous a demand beaucoup de rigueur, de patience et de temps. Toutefois, nous navons pas eu malheureusement le temps dinstaller le capteur de temprature intrieure par manque de temps. Plus encore nous aurions aim approfondir certains points. Par exemple pouvoir installer les composants sur circuit imprim et concevoir un support viable pour en faire une vraie station mto. Linstallation dune girouette aurait t apprciable pour connatre le sens du vent. Aussi, le programme aurait sans doute pu tre encore amlior pour de meilleures performances. Malgr ce manque de temps, nous sommes trs satisfaits du fonctionnement de ce module qui nous a permis de comprendre lutilit des parties thoriques pour lapplication et la mise en uvre dun systme. Lapproche pdagogique de nous diriger vers les solutions sans jamais les donner, de nous laisser un grand degr de libert et dautonomie a t au dbut assez droutante mais trs instructif. Enfin, nous tenions remercier Mme Leymarie qui nous a suivis et aiguill tout au long de ce projet.

33

Station mto autonome 2012


XV. ANNEXES

Programme complet
/******************Dclaration des fonctions****************************************/ avoid humidite(int *cond); void temperature(int *cond); void vent(int *cond); void lcd(int li, int co, int nb, char receive[15]); void xbee(int nb, char receive[15]); void main() { /*****************************dclaration des variables*****************************/ int cond=0;//Condition pour l'affichage sur l'cran LCD int BP=0; /******************Initialisation et affectation des ports**************************/ PORTA=0; PORTB=0; //initialisation PORTC=0; TRISB=0; //Port B dclarer en sortie TRISA=0xFF; //Port A en entre ADCON1=0x84; //Justifi droite active RA0/RA1/RA3 analogique ADCON0=0x85; //Fosc/32 sur PA0 en service TRISB=0; //Port B dclarer en sortie TRISC=0xFF;//Port C dclarer en entre /******************Configuration et initialisation de l'cran LCD*******************/ Lcd_Config(&PORTB, 0, 1, WR, 5, 4, 3, 2); //Configure l'ecran Lcd_Init(&PORTB); //initialisation du LCD Lcd_Cmd(Lcd_CURSOR_OFF); //Enleve le curseur Lcd_Cmd(Lcd_CLEAR); //Efface l'ecran /******************Initialisation du module I2C************************************/ I2C_Init(100000);//initialisation de la communication I2C I2C_Start();//Dtermine si l'I2C est libre et lance le signal I2C_Wr(0x90);//Mode de contrle en mode criture I2C_Wr(0xAC);//Accs au registre de configuration I2C_Wr(0x0A);//Registre de configuration mesure en continu I2C_Stop();//Arrt du signal I2C_Start();//Dtermine si l'I2C est libre et lance le signal I2C_Wr(0x90);//Mode de contrle en mode criture I2C_Wr(0xEE);//Dbut de la conversion I2C_Stop();//Arrt du sigal

34

Station mto autonome 2012


/************************Configuration du mode capture******************************/ T1CON=0x31; //Configuration du timer1 CCP1CON=0x05; //Paramtrage du mode capture PIE1.TMR1IE=1; //Autorise les dbordements du timer 1 /*****************************Boucle infinie****************************************/ while(1) { cond=cond+1;//Incrmente la variable cond switch(BP) { case 0: humidite(&cond);//Appel la fonction humidit if(PORTA.F2==1)//Ces if permet de changer la valeur de BP { BP=1; Lcd_Cmd(Lcd_CLEAR); Delay_ms(250);//Temps qu'on relche bien le bouton } break; case 1: temperature(&cond);//Appel la fonction temprature if(PORTA.F2==1) { BP=2; Lcd_Cmd(Lcd_CLEAR); Delay_ms(250); } break; case 2: vent(&cond);//Appel la fonction vent if(PORTA.F2==1) { BP=0; Lcd_Cmd(Lcd_CLEAR); Delay_ms(250); } break; } } } /*******************************Fonction humidit***********************************/ void humidite(int *cond) { long H, U, VL;//Dclaration des variables char HH, hum[8], humtxt[]="Humidite"; VL=Adc_read(0); //Valeur lue sur RA0(humidit) U=(VL*5000)/1023; //Convertit la valeur lue en tension x1000 H=(U-810)/(0.031); //Convertit la tension en humidit x1000

35

Station mto autonome 2012


if(H>100000)//Si H > 100%(impossible) alors = 100% { H=100000; } if(H<0)//Si H < 0%(impossible) alors = 0% { H=0; } hum[0]=(H/100000)+48;//Valeur des centaines affect en ascii(48=0) HH=(H/10000)%10; hum[1]=HH+48;//Valeur des dizaines affect en ascii HH=(H/1000)%10; hum[2]=HH+48;//Valeur des units affect en ascii hum[3]=44;//Virgule affect en ascii HH=(H/100)%10; hum[4]=HH+48;//Valeur de la premire dcimale affect en ascii HH=(H/10)%10; hum[5]=HH+48;//Valeur de la deuxime dcimale affect en ascii hum[6]=37;//Pourcentage affect en ascii if(*cond==50)//Appel la fonction LCD tous les 1000 { lcd(1, 1, 8, humtxt);//Affiche la chaine de caractre humtxt sur le LCD lcd(2, 1, 7, hum);//Affiche la chaine de caractre hum sur le LCD *cond=0;//Remise a 0 de la condition } Xbee(7, hum) ;//Envoi la chane de caractre hum dans la fonction xbee } /****************************Fonction temprature***********************************/ void temperature(int *cond) { char temp[7], temptxt[]="Temperature", LSB; signed char MSB; I2C_Start();//Dtermine si l'I2C est libre et lance le signal I2C_Wr(0x90);//Mode de contrle en mode criture I2C_Wr(0xAA);//Lecture de la temprature I2C_Stop();//Arrt du sigal I2C_Start();//Dtermine si l'I2C est libre et lance le signal I2C_Wr(0x91);//Mode de contrle en mode lecture MSB = I2C_Rd(1);//Nombre sign donnant la temprature entre +125 et -55C LSB = I2C_Rd(0);//Si bit 7 = 1 temprature MSB +0,5C I2C_Stop();//Arrt du sigal if(MSB<0) { MSB = abs(MSB); // Si temperature ngative valeur absolue de MSB Temp[0]=45; //Signe - affect en ascii } else

36

Station mto autonome 2012


{ Temp[0]=43;//signe + affect en ascii } Temp[1]=(MSB/10)+48; //Valeur des dizaines affect en ascii Temp[2]=(MSB%10)+48; //Valeur des units affect en ascii Temp[3]=44; //Virgule affect en ascii if (LSB==128) //Si bit 7 1 alors +0.5 { Temp[4]='5'; } else //Si bit 7 0 alors +0.0 { Temp[4]='0'; } Temp[5]=223;// degr affect en ascii Temp[6]=67; //C affect en ascii if(*cond==50)//Appel la fonction LCD tous les 1000 { lcd(1, 1, 11, temptxt);//Affiche la chaine de caractre humtxt sur le LCD lcd(2, 1, 7, temp);//Affiche la chaine de caractre hum sur le LCD *cond=0;//Remise a 0 de la condition } Xbee(7, temp) ;//Envoi la chane de caractre temp dans la fonction xbee } /*******************************Fonction vent**************************************/ void vent(int *cond) { unsigned long tl, th, per; int vit,freq; char vent[13], txtvent[]="Vitesse du vent", VV; if(PIR1.CCP1IF==1) //Test si front montant lieu { TMR1H=0; //Initialisation du timer1 bit de point fort TMR1L=0; //Initialisation du timer1 bit de point faible th=CCPR1H; //Les valeurs sont copi dans des variables tl=CCPR1L; th=th<<8; //Dcalage car th => bit de point fort per = th|tl; //On concatne les deux valeurs, nous obtenons la priode PIR1.CCP1IF=0; //Remise a 0 du drapeau if(PIR1.TMR1IF==1) //Si dpassement du timer 1 { per=65535+per; //On ajoute une retenue lorsqu'on a fait un tour (16bit) PIR1.TMR1IF=0; //Remise a 0 du drapeau "dpassement" } }

37

Station mto autonome 2012


freq=671310/per;//Calacul de la frquence vit=freq*17.9 + 69.2;//Calcul de la vitesse que l'on x100 if(vit<200)//En dessous 2m/s la mesure est alatoire cause du 2me dbordement { vit=0; } vent[0]=(vit/10000)+48;//Valeur des centaines affect en ascii(48=0) VV=(vit/1000)%10; vent[1]=VV+48;//Valeur des dizaines affect en ascii VV=(vit/100)%10; vent[2]=VV+48;//Valeur des unit affect en ascii VV=(vit/10)%10; vent[3]=44;//Virgule affect en ascii vent[4]=VV+48;//Valeur de la 1er dcimale affect en ascii VV=vit%10; vent[5]=VV+48;//Valeur de la 2me dcimale affect en ascii vent[6]=109;//m affect en ascii vent[7]=47;// / affect en ascii vent[8]=115;//s affect en ascii if(*cond==50)//Appel la fonction LCD tous les 1000 { lcd(1, 1, 15, txtvent);//Affiche la chaine de caractre humtxt sur le LCD lcd(2, 1, 9, vent);//Affiche la chaine de caractre hum sur le LCD *cond=0;//Remise a 0 de la condition } Xbee(9, vent) ;//Envoi la chane de caractre vent dans la fonction xbee } /*******************************Fonction affichage***********************************/ void lcd(int li, int co, int nb, char receive[15]) { int i; for(i=0; i<nb ; i++)//Boucle for { Lcd_chr(li, (co+i), receive[i]);//Affiche les caractres jusqu' i } } /**************************************Usart****************************************/ void xbee(int nb, char receive[15]) { int i; Usart_Init(9600);//Vitesse de transmission for(i=0; i<nb ; i++)//Boucle for { Usart_Write(receive[i]);//Envoi les caractres sur l'HyperTerminal jusqu' i } }

38

You might also like