ProjetHL Station Meteo

39
2012 MAITRE Ghyslain et VERNEAUX Roland Licence 3 REL EEA 05/05/2012 Station météo autonome

Transcript of ProjetHL Station Meteo

2012

MAITRE Ghyslain et VERNEAUX Roland

Licence 3 REL EEA

05052012

Station meacuteteacuteo autonome

Station meacuteteacuteo autonome 2012

1

I Table des matiegraveres II Introduction 2

III Cahier des charges 2

IV Scheacutema Synoptique de la station meacuteteacuteo 2

V Le microcontrocircleur 3

A Choix du microcontrocircleur 3

B Prise en main du microcontrocircleur 4

C Scheacutema du microcontrocircleur avec la LED 4

D Programme pour faire clignoter la LED 5

VI Lrsquoeacutecran LCD 5

A Scheacutema du microcontrocircleur avec lrsquoeacutecran LCD 5

B Programme pour lrsquoeacutecran LCD 6

VII Le capteur drsquohumiditeacute 7

A Caracteacuteristiques du capteur drsquohumiditeacute 7

B Configuration du microcontrocircleur 9

C Le scheacutema du microcontrocircleur avec le capteur drsquohumiditeacute 11

D Programme pour la mesure de lrsquohumiditeacute 11

VIII Le capteur de tempeacuterature 13

A Le protocole I2C 13

B Caracteacuteristique du DS1621 14

1 Speacutecificiteacute des commandes 14

2 Dialogue I2C pour avoir la tempeacuterature 16

C Le scheacutema du microcontrocircleur avec le capteur de tempeacuterature 17

D Programme pour la mesure de la tempeacuterature 17

IX Lrsquoaneacutemomegravetre 19

A Conception 19

B Mesure de la peacuteriode sur le microcontrocircleur 20

C Etalonnage de lrsquoaneacutemomegravetre 22

D Le scheacutema du microcontrocircleur avec lrsquoaneacutemomegravetre 23

E Programme pour la mesure de la vitesse du vent 24

X Simulation une station meacuteteacuteo autonome 26

A La structure du programme 26

B La simulation 27

XI Transmission des donneacutees par liaison ZigBee 28

A Scheacutema eacutelectrique du module Xbee 29

B Envoi des donneacutees la liaison Usart 29

C Programme drsquoenvoi des donneacutees par liaison Usart 30

XII Estimation du coucirct du projet 31

XIII English summary 32

XIV Conclusion 33

XV ANNEXES 34

Station meacuteteacuteo autonome 2012

2

II Introduction

Dans le cadre de notre formation L3 EEA (eacutelectrotechnique eacutelectronique automatique) il

nous a eacuteteacute demandeacute de concevoir et reacutealiser un systegraveme pluridisciplinaire de notre choix agrave partir drsquoun

cahier des charges Un projet ougrave il faut organiser son travail et ecirctre capable de le preacutesenter par eacutecrit

(rapport) et oralement Lrsquoobjectif principal de ce travail est de faire le lien entre lrsquoensemble des

enseignements disciplinaire et de valider notre autonomie

Dans ce rapport nous preacutesenterons notre projet une station meacuteteacuteo autonome conccedilue et

programmeacutee par nos soins Nous deacutetaillerons chaque fonction de la station avec dans chaque partie

son scheacutema son programme associeacute et lrsquoexplication des points importants

Nous finirons par une conclusion qui rappellerons les grandes lignes de notre projet les

connaissances et les acquis apporteacute par ce module ainsi que le ressenti et notre avis suite au projet

III Cahier des charges

Le projet drsquoune laquo station meacuteteacuteo autonome raquo est constitueacute de plusieurs objectifs clairs et bien

preacutecis qui nous ont permis de progresser par eacutetape

Mettre en œuvre un capteur drsquohumiditeacute (liaison analogique)

Conception et mise en œuvre drsquoun aneacutemomegravetre (Mesure drsquoune freacutequence convertie

en vitesse (ms))

Mettre en œuvre deux capteurs de tempeacuterature numeacuteriques (DS1621) mesurant la

tempeacuterature inteacuterieure et exteacuterieure (la liaison avec le capteur de tempeacuterature se

fera directement sur le PC)

Affichage des donneacutees sur un eacutecran LCD

Une liaison sans fil type Xbee pour envoyer les donneacutees aux PC

Affichage des donneacutees sur un eacutecran PC sous labview

On remarquera que chaque capteur utilise une technologie diffeacuterente ce qui en fait un

projet polyvalent

IV Scheacutema Synoptique de la station meacuteteacuteo

Pour plus de compreacutehension nous avons commenceacute agrave partir du cahier des charges le

synoptique complet de la station meacuteteacuteo On y trouve tous les eacuteleacutements citeacutes preacuteceacutedemment dans le

cahier des charges

Station meacuteteacuteo autonome 2012

3

V Le microcontrocircleur

A Choix du microcontrocircleur

Comme on peut voir preacuteceacutedemment que le microcontrocircleur choisi est un PIC16F876 (cf figure 1)

celui-ci nous as eacuteteacute conseilleacute par notre eacutequipe peacutedagogique Nous avons quand mecircme pris soin de

veacuterifier globalement si le nombre drsquoentreacutee et de sortie eacutetaient suffisants pour le nombre drsquoeacuteleacutements

utiliseacutes en survolant pour chacun drsquoentre eux leur datasheet

Microcontrocircleur

PIC16F876

Capteur

drsquohumiditeacute

Capteur de

tempeacuterature

exteacuterieure

Aneacutemomegravetre

Ecran LCD

Emetteur

ZigBee

Reacutecepteur

ZigBee

PC

Capteur de

tempeacuterature

inteacuterieure

Figure 1 Scheacutema du PIC16F876

Station meacuteteacuteo autonome 2012

4

B Prise en main du microcontrocircleur

Nrsquoayant jamais programmeacute sur un microcontrocircleur notre eacutequipe peacutedagogique nous a conseilleacute

de commencer par nous familiariser avec le PIC agrave lrsquoaide drsquoun mini TP Ce TP drsquoinitiation proposeacute par le

logiciel Mikroelektronika marque du logiciel utiliseacute pour programmer le PIC (MikroC) consiste agrave faire

clignoter une LED

Pour le quartz qui deacutefinit la freacutequence drsquohorloge on nous a donneacute un 20Mhz Pour choisir les

condensateurs nous avons regardeacute dans la datasheet du quartz

Au vue de cette datasheet nous avons pris des condensateurs de 22pF car ils eacutetaient agrave notre

disposition

C Scheacutema du microcontrocircleur avec la LED

Nous avons donc commenceacute par implanter les composants et agrave les cacircbler entre eux sur la platine

qursquoon nous a fourni Comme vous pouvez le voir sur la figure 2 le scheacutema de la partie laquo LED raquo eacutetabli

sur le logiciel Proteus ISIS 78 Crsquoest ce Logiciel qui nous a permis tout au long du projet de faire les

scheacutemas et les simulations

On peut voir sur le scheacutema de la figure 2 qursquoil yrsquoa un bornier brancher sur les bornes RB6 RB7

et Vpp Il repreacutesente en fait le cacircble USB qui va au PC Ce cacircble nous permet de transfeacuterer le

programme Par la suite nous ne le repreacutesenterons plus de mecircme pour chaque partie nous

repreacutesenterons que les capteurs en question Ceci pour un souci de clarteacute

Figure 2 Scheacutema avec la LED

Station meacuteteacuteo autonome 2012

5

D Programme pour le clignotement de la LED

Nous avons ensuite agrave lrsquoaide du TP et du logiciel MikroC programmeacute le microcontrocircleur 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 deacuteclarations des bornes

Voici le programme eacutetablit avec ccedila description

void main()

PORTC=0 Initialisation du port C

PORTB=0 Initialisation du port B

TRISC=0 Le port C affecteacute en sortie

TRISB=0 Le port B affecteacute en sortie

while(1)Boucle infinie

PORTCF7 = ~PORTCF7 Allumeeacuteteint la LED

Delay_ms(1000) Temporisation de 1 seconde

VI Lrsquoeacutecran LCD

Ensuite nous sommes rentreacute dans le vif du sujet nous avons installeacute programmeacute lrsquoeacutecran LCD et

essayeacute drsquoafficher des caractegraveres dessus Nous avons aussi rajouteacute un bouton poussoir en vue de

preacuteparer le terrain pour la suite du projet

A Scheacutema du microcontrocircleur avec lrsquoeacutecran LCD

Figure 3 scheacutema avec eacutecran LCD et le bouton poussoir

Station meacuteteacuteo autonome 2012

6

Pour cacircbler lrsquoeacutecran LCD nous nous sommes aideacutes de sa datasheet ainsi que lrsquoaide du logiciel

MikroC Le point qui nous semble important est la borne R(read)W(write) On peut voir qursquoelle est

connecteacutee agrave la masse En effet pour eacutecrire sur lrsquoeacutecran il faut mettre RW = 0 pour lire on le met agrave 1

B Programme pour lrsquoeacutecran LCD

Voici un petit exemple de programme qui utilise agrave la fois le bouton poussoir et qui affiche du

texte sur lrsquoeacutecran LCD void main()

int cond=0 BP=0

Initialisation et affectation des ports

PORTB=0 Initialisation du port B

PORTA=0 Initialisation du port A

TRISB=0 Le port B affecteacute en sortie

TRISA = 0xFF Port A en entreacutee

ADCON1 = 0x84 RA2 en entreacutee

Configuration et initialisation de leacutecran LCD

Lcd_Config(ampPORTB 0 1 WR 5 4 3 2) Configure leacutecran

Lcd_Init(ampPORTB) initialisation du LCD

Lcd_Cmd(Lcd_CURSOR_OFF) Enlegraveve le curseur

Lcd_Cmd(Lcd_CLEAR) Efface leacutecran

Boucle infini

while(1)

cond=cond+1

switch(BP)

case 0

if(PORTAF2==1) Ces if permet de changer la valeur de BP

BP=1

Delay_ms(250) Temps quon relacircche bien le bouton

if(cond==1000)

Lcd_Cmd(Lcd_CLEAR)

Lcd_Out(1 1 Bonjour) Affiche Bonjour ligne 1 colonne 1

break

case 1

if(PORTAF2==1)

BP=0

Delay_ms(250)

if(cond==1000)

Lcd_Cmd(Lcd_CLEAR)

Lcd_Out(1 1 Mme Leymarie )

break

Station meacuteteacuteo autonome 2012

7

Fonctionnement de ce programme

Affiche laquo bonjourhellip raquo sur lrsquoeacutecran LCD

Appuie sur le BP

Affiche laquo Mme Leymarie raquo sur lrsquoeacutecran LCD

Appuie sur le BP

Affiche laquo bonjourhellip raquo sur lrsquoeacutecran LCD

Etc

Les fonctions de lrsquoeacutecran LCD sont expliqueacutees dans lrsquoaide du logiciel MikroC La variable laquo cond raquo

est une condition pour ne pas afficher le mot agrave chaque boucle mais tous les 1000 iteacuterations ce qui

permet de ne pas faire clignoter lrsquoeacutecran ADCON1 sera expliqueacute agrave la suite de ce rapport

VII Le capteur drsquohumiditeacute

Apregraves avoir pris en main

lrsquoeacutecran LCD ainsi que le logiciel

nous avons deacutecideacute drsquoinstaller le

capteur drsquohumiditeacute On nous a mis

agrave disposition un capteur

drsquohumiditeacute de reacutefeacuterence HIH-

4000-001 Crsquoest un capteur qui

renvoie une tension analogique

(cf figure 4) Nous avons

commenceacute par chercher sa

datasheet et regarder les

proprieacuteteacutes du capteur

A Caracteacuteristiques du capteur drsquohumiditeacute

Voici les proprieacuteteacutes importantes du capteur donneacutee par la notice

Gamme dhumiditeacute 0 agrave 100 RH (Relative Humidity) avec une Preacutecision de plusmn 35 RH

Gamme de tension dalimentation 4V agrave 58V

Tempeacuterature de fonctionnement -40degC agrave +85degC (-40 degF to 185 degF)

Courant alimentation 500μA

Sortie Analogique

Figure 4 Capteur dhumiditeacute HIH 4000-001

Station meacuteteacuteo autonome 2012

8

Pour ce qui est lrsquoeacutequation de la tension

en fonction de lrsquohumiditeacute le constructeur nous

donne la courbe drsquoeacutetalonnage suivante (cf

figure 5)

De cette courbe nous en avons tireacute les

valeurs suivantes (cf figure 6)

Nous avons ensuite deacutecideacute de la retracer sur Excel et drsquoen tirer llsquoeacutequation qui sera utiliseacute dans le

programme du microcontrocircleur

On voit qursquoExcel nous donne lrsquoeacutequation suivante

U=0031H +081

Donc H= (U-081)0031

De plus nous multiplierons par 1000 la valeur de H pour pouvoir reacutecupeacuterer les chiffres

deacutecimales et les rentrer dans une chaine de caractegraveres et les afficher sur lrsquoeacutecran LCD H=

(U810)0031

La valeur maximum de H est donc de 100 000 nous la deacuteclarerons donc en long (une

deacuteclaration en int ne serais pas suffisant -32768 agrave 32767)

Figure 5 Courbes donneacutee par le constructeur

Figure 6 tableau de mesure

Figure 7 Courbe traceacute sur Excel

Station meacuteteacuteo autonome 2012

9

Nous avons remarqueacute sur la courbe ainsi qursquoen simulation que le capteur peut avoir des

valeurs supeacuterieur agrave 100 et infeacuterieur agrave 0 Il faudra donc mettre deux conditions pour ne pas

deacutepasser la plage de valeur

B Configuration du microcontrocircleur

Maintenant nous arrivons agrave point important de cette partie celle de la configuration des

ports du microcontrocircleur En effet le PIC16F876 est constitueacute drsquoun module convertisseur agrave 5 entreacutees

Ces entreacutees sont situeacutees sur les bornes RA0 RA1 RA2 RA3 et RA5 (cf figure1) Le reacutesultat de la

conversion est codeacute sur 10 bits Crsquoest une valeur comprise entre hrsquo000rsquo et hrsquo3FFrsquo

hlsquo3FFrsquo = brsquo1 1111 1111rsquo = drsquo1023rsquo

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 eacutequation

U = (Valeur lue sur le CAN 5)1023

Pour les mecircme raison que lrsquoeacutequation du capteur drsquohumiditeacute nous avons multiplieacute par

1000 la tension nous obtenons donc U= (Valeur lue sur le CAN 5000)1023

Il faut ensuite reacutegler les entreacutees analogiques avec les registres ADCON0 et ADCON1 en

sachant que nous avons deacutecideacute 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 (Freacutequence drsquooscillation)2

01= Fosc8

10= Fosc32

11= Oscillateur RC interne

Pour que la conversion soit correct il faut que T(ad) soit au minimum de 16micros nous

disposons drsquoun quartz de 20Mhz =gt 20Mhz32 =gt 16micros Nous mettrons donc le bit 7 agrave 1 et

le 6 agrave 0

Bit 5 bit4 et bit 3 CHS2 CHS1 et CHS0 = Channel Select bits

Ces 3 bits permettent de choisir lentreacutee qui va ecirctre convertie

Station meacuteteacuteo autonome 2012

10

Nous voulons convertir lrsquoentreacutee RA0 pour cela il faut mettre les bits 5 4 3 agrave 0

Bit 2 GODONE Status bit si ADON=1

1 = Deacutemarre la conversion AD Ce bit est remis agrave 0 par hard

0 = La conversion AD est termineacutee

Il nous faut deacutemarrer la conversion

Bit 1 Bit non implanteacute

Bit 0 ADON AD on bit

1= Convertisseur AD en service

0 = Convertisseur AD agrave larrecirct

Il nous faut mettre le convertisseur en service

ADCON0 = brsquo1000 0101rsquo = hrsquo85rsquo

Bit 7 ADFM = AD Result format

1 = Justifieacute agrave droite

0 = Justifieacute agrave gauche

Nous avons justifieacute agrave droite

Bit 6 bit 5 et bit 4 Bits non impleacutementeacutes

Bit 3 bit 2 bit 1 et bit 0 PCFG3 PCFG2 PCFG1 et PCFG0

Bits de controcircle de la configuration des Ports

Ces bits permettent de choisir le partage entre entreacutees analogiques et digitales sur les PORTS A et E

On a choisi drsquoactiver RA0 RA1 et RA3 en entreacutee analogique les autres resteront en

digitales ce qui signifie qursquoau vue de la datasheet il faut mettre le bit 2 agrave 1 et les autres agrave 0

ADCON1 = brsquo10000100rsquo = hrsquo84rsquo

Station meacuteteacuteo autonome 2012

11

C Le scheacutema du microcontrocircleur avec le capteur drsquohumiditeacute

Voici le scheacutema de cacircblage du capteur drsquohumiditeacute uniquement A noter que le capteur est

remplaceacute par un potentiomegravetre nrsquoeacutetant pas dans la librairie de Proteus On constate qursquoil est bien

brancheacute sur RA0

D Programme pour la mesure de lrsquohumiditeacute

Voici le programme pour mesurer lrsquohumiditeacute avec les affectations deacutecrites ci-dessus ainsi

que les eacutequations de conversions

Deacuteclaration des fonctions

void humidite(int cond)

void lcd(int li int co int nb char receive[11])

void main()

deacuteclaration des variables

int cond=0 Condition pour laffichage sur leacutecran LCD

Initialisation et affectation des ports

PORTB=0 initialisation

TRISB=0 Port B deacuteclarer en sortie

TRISA = 0xFF Port A en entreacutee

ADCON1 = 0x84 Justifieacute agrave droite active RA0RA1RA3 analogique

ADCON0 = 0x85 Fosc32 sur PA0 en service

Configuration et initialisation de leacutecran LCD

Lcd_Config(ampPORTB 0 1 WR 5 4 3 2) Configure leacutecran

Lcd_Init(ampPORTB) initialisation du LCD

Lcd_Cmd(Lcd_CURSOR_OFF) Enlegraveve le curseur

Lcd_Cmd(Lcd_CLEAR) Efface leacutecran

Figure 8 Scheacutema de cacircblage du capteur dhumiditeacute

Station meacuteteacuteo autonome 2012

12

Boucle infinie

while(1)

cond=cond+1 Increacutemente la variable cond

humidite(ampcond) Appel la fonction humiditeacute

Fonction humiditeacute

void humidite(int cond)

long H U VL Deacuteclaration des variables

char HH hum[8] humtxt[]=Humidite

VL=Adc_read(0) Valeur lue sur RA0(humiditeacute)

U=(VL5000)1023 Convertit la valeur lue en tension x1000

H=(U-810)(0031) Convertit la tension en humiditeacute x1000

if(Hgt100000) Si H gt 100(impossible) alors = 100

H=100000

if(Hlt0) Si H lt 0(impossible) alors = 0

H=0

hum[0]=(H100000)+48 Valeur des centaines affecteacute en ascii(48=0)

HH=(H10000)10

hum[1]=HH+48 Valeur des dizaines affecteacute en ascii

HH=(H1000)10

hum[2]=HH+48 Valeur des uniteacutes affecteacute en ascii

hum[3]=44Virgule affecteacute en ascii

HH=(H100)10

hum[4]=HH+48 Valeur de la premiegravere deacutecimale affecteacute en ascii

HH=(H10)10

hum[5]=HH+48 Valeur de la deuxiegraveme deacutecimale affecteacute en ascii

hum[6]=37 Pourcentage affecteacute en ascii

if(cond==1000)Appel la fonction LCD tous les 1000

lcd(1 1 10 humtxt) Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 7 hum) Affiche la chaine de caractegravere hum sur le LCD

cond=0 Remise a 0 de la condition

Fonction affichage

void lcd(int li int co int nb char receive[11])

int i

for(i=0 ilt=nb i++)Boucle for

Lcd_chr(li (co+i) receive[i]) Affiche les caractegraveres jusquagrave i

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

Station meacuteteacuteo autonome 2012

13

VIII Le capteur de tempeacuterature

A preacutesent comme toute station meacuteteacuteo

nous avons installeacute un capteur de tempeacuterature le

DS1621 Ce capteur communique avec le

microcontrocircleur gracircce au protocole I2C

A Le protocole I2C

Le bus I2C (Inter Integrated Circuit) a eacuteteacute deacuteveloppeacute au deacutebut des anneacutees 80 par Philips

semiconductors pour permettre de relier facilement agrave un microprocesseur les diffeacuterents circuits dun

teacuteleacuteviseur moderne

Le bus I2C permet de faire communiquer entre eux des composants eacutelectroniques tregraves divers

gracircce agrave seulement trois fils Un signal de donneacutee (SDA) un signal dhorloge (SCL) et un signal de

reacutefeacuterence eacutelectrique (Masse)

Ceci permet de reacutealiser des eacutequipements ayant des fonctionnaliteacutes tregraves puissantes (En

apportant toute la puissance des systegravemes micro programmeacutes) et conservant un circuit imprimeacute tregraves

simple par rapport un scheacutema classique (8bits de donneacutees 16 bits dadresse + les bits de controcircle)

Les donneacutees sont transmises en seacuterie agrave 100Kbitss en mode standard et jusquagrave 400Kbitss en

mode rapide Ce qui ouvre la porte de cette technologie agrave toutes les applications ougrave la vitesse nest

pas primordiale

Voici un exemple de protocole qursquoutilise le bus I2C

1 Pour initier le dialogue le maicirctre creacutee une condition Start

2 Le maicirctre envoie ladresse de lesclave (1010100) suivi du bit 0 (bit Write)

3 Lesclave reacutepond (accuseacute de reacuteception bit Acknowledge)

4 Le maicirctre envoie ladresse du registre (0x04) agrave eacutecrire

5 Lesclave reacutepond (accuseacute de reacuteception bit Acknowledge)

6 Le maicirctre envoie la donneacutee (0x27) agrave eacutecrire

7 Lesclave eacutecrit la donneacutee puis envoie un accuseacute de reacuteception (bit Acknowledge)

8 Le maicirctre termine le dialogue avec une condition Stop

9 Le bus I2C est maintenant libre (SCL = 1 SDA = 1 niveaux de repos)

Figure 9 scheacutema du DS1621

Station meacuteteacuteo autonome 2012

14

B Caracteacuteristique du DS1621

Comme on peut voir sur la figure 9 le capteur est composeacute de 8 bornes

SDA =gt Liaison seacuterie entreacutee sortie

SCL =gt Signal drsquohorloge

Tout =gt Signal de sortie du thermostat (inutile dans notre cas)

GND =gt Masse

VDD =gt Alimentation +5V

A0 A1 A2 =gt Entreacutee drsquoadressage (dans notre cas les 3 agrave la masse car nous nrsquoavons qursquoun

module I2C)

Les circuits connecteacutes sur un bus I2C ont des sorties de type drain ouvert (ou collecteur

ouvert) Deux reacutesistances de pull-up sont bien sucircr placeacutees entre les lignes SDA SCL et lalimentation

(VDD)Quand le bus nest pas utiliseacute SDA et SCL sont au niveau haut (niveau de repos)

1 Speacutecificiteacute des commandes

Tous dialogue du maicirctre(PIC16F876) avec un DS1621 esclave doit deacutebuter par lrsquoenvoi drsquoun

mot de controcircle

Le maicirctre envoi ensuite une commande suivi ou non de donneacutees Voici la liste des

commandes avec leur description

Les commandes AC EE et 22 ne sont pas suivies de lenvoi de donneacutees Par contre la

commande AA qui nous inteacuteresse est suivie de lrsquoenvoi par le DS1621 de 2 octets repreacutesentant la

tempeacuterature

Station meacuteteacuteo autonome 2012

15

Voici le registre de configuration(AC) qursquoil nous faut deacuteterminer

DONE 1 = conversion finie 0 = conversion en cours En mode 1 SHOT uniquement

THF Flag seuil haut du thermostat Passe agrave 1 et y reste si tempeacuterature supeacuterieure agrave TH

TLF Flag seuil bas du thermostat Passe agrave 1 et y reste si tempeacuterature infeacuterieure agrave TL

NVB 1 = meacutemoire EEPROM en eacutecriture 0 = meacutemoire EEPROM eacutecriture termineacutee

Nous nrsquoactiverons pas lrsquoeacutecriture de la meacutemoire

POL Polariteacute de Tout (pin 3) 1 = actif sera un niveau HAUT 0 = actif sera un niveau BAS

Il faut activer la polariteacute donc nous le mettons agrave 1

ONE SHOT 0 = conversion en continu 1 = conversion 1 fois

Nous le mettons en mode continu

AC = brsquo00001010rsquo = hrsquo0Arsquo

La commande AA qui permet de lire la tempeacuterature renvoie 2 octets

MSB (Most Significant Bit) Nombre signeacute donnant la tempeacuterature entre +125deg et -55degC

LSB (Least Significant Bit ) Seul le bit 7 de cet octet est significatif Si 1 tempeacuterature

MSB +05degC

Pour bien comprendre comment est codeacute un nombre signeacute un tableau avec des exemples de

valeurs eacutetait agrave notre disposition dans la notice

Station meacuteteacuteo autonome 2012

16

2 Dialogue I2C pour avoir la tempeacuterature

Voici un scheacutema qui montre le dialogue agrave effectuer entre le microcontrocircleur et le capteur

pour avoir la tempeacuterature Crsquoest gracircce agrave ce mecircme scheacutema que nous avons pu programmer le PIC

Station meacuteteacuteo autonome 2012

17

C Le scheacutema du microcontrocircleur avec le capteur de tempeacuterature

Voici le scheacutema du capteur de tempeacuterature uniquement Le capteur est brancheacute sur les

borne SCL(RC3) et SDA(RC4) du PIC Qursquoelles soient deacuteclareacutees en entreacutee ou en sortie les bornes SCL et

SDA sont fonctionnelles Il ne faut pas oublier les reacutesistances de tirages (R1 et R3) Lrsquoadressage A0 A1

A2 toutes misent agrave la masse car nous nrsquoavons qursquoun seul capteur I2C relieacute au PIC et le Tout

(thermostat) inutile car nous faisons juste un releveacute de tempeacuterature

D Programme pour la mesure de la tempeacuterature

Deacuteclaration des fonctions

void temperature(int cond)

void lcd(int li int co int nb char receive[14])

void main()

deacuteclaration des variables

int cond=0Condition pour laffichage sur leacutecran LCD

Initialisation et affectation des ports

PORTB=0 initialisation

PORTC=0

TRISB=0 Port B deacuteclarer en sortie

TRISC = 0xFF Port C en entreacutee

Configuration et initialisation de leacutecran LCD

Lcd_Config(ampPORTB 0 1 WR 5 4 3 2) Configure leacutecran

Lcd_Init(ampPORTB) initialisation du LCD

Lcd_Cmd(Lcd_CURSOR_OFF) Enlegraveve le curseur

Lcd_Cmd(Lcd_CLEAR) Efface leacutecran

Initialisation du module I2C

I2C_Init(100000) initialisation de la communication I2C

I2C_Start() Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90) Mode de controcircle en mode eacutecriture

I2C_Wr(0xAC) Accegraves au registre de configuration

I2C_Wr(0x0A) Registre de configuration mesure en continu

I2C_Stop() Arrecirct du signal

I2C_Start() Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90) Mode de controcircle en mode eacutecriture

Figure 10 Scheacutema de cacircblage avec le capteur de tempeacuterature

Station meacuteteacuteo autonome 2012

18

I2C_Wr(0xEE) Deacutebut de la conversion

I2C_Stop()Arrecirct du sigal

Boucle infinie

while(1)

cond=cond+1 Increacutemente la variable cond

temperature(ampcond) Appel la fonction humiditeacute

Fonction tempeacuterature

void temperature(int cond)

char temp[7] temptxt[]=Temperature LSB

signed char MSB

I2C_Start() Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90) Mode de controcircle en mode eacutecriture

I2C_Wr(0xAA) Lecture de la tempeacuterature

I2C_Stop() Arrecirct du signal

I2C_Start() Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x91) Mode de controcircle en mode lecture

MSB = I2C_Rd(1) Nombre signeacute donnant la tempeacuterature entre +125deg et -55degC

LSB = I2C_Rd(0) Si bit 7 = 1 tempeacuterature MSB +05degC

I2C_Stop() Arrecirct du signal

if(MSBlt0)

MSB = abs(MSB) Si tempeacuterature neacutegative valeur absolue de MSB

Temp[0]=45 Signe - affecteacute en ascii

else

Temp[0]=43 signe + affecteacute en ascii

Temp[1]=(MSB10)+48 Valeur des dizaines affecteacute en ascii

Temp[2]=(MSB10)+48 Valeur des uniteacutes affecteacute en ascii

Temp[3]=44 Virgule affecteacute en ascii

if (LSB==128) Si bit 7 agrave 1 alors +05deg

Temp[4]=5

Else Si bit 7 agrave 0 alors +00deg

Temp[4]=0

Temp[5]=223 degreacute affecteacute en ascii

Temp[6]=67 C affecteacute en ascii

if(cond==10) Appel la fonction LCD tous les 1000

lcd(1 1 13 temptxt) Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 6 temp) Affiche la chaine de caractegravere hum sur le LCD

cond=0 Remise a 0 de la condition

Fonction affichage

void lcd(int li int co int nb char receive[14])

int i

for(i=0 ilt=nb i++)Boucle for

Lcd_chr(li (co+i) receive[i]) Affiche les caractegraveres jusquagrave i

Le scheacutema preacuteceacutedent est bien respecteacute comme on peut le voir crsquoest tregraves facile agrave programmer

gracircce aux librairies I2C du logiciel MikroC

Station meacuteteacuteo autonome 2012

19

IX Lrsquoaneacutemomegravetre

A Conception

Pour lrsquoaneacutemomegravetre lrsquoeacutequipe peacutedagogique

nous a juste fourni lrsquoheacutelice du capteur donc il a fallu

concevoir toute la partie eacutelectronique Lrsquoideacutee est

drsquoinstaller une diode et un transistor photonique par

de lagrave lrsquoheacutelice et lorsqursquoelle tourne elle vient couper le

faisceau Succinctement le transistor envoit soit 1 soit

0 sur le PIC Le but est de relever la freacutequence agrave

laquelle tourne lrsquoheacutelice puis la convertir en vitesse (cf

figure 11)

La photodiode choisie est de reacutefeacuterence SD5455-3 Ce choix a eacuteteacute fait car lrsquoangle du faisceau

est de 20deg pour que le flux infrarouge soit bien concentreacute sur le phototransistor pour un

fonctionnement optimal

Comme on le voit sur le scheacutema de principe (cf figure 11) il a fallu dimensionner la

reacutesistance qui sert agrave reacuteguler le courant qui circule dans la LED avec les informations donneacutees par la

documentation technique nous avons pu la calculer

Forward voltage VF = 17V et IF = 01A

Ualim = 5V

RD = (Ualim ndash UF)IF = (5 ndash 17)01

RD = 33Ω

Pour le phototransistor nous avons choisi celui qui allait avec la diode de reacutefeacuterence SE5455-3

Cette fois la valeur de la reacutesistance nous eacutetait donneacute par le constructeur

RL=1000Ω

Lors des seacuteances nous avons implanteacute la diode et le

transistor sur le support du capteur Pour des raisons

pratiques et estheacutetiques nous avons seacutepareacute la partie

aneacutemomegravetre et la partie platine par des borniers (cf figure

12)

Figure 11 scheacutema descriptif de laneacutemomegravetre

Figure 12 Notre aneacutemomegravetre

Station meacuteteacuteo autonome 2012

20

B Mesure de la peacuteriode sur le microcontrocircleur

Le but est de relever la peacuteriode du signal envoyer par lrsquoaneacutemomegravetre pour cela le PIC est

eacutequipeacute drsquoun mode capture Le principe est de recopier agrave un moment voulu la valeur du timer 1 La

capture peut avoir lieux agrave chaque front descendant agrave chaque front montant tous les 4 ou tous les 16

fronts montants Quand la capture a eu lieu un flag est mis agrave 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 constitueacute de 2 registres de 8 bits TMR1H et TMR1L que lon peut lire ou eacutecrire Le registre TMR1

(constitueacute de TMR1H et TMR1L) sincreacutemente de h0000 jusquagrave hFFFF et repasse ensuite agrave h0000

pour continuer le comptage Quand il y a deacutebordement une interruption peut ecirctre geacuteneacutereacutee si on lrsquoa

autoriseacutee par TMR1IE =1 (bit 0 de PIE1) et le Flag TMR1IF (bit 0 de PIR1) passe agrave 1 Le controcircle du

timer 1 ce fait par le registre T1CON

Bit 7 et bit 6 bits non impleacutementeacutes

Bit 5 et bit 4 T1CKPS = Seacutelection du preacute diviseur placeacute avant le TIMER

Vu qursquoon a un quartz eacuteleveacute nous avons deacutecideacute de choisir un preacute-diviseur de 8 donc

F=Fosc(48) Pour cela mettre les bit 4 et 5 agrave 1

Bit 3 T1OSCEN Bit dautorisation de loscillateur du Timer 1

1 = oscillateur autoriseacute

0 = oscillateur stoppeacute

Oscillateur interne inutile donc bit 3 agrave 0

Bit 2 T1SYNC Bit de controcircle de la synchronisation du CLK externe

1 = Pas de synchronisation de lhorloge externe

0 = Synchronisation de lhorloge externe

Nous nous mettrons en mode synchrone

Bit1 TMR1CS Bit de seacutelection de la source horloge

1 = Mode Compteur Clk externe sur la broche PC0 ou Quartz entre PC0 et PC1

0 = Mode Timer Clk interne = Fosc4

Station meacuteteacuteo autonome 2012

21

On mettra ce bit agrave 0 car on utilise le mode Timer

Bit 0 TMR1ON Bit dautorisation du Timer 1

1 = Timer 1 en service

0 = Timer 1 stoppeacute

Il faut eacutevidemment mettre la timer 1 en service

Nous avons aussi autoriseacute le deacutebordement du timer 1 pour avoir plus de preacutecisions pour cela il faut

mettre la commande PIE1TMR1 agrave 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 parameacutetrer le registre

CCP1CON

Bit 7 et Bit 6 bits non impleacutementeacutes

Bit 5 et Bit 4 CCP1X et CCP1Y

Bits non utiliseacutes 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 agrave Bit 0 CCP1M3 agrave CCP1M0 bits de seacutelection du mode

Nous avons seacutelectionneacute le mode capture sur chaque front montant Pour cela nous avons

mis les bits 1 et 3 agrave 0 et les bits 0 et 2 agrave 1

Pour savoir si un front montant agrave eu lieu le flag CCP1F est mis agrave 1 Ce flag doit ecirctre remis agrave 0 par

lrsquoutilisateur La valeur des 16 bits des registres du Timer 1 TMR1L (bit de poids faible) et TMR1H (bit

de poids fort) sont recopieacutees dans les registres CCPR1 CCPRIH (bit de poids faible) et CCPR1L (bit de

poids fort)

Nous avons programmeacute le mode capture de faccedilon agrave afficher sur lrsquoeacutecran LCD la valeur du registre

CCPR1 crsquoest-agrave-dire la peacuteriode du signal de lrsquoaneacutemomegravetre Il ne nous reste maintenant plus qursquoagrave

eacutetalonner notre aneacutemomegravetre

Station meacuteteacuteo autonome 2012

22

C Etalonnage de lrsquoaneacutemomegravetre

Pour eacutetalonner le capteur nous avons commenceacute par savoir agrave quelle freacutequence correspond la

valeur releveacutee par le mode capture Pour cela nous avons brancheacute un GBF agrave la place du capteur et

avec un oscilloscope nous avons compareacute leurs valeurs

Nous avons ensuite traceacute agrave lrsquoaide des valeurs du tableau la courbe F(Hz) en fonction du

compteur De cette courbe nous relevons lrsquoeacutequation

F = 671310compteur^(-101)

Soit environ F = 671310compteur

Puis nous avons brancheacute notre aneacutemomegravetre sur le microcontrocircleur Cela dans le but de

relever sa peacuteriode sur lrsquoeacutecran LCD agrave lrsquoaide drsquoune soufflerie variable et du manomegravetre GDH (reacutef

121552 200-13) nous avons compareacute leurs valeurs pour connaitre lrsquoeacutetalonnage de notre capteur

Nous avons noteacute plusieurs valeurs puis traceacute diffeacuterentes courbe pour trouver les eacutequations qui nous

permettrons de calculer la vitesse dans notre programme

Station meacuteteacuteo autonome 2012

23

Voici les valeurs que nous avons releveacutees puis la courbe traceacutee sur Excel

De cette courbe nous obtenons lrsquoeacutequation

Vitesse du vent = 0179F + 0629

Nous les multiplierons par 100 pour reacutecupeacuterer les deacutecimales et les implanter dans une chaine

de caractegravere

Vitesse du vent = 179F + 629

Nous avons agrave preacutesent agrave notre disposition toutes les eacutequations neacutecessaires pour pouvoir

convertir la valeur releveacutee par le mode capture en une vitesse

D Le scheacutema du microcontrocircleur avec lrsquoaneacutemomegravetre

On voit sur le scheacutema que le capteur est bien relieacute sur la borne RC2 Nous avons aussi

repreacutesenteacute les borniers J1 et J2 A droite tous ce qui est sur le support et agrave gauche tous ce qui est sur

la platine

Figure 13 Scheacutema avec laneacutemomegravetre

Station meacuteteacuteo autonome 2012

24

E Programme pour la mesure de la vitesse du vent

Voici le programme pour mesurer la vitesse du vent avec les affectations deacutecrites ci-dessus

ainsi que les eacutequations de conversions

Deacuteclaration des fonctions

void vent(int cond)

void lcd(int li int co int nb char receive[20])

void main()

deacuteclaration des variables

int cond=0

Initialisation et affectation des ports

PORTB=0 initialisation

PORTC=0 initialisation

TRISC=0x04 Port C deacuteclarer en sortie sauf RC2 en mode capture

TRISB=0 Port B deacuteclarer en sortie

Configuration du mode capture

T1CON=0x31 Configuration du timer1

CCP1CON=0x05 Parameacutetrage du mode capture

PIE1TMR1IE=1 Autorise les deacutebordements du timer 1

Configuration et initialisation de leacutecran LCD

Lcd_Config(ampPORTB 0 1 WR 5 4 3 2) Configure leacutecran

Lcd_Init(ampPORTB) Initialisation du LCD

Lcd_Cmd(Lcd_CURSOR_OFF) Enlegraveve le curseur

Lcd_Cmd(Lcd_CLEAR) Efface leacutecran

Boucle infinie

while(1)

cond=cond+1

vent(ampcond)

Fonction vent

void vent(int cond)

unsigned long tl th per

int vitfreq

char vent[13] txtvent[]=vitesse du vent VV

if(PIR1CCP1IF==1) Test si front montant agrave lieu

TMR1H=0 Initialisation du timer1 bit de point fort

TMR1L=0 Initialisation du timer1 bit de point faible

th=CCPR1H Les valeurs sont copieacute dans des variables

tl=CCPR1L

th=thltlt8 Deacutecalage car th =gt bit de point fort

per = th|tl On concategravene les deux valeurs nous obtenons la peacuteriode

PIR1CCP1IF=0 Remise a 0 du drapeau

if(PIR1TMR1IF==1) Si deacutepassement du timer 1

per=65535+per On ajoute une retenue lorsquon a fait un tour (16bit)

PIR1TMR1IF=0 Remise a 0 du drapeau deacutepassement

freq=671310per Calcul de la freacutequence

vit=freq179 + 692 Calcul de la vitesse que lon x100

Station meacuteteacuteo autonome 2012

25

if(vitlt200) En dessous 2ms la mesure est aleacuteatoire agrave cause du 2egraveme deacutebordement

vit=0

vent[0]=(vit10000)+48 Valeur des centaines affecteacute en ascii(48=0)

VV=(vit1000)10

vent[1]=VV+48 Valeur des dizaines affecteacute en ascii

VV=(vit100)10

vent[2]=VV+48 Valeur des uniteacute affecteacute en ascii

VV=(vit10)10

vent[3]=44 Virgule affecteacute en ascii

vent[4]=VV+48 Valeur de la 1er deacutecimale affecteacute en ascii

VV=vit10

vent[5]=VV+48 Valeur de la 2egraveme deacutecimale affecteacute en ascii

vent[6]=109 m affecteacute en ascii

vent[7]=47 affecteacute en ascii

vent[8]=115 s affecteacute en ascii

if(cond==1000) Appel la fonction LCD tous les 1000

lcd(1 1 16 txtvent) Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 8 vent) Affiche la chaine de caractegravere hum sur le LCD

cond=0 Remise a 0 de la condition

Fonction affichage

void lcd(int li int co int nb char receive[20])

int i

for(i=0 ilt=nb i++) Boucle for

Lcd_chr(li (co+i) receive[i]) Affiche les caractegraveres jusquagrave i

Station meacuteteacuteo autonome 2012

26

X Simulation une station meacuteteacuteo autonome

Maintenant que tous nos capteurs sont installeacutes nous allons mettre agrave profit le bouton

poussoir installeacute dans la partie LCD Crsquoest-agrave-dire que nous allons rassembler tous les programmes

preacuteceacutedents pour nrsquoen faire qursquoun Il suffira drsquoappuyer sur le bouton poussoir pour faire deacutefiler les

diffeacuterentes valeurs comme une vraie station meacuteteacuteo

A La structure du programme

Boucle infinie

while(1)

cond=cond+1 Increacutemente la variable cond

switch(BP)

case 0

humidite(ampcond) Appel la fonction humiditeacute

if(PORTAF2==1) Ces if permet de changer la valeur de BP

BP=1

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250) Temps quon relacircche bien le bouton

break

case 1

temperature(ampcond) Appel la fonction tempeacuterature

if(PORTAF2==1)

BP=2

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)

break

case 2

vent(ampcond) Appel la fonction vent

if(PORTAF2==1)

BP=0

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)

break

Nous avons choisi drsquoutiliser un Switch nous avons donc juste rajouteacute une variable BP

Lorsqursquoil y a appui sur le bouton poussoir la variable BP srsquoincreacutemente et le programme passe agrave une

autre case et donc utilise une nouvelle fonction La temporisation nous donne le temps de relacirccher le

bouton pour eacuteviter de faire deacutefiler le menu sans le vouloir

Station meacuteteacuteo autonome 2012

27

B La simulation

Etant donneacute que nous ne pouvions pas prendre le mateacuteriel avec nous il eacutetait impeacuteratif de

pouvoir faire des simulations Pour cela nous avons utiliseacute un logiciel tregraves utile Proteus ISIS Ce

logiciel possegravede une tregraves grande librairie et permet de rentrer nos programmes sur le PIC virtuel

geacuteneacutereacute par le logiciel Pour simuler le capteur drsquohumiditeacute nous avons utiliseacute un potentiomegravetre Pour

celui de lrsquoaneacutemomegravetre comme pour nos mesures nous avons brancheacute virtuellement un GBF sur la

borne associeacute et observeacute son signal agrave lrsquoaide drsquoun oscilloscope

Voilagrave un aperccedilu de la simulation effectueacute sur ISIS

Veacuterification theacuteorique du vent

Vitesse du vent = 0179 37 + 0629

Vitesse du vent = 7657ms

Veacuterification theacuteorique de lrsquohumiditeacute

H= (315-081)0031

H=7548

Veacuterification theacuteorique de la

tempeacuterature

La valeur afficheacutee correspond bien

aux 27degC seacutelectionneacute sur le capteur

Station meacuteteacuteo autonome 2012

28

XI Transmission des donneacutees par liaison ZigBee

ZigBee est un protocole de haut niveau permettant la communication de petites radios agrave

consommation reacuteduite baseacutee sur le standard IEEE 802154

Cette technologie a pour but la communication de courte distance telle que le propose deacutejagrave

la technologie Bluetooth tout en eacutetant moins chegravere plus simple et avec une fiabiliteacute assez eacuteleveacutee

Dans notre projet nous nous servirons de ZigBee pour permettre une transmission par ondes

de nos donneacutees de la station meacuteteacuteo vers un ordinateur Pour cela nous avons 2 modules Xbee pro 2

platines drsquointerfaces une avec des pattes (liaison platine) et lrsquoautre avec une sortie RS232 (liaison pc)

Caracteacuteristique eacutelectrique

Les signaux Xbee ont une amplitude de 33V mais sont alimenteacutes en 5V (tension de notre

source USB) cacircbleacutes sur la bornes VIN (laquo Power input from 6-12Vdc 300mA or higher raquo) Mais

notre source nrsquoeacutetant pas assez puissante pour alimenter toute notre installation Nous utiliserons

donc une source externe de 5V qui sera utiliseacutee pour alimenter les 2 systegravemes Xbee

Description des Bornes du Xbee qui nous inteacuteresse

Station meacuteteacuteo autonome 2012

29

A Scheacutema eacutelectrique du module Xbee

Nous avons cacircbleacute la sortie TX du microcontrocircleur qui eacutemet un signal jusqursquoagrave la borne RX du

Xbee qui reacuteceptionne ce signal Apregraves la transmission se fait par onde entre les 2 modules Xbee Pour

le module qui reccediloit le signal un cacircble RS232 suffit agrave faire la liaison entre celui-ci et le PC

B Envoi des donneacutees la liaison Usart

Un USART (Universal synchronous amp Asynchronous Receiver Transmitter) est un eacutemetteur-

reacutecepteur universel En langage courant cest le composant utiliseacute pour faire la liaison entre

lordinateur et le port seacuterie Lordinateur envoie les donneacutees en parallegravele (autant de fils que de bits

de donneacutees) Il faut donc transformer ces donneacutees pour les faire passer agrave travers une liaison seacuterie qui

utilise un mecircme fil pour faire passer tous les bits de donneacutees

Constitution dune trame USART

un bit de start toujours agrave 0 servant agrave la synchronisation du reacutecepteur

les donneacutees la taille peut varier (geacuteneacuteralement entre 5 et 9 bits)

eacuteventuellement un bit de pariteacute paire ou impaire

et un bit de stop toujours agrave 1 (la dureacutee peut varier entre 1 15 et 2 temps bit)

Le niveau logique de repos est le 1

Figure 14 Trame USART

Station meacuteteacuteo autonome 2012

30

Afin de faciliter les liaisons entre peacuteripheacuteriques (PC microcontrocircleur modem hellip) des vitesses

de transmission sont normaliseacutees luniteacute baud correspondant agrave un temps bit Dans notre cas nous

choisirons une vitesse de transmission de 9600bps

C Programme drsquoenvoi des donneacutees par liaison Usart

Gracircce agrave la librairie de MikroC il est tregraves facile drsquoenvoyer des donneacutees par liaison Usart Cela

fonctionne comme pour envoyer des caractegraveres sur lrsquoeacutecran LCD Il faut juste ensuite choisir la vitesse

de transmission qui sera 9600bps Voici la fonction et un morceau du programme qui sert agrave envoyer

les caractegraveres sur Xbee et de Xbee agrave un HyperTerminal

Fonction humiditeacute

void humidite(int cond)

long H U VL Deacuteclaration des variables

char HH hum[8] humtxt[]=Humidite

helliphellip

Xbee(8 hum) Envoi la chaicircne de caractegravere hum dans la fonction xbee

Usart

void xbee(int nb char receive[20])

int i

Usart_Init(9600) Vitesse de transmission

for(i=0 ilt=nb i++) Boucle for

Usart_Write(receive[i]) Envoi les caractegraveres sur lrsquoHyperTerminal jusquagrave i

Station meacuteteacuteo autonome 2012

31

XII Estimation du coucirct du projet

On peut voir sur ce tableau que le prix de reviens pour les eacuteleacutements que nous avons utiliseacute

est de 14506euro TTC Ce qui est plutocirct oneacutereux compareacute aux stations meacuteteacuteo du marcheacute qui oscille

entre 6euro et 400euro En sachant que la nocirctre est loin drsquoecirctre finaliseacute (finition estheacutetique ergonomie et

ajout de nouvelle fonction comme la date et lrsquoheure)

Composant Quantiteacute Prix (TVA inclus) Liens Quartz 20000MHz 1 111 euro Lien

Capaciteacute 22pF 2 010 euro lien

PIC 16F876 1 427 euro lien

LCD MODULE 1 1575 euro lien

Potentiomegravetre 10KΩ 1 618 euro lien

Reacutesistance 33 Ω 1 035 euro lien

Reacutesistance 10 K Ω 2 070 euro lien

Reacutesistance 1 KΩ 3 105 euro lien

LED rouge 1 013 euro lien

DS1621 1 650 euro lien

Bouton poussoir 1 060 euro lien

Module Xbee 2 4000 euro lien

Platine dinterface (XBEE) RS232 1 1890 euro lien

Platine dinterface (XBEE) 1 1364 euro lien

Capteur drsquohumiditeacute 1 2692 euro lien

Transistor 1 561 euro lien

Diode 1 325 euro lien

Totales 1 14506 euro

Station meacuteteacuteo autonome 2012

32

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

panelsbut 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 Itrsquos also possible to measure

humidity and wind speed Then itrsquos 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 its 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 Itrsquos 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

Station meacuteteacuteo autonome 2012

33

XIV Conclusion

Ce projet sur la conception drsquoune station meacuteteacuteo autonome qui nous a eacuteteacute confieacute a eacuteteacute tregraves

enrichissant Il nous a permis de mettre en relations les connaissances acquises durant lrsquoanneacutee mais

aussi acqueacuterir de nouvelles connaissances comme le fonctionnement drsquoun microcontrocircleur En effet

nous nrsquoavions jamais programmeacute sur microcontrocircleur Il a fallu srsquoadapter et apprendre agrave utiliser des

nouveaux logiciels tels que Proteus MikroC ainsi que Labview

De cette expeacuterience nous avons aussi appris agrave ecirctre autonome Nous avons saisi que la

compreacutehension des documents techniques et des librairies eacutetait un point essentiel de notre projet

En programmation nous nrsquoavions pas le droit agrave lrsquoerreur car la moindre faute pouvait conduire le

systegraveme agrave un dysfonctionnement Ce projet nous a demandeacute beaucoup de rigueur de patience et de

temps

Toutefois nous nrsquoavons pas eu malheureusement le temps drsquoinstaller le capteur de

tempeacuterature inteacuterieure par manque de temps Plus encore nous aurions aimeacute approfondir certains

points Par exemple pouvoir installer les composants sur circuit imprimeacute et concevoir un support

viable pour en faire une vraie station meacuteteacuteo Lrsquoinstallation drsquoune girouette aurait eacuteteacute appreacuteciable

pour connaicirctre le sens du vent Aussi le programme aurait sans doute pu ecirctre encore ameacutelioreacute pour

de meilleures performances

Malgreacute ce manque de temps nous sommes tregraves satisfaits du fonctionnement de ce module

qui nous a permis de comprendre lrsquoutiliteacute des parties theacuteoriques pour lrsquoapplication et la mise en

œuvre drsquoun systegraveme Lrsquoapproche peacutedagogique de nous diriger vers les solutions sans jamais les

donner de nous laisser un grand degreacute de liberteacute et drsquoautonomie a eacuteteacute au deacutebut assez deacuteroutante

mais tregraves instructif

Enfin nous tenions agrave remercier Mme Leymarie qui nous a suivis et aiguilleacute tout au long de ce

projet

Station meacuteteacuteo autonome 2012

34

XV ANNEXES

Programme complet

Deacuteclaration 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()

deacuteclaration des variables

int cond=0Condition pour laffichage sur leacutecran LCD

int BP=0

Initialisation et affectation des ports

PORTA=0

PORTB=0 initialisation

PORTC=0

TRISB=0 Port B deacuteclarer en sortie

TRISA=0xFF Port A en entreacutee

ADCON1=0x84 Justifieacute agrave droite active RA0RA1RA3 analogique

ADCON0=0x85 Fosc32 sur PA0 en service

TRISB=0 Port B deacuteclarer en sortie

TRISC=0xFFPort C deacuteclarer en entreacutee

Configuration et initialisation de leacutecran LCD

Lcd_Config(ampPORTB 0 1 WR 5 4 3 2) Configure lecran

Lcd_Init(ampPORTB) initialisation du LCD

Lcd_Cmd(Lcd_CURSOR_OFF) Enleve le curseur

Lcd_Cmd(Lcd_CLEAR) Efface lecran

Initialisation du module I2C

I2C_Init(100000)initialisation de la communication I2C

I2C_Start()Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90)Mode de controcircle en mode eacutecriture

I2C_Wr(0xAC)Accegraves au registre de configuration

I2C_Wr(0x0A)Registre de configuration mesure en continu

I2C_Stop()Arrecirct du signal

I2C_Start()Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90)Mode de controcircle en mode eacutecriture

I2C_Wr(0xEE)Deacutebut de la conversion

I2C_Stop()Arrecirct du sigal

Station meacuteteacuteo autonome 2012

35

Configuration du mode capture

T1CON=0x31 Configuration du timer1

CCP1CON=0x05 Paramegravetrage du mode capture

PIE1TMR1IE=1 Autorise les deacutebordements du timer 1

Boucle infinie

while(1)

cond=cond+1Increacutemente la variable cond

switch(BP)

case 0

humidite(ampcond)Appel la fonction humiditeacute

if(PORTAF2==1)Ces if permet de changer la valeur de BP

BP=1

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)Temps quon relacircche bien le bouton

break

case 1

temperature(ampcond)Appel la fonction tempeacuterature

if(PORTAF2==1)

BP=2

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)

break

case 2

vent(ampcond)Appel la fonction vent

if(PORTAF2==1)

BP=0

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)

break

Fonction humiditeacute

void humidite(int cond)

long H U VLDeacuteclaration des variables

char HH hum[8] humtxt[]=Humidite

VL=Adc_read(0) Valeur lue sur RA0(humiditeacute)

U=(VL5000)1023 Convertit la valeur lue en tension x1000

H=(U-810)(0031) Convertit la tension en humiditeacute x1000

Station meacuteteacuteo autonome 2012

36

if(Hgt100000)Si H gt 100(impossible) alors = 100

H=100000

if(Hlt0)Si H lt 0(impossible) alors = 0

H=0

hum[0]=(H100000)+48Valeur des centaines affecteacute en ascii(48=0)

HH=(H10000)10

hum[1]=HH+48Valeur des dizaines affecteacute en ascii

HH=(H1000)10

hum[2]=HH+48Valeur des uniteacutes affecteacute en ascii

hum[3]=44Virgule affecteacute en ascii

HH=(H100)10

hum[4]=HH+48Valeur de la premiegravere deacutecimale affecteacute en ascii

HH=(H10)10

hum[5]=HH+48Valeur de la deuxiegraveme deacutecimale affecteacute en ascii

hum[6]=37Pourcentage affecteacute en ascii

if(cond==50)Appel la fonction LCD tous les 1000

lcd(1 1 8 humtxt)Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 7 hum)Affiche la chaine de caractegravere hum sur le LCD

cond=0Remise a 0 de la condition

Xbee(7 hum) Envoi la chaicircne de caractegravere hum dans la fonction xbee

Fonction tempeacuterature

void temperature(int cond)

char temp[7] temptxt[]=Temperature LSB

signed char MSB

I2C_Start()Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90)Mode de controcircle en mode eacutecriture

I2C_Wr(0xAA)Lecture de la tempeacuterature

I2C_Stop()Arrecirct du sigal

I2C_Start()Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x91)Mode de controcircle en mode lecture

MSB = I2C_Rd(1)Nombre signeacute donnant la tempeacuterature entre +125deg et -55degC

LSB = I2C_Rd(0)Si bit 7 = 1 tempeacuterature MSB +05degC

I2C_Stop()Arrecirct du sigal

if(MSBlt0)

MSB = abs(MSB) Si temperature neacutegative valeur absolue de MSB

Temp[0]=45 Signe - affecteacute en ascii

else

Station meacuteteacuteo autonome 2012

37

Temp[0]=43signe + affecteacute en ascii

Temp[1]=(MSB10)+48 Valeur des dizaines affecteacute en ascii

Temp[2]=(MSB10)+48 Valeur des uniteacutes affecteacute en ascii

Temp[3]=44 Virgule affecteacute en ascii

if (LSB==128) Si bit 7 agrave 1 alors +05deg

Temp[4]=5

else Si bit 7 agrave 0 alors +00deg

Temp[4]=0

Temp[5]=223 degreacute affecteacute en ascii

Temp[6]=67 C affecteacute en ascii

if(cond==50)Appel la fonction LCD tous les 1000

lcd(1 1 11 temptxt)Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 7 temp)Affiche la chaine de caractegravere hum sur le LCD

cond=0Remise a 0 de la condition

Xbee(7 temp) Envoi la chaicircne de caractegravere temp dans la fonction xbee

Fonction vent

void vent(int cond)

unsigned long tl th per

int vitfreq

char vent[13] txtvent[]=Vitesse du vent VV

if(PIR1CCP1IF==1) Test si front montant agrave lieu

TMR1H=0 Initialisation du timer1 bit de point fort

TMR1L=0 Initialisation du timer1 bit de point faible

th=CCPR1H Les valeurs sont copieacute dans des variables

tl=CCPR1L

th=thltlt8 Deacutecalage car th =gt bit de point fort

per = th|tl On concategravene les deux valeurs nous obtenons la peacuteriode

PIR1CCP1IF=0 Remise a 0 du drapeau

if(PIR1TMR1IF==1) Si deacutepassement du timer 1

per=65535+per On ajoute une retenue lorsquon a fait un tour (16bit)

PIR1TMR1IF=0 Remise a 0 du drapeau deacutepassement

Station meacuteteacuteo autonome 2012

38

freq=671310perCalacul de la freacutequence

vit=freq179 + 692Calcul de la vitesse que lon x100

if(vitlt200)En dessous 2ms la mesure est aleacuteatoire agrave cause du 2egraveme deacutebordement

vit=0

vent[0]=(vit10000)+48Valeur des centaines affecteacute en ascii(48=0)

VV=(vit1000)10

vent[1]=VV+48Valeur des dizaines affecteacute en ascii

VV=(vit100)10

vent[2]=VV+48Valeur des uniteacute affecteacute en ascii

VV=(vit10)10

vent[3]=44Virgule affecteacute en ascii

vent[4]=VV+48Valeur de la 1er deacutecimale affecteacute en ascii

VV=vit10

vent[5]=VV+48Valeur de la 2egraveme deacutecimale affecteacute en ascii

vent[6]=109m affecteacute en ascii

vent[7]=47 affecteacute en ascii

vent[8]=115s affecteacute en ascii

if(cond==50)Appel la fonction LCD tous les 1000

lcd(1 1 15 txtvent)Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 9 vent)Affiche la chaine de caractegravere hum sur le LCD

cond=0Remise a 0 de la condition

Xbee(9 vent) Envoi la chaicircne de caractegravere vent dans la fonction xbee

Fonction affichage

void lcd(int li int co int nb char receive[15])

int i

for(i=0 iltnb i++)Boucle for

Lcd_chr(li (co+i) receive[i])Affiche les caractegraveres jusquagrave i

Usart

void xbee(int nb char receive[15])

int i

Usart_Init(9600)Vitesse de transmission

for(i=0 iltnb i++)Boucle for

Usart_Write(receive[i])Envoi les caractegraveres sur lHyperTerminal jusquagrave i

Station meacuteteacuteo autonome 2012

1

I Table des matiegraveres II Introduction 2

III Cahier des charges 2

IV Scheacutema Synoptique de la station meacuteteacuteo 2

V Le microcontrocircleur 3

A Choix du microcontrocircleur 3

B Prise en main du microcontrocircleur 4

C Scheacutema du microcontrocircleur avec la LED 4

D Programme pour faire clignoter la LED 5

VI Lrsquoeacutecran LCD 5

A Scheacutema du microcontrocircleur avec lrsquoeacutecran LCD 5

B Programme pour lrsquoeacutecran LCD 6

VII Le capteur drsquohumiditeacute 7

A Caracteacuteristiques du capteur drsquohumiditeacute 7

B Configuration du microcontrocircleur 9

C Le scheacutema du microcontrocircleur avec le capteur drsquohumiditeacute 11

D Programme pour la mesure de lrsquohumiditeacute 11

VIII Le capteur de tempeacuterature 13

A Le protocole I2C 13

B Caracteacuteristique du DS1621 14

1 Speacutecificiteacute des commandes 14

2 Dialogue I2C pour avoir la tempeacuterature 16

C Le scheacutema du microcontrocircleur avec le capteur de tempeacuterature 17

D Programme pour la mesure de la tempeacuterature 17

IX Lrsquoaneacutemomegravetre 19

A Conception 19

B Mesure de la peacuteriode sur le microcontrocircleur 20

C Etalonnage de lrsquoaneacutemomegravetre 22

D Le scheacutema du microcontrocircleur avec lrsquoaneacutemomegravetre 23

E Programme pour la mesure de la vitesse du vent 24

X Simulation une station meacuteteacuteo autonome 26

A La structure du programme 26

B La simulation 27

XI Transmission des donneacutees par liaison ZigBee 28

A Scheacutema eacutelectrique du module Xbee 29

B Envoi des donneacutees la liaison Usart 29

C Programme drsquoenvoi des donneacutees par liaison Usart 30

XII Estimation du coucirct du projet 31

XIII English summary 32

XIV Conclusion 33

XV ANNEXES 34

Station meacuteteacuteo autonome 2012

2

II Introduction

Dans le cadre de notre formation L3 EEA (eacutelectrotechnique eacutelectronique automatique) il

nous a eacuteteacute demandeacute de concevoir et reacutealiser un systegraveme pluridisciplinaire de notre choix agrave partir drsquoun

cahier des charges Un projet ougrave il faut organiser son travail et ecirctre capable de le preacutesenter par eacutecrit

(rapport) et oralement Lrsquoobjectif principal de ce travail est de faire le lien entre lrsquoensemble des

enseignements disciplinaire et de valider notre autonomie

Dans ce rapport nous preacutesenterons notre projet une station meacuteteacuteo autonome conccedilue et

programmeacutee par nos soins Nous deacutetaillerons chaque fonction de la station avec dans chaque partie

son scheacutema son programme associeacute et lrsquoexplication des points importants

Nous finirons par une conclusion qui rappellerons les grandes lignes de notre projet les

connaissances et les acquis apporteacute par ce module ainsi que le ressenti et notre avis suite au projet

III Cahier des charges

Le projet drsquoune laquo station meacuteteacuteo autonome raquo est constitueacute de plusieurs objectifs clairs et bien

preacutecis qui nous ont permis de progresser par eacutetape

Mettre en œuvre un capteur drsquohumiditeacute (liaison analogique)

Conception et mise en œuvre drsquoun aneacutemomegravetre (Mesure drsquoune freacutequence convertie

en vitesse (ms))

Mettre en œuvre deux capteurs de tempeacuterature numeacuteriques (DS1621) mesurant la

tempeacuterature inteacuterieure et exteacuterieure (la liaison avec le capteur de tempeacuterature se

fera directement sur le PC)

Affichage des donneacutees sur un eacutecran LCD

Une liaison sans fil type Xbee pour envoyer les donneacutees aux PC

Affichage des donneacutees sur un eacutecran PC sous labview

On remarquera que chaque capteur utilise une technologie diffeacuterente ce qui en fait un

projet polyvalent

IV Scheacutema Synoptique de la station meacuteteacuteo

Pour plus de compreacutehension nous avons commenceacute agrave partir du cahier des charges le

synoptique complet de la station meacuteteacuteo On y trouve tous les eacuteleacutements citeacutes preacuteceacutedemment dans le

cahier des charges

Station meacuteteacuteo autonome 2012

3

V Le microcontrocircleur

A Choix du microcontrocircleur

Comme on peut voir preacuteceacutedemment que le microcontrocircleur choisi est un PIC16F876 (cf figure 1)

celui-ci nous as eacuteteacute conseilleacute par notre eacutequipe peacutedagogique Nous avons quand mecircme pris soin de

veacuterifier globalement si le nombre drsquoentreacutee et de sortie eacutetaient suffisants pour le nombre drsquoeacuteleacutements

utiliseacutes en survolant pour chacun drsquoentre eux leur datasheet

Microcontrocircleur

PIC16F876

Capteur

drsquohumiditeacute

Capteur de

tempeacuterature

exteacuterieure

Aneacutemomegravetre

Ecran LCD

Emetteur

ZigBee

Reacutecepteur

ZigBee

PC

Capteur de

tempeacuterature

inteacuterieure

Figure 1 Scheacutema du PIC16F876

Station meacuteteacuteo autonome 2012

4

B Prise en main du microcontrocircleur

Nrsquoayant jamais programmeacute sur un microcontrocircleur notre eacutequipe peacutedagogique nous a conseilleacute

de commencer par nous familiariser avec le PIC agrave lrsquoaide drsquoun mini TP Ce TP drsquoinitiation proposeacute par le

logiciel Mikroelektronika marque du logiciel utiliseacute pour programmer le PIC (MikroC) consiste agrave faire

clignoter une LED

Pour le quartz qui deacutefinit la freacutequence drsquohorloge on nous a donneacute un 20Mhz Pour choisir les

condensateurs nous avons regardeacute dans la datasheet du quartz

Au vue de cette datasheet nous avons pris des condensateurs de 22pF car ils eacutetaient agrave notre

disposition

C Scheacutema du microcontrocircleur avec la LED

Nous avons donc commenceacute par implanter les composants et agrave les cacircbler entre eux sur la platine

qursquoon nous a fourni Comme vous pouvez le voir sur la figure 2 le scheacutema de la partie laquo LED raquo eacutetabli

sur le logiciel Proteus ISIS 78 Crsquoest ce Logiciel qui nous a permis tout au long du projet de faire les

scheacutemas et les simulations

On peut voir sur le scheacutema de la figure 2 qursquoil yrsquoa un bornier brancher sur les bornes RB6 RB7

et Vpp Il repreacutesente en fait le cacircble USB qui va au PC Ce cacircble nous permet de transfeacuterer le

programme Par la suite nous ne le repreacutesenterons plus de mecircme pour chaque partie nous

repreacutesenterons que les capteurs en question Ceci pour un souci de clarteacute

Figure 2 Scheacutema avec la LED

Station meacuteteacuteo autonome 2012

5

D Programme pour le clignotement de la LED

Nous avons ensuite agrave lrsquoaide du TP et du logiciel MikroC programmeacute le microcontrocircleur 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 deacuteclarations des bornes

Voici le programme eacutetablit avec ccedila description

void main()

PORTC=0 Initialisation du port C

PORTB=0 Initialisation du port B

TRISC=0 Le port C affecteacute en sortie

TRISB=0 Le port B affecteacute en sortie

while(1)Boucle infinie

PORTCF7 = ~PORTCF7 Allumeeacuteteint la LED

Delay_ms(1000) Temporisation de 1 seconde

VI Lrsquoeacutecran LCD

Ensuite nous sommes rentreacute dans le vif du sujet nous avons installeacute programmeacute lrsquoeacutecran LCD et

essayeacute drsquoafficher des caractegraveres dessus Nous avons aussi rajouteacute un bouton poussoir en vue de

preacuteparer le terrain pour la suite du projet

A Scheacutema du microcontrocircleur avec lrsquoeacutecran LCD

Figure 3 scheacutema avec eacutecran LCD et le bouton poussoir

Station meacuteteacuteo autonome 2012

6

Pour cacircbler lrsquoeacutecran LCD nous nous sommes aideacutes de sa datasheet ainsi que lrsquoaide du logiciel

MikroC Le point qui nous semble important est la borne R(read)W(write) On peut voir qursquoelle est

connecteacutee agrave la masse En effet pour eacutecrire sur lrsquoeacutecran il faut mettre RW = 0 pour lire on le met agrave 1

B Programme pour lrsquoeacutecran LCD

Voici un petit exemple de programme qui utilise agrave la fois le bouton poussoir et qui affiche du

texte sur lrsquoeacutecran LCD void main()

int cond=0 BP=0

Initialisation et affectation des ports

PORTB=0 Initialisation du port B

PORTA=0 Initialisation du port A

TRISB=0 Le port B affecteacute en sortie

TRISA = 0xFF Port A en entreacutee

ADCON1 = 0x84 RA2 en entreacutee

Configuration et initialisation de leacutecran LCD

Lcd_Config(ampPORTB 0 1 WR 5 4 3 2) Configure leacutecran

Lcd_Init(ampPORTB) initialisation du LCD

Lcd_Cmd(Lcd_CURSOR_OFF) Enlegraveve le curseur

Lcd_Cmd(Lcd_CLEAR) Efface leacutecran

Boucle infini

while(1)

cond=cond+1

switch(BP)

case 0

if(PORTAF2==1) Ces if permet de changer la valeur de BP

BP=1

Delay_ms(250) Temps quon relacircche bien le bouton

if(cond==1000)

Lcd_Cmd(Lcd_CLEAR)

Lcd_Out(1 1 Bonjour) Affiche Bonjour ligne 1 colonne 1

break

case 1

if(PORTAF2==1)

BP=0

Delay_ms(250)

if(cond==1000)

Lcd_Cmd(Lcd_CLEAR)

Lcd_Out(1 1 Mme Leymarie )

break

Station meacuteteacuteo autonome 2012

7

Fonctionnement de ce programme

Affiche laquo bonjourhellip raquo sur lrsquoeacutecran LCD

Appuie sur le BP

Affiche laquo Mme Leymarie raquo sur lrsquoeacutecran LCD

Appuie sur le BP

Affiche laquo bonjourhellip raquo sur lrsquoeacutecran LCD

Etc

Les fonctions de lrsquoeacutecran LCD sont expliqueacutees dans lrsquoaide du logiciel MikroC La variable laquo cond raquo

est une condition pour ne pas afficher le mot agrave chaque boucle mais tous les 1000 iteacuterations ce qui

permet de ne pas faire clignoter lrsquoeacutecran ADCON1 sera expliqueacute agrave la suite de ce rapport

VII Le capteur drsquohumiditeacute

Apregraves avoir pris en main

lrsquoeacutecran LCD ainsi que le logiciel

nous avons deacutecideacute drsquoinstaller le

capteur drsquohumiditeacute On nous a mis

agrave disposition un capteur

drsquohumiditeacute de reacutefeacuterence HIH-

4000-001 Crsquoest un capteur qui

renvoie une tension analogique

(cf figure 4) Nous avons

commenceacute par chercher sa

datasheet et regarder les

proprieacuteteacutes du capteur

A Caracteacuteristiques du capteur drsquohumiditeacute

Voici les proprieacuteteacutes importantes du capteur donneacutee par la notice

Gamme dhumiditeacute 0 agrave 100 RH (Relative Humidity) avec une Preacutecision de plusmn 35 RH

Gamme de tension dalimentation 4V agrave 58V

Tempeacuterature de fonctionnement -40degC agrave +85degC (-40 degF to 185 degF)

Courant alimentation 500μA

Sortie Analogique

Figure 4 Capteur dhumiditeacute HIH 4000-001

Station meacuteteacuteo autonome 2012

8

Pour ce qui est lrsquoeacutequation de la tension

en fonction de lrsquohumiditeacute le constructeur nous

donne la courbe drsquoeacutetalonnage suivante (cf

figure 5)

De cette courbe nous en avons tireacute les

valeurs suivantes (cf figure 6)

Nous avons ensuite deacutecideacute de la retracer sur Excel et drsquoen tirer llsquoeacutequation qui sera utiliseacute dans le

programme du microcontrocircleur

On voit qursquoExcel nous donne lrsquoeacutequation suivante

U=0031H +081

Donc H= (U-081)0031

De plus nous multiplierons par 1000 la valeur de H pour pouvoir reacutecupeacuterer les chiffres

deacutecimales et les rentrer dans une chaine de caractegraveres et les afficher sur lrsquoeacutecran LCD H=

(U810)0031

La valeur maximum de H est donc de 100 000 nous la deacuteclarerons donc en long (une

deacuteclaration en int ne serais pas suffisant -32768 agrave 32767)

Figure 5 Courbes donneacutee par le constructeur

Figure 6 tableau de mesure

Figure 7 Courbe traceacute sur Excel

Station meacuteteacuteo autonome 2012

9

Nous avons remarqueacute sur la courbe ainsi qursquoen simulation que le capteur peut avoir des

valeurs supeacuterieur agrave 100 et infeacuterieur agrave 0 Il faudra donc mettre deux conditions pour ne pas

deacutepasser la plage de valeur

B Configuration du microcontrocircleur

Maintenant nous arrivons agrave point important de cette partie celle de la configuration des

ports du microcontrocircleur En effet le PIC16F876 est constitueacute drsquoun module convertisseur agrave 5 entreacutees

Ces entreacutees sont situeacutees sur les bornes RA0 RA1 RA2 RA3 et RA5 (cf figure1) Le reacutesultat de la

conversion est codeacute sur 10 bits Crsquoest une valeur comprise entre hrsquo000rsquo et hrsquo3FFrsquo

hlsquo3FFrsquo = brsquo1 1111 1111rsquo = drsquo1023rsquo

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 eacutequation

U = (Valeur lue sur le CAN 5)1023

Pour les mecircme raison que lrsquoeacutequation du capteur drsquohumiditeacute nous avons multiplieacute par

1000 la tension nous obtenons donc U= (Valeur lue sur le CAN 5000)1023

Il faut ensuite reacutegler les entreacutees analogiques avec les registres ADCON0 et ADCON1 en

sachant que nous avons deacutecideacute 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 (Freacutequence drsquooscillation)2

01= Fosc8

10= Fosc32

11= Oscillateur RC interne

Pour que la conversion soit correct il faut que T(ad) soit au minimum de 16micros nous

disposons drsquoun quartz de 20Mhz =gt 20Mhz32 =gt 16micros Nous mettrons donc le bit 7 agrave 1 et

le 6 agrave 0

Bit 5 bit4 et bit 3 CHS2 CHS1 et CHS0 = Channel Select bits

Ces 3 bits permettent de choisir lentreacutee qui va ecirctre convertie

Station meacuteteacuteo autonome 2012

10

Nous voulons convertir lrsquoentreacutee RA0 pour cela il faut mettre les bits 5 4 3 agrave 0

Bit 2 GODONE Status bit si ADON=1

1 = Deacutemarre la conversion AD Ce bit est remis agrave 0 par hard

0 = La conversion AD est termineacutee

Il nous faut deacutemarrer la conversion

Bit 1 Bit non implanteacute

Bit 0 ADON AD on bit

1= Convertisseur AD en service

0 = Convertisseur AD agrave larrecirct

Il nous faut mettre le convertisseur en service

ADCON0 = brsquo1000 0101rsquo = hrsquo85rsquo

Bit 7 ADFM = AD Result format

1 = Justifieacute agrave droite

0 = Justifieacute agrave gauche

Nous avons justifieacute agrave droite

Bit 6 bit 5 et bit 4 Bits non impleacutementeacutes

Bit 3 bit 2 bit 1 et bit 0 PCFG3 PCFG2 PCFG1 et PCFG0

Bits de controcircle de la configuration des Ports

Ces bits permettent de choisir le partage entre entreacutees analogiques et digitales sur les PORTS A et E

On a choisi drsquoactiver RA0 RA1 et RA3 en entreacutee analogique les autres resteront en

digitales ce qui signifie qursquoau vue de la datasheet il faut mettre le bit 2 agrave 1 et les autres agrave 0

ADCON1 = brsquo10000100rsquo = hrsquo84rsquo

Station meacuteteacuteo autonome 2012

11

C Le scheacutema du microcontrocircleur avec le capteur drsquohumiditeacute

Voici le scheacutema de cacircblage du capteur drsquohumiditeacute uniquement A noter que le capteur est

remplaceacute par un potentiomegravetre nrsquoeacutetant pas dans la librairie de Proteus On constate qursquoil est bien

brancheacute sur RA0

D Programme pour la mesure de lrsquohumiditeacute

Voici le programme pour mesurer lrsquohumiditeacute avec les affectations deacutecrites ci-dessus ainsi

que les eacutequations de conversions

Deacuteclaration des fonctions

void humidite(int cond)

void lcd(int li int co int nb char receive[11])

void main()

deacuteclaration des variables

int cond=0 Condition pour laffichage sur leacutecran LCD

Initialisation et affectation des ports

PORTB=0 initialisation

TRISB=0 Port B deacuteclarer en sortie

TRISA = 0xFF Port A en entreacutee

ADCON1 = 0x84 Justifieacute agrave droite active RA0RA1RA3 analogique

ADCON0 = 0x85 Fosc32 sur PA0 en service

Configuration et initialisation de leacutecran LCD

Lcd_Config(ampPORTB 0 1 WR 5 4 3 2) Configure leacutecran

Lcd_Init(ampPORTB) initialisation du LCD

Lcd_Cmd(Lcd_CURSOR_OFF) Enlegraveve le curseur

Lcd_Cmd(Lcd_CLEAR) Efface leacutecran

Figure 8 Scheacutema de cacircblage du capteur dhumiditeacute

Station meacuteteacuteo autonome 2012

12

Boucle infinie

while(1)

cond=cond+1 Increacutemente la variable cond

humidite(ampcond) Appel la fonction humiditeacute

Fonction humiditeacute

void humidite(int cond)

long H U VL Deacuteclaration des variables

char HH hum[8] humtxt[]=Humidite

VL=Adc_read(0) Valeur lue sur RA0(humiditeacute)

U=(VL5000)1023 Convertit la valeur lue en tension x1000

H=(U-810)(0031) Convertit la tension en humiditeacute x1000

if(Hgt100000) Si H gt 100(impossible) alors = 100

H=100000

if(Hlt0) Si H lt 0(impossible) alors = 0

H=0

hum[0]=(H100000)+48 Valeur des centaines affecteacute en ascii(48=0)

HH=(H10000)10

hum[1]=HH+48 Valeur des dizaines affecteacute en ascii

HH=(H1000)10

hum[2]=HH+48 Valeur des uniteacutes affecteacute en ascii

hum[3]=44Virgule affecteacute en ascii

HH=(H100)10

hum[4]=HH+48 Valeur de la premiegravere deacutecimale affecteacute en ascii

HH=(H10)10

hum[5]=HH+48 Valeur de la deuxiegraveme deacutecimale affecteacute en ascii

hum[6]=37 Pourcentage affecteacute en ascii

if(cond==1000)Appel la fonction LCD tous les 1000

lcd(1 1 10 humtxt) Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 7 hum) Affiche la chaine de caractegravere hum sur le LCD

cond=0 Remise a 0 de la condition

Fonction affichage

void lcd(int li int co int nb char receive[11])

int i

for(i=0 ilt=nb i++)Boucle for

Lcd_chr(li (co+i) receive[i]) Affiche les caractegraveres jusquagrave i

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

Station meacuteteacuteo autonome 2012

13

VIII Le capteur de tempeacuterature

A preacutesent comme toute station meacuteteacuteo

nous avons installeacute un capteur de tempeacuterature le

DS1621 Ce capteur communique avec le

microcontrocircleur gracircce au protocole I2C

A Le protocole I2C

Le bus I2C (Inter Integrated Circuit) a eacuteteacute deacuteveloppeacute au deacutebut des anneacutees 80 par Philips

semiconductors pour permettre de relier facilement agrave un microprocesseur les diffeacuterents circuits dun

teacuteleacuteviseur moderne

Le bus I2C permet de faire communiquer entre eux des composants eacutelectroniques tregraves divers

gracircce agrave seulement trois fils Un signal de donneacutee (SDA) un signal dhorloge (SCL) et un signal de

reacutefeacuterence eacutelectrique (Masse)

Ceci permet de reacutealiser des eacutequipements ayant des fonctionnaliteacutes tregraves puissantes (En

apportant toute la puissance des systegravemes micro programmeacutes) et conservant un circuit imprimeacute tregraves

simple par rapport un scheacutema classique (8bits de donneacutees 16 bits dadresse + les bits de controcircle)

Les donneacutees sont transmises en seacuterie agrave 100Kbitss en mode standard et jusquagrave 400Kbitss en

mode rapide Ce qui ouvre la porte de cette technologie agrave toutes les applications ougrave la vitesse nest

pas primordiale

Voici un exemple de protocole qursquoutilise le bus I2C

1 Pour initier le dialogue le maicirctre creacutee une condition Start

2 Le maicirctre envoie ladresse de lesclave (1010100) suivi du bit 0 (bit Write)

3 Lesclave reacutepond (accuseacute de reacuteception bit Acknowledge)

4 Le maicirctre envoie ladresse du registre (0x04) agrave eacutecrire

5 Lesclave reacutepond (accuseacute de reacuteception bit Acknowledge)

6 Le maicirctre envoie la donneacutee (0x27) agrave eacutecrire

7 Lesclave eacutecrit la donneacutee puis envoie un accuseacute de reacuteception (bit Acknowledge)

8 Le maicirctre termine le dialogue avec une condition Stop

9 Le bus I2C est maintenant libre (SCL = 1 SDA = 1 niveaux de repos)

Figure 9 scheacutema du DS1621

Station meacuteteacuteo autonome 2012

14

B Caracteacuteristique du DS1621

Comme on peut voir sur la figure 9 le capteur est composeacute de 8 bornes

SDA =gt Liaison seacuterie entreacutee sortie

SCL =gt Signal drsquohorloge

Tout =gt Signal de sortie du thermostat (inutile dans notre cas)

GND =gt Masse

VDD =gt Alimentation +5V

A0 A1 A2 =gt Entreacutee drsquoadressage (dans notre cas les 3 agrave la masse car nous nrsquoavons qursquoun

module I2C)

Les circuits connecteacutes sur un bus I2C ont des sorties de type drain ouvert (ou collecteur

ouvert) Deux reacutesistances de pull-up sont bien sucircr placeacutees entre les lignes SDA SCL et lalimentation

(VDD)Quand le bus nest pas utiliseacute SDA et SCL sont au niveau haut (niveau de repos)

1 Speacutecificiteacute des commandes

Tous dialogue du maicirctre(PIC16F876) avec un DS1621 esclave doit deacutebuter par lrsquoenvoi drsquoun

mot de controcircle

Le maicirctre envoi ensuite une commande suivi ou non de donneacutees Voici la liste des

commandes avec leur description

Les commandes AC EE et 22 ne sont pas suivies de lenvoi de donneacutees Par contre la

commande AA qui nous inteacuteresse est suivie de lrsquoenvoi par le DS1621 de 2 octets repreacutesentant la

tempeacuterature

Station meacuteteacuteo autonome 2012

15

Voici le registre de configuration(AC) qursquoil nous faut deacuteterminer

DONE 1 = conversion finie 0 = conversion en cours En mode 1 SHOT uniquement

THF Flag seuil haut du thermostat Passe agrave 1 et y reste si tempeacuterature supeacuterieure agrave TH

TLF Flag seuil bas du thermostat Passe agrave 1 et y reste si tempeacuterature infeacuterieure agrave TL

NVB 1 = meacutemoire EEPROM en eacutecriture 0 = meacutemoire EEPROM eacutecriture termineacutee

Nous nrsquoactiverons pas lrsquoeacutecriture de la meacutemoire

POL Polariteacute de Tout (pin 3) 1 = actif sera un niveau HAUT 0 = actif sera un niveau BAS

Il faut activer la polariteacute donc nous le mettons agrave 1

ONE SHOT 0 = conversion en continu 1 = conversion 1 fois

Nous le mettons en mode continu

AC = brsquo00001010rsquo = hrsquo0Arsquo

La commande AA qui permet de lire la tempeacuterature renvoie 2 octets

MSB (Most Significant Bit) Nombre signeacute donnant la tempeacuterature entre +125deg et -55degC

LSB (Least Significant Bit ) Seul le bit 7 de cet octet est significatif Si 1 tempeacuterature

MSB +05degC

Pour bien comprendre comment est codeacute un nombre signeacute un tableau avec des exemples de

valeurs eacutetait agrave notre disposition dans la notice

Station meacuteteacuteo autonome 2012

16

2 Dialogue I2C pour avoir la tempeacuterature

Voici un scheacutema qui montre le dialogue agrave effectuer entre le microcontrocircleur et le capteur

pour avoir la tempeacuterature Crsquoest gracircce agrave ce mecircme scheacutema que nous avons pu programmer le PIC

Station meacuteteacuteo autonome 2012

17

C Le scheacutema du microcontrocircleur avec le capteur de tempeacuterature

Voici le scheacutema du capteur de tempeacuterature uniquement Le capteur est brancheacute sur les

borne SCL(RC3) et SDA(RC4) du PIC Qursquoelles soient deacuteclareacutees en entreacutee ou en sortie les bornes SCL et

SDA sont fonctionnelles Il ne faut pas oublier les reacutesistances de tirages (R1 et R3) Lrsquoadressage A0 A1

A2 toutes misent agrave la masse car nous nrsquoavons qursquoun seul capteur I2C relieacute au PIC et le Tout

(thermostat) inutile car nous faisons juste un releveacute de tempeacuterature

D Programme pour la mesure de la tempeacuterature

Deacuteclaration des fonctions

void temperature(int cond)

void lcd(int li int co int nb char receive[14])

void main()

deacuteclaration des variables

int cond=0Condition pour laffichage sur leacutecran LCD

Initialisation et affectation des ports

PORTB=0 initialisation

PORTC=0

TRISB=0 Port B deacuteclarer en sortie

TRISC = 0xFF Port C en entreacutee

Configuration et initialisation de leacutecran LCD

Lcd_Config(ampPORTB 0 1 WR 5 4 3 2) Configure leacutecran

Lcd_Init(ampPORTB) initialisation du LCD

Lcd_Cmd(Lcd_CURSOR_OFF) Enlegraveve le curseur

Lcd_Cmd(Lcd_CLEAR) Efface leacutecran

Initialisation du module I2C

I2C_Init(100000) initialisation de la communication I2C

I2C_Start() Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90) Mode de controcircle en mode eacutecriture

I2C_Wr(0xAC) Accegraves au registre de configuration

I2C_Wr(0x0A) Registre de configuration mesure en continu

I2C_Stop() Arrecirct du signal

I2C_Start() Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90) Mode de controcircle en mode eacutecriture

Figure 10 Scheacutema de cacircblage avec le capteur de tempeacuterature

Station meacuteteacuteo autonome 2012

18

I2C_Wr(0xEE) Deacutebut de la conversion

I2C_Stop()Arrecirct du sigal

Boucle infinie

while(1)

cond=cond+1 Increacutemente la variable cond

temperature(ampcond) Appel la fonction humiditeacute

Fonction tempeacuterature

void temperature(int cond)

char temp[7] temptxt[]=Temperature LSB

signed char MSB

I2C_Start() Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90) Mode de controcircle en mode eacutecriture

I2C_Wr(0xAA) Lecture de la tempeacuterature

I2C_Stop() Arrecirct du signal

I2C_Start() Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x91) Mode de controcircle en mode lecture

MSB = I2C_Rd(1) Nombre signeacute donnant la tempeacuterature entre +125deg et -55degC

LSB = I2C_Rd(0) Si bit 7 = 1 tempeacuterature MSB +05degC

I2C_Stop() Arrecirct du signal

if(MSBlt0)

MSB = abs(MSB) Si tempeacuterature neacutegative valeur absolue de MSB

Temp[0]=45 Signe - affecteacute en ascii

else

Temp[0]=43 signe + affecteacute en ascii

Temp[1]=(MSB10)+48 Valeur des dizaines affecteacute en ascii

Temp[2]=(MSB10)+48 Valeur des uniteacutes affecteacute en ascii

Temp[3]=44 Virgule affecteacute en ascii

if (LSB==128) Si bit 7 agrave 1 alors +05deg

Temp[4]=5

Else Si bit 7 agrave 0 alors +00deg

Temp[4]=0

Temp[5]=223 degreacute affecteacute en ascii

Temp[6]=67 C affecteacute en ascii

if(cond==10) Appel la fonction LCD tous les 1000

lcd(1 1 13 temptxt) Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 6 temp) Affiche la chaine de caractegravere hum sur le LCD

cond=0 Remise a 0 de la condition

Fonction affichage

void lcd(int li int co int nb char receive[14])

int i

for(i=0 ilt=nb i++)Boucle for

Lcd_chr(li (co+i) receive[i]) Affiche les caractegraveres jusquagrave i

Le scheacutema preacuteceacutedent est bien respecteacute comme on peut le voir crsquoest tregraves facile agrave programmer

gracircce aux librairies I2C du logiciel MikroC

Station meacuteteacuteo autonome 2012

19

IX Lrsquoaneacutemomegravetre

A Conception

Pour lrsquoaneacutemomegravetre lrsquoeacutequipe peacutedagogique

nous a juste fourni lrsquoheacutelice du capteur donc il a fallu

concevoir toute la partie eacutelectronique Lrsquoideacutee est

drsquoinstaller une diode et un transistor photonique par

de lagrave lrsquoheacutelice et lorsqursquoelle tourne elle vient couper le

faisceau Succinctement le transistor envoit soit 1 soit

0 sur le PIC Le but est de relever la freacutequence agrave

laquelle tourne lrsquoheacutelice puis la convertir en vitesse (cf

figure 11)

La photodiode choisie est de reacutefeacuterence SD5455-3 Ce choix a eacuteteacute fait car lrsquoangle du faisceau

est de 20deg pour que le flux infrarouge soit bien concentreacute sur le phototransistor pour un

fonctionnement optimal

Comme on le voit sur le scheacutema de principe (cf figure 11) il a fallu dimensionner la

reacutesistance qui sert agrave reacuteguler le courant qui circule dans la LED avec les informations donneacutees par la

documentation technique nous avons pu la calculer

Forward voltage VF = 17V et IF = 01A

Ualim = 5V

RD = (Ualim ndash UF)IF = (5 ndash 17)01

RD = 33Ω

Pour le phototransistor nous avons choisi celui qui allait avec la diode de reacutefeacuterence SE5455-3

Cette fois la valeur de la reacutesistance nous eacutetait donneacute par le constructeur

RL=1000Ω

Lors des seacuteances nous avons implanteacute la diode et le

transistor sur le support du capteur Pour des raisons

pratiques et estheacutetiques nous avons seacutepareacute la partie

aneacutemomegravetre et la partie platine par des borniers (cf figure

12)

Figure 11 scheacutema descriptif de laneacutemomegravetre

Figure 12 Notre aneacutemomegravetre

Station meacuteteacuteo autonome 2012

20

B Mesure de la peacuteriode sur le microcontrocircleur

Le but est de relever la peacuteriode du signal envoyer par lrsquoaneacutemomegravetre pour cela le PIC est

eacutequipeacute drsquoun mode capture Le principe est de recopier agrave un moment voulu la valeur du timer 1 La

capture peut avoir lieux agrave chaque front descendant agrave chaque front montant tous les 4 ou tous les 16

fronts montants Quand la capture a eu lieu un flag est mis agrave 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 constitueacute de 2 registres de 8 bits TMR1H et TMR1L que lon peut lire ou eacutecrire Le registre TMR1

(constitueacute de TMR1H et TMR1L) sincreacutemente de h0000 jusquagrave hFFFF et repasse ensuite agrave h0000

pour continuer le comptage Quand il y a deacutebordement une interruption peut ecirctre geacuteneacutereacutee si on lrsquoa

autoriseacutee par TMR1IE =1 (bit 0 de PIE1) et le Flag TMR1IF (bit 0 de PIR1) passe agrave 1 Le controcircle du

timer 1 ce fait par le registre T1CON

Bit 7 et bit 6 bits non impleacutementeacutes

Bit 5 et bit 4 T1CKPS = Seacutelection du preacute diviseur placeacute avant le TIMER

Vu qursquoon a un quartz eacuteleveacute nous avons deacutecideacute de choisir un preacute-diviseur de 8 donc

F=Fosc(48) Pour cela mettre les bit 4 et 5 agrave 1

Bit 3 T1OSCEN Bit dautorisation de loscillateur du Timer 1

1 = oscillateur autoriseacute

0 = oscillateur stoppeacute

Oscillateur interne inutile donc bit 3 agrave 0

Bit 2 T1SYNC Bit de controcircle de la synchronisation du CLK externe

1 = Pas de synchronisation de lhorloge externe

0 = Synchronisation de lhorloge externe

Nous nous mettrons en mode synchrone

Bit1 TMR1CS Bit de seacutelection de la source horloge

1 = Mode Compteur Clk externe sur la broche PC0 ou Quartz entre PC0 et PC1

0 = Mode Timer Clk interne = Fosc4

Station meacuteteacuteo autonome 2012

21

On mettra ce bit agrave 0 car on utilise le mode Timer

Bit 0 TMR1ON Bit dautorisation du Timer 1

1 = Timer 1 en service

0 = Timer 1 stoppeacute

Il faut eacutevidemment mettre la timer 1 en service

Nous avons aussi autoriseacute le deacutebordement du timer 1 pour avoir plus de preacutecisions pour cela il faut

mettre la commande PIE1TMR1 agrave 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 parameacutetrer le registre

CCP1CON

Bit 7 et Bit 6 bits non impleacutementeacutes

Bit 5 et Bit 4 CCP1X et CCP1Y

Bits non utiliseacutes 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 agrave Bit 0 CCP1M3 agrave CCP1M0 bits de seacutelection du mode

Nous avons seacutelectionneacute le mode capture sur chaque front montant Pour cela nous avons

mis les bits 1 et 3 agrave 0 et les bits 0 et 2 agrave 1

Pour savoir si un front montant agrave eu lieu le flag CCP1F est mis agrave 1 Ce flag doit ecirctre remis agrave 0 par

lrsquoutilisateur La valeur des 16 bits des registres du Timer 1 TMR1L (bit de poids faible) et TMR1H (bit

de poids fort) sont recopieacutees dans les registres CCPR1 CCPRIH (bit de poids faible) et CCPR1L (bit de

poids fort)

Nous avons programmeacute le mode capture de faccedilon agrave afficher sur lrsquoeacutecran LCD la valeur du registre

CCPR1 crsquoest-agrave-dire la peacuteriode du signal de lrsquoaneacutemomegravetre Il ne nous reste maintenant plus qursquoagrave

eacutetalonner notre aneacutemomegravetre

Station meacuteteacuteo autonome 2012

22

C Etalonnage de lrsquoaneacutemomegravetre

Pour eacutetalonner le capteur nous avons commenceacute par savoir agrave quelle freacutequence correspond la

valeur releveacutee par le mode capture Pour cela nous avons brancheacute un GBF agrave la place du capteur et

avec un oscilloscope nous avons compareacute leurs valeurs

Nous avons ensuite traceacute agrave lrsquoaide des valeurs du tableau la courbe F(Hz) en fonction du

compteur De cette courbe nous relevons lrsquoeacutequation

F = 671310compteur^(-101)

Soit environ F = 671310compteur

Puis nous avons brancheacute notre aneacutemomegravetre sur le microcontrocircleur Cela dans le but de

relever sa peacuteriode sur lrsquoeacutecran LCD agrave lrsquoaide drsquoune soufflerie variable et du manomegravetre GDH (reacutef

121552 200-13) nous avons compareacute leurs valeurs pour connaitre lrsquoeacutetalonnage de notre capteur

Nous avons noteacute plusieurs valeurs puis traceacute diffeacuterentes courbe pour trouver les eacutequations qui nous

permettrons de calculer la vitesse dans notre programme

Station meacuteteacuteo autonome 2012

23

Voici les valeurs que nous avons releveacutees puis la courbe traceacutee sur Excel

De cette courbe nous obtenons lrsquoeacutequation

Vitesse du vent = 0179F + 0629

Nous les multiplierons par 100 pour reacutecupeacuterer les deacutecimales et les implanter dans une chaine

de caractegravere

Vitesse du vent = 179F + 629

Nous avons agrave preacutesent agrave notre disposition toutes les eacutequations neacutecessaires pour pouvoir

convertir la valeur releveacutee par le mode capture en une vitesse

D Le scheacutema du microcontrocircleur avec lrsquoaneacutemomegravetre

On voit sur le scheacutema que le capteur est bien relieacute sur la borne RC2 Nous avons aussi

repreacutesenteacute les borniers J1 et J2 A droite tous ce qui est sur le support et agrave gauche tous ce qui est sur

la platine

Figure 13 Scheacutema avec laneacutemomegravetre

Station meacuteteacuteo autonome 2012

24

E Programme pour la mesure de la vitesse du vent

Voici le programme pour mesurer la vitesse du vent avec les affectations deacutecrites ci-dessus

ainsi que les eacutequations de conversions

Deacuteclaration des fonctions

void vent(int cond)

void lcd(int li int co int nb char receive[20])

void main()

deacuteclaration des variables

int cond=0

Initialisation et affectation des ports

PORTB=0 initialisation

PORTC=0 initialisation

TRISC=0x04 Port C deacuteclarer en sortie sauf RC2 en mode capture

TRISB=0 Port B deacuteclarer en sortie

Configuration du mode capture

T1CON=0x31 Configuration du timer1

CCP1CON=0x05 Parameacutetrage du mode capture

PIE1TMR1IE=1 Autorise les deacutebordements du timer 1

Configuration et initialisation de leacutecran LCD

Lcd_Config(ampPORTB 0 1 WR 5 4 3 2) Configure leacutecran

Lcd_Init(ampPORTB) Initialisation du LCD

Lcd_Cmd(Lcd_CURSOR_OFF) Enlegraveve le curseur

Lcd_Cmd(Lcd_CLEAR) Efface leacutecran

Boucle infinie

while(1)

cond=cond+1

vent(ampcond)

Fonction vent

void vent(int cond)

unsigned long tl th per

int vitfreq

char vent[13] txtvent[]=vitesse du vent VV

if(PIR1CCP1IF==1) Test si front montant agrave lieu

TMR1H=0 Initialisation du timer1 bit de point fort

TMR1L=0 Initialisation du timer1 bit de point faible

th=CCPR1H Les valeurs sont copieacute dans des variables

tl=CCPR1L

th=thltlt8 Deacutecalage car th =gt bit de point fort

per = th|tl On concategravene les deux valeurs nous obtenons la peacuteriode

PIR1CCP1IF=0 Remise a 0 du drapeau

if(PIR1TMR1IF==1) Si deacutepassement du timer 1

per=65535+per On ajoute une retenue lorsquon a fait un tour (16bit)

PIR1TMR1IF=0 Remise a 0 du drapeau deacutepassement

freq=671310per Calcul de la freacutequence

vit=freq179 + 692 Calcul de la vitesse que lon x100

Station meacuteteacuteo autonome 2012

25

if(vitlt200) En dessous 2ms la mesure est aleacuteatoire agrave cause du 2egraveme deacutebordement

vit=0

vent[0]=(vit10000)+48 Valeur des centaines affecteacute en ascii(48=0)

VV=(vit1000)10

vent[1]=VV+48 Valeur des dizaines affecteacute en ascii

VV=(vit100)10

vent[2]=VV+48 Valeur des uniteacute affecteacute en ascii

VV=(vit10)10

vent[3]=44 Virgule affecteacute en ascii

vent[4]=VV+48 Valeur de la 1er deacutecimale affecteacute en ascii

VV=vit10

vent[5]=VV+48 Valeur de la 2egraveme deacutecimale affecteacute en ascii

vent[6]=109 m affecteacute en ascii

vent[7]=47 affecteacute en ascii

vent[8]=115 s affecteacute en ascii

if(cond==1000) Appel la fonction LCD tous les 1000

lcd(1 1 16 txtvent) Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 8 vent) Affiche la chaine de caractegravere hum sur le LCD

cond=0 Remise a 0 de la condition

Fonction affichage

void lcd(int li int co int nb char receive[20])

int i

for(i=0 ilt=nb i++) Boucle for

Lcd_chr(li (co+i) receive[i]) Affiche les caractegraveres jusquagrave i

Station meacuteteacuteo autonome 2012

26

X Simulation une station meacuteteacuteo autonome

Maintenant que tous nos capteurs sont installeacutes nous allons mettre agrave profit le bouton

poussoir installeacute dans la partie LCD Crsquoest-agrave-dire que nous allons rassembler tous les programmes

preacuteceacutedents pour nrsquoen faire qursquoun Il suffira drsquoappuyer sur le bouton poussoir pour faire deacutefiler les

diffeacuterentes valeurs comme une vraie station meacuteteacuteo

A La structure du programme

Boucle infinie

while(1)

cond=cond+1 Increacutemente la variable cond

switch(BP)

case 0

humidite(ampcond) Appel la fonction humiditeacute

if(PORTAF2==1) Ces if permet de changer la valeur de BP

BP=1

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250) Temps quon relacircche bien le bouton

break

case 1

temperature(ampcond) Appel la fonction tempeacuterature

if(PORTAF2==1)

BP=2

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)

break

case 2

vent(ampcond) Appel la fonction vent

if(PORTAF2==1)

BP=0

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)

break

Nous avons choisi drsquoutiliser un Switch nous avons donc juste rajouteacute une variable BP

Lorsqursquoil y a appui sur le bouton poussoir la variable BP srsquoincreacutemente et le programme passe agrave une

autre case et donc utilise une nouvelle fonction La temporisation nous donne le temps de relacirccher le

bouton pour eacuteviter de faire deacutefiler le menu sans le vouloir

Station meacuteteacuteo autonome 2012

27

B La simulation

Etant donneacute que nous ne pouvions pas prendre le mateacuteriel avec nous il eacutetait impeacuteratif de

pouvoir faire des simulations Pour cela nous avons utiliseacute un logiciel tregraves utile Proteus ISIS Ce

logiciel possegravede une tregraves grande librairie et permet de rentrer nos programmes sur le PIC virtuel

geacuteneacutereacute par le logiciel Pour simuler le capteur drsquohumiditeacute nous avons utiliseacute un potentiomegravetre Pour

celui de lrsquoaneacutemomegravetre comme pour nos mesures nous avons brancheacute virtuellement un GBF sur la

borne associeacute et observeacute son signal agrave lrsquoaide drsquoun oscilloscope

Voilagrave un aperccedilu de la simulation effectueacute sur ISIS

Veacuterification theacuteorique du vent

Vitesse du vent = 0179 37 + 0629

Vitesse du vent = 7657ms

Veacuterification theacuteorique de lrsquohumiditeacute

H= (315-081)0031

H=7548

Veacuterification theacuteorique de la

tempeacuterature

La valeur afficheacutee correspond bien

aux 27degC seacutelectionneacute sur le capteur

Station meacuteteacuteo autonome 2012

28

XI Transmission des donneacutees par liaison ZigBee

ZigBee est un protocole de haut niveau permettant la communication de petites radios agrave

consommation reacuteduite baseacutee sur le standard IEEE 802154

Cette technologie a pour but la communication de courte distance telle que le propose deacutejagrave

la technologie Bluetooth tout en eacutetant moins chegravere plus simple et avec une fiabiliteacute assez eacuteleveacutee

Dans notre projet nous nous servirons de ZigBee pour permettre une transmission par ondes

de nos donneacutees de la station meacuteteacuteo vers un ordinateur Pour cela nous avons 2 modules Xbee pro 2

platines drsquointerfaces une avec des pattes (liaison platine) et lrsquoautre avec une sortie RS232 (liaison pc)

Caracteacuteristique eacutelectrique

Les signaux Xbee ont une amplitude de 33V mais sont alimenteacutes en 5V (tension de notre

source USB) cacircbleacutes sur la bornes VIN (laquo Power input from 6-12Vdc 300mA or higher raquo) Mais

notre source nrsquoeacutetant pas assez puissante pour alimenter toute notre installation Nous utiliserons

donc une source externe de 5V qui sera utiliseacutee pour alimenter les 2 systegravemes Xbee

Description des Bornes du Xbee qui nous inteacuteresse

Station meacuteteacuteo autonome 2012

29

A Scheacutema eacutelectrique du module Xbee

Nous avons cacircbleacute la sortie TX du microcontrocircleur qui eacutemet un signal jusqursquoagrave la borne RX du

Xbee qui reacuteceptionne ce signal Apregraves la transmission se fait par onde entre les 2 modules Xbee Pour

le module qui reccediloit le signal un cacircble RS232 suffit agrave faire la liaison entre celui-ci et le PC

B Envoi des donneacutees la liaison Usart

Un USART (Universal synchronous amp Asynchronous Receiver Transmitter) est un eacutemetteur-

reacutecepteur universel En langage courant cest le composant utiliseacute pour faire la liaison entre

lordinateur et le port seacuterie Lordinateur envoie les donneacutees en parallegravele (autant de fils que de bits

de donneacutees) Il faut donc transformer ces donneacutees pour les faire passer agrave travers une liaison seacuterie qui

utilise un mecircme fil pour faire passer tous les bits de donneacutees

Constitution dune trame USART

un bit de start toujours agrave 0 servant agrave la synchronisation du reacutecepteur

les donneacutees la taille peut varier (geacuteneacuteralement entre 5 et 9 bits)

eacuteventuellement un bit de pariteacute paire ou impaire

et un bit de stop toujours agrave 1 (la dureacutee peut varier entre 1 15 et 2 temps bit)

Le niveau logique de repos est le 1

Figure 14 Trame USART

Station meacuteteacuteo autonome 2012

30

Afin de faciliter les liaisons entre peacuteripheacuteriques (PC microcontrocircleur modem hellip) des vitesses

de transmission sont normaliseacutees luniteacute baud correspondant agrave un temps bit Dans notre cas nous

choisirons une vitesse de transmission de 9600bps

C Programme drsquoenvoi des donneacutees par liaison Usart

Gracircce agrave la librairie de MikroC il est tregraves facile drsquoenvoyer des donneacutees par liaison Usart Cela

fonctionne comme pour envoyer des caractegraveres sur lrsquoeacutecran LCD Il faut juste ensuite choisir la vitesse

de transmission qui sera 9600bps Voici la fonction et un morceau du programme qui sert agrave envoyer

les caractegraveres sur Xbee et de Xbee agrave un HyperTerminal

Fonction humiditeacute

void humidite(int cond)

long H U VL Deacuteclaration des variables

char HH hum[8] humtxt[]=Humidite

helliphellip

Xbee(8 hum) Envoi la chaicircne de caractegravere hum dans la fonction xbee

Usart

void xbee(int nb char receive[20])

int i

Usart_Init(9600) Vitesse de transmission

for(i=0 ilt=nb i++) Boucle for

Usart_Write(receive[i]) Envoi les caractegraveres sur lrsquoHyperTerminal jusquagrave i

Station meacuteteacuteo autonome 2012

31

XII Estimation du coucirct du projet

On peut voir sur ce tableau que le prix de reviens pour les eacuteleacutements que nous avons utiliseacute

est de 14506euro TTC Ce qui est plutocirct oneacutereux compareacute aux stations meacuteteacuteo du marcheacute qui oscille

entre 6euro et 400euro En sachant que la nocirctre est loin drsquoecirctre finaliseacute (finition estheacutetique ergonomie et

ajout de nouvelle fonction comme la date et lrsquoheure)

Composant Quantiteacute Prix (TVA inclus) Liens Quartz 20000MHz 1 111 euro Lien

Capaciteacute 22pF 2 010 euro lien

PIC 16F876 1 427 euro lien

LCD MODULE 1 1575 euro lien

Potentiomegravetre 10KΩ 1 618 euro lien

Reacutesistance 33 Ω 1 035 euro lien

Reacutesistance 10 K Ω 2 070 euro lien

Reacutesistance 1 KΩ 3 105 euro lien

LED rouge 1 013 euro lien

DS1621 1 650 euro lien

Bouton poussoir 1 060 euro lien

Module Xbee 2 4000 euro lien

Platine dinterface (XBEE) RS232 1 1890 euro lien

Platine dinterface (XBEE) 1 1364 euro lien

Capteur drsquohumiditeacute 1 2692 euro lien

Transistor 1 561 euro lien

Diode 1 325 euro lien

Totales 1 14506 euro

Station meacuteteacuteo autonome 2012

32

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

panelsbut 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 Itrsquos also possible to measure

humidity and wind speed Then itrsquos 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 its 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 Itrsquos 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

Station meacuteteacuteo autonome 2012

33

XIV Conclusion

Ce projet sur la conception drsquoune station meacuteteacuteo autonome qui nous a eacuteteacute confieacute a eacuteteacute tregraves

enrichissant Il nous a permis de mettre en relations les connaissances acquises durant lrsquoanneacutee mais

aussi acqueacuterir de nouvelles connaissances comme le fonctionnement drsquoun microcontrocircleur En effet

nous nrsquoavions jamais programmeacute sur microcontrocircleur Il a fallu srsquoadapter et apprendre agrave utiliser des

nouveaux logiciels tels que Proteus MikroC ainsi que Labview

De cette expeacuterience nous avons aussi appris agrave ecirctre autonome Nous avons saisi que la

compreacutehension des documents techniques et des librairies eacutetait un point essentiel de notre projet

En programmation nous nrsquoavions pas le droit agrave lrsquoerreur car la moindre faute pouvait conduire le

systegraveme agrave un dysfonctionnement Ce projet nous a demandeacute beaucoup de rigueur de patience et de

temps

Toutefois nous nrsquoavons pas eu malheureusement le temps drsquoinstaller le capteur de

tempeacuterature inteacuterieure par manque de temps Plus encore nous aurions aimeacute approfondir certains

points Par exemple pouvoir installer les composants sur circuit imprimeacute et concevoir un support

viable pour en faire une vraie station meacuteteacuteo Lrsquoinstallation drsquoune girouette aurait eacuteteacute appreacuteciable

pour connaicirctre le sens du vent Aussi le programme aurait sans doute pu ecirctre encore ameacutelioreacute pour

de meilleures performances

Malgreacute ce manque de temps nous sommes tregraves satisfaits du fonctionnement de ce module

qui nous a permis de comprendre lrsquoutiliteacute des parties theacuteoriques pour lrsquoapplication et la mise en

œuvre drsquoun systegraveme Lrsquoapproche peacutedagogique de nous diriger vers les solutions sans jamais les

donner de nous laisser un grand degreacute de liberteacute et drsquoautonomie a eacuteteacute au deacutebut assez deacuteroutante

mais tregraves instructif

Enfin nous tenions agrave remercier Mme Leymarie qui nous a suivis et aiguilleacute tout au long de ce

projet

Station meacuteteacuteo autonome 2012

34

XV ANNEXES

Programme complet

Deacuteclaration 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()

deacuteclaration des variables

int cond=0Condition pour laffichage sur leacutecran LCD

int BP=0

Initialisation et affectation des ports

PORTA=0

PORTB=0 initialisation

PORTC=0

TRISB=0 Port B deacuteclarer en sortie

TRISA=0xFF Port A en entreacutee

ADCON1=0x84 Justifieacute agrave droite active RA0RA1RA3 analogique

ADCON0=0x85 Fosc32 sur PA0 en service

TRISB=0 Port B deacuteclarer en sortie

TRISC=0xFFPort C deacuteclarer en entreacutee

Configuration et initialisation de leacutecran LCD

Lcd_Config(ampPORTB 0 1 WR 5 4 3 2) Configure lecran

Lcd_Init(ampPORTB) initialisation du LCD

Lcd_Cmd(Lcd_CURSOR_OFF) Enleve le curseur

Lcd_Cmd(Lcd_CLEAR) Efface lecran

Initialisation du module I2C

I2C_Init(100000)initialisation de la communication I2C

I2C_Start()Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90)Mode de controcircle en mode eacutecriture

I2C_Wr(0xAC)Accegraves au registre de configuration

I2C_Wr(0x0A)Registre de configuration mesure en continu

I2C_Stop()Arrecirct du signal

I2C_Start()Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90)Mode de controcircle en mode eacutecriture

I2C_Wr(0xEE)Deacutebut de la conversion

I2C_Stop()Arrecirct du sigal

Station meacuteteacuteo autonome 2012

35

Configuration du mode capture

T1CON=0x31 Configuration du timer1

CCP1CON=0x05 Paramegravetrage du mode capture

PIE1TMR1IE=1 Autorise les deacutebordements du timer 1

Boucle infinie

while(1)

cond=cond+1Increacutemente la variable cond

switch(BP)

case 0

humidite(ampcond)Appel la fonction humiditeacute

if(PORTAF2==1)Ces if permet de changer la valeur de BP

BP=1

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)Temps quon relacircche bien le bouton

break

case 1

temperature(ampcond)Appel la fonction tempeacuterature

if(PORTAF2==1)

BP=2

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)

break

case 2

vent(ampcond)Appel la fonction vent

if(PORTAF2==1)

BP=0

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)

break

Fonction humiditeacute

void humidite(int cond)

long H U VLDeacuteclaration des variables

char HH hum[8] humtxt[]=Humidite

VL=Adc_read(0) Valeur lue sur RA0(humiditeacute)

U=(VL5000)1023 Convertit la valeur lue en tension x1000

H=(U-810)(0031) Convertit la tension en humiditeacute x1000

Station meacuteteacuteo autonome 2012

36

if(Hgt100000)Si H gt 100(impossible) alors = 100

H=100000

if(Hlt0)Si H lt 0(impossible) alors = 0

H=0

hum[0]=(H100000)+48Valeur des centaines affecteacute en ascii(48=0)

HH=(H10000)10

hum[1]=HH+48Valeur des dizaines affecteacute en ascii

HH=(H1000)10

hum[2]=HH+48Valeur des uniteacutes affecteacute en ascii

hum[3]=44Virgule affecteacute en ascii

HH=(H100)10

hum[4]=HH+48Valeur de la premiegravere deacutecimale affecteacute en ascii

HH=(H10)10

hum[5]=HH+48Valeur de la deuxiegraveme deacutecimale affecteacute en ascii

hum[6]=37Pourcentage affecteacute en ascii

if(cond==50)Appel la fonction LCD tous les 1000

lcd(1 1 8 humtxt)Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 7 hum)Affiche la chaine de caractegravere hum sur le LCD

cond=0Remise a 0 de la condition

Xbee(7 hum) Envoi la chaicircne de caractegravere hum dans la fonction xbee

Fonction tempeacuterature

void temperature(int cond)

char temp[7] temptxt[]=Temperature LSB

signed char MSB

I2C_Start()Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90)Mode de controcircle en mode eacutecriture

I2C_Wr(0xAA)Lecture de la tempeacuterature

I2C_Stop()Arrecirct du sigal

I2C_Start()Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x91)Mode de controcircle en mode lecture

MSB = I2C_Rd(1)Nombre signeacute donnant la tempeacuterature entre +125deg et -55degC

LSB = I2C_Rd(0)Si bit 7 = 1 tempeacuterature MSB +05degC

I2C_Stop()Arrecirct du sigal

if(MSBlt0)

MSB = abs(MSB) Si temperature neacutegative valeur absolue de MSB

Temp[0]=45 Signe - affecteacute en ascii

else

Station meacuteteacuteo autonome 2012

37

Temp[0]=43signe + affecteacute en ascii

Temp[1]=(MSB10)+48 Valeur des dizaines affecteacute en ascii

Temp[2]=(MSB10)+48 Valeur des uniteacutes affecteacute en ascii

Temp[3]=44 Virgule affecteacute en ascii

if (LSB==128) Si bit 7 agrave 1 alors +05deg

Temp[4]=5

else Si bit 7 agrave 0 alors +00deg

Temp[4]=0

Temp[5]=223 degreacute affecteacute en ascii

Temp[6]=67 C affecteacute en ascii

if(cond==50)Appel la fonction LCD tous les 1000

lcd(1 1 11 temptxt)Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 7 temp)Affiche la chaine de caractegravere hum sur le LCD

cond=0Remise a 0 de la condition

Xbee(7 temp) Envoi la chaicircne de caractegravere temp dans la fonction xbee

Fonction vent

void vent(int cond)

unsigned long tl th per

int vitfreq

char vent[13] txtvent[]=Vitesse du vent VV

if(PIR1CCP1IF==1) Test si front montant agrave lieu

TMR1H=0 Initialisation du timer1 bit de point fort

TMR1L=0 Initialisation du timer1 bit de point faible

th=CCPR1H Les valeurs sont copieacute dans des variables

tl=CCPR1L

th=thltlt8 Deacutecalage car th =gt bit de point fort

per = th|tl On concategravene les deux valeurs nous obtenons la peacuteriode

PIR1CCP1IF=0 Remise a 0 du drapeau

if(PIR1TMR1IF==1) Si deacutepassement du timer 1

per=65535+per On ajoute une retenue lorsquon a fait un tour (16bit)

PIR1TMR1IF=0 Remise a 0 du drapeau deacutepassement

Station meacuteteacuteo autonome 2012

38

freq=671310perCalacul de la freacutequence

vit=freq179 + 692Calcul de la vitesse que lon x100

if(vitlt200)En dessous 2ms la mesure est aleacuteatoire agrave cause du 2egraveme deacutebordement

vit=0

vent[0]=(vit10000)+48Valeur des centaines affecteacute en ascii(48=0)

VV=(vit1000)10

vent[1]=VV+48Valeur des dizaines affecteacute en ascii

VV=(vit100)10

vent[2]=VV+48Valeur des uniteacute affecteacute en ascii

VV=(vit10)10

vent[3]=44Virgule affecteacute en ascii

vent[4]=VV+48Valeur de la 1er deacutecimale affecteacute en ascii

VV=vit10

vent[5]=VV+48Valeur de la 2egraveme deacutecimale affecteacute en ascii

vent[6]=109m affecteacute en ascii

vent[7]=47 affecteacute en ascii

vent[8]=115s affecteacute en ascii

if(cond==50)Appel la fonction LCD tous les 1000

lcd(1 1 15 txtvent)Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 9 vent)Affiche la chaine de caractegravere hum sur le LCD

cond=0Remise a 0 de la condition

Xbee(9 vent) Envoi la chaicircne de caractegravere vent dans la fonction xbee

Fonction affichage

void lcd(int li int co int nb char receive[15])

int i

for(i=0 iltnb i++)Boucle for

Lcd_chr(li (co+i) receive[i])Affiche les caractegraveres jusquagrave i

Usart

void xbee(int nb char receive[15])

int i

Usart_Init(9600)Vitesse de transmission

for(i=0 iltnb i++)Boucle for

Usart_Write(receive[i])Envoi les caractegraveres sur lHyperTerminal jusquagrave i

Station meacuteteacuteo autonome 2012

2

II Introduction

Dans le cadre de notre formation L3 EEA (eacutelectrotechnique eacutelectronique automatique) il

nous a eacuteteacute demandeacute de concevoir et reacutealiser un systegraveme pluridisciplinaire de notre choix agrave partir drsquoun

cahier des charges Un projet ougrave il faut organiser son travail et ecirctre capable de le preacutesenter par eacutecrit

(rapport) et oralement Lrsquoobjectif principal de ce travail est de faire le lien entre lrsquoensemble des

enseignements disciplinaire et de valider notre autonomie

Dans ce rapport nous preacutesenterons notre projet une station meacuteteacuteo autonome conccedilue et

programmeacutee par nos soins Nous deacutetaillerons chaque fonction de la station avec dans chaque partie

son scheacutema son programme associeacute et lrsquoexplication des points importants

Nous finirons par une conclusion qui rappellerons les grandes lignes de notre projet les

connaissances et les acquis apporteacute par ce module ainsi que le ressenti et notre avis suite au projet

III Cahier des charges

Le projet drsquoune laquo station meacuteteacuteo autonome raquo est constitueacute de plusieurs objectifs clairs et bien

preacutecis qui nous ont permis de progresser par eacutetape

Mettre en œuvre un capteur drsquohumiditeacute (liaison analogique)

Conception et mise en œuvre drsquoun aneacutemomegravetre (Mesure drsquoune freacutequence convertie

en vitesse (ms))

Mettre en œuvre deux capteurs de tempeacuterature numeacuteriques (DS1621) mesurant la

tempeacuterature inteacuterieure et exteacuterieure (la liaison avec le capteur de tempeacuterature se

fera directement sur le PC)

Affichage des donneacutees sur un eacutecran LCD

Une liaison sans fil type Xbee pour envoyer les donneacutees aux PC

Affichage des donneacutees sur un eacutecran PC sous labview

On remarquera que chaque capteur utilise une technologie diffeacuterente ce qui en fait un

projet polyvalent

IV Scheacutema Synoptique de la station meacuteteacuteo

Pour plus de compreacutehension nous avons commenceacute agrave partir du cahier des charges le

synoptique complet de la station meacuteteacuteo On y trouve tous les eacuteleacutements citeacutes preacuteceacutedemment dans le

cahier des charges

Station meacuteteacuteo autonome 2012

3

V Le microcontrocircleur

A Choix du microcontrocircleur

Comme on peut voir preacuteceacutedemment que le microcontrocircleur choisi est un PIC16F876 (cf figure 1)

celui-ci nous as eacuteteacute conseilleacute par notre eacutequipe peacutedagogique Nous avons quand mecircme pris soin de

veacuterifier globalement si le nombre drsquoentreacutee et de sortie eacutetaient suffisants pour le nombre drsquoeacuteleacutements

utiliseacutes en survolant pour chacun drsquoentre eux leur datasheet

Microcontrocircleur

PIC16F876

Capteur

drsquohumiditeacute

Capteur de

tempeacuterature

exteacuterieure

Aneacutemomegravetre

Ecran LCD

Emetteur

ZigBee

Reacutecepteur

ZigBee

PC

Capteur de

tempeacuterature

inteacuterieure

Figure 1 Scheacutema du PIC16F876

Station meacuteteacuteo autonome 2012

4

B Prise en main du microcontrocircleur

Nrsquoayant jamais programmeacute sur un microcontrocircleur notre eacutequipe peacutedagogique nous a conseilleacute

de commencer par nous familiariser avec le PIC agrave lrsquoaide drsquoun mini TP Ce TP drsquoinitiation proposeacute par le

logiciel Mikroelektronika marque du logiciel utiliseacute pour programmer le PIC (MikroC) consiste agrave faire

clignoter une LED

Pour le quartz qui deacutefinit la freacutequence drsquohorloge on nous a donneacute un 20Mhz Pour choisir les

condensateurs nous avons regardeacute dans la datasheet du quartz

Au vue de cette datasheet nous avons pris des condensateurs de 22pF car ils eacutetaient agrave notre

disposition

C Scheacutema du microcontrocircleur avec la LED

Nous avons donc commenceacute par implanter les composants et agrave les cacircbler entre eux sur la platine

qursquoon nous a fourni Comme vous pouvez le voir sur la figure 2 le scheacutema de la partie laquo LED raquo eacutetabli

sur le logiciel Proteus ISIS 78 Crsquoest ce Logiciel qui nous a permis tout au long du projet de faire les

scheacutemas et les simulations

On peut voir sur le scheacutema de la figure 2 qursquoil yrsquoa un bornier brancher sur les bornes RB6 RB7

et Vpp Il repreacutesente en fait le cacircble USB qui va au PC Ce cacircble nous permet de transfeacuterer le

programme Par la suite nous ne le repreacutesenterons plus de mecircme pour chaque partie nous

repreacutesenterons que les capteurs en question Ceci pour un souci de clarteacute

Figure 2 Scheacutema avec la LED

Station meacuteteacuteo autonome 2012

5

D Programme pour le clignotement de la LED

Nous avons ensuite agrave lrsquoaide du TP et du logiciel MikroC programmeacute le microcontrocircleur 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 deacuteclarations des bornes

Voici le programme eacutetablit avec ccedila description

void main()

PORTC=0 Initialisation du port C

PORTB=0 Initialisation du port B

TRISC=0 Le port C affecteacute en sortie

TRISB=0 Le port B affecteacute en sortie

while(1)Boucle infinie

PORTCF7 = ~PORTCF7 Allumeeacuteteint la LED

Delay_ms(1000) Temporisation de 1 seconde

VI Lrsquoeacutecran LCD

Ensuite nous sommes rentreacute dans le vif du sujet nous avons installeacute programmeacute lrsquoeacutecran LCD et

essayeacute drsquoafficher des caractegraveres dessus Nous avons aussi rajouteacute un bouton poussoir en vue de

preacuteparer le terrain pour la suite du projet

A Scheacutema du microcontrocircleur avec lrsquoeacutecran LCD

Figure 3 scheacutema avec eacutecran LCD et le bouton poussoir

Station meacuteteacuteo autonome 2012

6

Pour cacircbler lrsquoeacutecran LCD nous nous sommes aideacutes de sa datasheet ainsi que lrsquoaide du logiciel

MikroC Le point qui nous semble important est la borne R(read)W(write) On peut voir qursquoelle est

connecteacutee agrave la masse En effet pour eacutecrire sur lrsquoeacutecran il faut mettre RW = 0 pour lire on le met agrave 1

B Programme pour lrsquoeacutecran LCD

Voici un petit exemple de programme qui utilise agrave la fois le bouton poussoir et qui affiche du

texte sur lrsquoeacutecran LCD void main()

int cond=0 BP=0

Initialisation et affectation des ports

PORTB=0 Initialisation du port B

PORTA=0 Initialisation du port A

TRISB=0 Le port B affecteacute en sortie

TRISA = 0xFF Port A en entreacutee

ADCON1 = 0x84 RA2 en entreacutee

Configuration et initialisation de leacutecran LCD

Lcd_Config(ampPORTB 0 1 WR 5 4 3 2) Configure leacutecran

Lcd_Init(ampPORTB) initialisation du LCD

Lcd_Cmd(Lcd_CURSOR_OFF) Enlegraveve le curseur

Lcd_Cmd(Lcd_CLEAR) Efface leacutecran

Boucle infini

while(1)

cond=cond+1

switch(BP)

case 0

if(PORTAF2==1) Ces if permet de changer la valeur de BP

BP=1

Delay_ms(250) Temps quon relacircche bien le bouton

if(cond==1000)

Lcd_Cmd(Lcd_CLEAR)

Lcd_Out(1 1 Bonjour) Affiche Bonjour ligne 1 colonne 1

break

case 1

if(PORTAF2==1)

BP=0

Delay_ms(250)

if(cond==1000)

Lcd_Cmd(Lcd_CLEAR)

Lcd_Out(1 1 Mme Leymarie )

break

Station meacuteteacuteo autonome 2012

7

Fonctionnement de ce programme

Affiche laquo bonjourhellip raquo sur lrsquoeacutecran LCD

Appuie sur le BP

Affiche laquo Mme Leymarie raquo sur lrsquoeacutecran LCD

Appuie sur le BP

Affiche laquo bonjourhellip raquo sur lrsquoeacutecran LCD

Etc

Les fonctions de lrsquoeacutecran LCD sont expliqueacutees dans lrsquoaide du logiciel MikroC La variable laquo cond raquo

est une condition pour ne pas afficher le mot agrave chaque boucle mais tous les 1000 iteacuterations ce qui

permet de ne pas faire clignoter lrsquoeacutecran ADCON1 sera expliqueacute agrave la suite de ce rapport

VII Le capteur drsquohumiditeacute

Apregraves avoir pris en main

lrsquoeacutecran LCD ainsi que le logiciel

nous avons deacutecideacute drsquoinstaller le

capteur drsquohumiditeacute On nous a mis

agrave disposition un capteur

drsquohumiditeacute de reacutefeacuterence HIH-

4000-001 Crsquoest un capteur qui

renvoie une tension analogique

(cf figure 4) Nous avons

commenceacute par chercher sa

datasheet et regarder les

proprieacuteteacutes du capteur

A Caracteacuteristiques du capteur drsquohumiditeacute

Voici les proprieacuteteacutes importantes du capteur donneacutee par la notice

Gamme dhumiditeacute 0 agrave 100 RH (Relative Humidity) avec une Preacutecision de plusmn 35 RH

Gamme de tension dalimentation 4V agrave 58V

Tempeacuterature de fonctionnement -40degC agrave +85degC (-40 degF to 185 degF)

Courant alimentation 500μA

Sortie Analogique

Figure 4 Capteur dhumiditeacute HIH 4000-001

Station meacuteteacuteo autonome 2012

8

Pour ce qui est lrsquoeacutequation de la tension

en fonction de lrsquohumiditeacute le constructeur nous

donne la courbe drsquoeacutetalonnage suivante (cf

figure 5)

De cette courbe nous en avons tireacute les

valeurs suivantes (cf figure 6)

Nous avons ensuite deacutecideacute de la retracer sur Excel et drsquoen tirer llsquoeacutequation qui sera utiliseacute dans le

programme du microcontrocircleur

On voit qursquoExcel nous donne lrsquoeacutequation suivante

U=0031H +081

Donc H= (U-081)0031

De plus nous multiplierons par 1000 la valeur de H pour pouvoir reacutecupeacuterer les chiffres

deacutecimales et les rentrer dans une chaine de caractegraveres et les afficher sur lrsquoeacutecran LCD H=

(U810)0031

La valeur maximum de H est donc de 100 000 nous la deacuteclarerons donc en long (une

deacuteclaration en int ne serais pas suffisant -32768 agrave 32767)

Figure 5 Courbes donneacutee par le constructeur

Figure 6 tableau de mesure

Figure 7 Courbe traceacute sur Excel

Station meacuteteacuteo autonome 2012

9

Nous avons remarqueacute sur la courbe ainsi qursquoen simulation que le capteur peut avoir des

valeurs supeacuterieur agrave 100 et infeacuterieur agrave 0 Il faudra donc mettre deux conditions pour ne pas

deacutepasser la plage de valeur

B Configuration du microcontrocircleur

Maintenant nous arrivons agrave point important de cette partie celle de la configuration des

ports du microcontrocircleur En effet le PIC16F876 est constitueacute drsquoun module convertisseur agrave 5 entreacutees

Ces entreacutees sont situeacutees sur les bornes RA0 RA1 RA2 RA3 et RA5 (cf figure1) Le reacutesultat de la

conversion est codeacute sur 10 bits Crsquoest une valeur comprise entre hrsquo000rsquo et hrsquo3FFrsquo

hlsquo3FFrsquo = brsquo1 1111 1111rsquo = drsquo1023rsquo

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 eacutequation

U = (Valeur lue sur le CAN 5)1023

Pour les mecircme raison que lrsquoeacutequation du capteur drsquohumiditeacute nous avons multiplieacute par

1000 la tension nous obtenons donc U= (Valeur lue sur le CAN 5000)1023

Il faut ensuite reacutegler les entreacutees analogiques avec les registres ADCON0 et ADCON1 en

sachant que nous avons deacutecideacute 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 (Freacutequence drsquooscillation)2

01= Fosc8

10= Fosc32

11= Oscillateur RC interne

Pour que la conversion soit correct il faut que T(ad) soit au minimum de 16micros nous

disposons drsquoun quartz de 20Mhz =gt 20Mhz32 =gt 16micros Nous mettrons donc le bit 7 agrave 1 et

le 6 agrave 0

Bit 5 bit4 et bit 3 CHS2 CHS1 et CHS0 = Channel Select bits

Ces 3 bits permettent de choisir lentreacutee qui va ecirctre convertie

Station meacuteteacuteo autonome 2012

10

Nous voulons convertir lrsquoentreacutee RA0 pour cela il faut mettre les bits 5 4 3 agrave 0

Bit 2 GODONE Status bit si ADON=1

1 = Deacutemarre la conversion AD Ce bit est remis agrave 0 par hard

0 = La conversion AD est termineacutee

Il nous faut deacutemarrer la conversion

Bit 1 Bit non implanteacute

Bit 0 ADON AD on bit

1= Convertisseur AD en service

0 = Convertisseur AD agrave larrecirct

Il nous faut mettre le convertisseur en service

ADCON0 = brsquo1000 0101rsquo = hrsquo85rsquo

Bit 7 ADFM = AD Result format

1 = Justifieacute agrave droite

0 = Justifieacute agrave gauche

Nous avons justifieacute agrave droite

Bit 6 bit 5 et bit 4 Bits non impleacutementeacutes

Bit 3 bit 2 bit 1 et bit 0 PCFG3 PCFG2 PCFG1 et PCFG0

Bits de controcircle de la configuration des Ports

Ces bits permettent de choisir le partage entre entreacutees analogiques et digitales sur les PORTS A et E

On a choisi drsquoactiver RA0 RA1 et RA3 en entreacutee analogique les autres resteront en

digitales ce qui signifie qursquoau vue de la datasheet il faut mettre le bit 2 agrave 1 et les autres agrave 0

ADCON1 = brsquo10000100rsquo = hrsquo84rsquo

Station meacuteteacuteo autonome 2012

11

C Le scheacutema du microcontrocircleur avec le capteur drsquohumiditeacute

Voici le scheacutema de cacircblage du capteur drsquohumiditeacute uniquement A noter que le capteur est

remplaceacute par un potentiomegravetre nrsquoeacutetant pas dans la librairie de Proteus On constate qursquoil est bien

brancheacute sur RA0

D Programme pour la mesure de lrsquohumiditeacute

Voici le programme pour mesurer lrsquohumiditeacute avec les affectations deacutecrites ci-dessus ainsi

que les eacutequations de conversions

Deacuteclaration des fonctions

void humidite(int cond)

void lcd(int li int co int nb char receive[11])

void main()

deacuteclaration des variables

int cond=0 Condition pour laffichage sur leacutecran LCD

Initialisation et affectation des ports

PORTB=0 initialisation

TRISB=0 Port B deacuteclarer en sortie

TRISA = 0xFF Port A en entreacutee

ADCON1 = 0x84 Justifieacute agrave droite active RA0RA1RA3 analogique

ADCON0 = 0x85 Fosc32 sur PA0 en service

Configuration et initialisation de leacutecran LCD

Lcd_Config(ampPORTB 0 1 WR 5 4 3 2) Configure leacutecran

Lcd_Init(ampPORTB) initialisation du LCD

Lcd_Cmd(Lcd_CURSOR_OFF) Enlegraveve le curseur

Lcd_Cmd(Lcd_CLEAR) Efface leacutecran

Figure 8 Scheacutema de cacircblage du capteur dhumiditeacute

Station meacuteteacuteo autonome 2012

12

Boucle infinie

while(1)

cond=cond+1 Increacutemente la variable cond

humidite(ampcond) Appel la fonction humiditeacute

Fonction humiditeacute

void humidite(int cond)

long H U VL Deacuteclaration des variables

char HH hum[8] humtxt[]=Humidite

VL=Adc_read(0) Valeur lue sur RA0(humiditeacute)

U=(VL5000)1023 Convertit la valeur lue en tension x1000

H=(U-810)(0031) Convertit la tension en humiditeacute x1000

if(Hgt100000) Si H gt 100(impossible) alors = 100

H=100000

if(Hlt0) Si H lt 0(impossible) alors = 0

H=0

hum[0]=(H100000)+48 Valeur des centaines affecteacute en ascii(48=0)

HH=(H10000)10

hum[1]=HH+48 Valeur des dizaines affecteacute en ascii

HH=(H1000)10

hum[2]=HH+48 Valeur des uniteacutes affecteacute en ascii

hum[3]=44Virgule affecteacute en ascii

HH=(H100)10

hum[4]=HH+48 Valeur de la premiegravere deacutecimale affecteacute en ascii

HH=(H10)10

hum[5]=HH+48 Valeur de la deuxiegraveme deacutecimale affecteacute en ascii

hum[6]=37 Pourcentage affecteacute en ascii

if(cond==1000)Appel la fonction LCD tous les 1000

lcd(1 1 10 humtxt) Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 7 hum) Affiche la chaine de caractegravere hum sur le LCD

cond=0 Remise a 0 de la condition

Fonction affichage

void lcd(int li int co int nb char receive[11])

int i

for(i=0 ilt=nb i++)Boucle for

Lcd_chr(li (co+i) receive[i]) Affiche les caractegraveres jusquagrave i

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

Station meacuteteacuteo autonome 2012

13

VIII Le capteur de tempeacuterature

A preacutesent comme toute station meacuteteacuteo

nous avons installeacute un capteur de tempeacuterature le

DS1621 Ce capteur communique avec le

microcontrocircleur gracircce au protocole I2C

A Le protocole I2C

Le bus I2C (Inter Integrated Circuit) a eacuteteacute deacuteveloppeacute au deacutebut des anneacutees 80 par Philips

semiconductors pour permettre de relier facilement agrave un microprocesseur les diffeacuterents circuits dun

teacuteleacuteviseur moderne

Le bus I2C permet de faire communiquer entre eux des composants eacutelectroniques tregraves divers

gracircce agrave seulement trois fils Un signal de donneacutee (SDA) un signal dhorloge (SCL) et un signal de

reacutefeacuterence eacutelectrique (Masse)

Ceci permet de reacutealiser des eacutequipements ayant des fonctionnaliteacutes tregraves puissantes (En

apportant toute la puissance des systegravemes micro programmeacutes) et conservant un circuit imprimeacute tregraves

simple par rapport un scheacutema classique (8bits de donneacutees 16 bits dadresse + les bits de controcircle)

Les donneacutees sont transmises en seacuterie agrave 100Kbitss en mode standard et jusquagrave 400Kbitss en

mode rapide Ce qui ouvre la porte de cette technologie agrave toutes les applications ougrave la vitesse nest

pas primordiale

Voici un exemple de protocole qursquoutilise le bus I2C

1 Pour initier le dialogue le maicirctre creacutee une condition Start

2 Le maicirctre envoie ladresse de lesclave (1010100) suivi du bit 0 (bit Write)

3 Lesclave reacutepond (accuseacute de reacuteception bit Acknowledge)

4 Le maicirctre envoie ladresse du registre (0x04) agrave eacutecrire

5 Lesclave reacutepond (accuseacute de reacuteception bit Acknowledge)

6 Le maicirctre envoie la donneacutee (0x27) agrave eacutecrire

7 Lesclave eacutecrit la donneacutee puis envoie un accuseacute de reacuteception (bit Acknowledge)

8 Le maicirctre termine le dialogue avec une condition Stop

9 Le bus I2C est maintenant libre (SCL = 1 SDA = 1 niveaux de repos)

Figure 9 scheacutema du DS1621

Station meacuteteacuteo autonome 2012

14

B Caracteacuteristique du DS1621

Comme on peut voir sur la figure 9 le capteur est composeacute de 8 bornes

SDA =gt Liaison seacuterie entreacutee sortie

SCL =gt Signal drsquohorloge

Tout =gt Signal de sortie du thermostat (inutile dans notre cas)

GND =gt Masse

VDD =gt Alimentation +5V

A0 A1 A2 =gt Entreacutee drsquoadressage (dans notre cas les 3 agrave la masse car nous nrsquoavons qursquoun

module I2C)

Les circuits connecteacutes sur un bus I2C ont des sorties de type drain ouvert (ou collecteur

ouvert) Deux reacutesistances de pull-up sont bien sucircr placeacutees entre les lignes SDA SCL et lalimentation

(VDD)Quand le bus nest pas utiliseacute SDA et SCL sont au niveau haut (niveau de repos)

1 Speacutecificiteacute des commandes

Tous dialogue du maicirctre(PIC16F876) avec un DS1621 esclave doit deacutebuter par lrsquoenvoi drsquoun

mot de controcircle

Le maicirctre envoi ensuite une commande suivi ou non de donneacutees Voici la liste des

commandes avec leur description

Les commandes AC EE et 22 ne sont pas suivies de lenvoi de donneacutees Par contre la

commande AA qui nous inteacuteresse est suivie de lrsquoenvoi par le DS1621 de 2 octets repreacutesentant la

tempeacuterature

Station meacuteteacuteo autonome 2012

15

Voici le registre de configuration(AC) qursquoil nous faut deacuteterminer

DONE 1 = conversion finie 0 = conversion en cours En mode 1 SHOT uniquement

THF Flag seuil haut du thermostat Passe agrave 1 et y reste si tempeacuterature supeacuterieure agrave TH

TLF Flag seuil bas du thermostat Passe agrave 1 et y reste si tempeacuterature infeacuterieure agrave TL

NVB 1 = meacutemoire EEPROM en eacutecriture 0 = meacutemoire EEPROM eacutecriture termineacutee

Nous nrsquoactiverons pas lrsquoeacutecriture de la meacutemoire

POL Polariteacute de Tout (pin 3) 1 = actif sera un niveau HAUT 0 = actif sera un niveau BAS

Il faut activer la polariteacute donc nous le mettons agrave 1

ONE SHOT 0 = conversion en continu 1 = conversion 1 fois

Nous le mettons en mode continu

AC = brsquo00001010rsquo = hrsquo0Arsquo

La commande AA qui permet de lire la tempeacuterature renvoie 2 octets

MSB (Most Significant Bit) Nombre signeacute donnant la tempeacuterature entre +125deg et -55degC

LSB (Least Significant Bit ) Seul le bit 7 de cet octet est significatif Si 1 tempeacuterature

MSB +05degC

Pour bien comprendre comment est codeacute un nombre signeacute un tableau avec des exemples de

valeurs eacutetait agrave notre disposition dans la notice

Station meacuteteacuteo autonome 2012

16

2 Dialogue I2C pour avoir la tempeacuterature

Voici un scheacutema qui montre le dialogue agrave effectuer entre le microcontrocircleur et le capteur

pour avoir la tempeacuterature Crsquoest gracircce agrave ce mecircme scheacutema que nous avons pu programmer le PIC

Station meacuteteacuteo autonome 2012

17

C Le scheacutema du microcontrocircleur avec le capteur de tempeacuterature

Voici le scheacutema du capteur de tempeacuterature uniquement Le capteur est brancheacute sur les

borne SCL(RC3) et SDA(RC4) du PIC Qursquoelles soient deacuteclareacutees en entreacutee ou en sortie les bornes SCL et

SDA sont fonctionnelles Il ne faut pas oublier les reacutesistances de tirages (R1 et R3) Lrsquoadressage A0 A1

A2 toutes misent agrave la masse car nous nrsquoavons qursquoun seul capteur I2C relieacute au PIC et le Tout

(thermostat) inutile car nous faisons juste un releveacute de tempeacuterature

D Programme pour la mesure de la tempeacuterature

Deacuteclaration des fonctions

void temperature(int cond)

void lcd(int li int co int nb char receive[14])

void main()

deacuteclaration des variables

int cond=0Condition pour laffichage sur leacutecran LCD

Initialisation et affectation des ports

PORTB=0 initialisation

PORTC=0

TRISB=0 Port B deacuteclarer en sortie

TRISC = 0xFF Port C en entreacutee

Configuration et initialisation de leacutecran LCD

Lcd_Config(ampPORTB 0 1 WR 5 4 3 2) Configure leacutecran

Lcd_Init(ampPORTB) initialisation du LCD

Lcd_Cmd(Lcd_CURSOR_OFF) Enlegraveve le curseur

Lcd_Cmd(Lcd_CLEAR) Efface leacutecran

Initialisation du module I2C

I2C_Init(100000) initialisation de la communication I2C

I2C_Start() Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90) Mode de controcircle en mode eacutecriture

I2C_Wr(0xAC) Accegraves au registre de configuration

I2C_Wr(0x0A) Registre de configuration mesure en continu

I2C_Stop() Arrecirct du signal

I2C_Start() Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90) Mode de controcircle en mode eacutecriture

Figure 10 Scheacutema de cacircblage avec le capteur de tempeacuterature

Station meacuteteacuteo autonome 2012

18

I2C_Wr(0xEE) Deacutebut de la conversion

I2C_Stop()Arrecirct du sigal

Boucle infinie

while(1)

cond=cond+1 Increacutemente la variable cond

temperature(ampcond) Appel la fonction humiditeacute

Fonction tempeacuterature

void temperature(int cond)

char temp[7] temptxt[]=Temperature LSB

signed char MSB

I2C_Start() Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90) Mode de controcircle en mode eacutecriture

I2C_Wr(0xAA) Lecture de la tempeacuterature

I2C_Stop() Arrecirct du signal

I2C_Start() Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x91) Mode de controcircle en mode lecture

MSB = I2C_Rd(1) Nombre signeacute donnant la tempeacuterature entre +125deg et -55degC

LSB = I2C_Rd(0) Si bit 7 = 1 tempeacuterature MSB +05degC

I2C_Stop() Arrecirct du signal

if(MSBlt0)

MSB = abs(MSB) Si tempeacuterature neacutegative valeur absolue de MSB

Temp[0]=45 Signe - affecteacute en ascii

else

Temp[0]=43 signe + affecteacute en ascii

Temp[1]=(MSB10)+48 Valeur des dizaines affecteacute en ascii

Temp[2]=(MSB10)+48 Valeur des uniteacutes affecteacute en ascii

Temp[3]=44 Virgule affecteacute en ascii

if (LSB==128) Si bit 7 agrave 1 alors +05deg

Temp[4]=5

Else Si bit 7 agrave 0 alors +00deg

Temp[4]=0

Temp[5]=223 degreacute affecteacute en ascii

Temp[6]=67 C affecteacute en ascii

if(cond==10) Appel la fonction LCD tous les 1000

lcd(1 1 13 temptxt) Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 6 temp) Affiche la chaine de caractegravere hum sur le LCD

cond=0 Remise a 0 de la condition

Fonction affichage

void lcd(int li int co int nb char receive[14])

int i

for(i=0 ilt=nb i++)Boucle for

Lcd_chr(li (co+i) receive[i]) Affiche les caractegraveres jusquagrave i

Le scheacutema preacuteceacutedent est bien respecteacute comme on peut le voir crsquoest tregraves facile agrave programmer

gracircce aux librairies I2C du logiciel MikroC

Station meacuteteacuteo autonome 2012

19

IX Lrsquoaneacutemomegravetre

A Conception

Pour lrsquoaneacutemomegravetre lrsquoeacutequipe peacutedagogique

nous a juste fourni lrsquoheacutelice du capteur donc il a fallu

concevoir toute la partie eacutelectronique Lrsquoideacutee est

drsquoinstaller une diode et un transistor photonique par

de lagrave lrsquoheacutelice et lorsqursquoelle tourne elle vient couper le

faisceau Succinctement le transistor envoit soit 1 soit

0 sur le PIC Le but est de relever la freacutequence agrave

laquelle tourne lrsquoheacutelice puis la convertir en vitesse (cf

figure 11)

La photodiode choisie est de reacutefeacuterence SD5455-3 Ce choix a eacuteteacute fait car lrsquoangle du faisceau

est de 20deg pour que le flux infrarouge soit bien concentreacute sur le phototransistor pour un

fonctionnement optimal

Comme on le voit sur le scheacutema de principe (cf figure 11) il a fallu dimensionner la

reacutesistance qui sert agrave reacuteguler le courant qui circule dans la LED avec les informations donneacutees par la

documentation technique nous avons pu la calculer

Forward voltage VF = 17V et IF = 01A

Ualim = 5V

RD = (Ualim ndash UF)IF = (5 ndash 17)01

RD = 33Ω

Pour le phototransistor nous avons choisi celui qui allait avec la diode de reacutefeacuterence SE5455-3

Cette fois la valeur de la reacutesistance nous eacutetait donneacute par le constructeur

RL=1000Ω

Lors des seacuteances nous avons implanteacute la diode et le

transistor sur le support du capteur Pour des raisons

pratiques et estheacutetiques nous avons seacutepareacute la partie

aneacutemomegravetre et la partie platine par des borniers (cf figure

12)

Figure 11 scheacutema descriptif de laneacutemomegravetre

Figure 12 Notre aneacutemomegravetre

Station meacuteteacuteo autonome 2012

20

B Mesure de la peacuteriode sur le microcontrocircleur

Le but est de relever la peacuteriode du signal envoyer par lrsquoaneacutemomegravetre pour cela le PIC est

eacutequipeacute drsquoun mode capture Le principe est de recopier agrave un moment voulu la valeur du timer 1 La

capture peut avoir lieux agrave chaque front descendant agrave chaque front montant tous les 4 ou tous les 16

fronts montants Quand la capture a eu lieu un flag est mis agrave 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 constitueacute de 2 registres de 8 bits TMR1H et TMR1L que lon peut lire ou eacutecrire Le registre TMR1

(constitueacute de TMR1H et TMR1L) sincreacutemente de h0000 jusquagrave hFFFF et repasse ensuite agrave h0000

pour continuer le comptage Quand il y a deacutebordement une interruption peut ecirctre geacuteneacutereacutee si on lrsquoa

autoriseacutee par TMR1IE =1 (bit 0 de PIE1) et le Flag TMR1IF (bit 0 de PIR1) passe agrave 1 Le controcircle du

timer 1 ce fait par le registre T1CON

Bit 7 et bit 6 bits non impleacutementeacutes

Bit 5 et bit 4 T1CKPS = Seacutelection du preacute diviseur placeacute avant le TIMER

Vu qursquoon a un quartz eacuteleveacute nous avons deacutecideacute de choisir un preacute-diviseur de 8 donc

F=Fosc(48) Pour cela mettre les bit 4 et 5 agrave 1

Bit 3 T1OSCEN Bit dautorisation de loscillateur du Timer 1

1 = oscillateur autoriseacute

0 = oscillateur stoppeacute

Oscillateur interne inutile donc bit 3 agrave 0

Bit 2 T1SYNC Bit de controcircle de la synchronisation du CLK externe

1 = Pas de synchronisation de lhorloge externe

0 = Synchronisation de lhorloge externe

Nous nous mettrons en mode synchrone

Bit1 TMR1CS Bit de seacutelection de la source horloge

1 = Mode Compteur Clk externe sur la broche PC0 ou Quartz entre PC0 et PC1

0 = Mode Timer Clk interne = Fosc4

Station meacuteteacuteo autonome 2012

21

On mettra ce bit agrave 0 car on utilise le mode Timer

Bit 0 TMR1ON Bit dautorisation du Timer 1

1 = Timer 1 en service

0 = Timer 1 stoppeacute

Il faut eacutevidemment mettre la timer 1 en service

Nous avons aussi autoriseacute le deacutebordement du timer 1 pour avoir plus de preacutecisions pour cela il faut

mettre la commande PIE1TMR1 agrave 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 parameacutetrer le registre

CCP1CON

Bit 7 et Bit 6 bits non impleacutementeacutes

Bit 5 et Bit 4 CCP1X et CCP1Y

Bits non utiliseacutes 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 agrave Bit 0 CCP1M3 agrave CCP1M0 bits de seacutelection du mode

Nous avons seacutelectionneacute le mode capture sur chaque front montant Pour cela nous avons

mis les bits 1 et 3 agrave 0 et les bits 0 et 2 agrave 1

Pour savoir si un front montant agrave eu lieu le flag CCP1F est mis agrave 1 Ce flag doit ecirctre remis agrave 0 par

lrsquoutilisateur La valeur des 16 bits des registres du Timer 1 TMR1L (bit de poids faible) et TMR1H (bit

de poids fort) sont recopieacutees dans les registres CCPR1 CCPRIH (bit de poids faible) et CCPR1L (bit de

poids fort)

Nous avons programmeacute le mode capture de faccedilon agrave afficher sur lrsquoeacutecran LCD la valeur du registre

CCPR1 crsquoest-agrave-dire la peacuteriode du signal de lrsquoaneacutemomegravetre Il ne nous reste maintenant plus qursquoagrave

eacutetalonner notre aneacutemomegravetre

Station meacuteteacuteo autonome 2012

22

C Etalonnage de lrsquoaneacutemomegravetre

Pour eacutetalonner le capteur nous avons commenceacute par savoir agrave quelle freacutequence correspond la

valeur releveacutee par le mode capture Pour cela nous avons brancheacute un GBF agrave la place du capteur et

avec un oscilloscope nous avons compareacute leurs valeurs

Nous avons ensuite traceacute agrave lrsquoaide des valeurs du tableau la courbe F(Hz) en fonction du

compteur De cette courbe nous relevons lrsquoeacutequation

F = 671310compteur^(-101)

Soit environ F = 671310compteur

Puis nous avons brancheacute notre aneacutemomegravetre sur le microcontrocircleur Cela dans le but de

relever sa peacuteriode sur lrsquoeacutecran LCD agrave lrsquoaide drsquoune soufflerie variable et du manomegravetre GDH (reacutef

121552 200-13) nous avons compareacute leurs valeurs pour connaitre lrsquoeacutetalonnage de notre capteur

Nous avons noteacute plusieurs valeurs puis traceacute diffeacuterentes courbe pour trouver les eacutequations qui nous

permettrons de calculer la vitesse dans notre programme

Station meacuteteacuteo autonome 2012

23

Voici les valeurs que nous avons releveacutees puis la courbe traceacutee sur Excel

De cette courbe nous obtenons lrsquoeacutequation

Vitesse du vent = 0179F + 0629

Nous les multiplierons par 100 pour reacutecupeacuterer les deacutecimales et les implanter dans une chaine

de caractegravere

Vitesse du vent = 179F + 629

Nous avons agrave preacutesent agrave notre disposition toutes les eacutequations neacutecessaires pour pouvoir

convertir la valeur releveacutee par le mode capture en une vitesse

D Le scheacutema du microcontrocircleur avec lrsquoaneacutemomegravetre

On voit sur le scheacutema que le capteur est bien relieacute sur la borne RC2 Nous avons aussi

repreacutesenteacute les borniers J1 et J2 A droite tous ce qui est sur le support et agrave gauche tous ce qui est sur

la platine

Figure 13 Scheacutema avec laneacutemomegravetre

Station meacuteteacuteo autonome 2012

24

E Programme pour la mesure de la vitesse du vent

Voici le programme pour mesurer la vitesse du vent avec les affectations deacutecrites ci-dessus

ainsi que les eacutequations de conversions

Deacuteclaration des fonctions

void vent(int cond)

void lcd(int li int co int nb char receive[20])

void main()

deacuteclaration des variables

int cond=0

Initialisation et affectation des ports

PORTB=0 initialisation

PORTC=0 initialisation

TRISC=0x04 Port C deacuteclarer en sortie sauf RC2 en mode capture

TRISB=0 Port B deacuteclarer en sortie

Configuration du mode capture

T1CON=0x31 Configuration du timer1

CCP1CON=0x05 Parameacutetrage du mode capture

PIE1TMR1IE=1 Autorise les deacutebordements du timer 1

Configuration et initialisation de leacutecran LCD

Lcd_Config(ampPORTB 0 1 WR 5 4 3 2) Configure leacutecran

Lcd_Init(ampPORTB) Initialisation du LCD

Lcd_Cmd(Lcd_CURSOR_OFF) Enlegraveve le curseur

Lcd_Cmd(Lcd_CLEAR) Efface leacutecran

Boucle infinie

while(1)

cond=cond+1

vent(ampcond)

Fonction vent

void vent(int cond)

unsigned long tl th per

int vitfreq

char vent[13] txtvent[]=vitesse du vent VV

if(PIR1CCP1IF==1) Test si front montant agrave lieu

TMR1H=0 Initialisation du timer1 bit de point fort

TMR1L=0 Initialisation du timer1 bit de point faible

th=CCPR1H Les valeurs sont copieacute dans des variables

tl=CCPR1L

th=thltlt8 Deacutecalage car th =gt bit de point fort

per = th|tl On concategravene les deux valeurs nous obtenons la peacuteriode

PIR1CCP1IF=0 Remise a 0 du drapeau

if(PIR1TMR1IF==1) Si deacutepassement du timer 1

per=65535+per On ajoute une retenue lorsquon a fait un tour (16bit)

PIR1TMR1IF=0 Remise a 0 du drapeau deacutepassement

freq=671310per Calcul de la freacutequence

vit=freq179 + 692 Calcul de la vitesse que lon x100

Station meacuteteacuteo autonome 2012

25

if(vitlt200) En dessous 2ms la mesure est aleacuteatoire agrave cause du 2egraveme deacutebordement

vit=0

vent[0]=(vit10000)+48 Valeur des centaines affecteacute en ascii(48=0)

VV=(vit1000)10

vent[1]=VV+48 Valeur des dizaines affecteacute en ascii

VV=(vit100)10

vent[2]=VV+48 Valeur des uniteacute affecteacute en ascii

VV=(vit10)10

vent[3]=44 Virgule affecteacute en ascii

vent[4]=VV+48 Valeur de la 1er deacutecimale affecteacute en ascii

VV=vit10

vent[5]=VV+48 Valeur de la 2egraveme deacutecimale affecteacute en ascii

vent[6]=109 m affecteacute en ascii

vent[7]=47 affecteacute en ascii

vent[8]=115 s affecteacute en ascii

if(cond==1000) Appel la fonction LCD tous les 1000

lcd(1 1 16 txtvent) Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 8 vent) Affiche la chaine de caractegravere hum sur le LCD

cond=0 Remise a 0 de la condition

Fonction affichage

void lcd(int li int co int nb char receive[20])

int i

for(i=0 ilt=nb i++) Boucle for

Lcd_chr(li (co+i) receive[i]) Affiche les caractegraveres jusquagrave i

Station meacuteteacuteo autonome 2012

26

X Simulation une station meacuteteacuteo autonome

Maintenant que tous nos capteurs sont installeacutes nous allons mettre agrave profit le bouton

poussoir installeacute dans la partie LCD Crsquoest-agrave-dire que nous allons rassembler tous les programmes

preacuteceacutedents pour nrsquoen faire qursquoun Il suffira drsquoappuyer sur le bouton poussoir pour faire deacutefiler les

diffeacuterentes valeurs comme une vraie station meacuteteacuteo

A La structure du programme

Boucle infinie

while(1)

cond=cond+1 Increacutemente la variable cond

switch(BP)

case 0

humidite(ampcond) Appel la fonction humiditeacute

if(PORTAF2==1) Ces if permet de changer la valeur de BP

BP=1

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250) Temps quon relacircche bien le bouton

break

case 1

temperature(ampcond) Appel la fonction tempeacuterature

if(PORTAF2==1)

BP=2

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)

break

case 2

vent(ampcond) Appel la fonction vent

if(PORTAF2==1)

BP=0

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)

break

Nous avons choisi drsquoutiliser un Switch nous avons donc juste rajouteacute une variable BP

Lorsqursquoil y a appui sur le bouton poussoir la variable BP srsquoincreacutemente et le programme passe agrave une

autre case et donc utilise une nouvelle fonction La temporisation nous donne le temps de relacirccher le

bouton pour eacuteviter de faire deacutefiler le menu sans le vouloir

Station meacuteteacuteo autonome 2012

27

B La simulation

Etant donneacute que nous ne pouvions pas prendre le mateacuteriel avec nous il eacutetait impeacuteratif de

pouvoir faire des simulations Pour cela nous avons utiliseacute un logiciel tregraves utile Proteus ISIS Ce

logiciel possegravede une tregraves grande librairie et permet de rentrer nos programmes sur le PIC virtuel

geacuteneacutereacute par le logiciel Pour simuler le capteur drsquohumiditeacute nous avons utiliseacute un potentiomegravetre Pour

celui de lrsquoaneacutemomegravetre comme pour nos mesures nous avons brancheacute virtuellement un GBF sur la

borne associeacute et observeacute son signal agrave lrsquoaide drsquoun oscilloscope

Voilagrave un aperccedilu de la simulation effectueacute sur ISIS

Veacuterification theacuteorique du vent

Vitesse du vent = 0179 37 + 0629

Vitesse du vent = 7657ms

Veacuterification theacuteorique de lrsquohumiditeacute

H= (315-081)0031

H=7548

Veacuterification theacuteorique de la

tempeacuterature

La valeur afficheacutee correspond bien

aux 27degC seacutelectionneacute sur le capteur

Station meacuteteacuteo autonome 2012

28

XI Transmission des donneacutees par liaison ZigBee

ZigBee est un protocole de haut niveau permettant la communication de petites radios agrave

consommation reacuteduite baseacutee sur le standard IEEE 802154

Cette technologie a pour but la communication de courte distance telle que le propose deacutejagrave

la technologie Bluetooth tout en eacutetant moins chegravere plus simple et avec une fiabiliteacute assez eacuteleveacutee

Dans notre projet nous nous servirons de ZigBee pour permettre une transmission par ondes

de nos donneacutees de la station meacuteteacuteo vers un ordinateur Pour cela nous avons 2 modules Xbee pro 2

platines drsquointerfaces une avec des pattes (liaison platine) et lrsquoautre avec une sortie RS232 (liaison pc)

Caracteacuteristique eacutelectrique

Les signaux Xbee ont une amplitude de 33V mais sont alimenteacutes en 5V (tension de notre

source USB) cacircbleacutes sur la bornes VIN (laquo Power input from 6-12Vdc 300mA or higher raquo) Mais

notre source nrsquoeacutetant pas assez puissante pour alimenter toute notre installation Nous utiliserons

donc une source externe de 5V qui sera utiliseacutee pour alimenter les 2 systegravemes Xbee

Description des Bornes du Xbee qui nous inteacuteresse

Station meacuteteacuteo autonome 2012

29

A Scheacutema eacutelectrique du module Xbee

Nous avons cacircbleacute la sortie TX du microcontrocircleur qui eacutemet un signal jusqursquoagrave la borne RX du

Xbee qui reacuteceptionne ce signal Apregraves la transmission se fait par onde entre les 2 modules Xbee Pour

le module qui reccediloit le signal un cacircble RS232 suffit agrave faire la liaison entre celui-ci et le PC

B Envoi des donneacutees la liaison Usart

Un USART (Universal synchronous amp Asynchronous Receiver Transmitter) est un eacutemetteur-

reacutecepteur universel En langage courant cest le composant utiliseacute pour faire la liaison entre

lordinateur et le port seacuterie Lordinateur envoie les donneacutees en parallegravele (autant de fils que de bits

de donneacutees) Il faut donc transformer ces donneacutees pour les faire passer agrave travers une liaison seacuterie qui

utilise un mecircme fil pour faire passer tous les bits de donneacutees

Constitution dune trame USART

un bit de start toujours agrave 0 servant agrave la synchronisation du reacutecepteur

les donneacutees la taille peut varier (geacuteneacuteralement entre 5 et 9 bits)

eacuteventuellement un bit de pariteacute paire ou impaire

et un bit de stop toujours agrave 1 (la dureacutee peut varier entre 1 15 et 2 temps bit)

Le niveau logique de repos est le 1

Figure 14 Trame USART

Station meacuteteacuteo autonome 2012

30

Afin de faciliter les liaisons entre peacuteripheacuteriques (PC microcontrocircleur modem hellip) des vitesses

de transmission sont normaliseacutees luniteacute baud correspondant agrave un temps bit Dans notre cas nous

choisirons une vitesse de transmission de 9600bps

C Programme drsquoenvoi des donneacutees par liaison Usart

Gracircce agrave la librairie de MikroC il est tregraves facile drsquoenvoyer des donneacutees par liaison Usart Cela

fonctionne comme pour envoyer des caractegraveres sur lrsquoeacutecran LCD Il faut juste ensuite choisir la vitesse

de transmission qui sera 9600bps Voici la fonction et un morceau du programme qui sert agrave envoyer

les caractegraveres sur Xbee et de Xbee agrave un HyperTerminal

Fonction humiditeacute

void humidite(int cond)

long H U VL Deacuteclaration des variables

char HH hum[8] humtxt[]=Humidite

helliphellip

Xbee(8 hum) Envoi la chaicircne de caractegravere hum dans la fonction xbee

Usart

void xbee(int nb char receive[20])

int i

Usart_Init(9600) Vitesse de transmission

for(i=0 ilt=nb i++) Boucle for

Usart_Write(receive[i]) Envoi les caractegraveres sur lrsquoHyperTerminal jusquagrave i

Station meacuteteacuteo autonome 2012

31

XII Estimation du coucirct du projet

On peut voir sur ce tableau que le prix de reviens pour les eacuteleacutements que nous avons utiliseacute

est de 14506euro TTC Ce qui est plutocirct oneacutereux compareacute aux stations meacuteteacuteo du marcheacute qui oscille

entre 6euro et 400euro En sachant que la nocirctre est loin drsquoecirctre finaliseacute (finition estheacutetique ergonomie et

ajout de nouvelle fonction comme la date et lrsquoheure)

Composant Quantiteacute Prix (TVA inclus) Liens Quartz 20000MHz 1 111 euro Lien

Capaciteacute 22pF 2 010 euro lien

PIC 16F876 1 427 euro lien

LCD MODULE 1 1575 euro lien

Potentiomegravetre 10KΩ 1 618 euro lien

Reacutesistance 33 Ω 1 035 euro lien

Reacutesistance 10 K Ω 2 070 euro lien

Reacutesistance 1 KΩ 3 105 euro lien

LED rouge 1 013 euro lien

DS1621 1 650 euro lien

Bouton poussoir 1 060 euro lien

Module Xbee 2 4000 euro lien

Platine dinterface (XBEE) RS232 1 1890 euro lien

Platine dinterface (XBEE) 1 1364 euro lien

Capteur drsquohumiditeacute 1 2692 euro lien

Transistor 1 561 euro lien

Diode 1 325 euro lien

Totales 1 14506 euro

Station meacuteteacuteo autonome 2012

32

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

panelsbut 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 Itrsquos also possible to measure

humidity and wind speed Then itrsquos 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 its 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 Itrsquos 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

Station meacuteteacuteo autonome 2012

33

XIV Conclusion

Ce projet sur la conception drsquoune station meacuteteacuteo autonome qui nous a eacuteteacute confieacute a eacuteteacute tregraves

enrichissant Il nous a permis de mettre en relations les connaissances acquises durant lrsquoanneacutee mais

aussi acqueacuterir de nouvelles connaissances comme le fonctionnement drsquoun microcontrocircleur En effet

nous nrsquoavions jamais programmeacute sur microcontrocircleur Il a fallu srsquoadapter et apprendre agrave utiliser des

nouveaux logiciels tels que Proteus MikroC ainsi que Labview

De cette expeacuterience nous avons aussi appris agrave ecirctre autonome Nous avons saisi que la

compreacutehension des documents techniques et des librairies eacutetait un point essentiel de notre projet

En programmation nous nrsquoavions pas le droit agrave lrsquoerreur car la moindre faute pouvait conduire le

systegraveme agrave un dysfonctionnement Ce projet nous a demandeacute beaucoup de rigueur de patience et de

temps

Toutefois nous nrsquoavons pas eu malheureusement le temps drsquoinstaller le capteur de

tempeacuterature inteacuterieure par manque de temps Plus encore nous aurions aimeacute approfondir certains

points Par exemple pouvoir installer les composants sur circuit imprimeacute et concevoir un support

viable pour en faire une vraie station meacuteteacuteo Lrsquoinstallation drsquoune girouette aurait eacuteteacute appreacuteciable

pour connaicirctre le sens du vent Aussi le programme aurait sans doute pu ecirctre encore ameacutelioreacute pour

de meilleures performances

Malgreacute ce manque de temps nous sommes tregraves satisfaits du fonctionnement de ce module

qui nous a permis de comprendre lrsquoutiliteacute des parties theacuteoriques pour lrsquoapplication et la mise en

œuvre drsquoun systegraveme Lrsquoapproche peacutedagogique de nous diriger vers les solutions sans jamais les

donner de nous laisser un grand degreacute de liberteacute et drsquoautonomie a eacuteteacute au deacutebut assez deacuteroutante

mais tregraves instructif

Enfin nous tenions agrave remercier Mme Leymarie qui nous a suivis et aiguilleacute tout au long de ce

projet

Station meacuteteacuteo autonome 2012

34

XV ANNEXES

Programme complet

Deacuteclaration 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()

deacuteclaration des variables

int cond=0Condition pour laffichage sur leacutecran LCD

int BP=0

Initialisation et affectation des ports

PORTA=0

PORTB=0 initialisation

PORTC=0

TRISB=0 Port B deacuteclarer en sortie

TRISA=0xFF Port A en entreacutee

ADCON1=0x84 Justifieacute agrave droite active RA0RA1RA3 analogique

ADCON0=0x85 Fosc32 sur PA0 en service

TRISB=0 Port B deacuteclarer en sortie

TRISC=0xFFPort C deacuteclarer en entreacutee

Configuration et initialisation de leacutecran LCD

Lcd_Config(ampPORTB 0 1 WR 5 4 3 2) Configure lecran

Lcd_Init(ampPORTB) initialisation du LCD

Lcd_Cmd(Lcd_CURSOR_OFF) Enleve le curseur

Lcd_Cmd(Lcd_CLEAR) Efface lecran

Initialisation du module I2C

I2C_Init(100000)initialisation de la communication I2C

I2C_Start()Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90)Mode de controcircle en mode eacutecriture

I2C_Wr(0xAC)Accegraves au registre de configuration

I2C_Wr(0x0A)Registre de configuration mesure en continu

I2C_Stop()Arrecirct du signal

I2C_Start()Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90)Mode de controcircle en mode eacutecriture

I2C_Wr(0xEE)Deacutebut de la conversion

I2C_Stop()Arrecirct du sigal

Station meacuteteacuteo autonome 2012

35

Configuration du mode capture

T1CON=0x31 Configuration du timer1

CCP1CON=0x05 Paramegravetrage du mode capture

PIE1TMR1IE=1 Autorise les deacutebordements du timer 1

Boucle infinie

while(1)

cond=cond+1Increacutemente la variable cond

switch(BP)

case 0

humidite(ampcond)Appel la fonction humiditeacute

if(PORTAF2==1)Ces if permet de changer la valeur de BP

BP=1

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)Temps quon relacircche bien le bouton

break

case 1

temperature(ampcond)Appel la fonction tempeacuterature

if(PORTAF2==1)

BP=2

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)

break

case 2

vent(ampcond)Appel la fonction vent

if(PORTAF2==1)

BP=0

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)

break

Fonction humiditeacute

void humidite(int cond)

long H U VLDeacuteclaration des variables

char HH hum[8] humtxt[]=Humidite

VL=Adc_read(0) Valeur lue sur RA0(humiditeacute)

U=(VL5000)1023 Convertit la valeur lue en tension x1000

H=(U-810)(0031) Convertit la tension en humiditeacute x1000

Station meacuteteacuteo autonome 2012

36

if(Hgt100000)Si H gt 100(impossible) alors = 100

H=100000

if(Hlt0)Si H lt 0(impossible) alors = 0

H=0

hum[0]=(H100000)+48Valeur des centaines affecteacute en ascii(48=0)

HH=(H10000)10

hum[1]=HH+48Valeur des dizaines affecteacute en ascii

HH=(H1000)10

hum[2]=HH+48Valeur des uniteacutes affecteacute en ascii

hum[3]=44Virgule affecteacute en ascii

HH=(H100)10

hum[4]=HH+48Valeur de la premiegravere deacutecimale affecteacute en ascii

HH=(H10)10

hum[5]=HH+48Valeur de la deuxiegraveme deacutecimale affecteacute en ascii

hum[6]=37Pourcentage affecteacute en ascii

if(cond==50)Appel la fonction LCD tous les 1000

lcd(1 1 8 humtxt)Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 7 hum)Affiche la chaine de caractegravere hum sur le LCD

cond=0Remise a 0 de la condition

Xbee(7 hum) Envoi la chaicircne de caractegravere hum dans la fonction xbee

Fonction tempeacuterature

void temperature(int cond)

char temp[7] temptxt[]=Temperature LSB

signed char MSB

I2C_Start()Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90)Mode de controcircle en mode eacutecriture

I2C_Wr(0xAA)Lecture de la tempeacuterature

I2C_Stop()Arrecirct du sigal

I2C_Start()Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x91)Mode de controcircle en mode lecture

MSB = I2C_Rd(1)Nombre signeacute donnant la tempeacuterature entre +125deg et -55degC

LSB = I2C_Rd(0)Si bit 7 = 1 tempeacuterature MSB +05degC

I2C_Stop()Arrecirct du sigal

if(MSBlt0)

MSB = abs(MSB) Si temperature neacutegative valeur absolue de MSB

Temp[0]=45 Signe - affecteacute en ascii

else

Station meacuteteacuteo autonome 2012

37

Temp[0]=43signe + affecteacute en ascii

Temp[1]=(MSB10)+48 Valeur des dizaines affecteacute en ascii

Temp[2]=(MSB10)+48 Valeur des uniteacutes affecteacute en ascii

Temp[3]=44 Virgule affecteacute en ascii

if (LSB==128) Si bit 7 agrave 1 alors +05deg

Temp[4]=5

else Si bit 7 agrave 0 alors +00deg

Temp[4]=0

Temp[5]=223 degreacute affecteacute en ascii

Temp[6]=67 C affecteacute en ascii

if(cond==50)Appel la fonction LCD tous les 1000

lcd(1 1 11 temptxt)Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 7 temp)Affiche la chaine de caractegravere hum sur le LCD

cond=0Remise a 0 de la condition

Xbee(7 temp) Envoi la chaicircne de caractegravere temp dans la fonction xbee

Fonction vent

void vent(int cond)

unsigned long tl th per

int vitfreq

char vent[13] txtvent[]=Vitesse du vent VV

if(PIR1CCP1IF==1) Test si front montant agrave lieu

TMR1H=0 Initialisation du timer1 bit de point fort

TMR1L=0 Initialisation du timer1 bit de point faible

th=CCPR1H Les valeurs sont copieacute dans des variables

tl=CCPR1L

th=thltlt8 Deacutecalage car th =gt bit de point fort

per = th|tl On concategravene les deux valeurs nous obtenons la peacuteriode

PIR1CCP1IF=0 Remise a 0 du drapeau

if(PIR1TMR1IF==1) Si deacutepassement du timer 1

per=65535+per On ajoute une retenue lorsquon a fait un tour (16bit)

PIR1TMR1IF=0 Remise a 0 du drapeau deacutepassement

Station meacuteteacuteo autonome 2012

38

freq=671310perCalacul de la freacutequence

vit=freq179 + 692Calcul de la vitesse que lon x100

if(vitlt200)En dessous 2ms la mesure est aleacuteatoire agrave cause du 2egraveme deacutebordement

vit=0

vent[0]=(vit10000)+48Valeur des centaines affecteacute en ascii(48=0)

VV=(vit1000)10

vent[1]=VV+48Valeur des dizaines affecteacute en ascii

VV=(vit100)10

vent[2]=VV+48Valeur des uniteacute affecteacute en ascii

VV=(vit10)10

vent[3]=44Virgule affecteacute en ascii

vent[4]=VV+48Valeur de la 1er deacutecimale affecteacute en ascii

VV=vit10

vent[5]=VV+48Valeur de la 2egraveme deacutecimale affecteacute en ascii

vent[6]=109m affecteacute en ascii

vent[7]=47 affecteacute en ascii

vent[8]=115s affecteacute en ascii

if(cond==50)Appel la fonction LCD tous les 1000

lcd(1 1 15 txtvent)Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 9 vent)Affiche la chaine de caractegravere hum sur le LCD

cond=0Remise a 0 de la condition

Xbee(9 vent) Envoi la chaicircne de caractegravere vent dans la fonction xbee

Fonction affichage

void lcd(int li int co int nb char receive[15])

int i

for(i=0 iltnb i++)Boucle for

Lcd_chr(li (co+i) receive[i])Affiche les caractegraveres jusquagrave i

Usart

void xbee(int nb char receive[15])

int i

Usart_Init(9600)Vitesse de transmission

for(i=0 iltnb i++)Boucle for

Usart_Write(receive[i])Envoi les caractegraveres sur lHyperTerminal jusquagrave i

Station meacuteteacuteo autonome 2012

3

V Le microcontrocircleur

A Choix du microcontrocircleur

Comme on peut voir preacuteceacutedemment que le microcontrocircleur choisi est un PIC16F876 (cf figure 1)

celui-ci nous as eacuteteacute conseilleacute par notre eacutequipe peacutedagogique Nous avons quand mecircme pris soin de

veacuterifier globalement si le nombre drsquoentreacutee et de sortie eacutetaient suffisants pour le nombre drsquoeacuteleacutements

utiliseacutes en survolant pour chacun drsquoentre eux leur datasheet

Microcontrocircleur

PIC16F876

Capteur

drsquohumiditeacute

Capteur de

tempeacuterature

exteacuterieure

Aneacutemomegravetre

Ecran LCD

Emetteur

ZigBee

Reacutecepteur

ZigBee

PC

Capteur de

tempeacuterature

inteacuterieure

Figure 1 Scheacutema du PIC16F876

Station meacuteteacuteo autonome 2012

4

B Prise en main du microcontrocircleur

Nrsquoayant jamais programmeacute sur un microcontrocircleur notre eacutequipe peacutedagogique nous a conseilleacute

de commencer par nous familiariser avec le PIC agrave lrsquoaide drsquoun mini TP Ce TP drsquoinitiation proposeacute par le

logiciel Mikroelektronika marque du logiciel utiliseacute pour programmer le PIC (MikroC) consiste agrave faire

clignoter une LED

Pour le quartz qui deacutefinit la freacutequence drsquohorloge on nous a donneacute un 20Mhz Pour choisir les

condensateurs nous avons regardeacute dans la datasheet du quartz

Au vue de cette datasheet nous avons pris des condensateurs de 22pF car ils eacutetaient agrave notre

disposition

C Scheacutema du microcontrocircleur avec la LED

Nous avons donc commenceacute par implanter les composants et agrave les cacircbler entre eux sur la platine

qursquoon nous a fourni Comme vous pouvez le voir sur la figure 2 le scheacutema de la partie laquo LED raquo eacutetabli

sur le logiciel Proteus ISIS 78 Crsquoest ce Logiciel qui nous a permis tout au long du projet de faire les

scheacutemas et les simulations

On peut voir sur le scheacutema de la figure 2 qursquoil yrsquoa un bornier brancher sur les bornes RB6 RB7

et Vpp Il repreacutesente en fait le cacircble USB qui va au PC Ce cacircble nous permet de transfeacuterer le

programme Par la suite nous ne le repreacutesenterons plus de mecircme pour chaque partie nous

repreacutesenterons que les capteurs en question Ceci pour un souci de clarteacute

Figure 2 Scheacutema avec la LED

Station meacuteteacuteo autonome 2012

5

D Programme pour le clignotement de la LED

Nous avons ensuite agrave lrsquoaide du TP et du logiciel MikroC programmeacute le microcontrocircleur 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 deacuteclarations des bornes

Voici le programme eacutetablit avec ccedila description

void main()

PORTC=0 Initialisation du port C

PORTB=0 Initialisation du port B

TRISC=0 Le port C affecteacute en sortie

TRISB=0 Le port B affecteacute en sortie

while(1)Boucle infinie

PORTCF7 = ~PORTCF7 Allumeeacuteteint la LED

Delay_ms(1000) Temporisation de 1 seconde

VI Lrsquoeacutecran LCD

Ensuite nous sommes rentreacute dans le vif du sujet nous avons installeacute programmeacute lrsquoeacutecran LCD et

essayeacute drsquoafficher des caractegraveres dessus Nous avons aussi rajouteacute un bouton poussoir en vue de

preacuteparer le terrain pour la suite du projet

A Scheacutema du microcontrocircleur avec lrsquoeacutecran LCD

Figure 3 scheacutema avec eacutecran LCD et le bouton poussoir

Station meacuteteacuteo autonome 2012

6

Pour cacircbler lrsquoeacutecran LCD nous nous sommes aideacutes de sa datasheet ainsi que lrsquoaide du logiciel

MikroC Le point qui nous semble important est la borne R(read)W(write) On peut voir qursquoelle est

connecteacutee agrave la masse En effet pour eacutecrire sur lrsquoeacutecran il faut mettre RW = 0 pour lire on le met agrave 1

B Programme pour lrsquoeacutecran LCD

Voici un petit exemple de programme qui utilise agrave la fois le bouton poussoir et qui affiche du

texte sur lrsquoeacutecran LCD void main()

int cond=0 BP=0

Initialisation et affectation des ports

PORTB=0 Initialisation du port B

PORTA=0 Initialisation du port A

TRISB=0 Le port B affecteacute en sortie

TRISA = 0xFF Port A en entreacutee

ADCON1 = 0x84 RA2 en entreacutee

Configuration et initialisation de leacutecran LCD

Lcd_Config(ampPORTB 0 1 WR 5 4 3 2) Configure leacutecran

Lcd_Init(ampPORTB) initialisation du LCD

Lcd_Cmd(Lcd_CURSOR_OFF) Enlegraveve le curseur

Lcd_Cmd(Lcd_CLEAR) Efface leacutecran

Boucle infini

while(1)

cond=cond+1

switch(BP)

case 0

if(PORTAF2==1) Ces if permet de changer la valeur de BP

BP=1

Delay_ms(250) Temps quon relacircche bien le bouton

if(cond==1000)

Lcd_Cmd(Lcd_CLEAR)

Lcd_Out(1 1 Bonjour) Affiche Bonjour ligne 1 colonne 1

break

case 1

if(PORTAF2==1)

BP=0

Delay_ms(250)

if(cond==1000)

Lcd_Cmd(Lcd_CLEAR)

Lcd_Out(1 1 Mme Leymarie )

break

Station meacuteteacuteo autonome 2012

7

Fonctionnement de ce programme

Affiche laquo bonjourhellip raquo sur lrsquoeacutecran LCD

Appuie sur le BP

Affiche laquo Mme Leymarie raquo sur lrsquoeacutecran LCD

Appuie sur le BP

Affiche laquo bonjourhellip raquo sur lrsquoeacutecran LCD

Etc

Les fonctions de lrsquoeacutecran LCD sont expliqueacutees dans lrsquoaide du logiciel MikroC La variable laquo cond raquo

est une condition pour ne pas afficher le mot agrave chaque boucle mais tous les 1000 iteacuterations ce qui

permet de ne pas faire clignoter lrsquoeacutecran ADCON1 sera expliqueacute agrave la suite de ce rapport

VII Le capteur drsquohumiditeacute

Apregraves avoir pris en main

lrsquoeacutecran LCD ainsi que le logiciel

nous avons deacutecideacute drsquoinstaller le

capteur drsquohumiditeacute On nous a mis

agrave disposition un capteur

drsquohumiditeacute de reacutefeacuterence HIH-

4000-001 Crsquoest un capteur qui

renvoie une tension analogique

(cf figure 4) Nous avons

commenceacute par chercher sa

datasheet et regarder les

proprieacuteteacutes du capteur

A Caracteacuteristiques du capteur drsquohumiditeacute

Voici les proprieacuteteacutes importantes du capteur donneacutee par la notice

Gamme dhumiditeacute 0 agrave 100 RH (Relative Humidity) avec une Preacutecision de plusmn 35 RH

Gamme de tension dalimentation 4V agrave 58V

Tempeacuterature de fonctionnement -40degC agrave +85degC (-40 degF to 185 degF)

Courant alimentation 500μA

Sortie Analogique

Figure 4 Capteur dhumiditeacute HIH 4000-001

Station meacuteteacuteo autonome 2012

8

Pour ce qui est lrsquoeacutequation de la tension

en fonction de lrsquohumiditeacute le constructeur nous

donne la courbe drsquoeacutetalonnage suivante (cf

figure 5)

De cette courbe nous en avons tireacute les

valeurs suivantes (cf figure 6)

Nous avons ensuite deacutecideacute de la retracer sur Excel et drsquoen tirer llsquoeacutequation qui sera utiliseacute dans le

programme du microcontrocircleur

On voit qursquoExcel nous donne lrsquoeacutequation suivante

U=0031H +081

Donc H= (U-081)0031

De plus nous multiplierons par 1000 la valeur de H pour pouvoir reacutecupeacuterer les chiffres

deacutecimales et les rentrer dans une chaine de caractegraveres et les afficher sur lrsquoeacutecran LCD H=

(U810)0031

La valeur maximum de H est donc de 100 000 nous la deacuteclarerons donc en long (une

deacuteclaration en int ne serais pas suffisant -32768 agrave 32767)

Figure 5 Courbes donneacutee par le constructeur

Figure 6 tableau de mesure

Figure 7 Courbe traceacute sur Excel

Station meacuteteacuteo autonome 2012

9

Nous avons remarqueacute sur la courbe ainsi qursquoen simulation que le capteur peut avoir des

valeurs supeacuterieur agrave 100 et infeacuterieur agrave 0 Il faudra donc mettre deux conditions pour ne pas

deacutepasser la plage de valeur

B Configuration du microcontrocircleur

Maintenant nous arrivons agrave point important de cette partie celle de la configuration des

ports du microcontrocircleur En effet le PIC16F876 est constitueacute drsquoun module convertisseur agrave 5 entreacutees

Ces entreacutees sont situeacutees sur les bornes RA0 RA1 RA2 RA3 et RA5 (cf figure1) Le reacutesultat de la

conversion est codeacute sur 10 bits Crsquoest une valeur comprise entre hrsquo000rsquo et hrsquo3FFrsquo

hlsquo3FFrsquo = brsquo1 1111 1111rsquo = drsquo1023rsquo

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 eacutequation

U = (Valeur lue sur le CAN 5)1023

Pour les mecircme raison que lrsquoeacutequation du capteur drsquohumiditeacute nous avons multiplieacute par

1000 la tension nous obtenons donc U= (Valeur lue sur le CAN 5000)1023

Il faut ensuite reacutegler les entreacutees analogiques avec les registres ADCON0 et ADCON1 en

sachant que nous avons deacutecideacute 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 (Freacutequence drsquooscillation)2

01= Fosc8

10= Fosc32

11= Oscillateur RC interne

Pour que la conversion soit correct il faut que T(ad) soit au minimum de 16micros nous

disposons drsquoun quartz de 20Mhz =gt 20Mhz32 =gt 16micros Nous mettrons donc le bit 7 agrave 1 et

le 6 agrave 0

Bit 5 bit4 et bit 3 CHS2 CHS1 et CHS0 = Channel Select bits

Ces 3 bits permettent de choisir lentreacutee qui va ecirctre convertie

Station meacuteteacuteo autonome 2012

10

Nous voulons convertir lrsquoentreacutee RA0 pour cela il faut mettre les bits 5 4 3 agrave 0

Bit 2 GODONE Status bit si ADON=1

1 = Deacutemarre la conversion AD Ce bit est remis agrave 0 par hard

0 = La conversion AD est termineacutee

Il nous faut deacutemarrer la conversion

Bit 1 Bit non implanteacute

Bit 0 ADON AD on bit

1= Convertisseur AD en service

0 = Convertisseur AD agrave larrecirct

Il nous faut mettre le convertisseur en service

ADCON0 = brsquo1000 0101rsquo = hrsquo85rsquo

Bit 7 ADFM = AD Result format

1 = Justifieacute agrave droite

0 = Justifieacute agrave gauche

Nous avons justifieacute agrave droite

Bit 6 bit 5 et bit 4 Bits non impleacutementeacutes

Bit 3 bit 2 bit 1 et bit 0 PCFG3 PCFG2 PCFG1 et PCFG0

Bits de controcircle de la configuration des Ports

Ces bits permettent de choisir le partage entre entreacutees analogiques et digitales sur les PORTS A et E

On a choisi drsquoactiver RA0 RA1 et RA3 en entreacutee analogique les autres resteront en

digitales ce qui signifie qursquoau vue de la datasheet il faut mettre le bit 2 agrave 1 et les autres agrave 0

ADCON1 = brsquo10000100rsquo = hrsquo84rsquo

Station meacuteteacuteo autonome 2012

11

C Le scheacutema du microcontrocircleur avec le capteur drsquohumiditeacute

Voici le scheacutema de cacircblage du capteur drsquohumiditeacute uniquement A noter que le capteur est

remplaceacute par un potentiomegravetre nrsquoeacutetant pas dans la librairie de Proteus On constate qursquoil est bien

brancheacute sur RA0

D Programme pour la mesure de lrsquohumiditeacute

Voici le programme pour mesurer lrsquohumiditeacute avec les affectations deacutecrites ci-dessus ainsi

que les eacutequations de conversions

Deacuteclaration des fonctions

void humidite(int cond)

void lcd(int li int co int nb char receive[11])

void main()

deacuteclaration des variables

int cond=0 Condition pour laffichage sur leacutecran LCD

Initialisation et affectation des ports

PORTB=0 initialisation

TRISB=0 Port B deacuteclarer en sortie

TRISA = 0xFF Port A en entreacutee

ADCON1 = 0x84 Justifieacute agrave droite active RA0RA1RA3 analogique

ADCON0 = 0x85 Fosc32 sur PA0 en service

Configuration et initialisation de leacutecran LCD

Lcd_Config(ampPORTB 0 1 WR 5 4 3 2) Configure leacutecran

Lcd_Init(ampPORTB) initialisation du LCD

Lcd_Cmd(Lcd_CURSOR_OFF) Enlegraveve le curseur

Lcd_Cmd(Lcd_CLEAR) Efface leacutecran

Figure 8 Scheacutema de cacircblage du capteur dhumiditeacute

Station meacuteteacuteo autonome 2012

12

Boucle infinie

while(1)

cond=cond+1 Increacutemente la variable cond

humidite(ampcond) Appel la fonction humiditeacute

Fonction humiditeacute

void humidite(int cond)

long H U VL Deacuteclaration des variables

char HH hum[8] humtxt[]=Humidite

VL=Adc_read(0) Valeur lue sur RA0(humiditeacute)

U=(VL5000)1023 Convertit la valeur lue en tension x1000

H=(U-810)(0031) Convertit la tension en humiditeacute x1000

if(Hgt100000) Si H gt 100(impossible) alors = 100

H=100000

if(Hlt0) Si H lt 0(impossible) alors = 0

H=0

hum[0]=(H100000)+48 Valeur des centaines affecteacute en ascii(48=0)

HH=(H10000)10

hum[1]=HH+48 Valeur des dizaines affecteacute en ascii

HH=(H1000)10

hum[2]=HH+48 Valeur des uniteacutes affecteacute en ascii

hum[3]=44Virgule affecteacute en ascii

HH=(H100)10

hum[4]=HH+48 Valeur de la premiegravere deacutecimale affecteacute en ascii

HH=(H10)10

hum[5]=HH+48 Valeur de la deuxiegraveme deacutecimale affecteacute en ascii

hum[6]=37 Pourcentage affecteacute en ascii

if(cond==1000)Appel la fonction LCD tous les 1000

lcd(1 1 10 humtxt) Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 7 hum) Affiche la chaine de caractegravere hum sur le LCD

cond=0 Remise a 0 de la condition

Fonction affichage

void lcd(int li int co int nb char receive[11])

int i

for(i=0 ilt=nb i++)Boucle for

Lcd_chr(li (co+i) receive[i]) Affiche les caractegraveres jusquagrave i

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

Station meacuteteacuteo autonome 2012

13

VIII Le capteur de tempeacuterature

A preacutesent comme toute station meacuteteacuteo

nous avons installeacute un capteur de tempeacuterature le

DS1621 Ce capteur communique avec le

microcontrocircleur gracircce au protocole I2C

A Le protocole I2C

Le bus I2C (Inter Integrated Circuit) a eacuteteacute deacuteveloppeacute au deacutebut des anneacutees 80 par Philips

semiconductors pour permettre de relier facilement agrave un microprocesseur les diffeacuterents circuits dun

teacuteleacuteviseur moderne

Le bus I2C permet de faire communiquer entre eux des composants eacutelectroniques tregraves divers

gracircce agrave seulement trois fils Un signal de donneacutee (SDA) un signal dhorloge (SCL) et un signal de

reacutefeacuterence eacutelectrique (Masse)

Ceci permet de reacutealiser des eacutequipements ayant des fonctionnaliteacutes tregraves puissantes (En

apportant toute la puissance des systegravemes micro programmeacutes) et conservant un circuit imprimeacute tregraves

simple par rapport un scheacutema classique (8bits de donneacutees 16 bits dadresse + les bits de controcircle)

Les donneacutees sont transmises en seacuterie agrave 100Kbitss en mode standard et jusquagrave 400Kbitss en

mode rapide Ce qui ouvre la porte de cette technologie agrave toutes les applications ougrave la vitesse nest

pas primordiale

Voici un exemple de protocole qursquoutilise le bus I2C

1 Pour initier le dialogue le maicirctre creacutee une condition Start

2 Le maicirctre envoie ladresse de lesclave (1010100) suivi du bit 0 (bit Write)

3 Lesclave reacutepond (accuseacute de reacuteception bit Acknowledge)

4 Le maicirctre envoie ladresse du registre (0x04) agrave eacutecrire

5 Lesclave reacutepond (accuseacute de reacuteception bit Acknowledge)

6 Le maicirctre envoie la donneacutee (0x27) agrave eacutecrire

7 Lesclave eacutecrit la donneacutee puis envoie un accuseacute de reacuteception (bit Acknowledge)

8 Le maicirctre termine le dialogue avec une condition Stop

9 Le bus I2C est maintenant libre (SCL = 1 SDA = 1 niveaux de repos)

Figure 9 scheacutema du DS1621

Station meacuteteacuteo autonome 2012

14

B Caracteacuteristique du DS1621

Comme on peut voir sur la figure 9 le capteur est composeacute de 8 bornes

SDA =gt Liaison seacuterie entreacutee sortie

SCL =gt Signal drsquohorloge

Tout =gt Signal de sortie du thermostat (inutile dans notre cas)

GND =gt Masse

VDD =gt Alimentation +5V

A0 A1 A2 =gt Entreacutee drsquoadressage (dans notre cas les 3 agrave la masse car nous nrsquoavons qursquoun

module I2C)

Les circuits connecteacutes sur un bus I2C ont des sorties de type drain ouvert (ou collecteur

ouvert) Deux reacutesistances de pull-up sont bien sucircr placeacutees entre les lignes SDA SCL et lalimentation

(VDD)Quand le bus nest pas utiliseacute SDA et SCL sont au niveau haut (niveau de repos)

1 Speacutecificiteacute des commandes

Tous dialogue du maicirctre(PIC16F876) avec un DS1621 esclave doit deacutebuter par lrsquoenvoi drsquoun

mot de controcircle

Le maicirctre envoi ensuite une commande suivi ou non de donneacutees Voici la liste des

commandes avec leur description

Les commandes AC EE et 22 ne sont pas suivies de lenvoi de donneacutees Par contre la

commande AA qui nous inteacuteresse est suivie de lrsquoenvoi par le DS1621 de 2 octets repreacutesentant la

tempeacuterature

Station meacuteteacuteo autonome 2012

15

Voici le registre de configuration(AC) qursquoil nous faut deacuteterminer

DONE 1 = conversion finie 0 = conversion en cours En mode 1 SHOT uniquement

THF Flag seuil haut du thermostat Passe agrave 1 et y reste si tempeacuterature supeacuterieure agrave TH

TLF Flag seuil bas du thermostat Passe agrave 1 et y reste si tempeacuterature infeacuterieure agrave TL

NVB 1 = meacutemoire EEPROM en eacutecriture 0 = meacutemoire EEPROM eacutecriture termineacutee

Nous nrsquoactiverons pas lrsquoeacutecriture de la meacutemoire

POL Polariteacute de Tout (pin 3) 1 = actif sera un niveau HAUT 0 = actif sera un niveau BAS

Il faut activer la polariteacute donc nous le mettons agrave 1

ONE SHOT 0 = conversion en continu 1 = conversion 1 fois

Nous le mettons en mode continu

AC = brsquo00001010rsquo = hrsquo0Arsquo

La commande AA qui permet de lire la tempeacuterature renvoie 2 octets

MSB (Most Significant Bit) Nombre signeacute donnant la tempeacuterature entre +125deg et -55degC

LSB (Least Significant Bit ) Seul le bit 7 de cet octet est significatif Si 1 tempeacuterature

MSB +05degC

Pour bien comprendre comment est codeacute un nombre signeacute un tableau avec des exemples de

valeurs eacutetait agrave notre disposition dans la notice

Station meacuteteacuteo autonome 2012

16

2 Dialogue I2C pour avoir la tempeacuterature

Voici un scheacutema qui montre le dialogue agrave effectuer entre le microcontrocircleur et le capteur

pour avoir la tempeacuterature Crsquoest gracircce agrave ce mecircme scheacutema que nous avons pu programmer le PIC

Station meacuteteacuteo autonome 2012

17

C Le scheacutema du microcontrocircleur avec le capteur de tempeacuterature

Voici le scheacutema du capteur de tempeacuterature uniquement Le capteur est brancheacute sur les

borne SCL(RC3) et SDA(RC4) du PIC Qursquoelles soient deacuteclareacutees en entreacutee ou en sortie les bornes SCL et

SDA sont fonctionnelles Il ne faut pas oublier les reacutesistances de tirages (R1 et R3) Lrsquoadressage A0 A1

A2 toutes misent agrave la masse car nous nrsquoavons qursquoun seul capteur I2C relieacute au PIC et le Tout

(thermostat) inutile car nous faisons juste un releveacute de tempeacuterature

D Programme pour la mesure de la tempeacuterature

Deacuteclaration des fonctions

void temperature(int cond)

void lcd(int li int co int nb char receive[14])

void main()

deacuteclaration des variables

int cond=0Condition pour laffichage sur leacutecran LCD

Initialisation et affectation des ports

PORTB=0 initialisation

PORTC=0

TRISB=0 Port B deacuteclarer en sortie

TRISC = 0xFF Port C en entreacutee

Configuration et initialisation de leacutecran LCD

Lcd_Config(ampPORTB 0 1 WR 5 4 3 2) Configure leacutecran

Lcd_Init(ampPORTB) initialisation du LCD

Lcd_Cmd(Lcd_CURSOR_OFF) Enlegraveve le curseur

Lcd_Cmd(Lcd_CLEAR) Efface leacutecran

Initialisation du module I2C

I2C_Init(100000) initialisation de la communication I2C

I2C_Start() Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90) Mode de controcircle en mode eacutecriture

I2C_Wr(0xAC) Accegraves au registre de configuration

I2C_Wr(0x0A) Registre de configuration mesure en continu

I2C_Stop() Arrecirct du signal

I2C_Start() Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90) Mode de controcircle en mode eacutecriture

Figure 10 Scheacutema de cacircblage avec le capteur de tempeacuterature

Station meacuteteacuteo autonome 2012

18

I2C_Wr(0xEE) Deacutebut de la conversion

I2C_Stop()Arrecirct du sigal

Boucle infinie

while(1)

cond=cond+1 Increacutemente la variable cond

temperature(ampcond) Appel la fonction humiditeacute

Fonction tempeacuterature

void temperature(int cond)

char temp[7] temptxt[]=Temperature LSB

signed char MSB

I2C_Start() Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90) Mode de controcircle en mode eacutecriture

I2C_Wr(0xAA) Lecture de la tempeacuterature

I2C_Stop() Arrecirct du signal

I2C_Start() Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x91) Mode de controcircle en mode lecture

MSB = I2C_Rd(1) Nombre signeacute donnant la tempeacuterature entre +125deg et -55degC

LSB = I2C_Rd(0) Si bit 7 = 1 tempeacuterature MSB +05degC

I2C_Stop() Arrecirct du signal

if(MSBlt0)

MSB = abs(MSB) Si tempeacuterature neacutegative valeur absolue de MSB

Temp[0]=45 Signe - affecteacute en ascii

else

Temp[0]=43 signe + affecteacute en ascii

Temp[1]=(MSB10)+48 Valeur des dizaines affecteacute en ascii

Temp[2]=(MSB10)+48 Valeur des uniteacutes affecteacute en ascii

Temp[3]=44 Virgule affecteacute en ascii

if (LSB==128) Si bit 7 agrave 1 alors +05deg

Temp[4]=5

Else Si bit 7 agrave 0 alors +00deg

Temp[4]=0

Temp[5]=223 degreacute affecteacute en ascii

Temp[6]=67 C affecteacute en ascii

if(cond==10) Appel la fonction LCD tous les 1000

lcd(1 1 13 temptxt) Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 6 temp) Affiche la chaine de caractegravere hum sur le LCD

cond=0 Remise a 0 de la condition

Fonction affichage

void lcd(int li int co int nb char receive[14])

int i

for(i=0 ilt=nb i++)Boucle for

Lcd_chr(li (co+i) receive[i]) Affiche les caractegraveres jusquagrave i

Le scheacutema preacuteceacutedent est bien respecteacute comme on peut le voir crsquoest tregraves facile agrave programmer

gracircce aux librairies I2C du logiciel MikroC

Station meacuteteacuteo autonome 2012

19

IX Lrsquoaneacutemomegravetre

A Conception

Pour lrsquoaneacutemomegravetre lrsquoeacutequipe peacutedagogique

nous a juste fourni lrsquoheacutelice du capteur donc il a fallu

concevoir toute la partie eacutelectronique Lrsquoideacutee est

drsquoinstaller une diode et un transistor photonique par

de lagrave lrsquoheacutelice et lorsqursquoelle tourne elle vient couper le

faisceau Succinctement le transistor envoit soit 1 soit

0 sur le PIC Le but est de relever la freacutequence agrave

laquelle tourne lrsquoheacutelice puis la convertir en vitesse (cf

figure 11)

La photodiode choisie est de reacutefeacuterence SD5455-3 Ce choix a eacuteteacute fait car lrsquoangle du faisceau

est de 20deg pour que le flux infrarouge soit bien concentreacute sur le phototransistor pour un

fonctionnement optimal

Comme on le voit sur le scheacutema de principe (cf figure 11) il a fallu dimensionner la

reacutesistance qui sert agrave reacuteguler le courant qui circule dans la LED avec les informations donneacutees par la

documentation technique nous avons pu la calculer

Forward voltage VF = 17V et IF = 01A

Ualim = 5V

RD = (Ualim ndash UF)IF = (5 ndash 17)01

RD = 33Ω

Pour le phototransistor nous avons choisi celui qui allait avec la diode de reacutefeacuterence SE5455-3

Cette fois la valeur de la reacutesistance nous eacutetait donneacute par le constructeur

RL=1000Ω

Lors des seacuteances nous avons implanteacute la diode et le

transistor sur le support du capteur Pour des raisons

pratiques et estheacutetiques nous avons seacutepareacute la partie

aneacutemomegravetre et la partie platine par des borniers (cf figure

12)

Figure 11 scheacutema descriptif de laneacutemomegravetre

Figure 12 Notre aneacutemomegravetre

Station meacuteteacuteo autonome 2012

20

B Mesure de la peacuteriode sur le microcontrocircleur

Le but est de relever la peacuteriode du signal envoyer par lrsquoaneacutemomegravetre pour cela le PIC est

eacutequipeacute drsquoun mode capture Le principe est de recopier agrave un moment voulu la valeur du timer 1 La

capture peut avoir lieux agrave chaque front descendant agrave chaque front montant tous les 4 ou tous les 16

fronts montants Quand la capture a eu lieu un flag est mis agrave 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 constitueacute de 2 registres de 8 bits TMR1H et TMR1L que lon peut lire ou eacutecrire Le registre TMR1

(constitueacute de TMR1H et TMR1L) sincreacutemente de h0000 jusquagrave hFFFF et repasse ensuite agrave h0000

pour continuer le comptage Quand il y a deacutebordement une interruption peut ecirctre geacuteneacutereacutee si on lrsquoa

autoriseacutee par TMR1IE =1 (bit 0 de PIE1) et le Flag TMR1IF (bit 0 de PIR1) passe agrave 1 Le controcircle du

timer 1 ce fait par le registre T1CON

Bit 7 et bit 6 bits non impleacutementeacutes

Bit 5 et bit 4 T1CKPS = Seacutelection du preacute diviseur placeacute avant le TIMER

Vu qursquoon a un quartz eacuteleveacute nous avons deacutecideacute de choisir un preacute-diviseur de 8 donc

F=Fosc(48) Pour cela mettre les bit 4 et 5 agrave 1

Bit 3 T1OSCEN Bit dautorisation de loscillateur du Timer 1

1 = oscillateur autoriseacute

0 = oscillateur stoppeacute

Oscillateur interne inutile donc bit 3 agrave 0

Bit 2 T1SYNC Bit de controcircle de la synchronisation du CLK externe

1 = Pas de synchronisation de lhorloge externe

0 = Synchronisation de lhorloge externe

Nous nous mettrons en mode synchrone

Bit1 TMR1CS Bit de seacutelection de la source horloge

1 = Mode Compteur Clk externe sur la broche PC0 ou Quartz entre PC0 et PC1

0 = Mode Timer Clk interne = Fosc4

Station meacuteteacuteo autonome 2012

21

On mettra ce bit agrave 0 car on utilise le mode Timer

Bit 0 TMR1ON Bit dautorisation du Timer 1

1 = Timer 1 en service

0 = Timer 1 stoppeacute

Il faut eacutevidemment mettre la timer 1 en service

Nous avons aussi autoriseacute le deacutebordement du timer 1 pour avoir plus de preacutecisions pour cela il faut

mettre la commande PIE1TMR1 agrave 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 parameacutetrer le registre

CCP1CON

Bit 7 et Bit 6 bits non impleacutementeacutes

Bit 5 et Bit 4 CCP1X et CCP1Y

Bits non utiliseacutes 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 agrave Bit 0 CCP1M3 agrave CCP1M0 bits de seacutelection du mode

Nous avons seacutelectionneacute le mode capture sur chaque front montant Pour cela nous avons

mis les bits 1 et 3 agrave 0 et les bits 0 et 2 agrave 1

Pour savoir si un front montant agrave eu lieu le flag CCP1F est mis agrave 1 Ce flag doit ecirctre remis agrave 0 par

lrsquoutilisateur La valeur des 16 bits des registres du Timer 1 TMR1L (bit de poids faible) et TMR1H (bit

de poids fort) sont recopieacutees dans les registres CCPR1 CCPRIH (bit de poids faible) et CCPR1L (bit de

poids fort)

Nous avons programmeacute le mode capture de faccedilon agrave afficher sur lrsquoeacutecran LCD la valeur du registre

CCPR1 crsquoest-agrave-dire la peacuteriode du signal de lrsquoaneacutemomegravetre Il ne nous reste maintenant plus qursquoagrave

eacutetalonner notre aneacutemomegravetre

Station meacuteteacuteo autonome 2012

22

C Etalonnage de lrsquoaneacutemomegravetre

Pour eacutetalonner le capteur nous avons commenceacute par savoir agrave quelle freacutequence correspond la

valeur releveacutee par le mode capture Pour cela nous avons brancheacute un GBF agrave la place du capteur et

avec un oscilloscope nous avons compareacute leurs valeurs

Nous avons ensuite traceacute agrave lrsquoaide des valeurs du tableau la courbe F(Hz) en fonction du

compteur De cette courbe nous relevons lrsquoeacutequation

F = 671310compteur^(-101)

Soit environ F = 671310compteur

Puis nous avons brancheacute notre aneacutemomegravetre sur le microcontrocircleur Cela dans le but de

relever sa peacuteriode sur lrsquoeacutecran LCD agrave lrsquoaide drsquoune soufflerie variable et du manomegravetre GDH (reacutef

121552 200-13) nous avons compareacute leurs valeurs pour connaitre lrsquoeacutetalonnage de notre capteur

Nous avons noteacute plusieurs valeurs puis traceacute diffeacuterentes courbe pour trouver les eacutequations qui nous

permettrons de calculer la vitesse dans notre programme

Station meacuteteacuteo autonome 2012

23

Voici les valeurs que nous avons releveacutees puis la courbe traceacutee sur Excel

De cette courbe nous obtenons lrsquoeacutequation

Vitesse du vent = 0179F + 0629

Nous les multiplierons par 100 pour reacutecupeacuterer les deacutecimales et les implanter dans une chaine

de caractegravere

Vitesse du vent = 179F + 629

Nous avons agrave preacutesent agrave notre disposition toutes les eacutequations neacutecessaires pour pouvoir

convertir la valeur releveacutee par le mode capture en une vitesse

D Le scheacutema du microcontrocircleur avec lrsquoaneacutemomegravetre

On voit sur le scheacutema que le capteur est bien relieacute sur la borne RC2 Nous avons aussi

repreacutesenteacute les borniers J1 et J2 A droite tous ce qui est sur le support et agrave gauche tous ce qui est sur

la platine

Figure 13 Scheacutema avec laneacutemomegravetre

Station meacuteteacuteo autonome 2012

24

E Programme pour la mesure de la vitesse du vent

Voici le programme pour mesurer la vitesse du vent avec les affectations deacutecrites ci-dessus

ainsi que les eacutequations de conversions

Deacuteclaration des fonctions

void vent(int cond)

void lcd(int li int co int nb char receive[20])

void main()

deacuteclaration des variables

int cond=0

Initialisation et affectation des ports

PORTB=0 initialisation

PORTC=0 initialisation

TRISC=0x04 Port C deacuteclarer en sortie sauf RC2 en mode capture

TRISB=0 Port B deacuteclarer en sortie

Configuration du mode capture

T1CON=0x31 Configuration du timer1

CCP1CON=0x05 Parameacutetrage du mode capture

PIE1TMR1IE=1 Autorise les deacutebordements du timer 1

Configuration et initialisation de leacutecran LCD

Lcd_Config(ampPORTB 0 1 WR 5 4 3 2) Configure leacutecran

Lcd_Init(ampPORTB) Initialisation du LCD

Lcd_Cmd(Lcd_CURSOR_OFF) Enlegraveve le curseur

Lcd_Cmd(Lcd_CLEAR) Efface leacutecran

Boucle infinie

while(1)

cond=cond+1

vent(ampcond)

Fonction vent

void vent(int cond)

unsigned long tl th per

int vitfreq

char vent[13] txtvent[]=vitesse du vent VV

if(PIR1CCP1IF==1) Test si front montant agrave lieu

TMR1H=0 Initialisation du timer1 bit de point fort

TMR1L=0 Initialisation du timer1 bit de point faible

th=CCPR1H Les valeurs sont copieacute dans des variables

tl=CCPR1L

th=thltlt8 Deacutecalage car th =gt bit de point fort

per = th|tl On concategravene les deux valeurs nous obtenons la peacuteriode

PIR1CCP1IF=0 Remise a 0 du drapeau

if(PIR1TMR1IF==1) Si deacutepassement du timer 1

per=65535+per On ajoute une retenue lorsquon a fait un tour (16bit)

PIR1TMR1IF=0 Remise a 0 du drapeau deacutepassement

freq=671310per Calcul de la freacutequence

vit=freq179 + 692 Calcul de la vitesse que lon x100

Station meacuteteacuteo autonome 2012

25

if(vitlt200) En dessous 2ms la mesure est aleacuteatoire agrave cause du 2egraveme deacutebordement

vit=0

vent[0]=(vit10000)+48 Valeur des centaines affecteacute en ascii(48=0)

VV=(vit1000)10

vent[1]=VV+48 Valeur des dizaines affecteacute en ascii

VV=(vit100)10

vent[2]=VV+48 Valeur des uniteacute affecteacute en ascii

VV=(vit10)10

vent[3]=44 Virgule affecteacute en ascii

vent[4]=VV+48 Valeur de la 1er deacutecimale affecteacute en ascii

VV=vit10

vent[5]=VV+48 Valeur de la 2egraveme deacutecimale affecteacute en ascii

vent[6]=109 m affecteacute en ascii

vent[7]=47 affecteacute en ascii

vent[8]=115 s affecteacute en ascii

if(cond==1000) Appel la fonction LCD tous les 1000

lcd(1 1 16 txtvent) Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 8 vent) Affiche la chaine de caractegravere hum sur le LCD

cond=0 Remise a 0 de la condition

Fonction affichage

void lcd(int li int co int nb char receive[20])

int i

for(i=0 ilt=nb i++) Boucle for

Lcd_chr(li (co+i) receive[i]) Affiche les caractegraveres jusquagrave i

Station meacuteteacuteo autonome 2012

26

X Simulation une station meacuteteacuteo autonome

Maintenant que tous nos capteurs sont installeacutes nous allons mettre agrave profit le bouton

poussoir installeacute dans la partie LCD Crsquoest-agrave-dire que nous allons rassembler tous les programmes

preacuteceacutedents pour nrsquoen faire qursquoun Il suffira drsquoappuyer sur le bouton poussoir pour faire deacutefiler les

diffeacuterentes valeurs comme une vraie station meacuteteacuteo

A La structure du programme

Boucle infinie

while(1)

cond=cond+1 Increacutemente la variable cond

switch(BP)

case 0

humidite(ampcond) Appel la fonction humiditeacute

if(PORTAF2==1) Ces if permet de changer la valeur de BP

BP=1

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250) Temps quon relacircche bien le bouton

break

case 1

temperature(ampcond) Appel la fonction tempeacuterature

if(PORTAF2==1)

BP=2

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)

break

case 2

vent(ampcond) Appel la fonction vent

if(PORTAF2==1)

BP=0

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)

break

Nous avons choisi drsquoutiliser un Switch nous avons donc juste rajouteacute une variable BP

Lorsqursquoil y a appui sur le bouton poussoir la variable BP srsquoincreacutemente et le programme passe agrave une

autre case et donc utilise une nouvelle fonction La temporisation nous donne le temps de relacirccher le

bouton pour eacuteviter de faire deacutefiler le menu sans le vouloir

Station meacuteteacuteo autonome 2012

27

B La simulation

Etant donneacute que nous ne pouvions pas prendre le mateacuteriel avec nous il eacutetait impeacuteratif de

pouvoir faire des simulations Pour cela nous avons utiliseacute un logiciel tregraves utile Proteus ISIS Ce

logiciel possegravede une tregraves grande librairie et permet de rentrer nos programmes sur le PIC virtuel

geacuteneacutereacute par le logiciel Pour simuler le capteur drsquohumiditeacute nous avons utiliseacute un potentiomegravetre Pour

celui de lrsquoaneacutemomegravetre comme pour nos mesures nous avons brancheacute virtuellement un GBF sur la

borne associeacute et observeacute son signal agrave lrsquoaide drsquoun oscilloscope

Voilagrave un aperccedilu de la simulation effectueacute sur ISIS

Veacuterification theacuteorique du vent

Vitesse du vent = 0179 37 + 0629

Vitesse du vent = 7657ms

Veacuterification theacuteorique de lrsquohumiditeacute

H= (315-081)0031

H=7548

Veacuterification theacuteorique de la

tempeacuterature

La valeur afficheacutee correspond bien

aux 27degC seacutelectionneacute sur le capteur

Station meacuteteacuteo autonome 2012

28

XI Transmission des donneacutees par liaison ZigBee

ZigBee est un protocole de haut niveau permettant la communication de petites radios agrave

consommation reacuteduite baseacutee sur le standard IEEE 802154

Cette technologie a pour but la communication de courte distance telle que le propose deacutejagrave

la technologie Bluetooth tout en eacutetant moins chegravere plus simple et avec une fiabiliteacute assez eacuteleveacutee

Dans notre projet nous nous servirons de ZigBee pour permettre une transmission par ondes

de nos donneacutees de la station meacuteteacuteo vers un ordinateur Pour cela nous avons 2 modules Xbee pro 2

platines drsquointerfaces une avec des pattes (liaison platine) et lrsquoautre avec une sortie RS232 (liaison pc)

Caracteacuteristique eacutelectrique

Les signaux Xbee ont une amplitude de 33V mais sont alimenteacutes en 5V (tension de notre

source USB) cacircbleacutes sur la bornes VIN (laquo Power input from 6-12Vdc 300mA or higher raquo) Mais

notre source nrsquoeacutetant pas assez puissante pour alimenter toute notre installation Nous utiliserons

donc une source externe de 5V qui sera utiliseacutee pour alimenter les 2 systegravemes Xbee

Description des Bornes du Xbee qui nous inteacuteresse

Station meacuteteacuteo autonome 2012

29

A Scheacutema eacutelectrique du module Xbee

Nous avons cacircbleacute la sortie TX du microcontrocircleur qui eacutemet un signal jusqursquoagrave la borne RX du

Xbee qui reacuteceptionne ce signal Apregraves la transmission se fait par onde entre les 2 modules Xbee Pour

le module qui reccediloit le signal un cacircble RS232 suffit agrave faire la liaison entre celui-ci et le PC

B Envoi des donneacutees la liaison Usart

Un USART (Universal synchronous amp Asynchronous Receiver Transmitter) est un eacutemetteur-

reacutecepteur universel En langage courant cest le composant utiliseacute pour faire la liaison entre

lordinateur et le port seacuterie Lordinateur envoie les donneacutees en parallegravele (autant de fils que de bits

de donneacutees) Il faut donc transformer ces donneacutees pour les faire passer agrave travers une liaison seacuterie qui

utilise un mecircme fil pour faire passer tous les bits de donneacutees

Constitution dune trame USART

un bit de start toujours agrave 0 servant agrave la synchronisation du reacutecepteur

les donneacutees la taille peut varier (geacuteneacuteralement entre 5 et 9 bits)

eacuteventuellement un bit de pariteacute paire ou impaire

et un bit de stop toujours agrave 1 (la dureacutee peut varier entre 1 15 et 2 temps bit)

Le niveau logique de repos est le 1

Figure 14 Trame USART

Station meacuteteacuteo autonome 2012

30

Afin de faciliter les liaisons entre peacuteripheacuteriques (PC microcontrocircleur modem hellip) des vitesses

de transmission sont normaliseacutees luniteacute baud correspondant agrave un temps bit Dans notre cas nous

choisirons une vitesse de transmission de 9600bps

C Programme drsquoenvoi des donneacutees par liaison Usart

Gracircce agrave la librairie de MikroC il est tregraves facile drsquoenvoyer des donneacutees par liaison Usart Cela

fonctionne comme pour envoyer des caractegraveres sur lrsquoeacutecran LCD Il faut juste ensuite choisir la vitesse

de transmission qui sera 9600bps Voici la fonction et un morceau du programme qui sert agrave envoyer

les caractegraveres sur Xbee et de Xbee agrave un HyperTerminal

Fonction humiditeacute

void humidite(int cond)

long H U VL Deacuteclaration des variables

char HH hum[8] humtxt[]=Humidite

helliphellip

Xbee(8 hum) Envoi la chaicircne de caractegravere hum dans la fonction xbee

Usart

void xbee(int nb char receive[20])

int i

Usart_Init(9600) Vitesse de transmission

for(i=0 ilt=nb i++) Boucle for

Usart_Write(receive[i]) Envoi les caractegraveres sur lrsquoHyperTerminal jusquagrave i

Station meacuteteacuteo autonome 2012

31

XII Estimation du coucirct du projet

On peut voir sur ce tableau que le prix de reviens pour les eacuteleacutements que nous avons utiliseacute

est de 14506euro TTC Ce qui est plutocirct oneacutereux compareacute aux stations meacuteteacuteo du marcheacute qui oscille

entre 6euro et 400euro En sachant que la nocirctre est loin drsquoecirctre finaliseacute (finition estheacutetique ergonomie et

ajout de nouvelle fonction comme la date et lrsquoheure)

Composant Quantiteacute Prix (TVA inclus) Liens Quartz 20000MHz 1 111 euro Lien

Capaciteacute 22pF 2 010 euro lien

PIC 16F876 1 427 euro lien

LCD MODULE 1 1575 euro lien

Potentiomegravetre 10KΩ 1 618 euro lien

Reacutesistance 33 Ω 1 035 euro lien

Reacutesistance 10 K Ω 2 070 euro lien

Reacutesistance 1 KΩ 3 105 euro lien

LED rouge 1 013 euro lien

DS1621 1 650 euro lien

Bouton poussoir 1 060 euro lien

Module Xbee 2 4000 euro lien

Platine dinterface (XBEE) RS232 1 1890 euro lien

Platine dinterface (XBEE) 1 1364 euro lien

Capteur drsquohumiditeacute 1 2692 euro lien

Transistor 1 561 euro lien

Diode 1 325 euro lien

Totales 1 14506 euro

Station meacuteteacuteo autonome 2012

32

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

panelsbut 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 Itrsquos also possible to measure

humidity and wind speed Then itrsquos 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 its 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 Itrsquos 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

Station meacuteteacuteo autonome 2012

33

XIV Conclusion

Ce projet sur la conception drsquoune station meacuteteacuteo autonome qui nous a eacuteteacute confieacute a eacuteteacute tregraves

enrichissant Il nous a permis de mettre en relations les connaissances acquises durant lrsquoanneacutee mais

aussi acqueacuterir de nouvelles connaissances comme le fonctionnement drsquoun microcontrocircleur En effet

nous nrsquoavions jamais programmeacute sur microcontrocircleur Il a fallu srsquoadapter et apprendre agrave utiliser des

nouveaux logiciels tels que Proteus MikroC ainsi que Labview

De cette expeacuterience nous avons aussi appris agrave ecirctre autonome Nous avons saisi que la

compreacutehension des documents techniques et des librairies eacutetait un point essentiel de notre projet

En programmation nous nrsquoavions pas le droit agrave lrsquoerreur car la moindre faute pouvait conduire le

systegraveme agrave un dysfonctionnement Ce projet nous a demandeacute beaucoup de rigueur de patience et de

temps

Toutefois nous nrsquoavons pas eu malheureusement le temps drsquoinstaller le capteur de

tempeacuterature inteacuterieure par manque de temps Plus encore nous aurions aimeacute approfondir certains

points Par exemple pouvoir installer les composants sur circuit imprimeacute et concevoir un support

viable pour en faire une vraie station meacuteteacuteo Lrsquoinstallation drsquoune girouette aurait eacuteteacute appreacuteciable

pour connaicirctre le sens du vent Aussi le programme aurait sans doute pu ecirctre encore ameacutelioreacute pour

de meilleures performances

Malgreacute ce manque de temps nous sommes tregraves satisfaits du fonctionnement de ce module

qui nous a permis de comprendre lrsquoutiliteacute des parties theacuteoriques pour lrsquoapplication et la mise en

œuvre drsquoun systegraveme Lrsquoapproche peacutedagogique de nous diriger vers les solutions sans jamais les

donner de nous laisser un grand degreacute de liberteacute et drsquoautonomie a eacuteteacute au deacutebut assez deacuteroutante

mais tregraves instructif

Enfin nous tenions agrave remercier Mme Leymarie qui nous a suivis et aiguilleacute tout au long de ce

projet

Station meacuteteacuteo autonome 2012

34

XV ANNEXES

Programme complet

Deacuteclaration 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()

deacuteclaration des variables

int cond=0Condition pour laffichage sur leacutecran LCD

int BP=0

Initialisation et affectation des ports

PORTA=0

PORTB=0 initialisation

PORTC=0

TRISB=0 Port B deacuteclarer en sortie

TRISA=0xFF Port A en entreacutee

ADCON1=0x84 Justifieacute agrave droite active RA0RA1RA3 analogique

ADCON0=0x85 Fosc32 sur PA0 en service

TRISB=0 Port B deacuteclarer en sortie

TRISC=0xFFPort C deacuteclarer en entreacutee

Configuration et initialisation de leacutecran LCD

Lcd_Config(ampPORTB 0 1 WR 5 4 3 2) Configure lecran

Lcd_Init(ampPORTB) initialisation du LCD

Lcd_Cmd(Lcd_CURSOR_OFF) Enleve le curseur

Lcd_Cmd(Lcd_CLEAR) Efface lecran

Initialisation du module I2C

I2C_Init(100000)initialisation de la communication I2C

I2C_Start()Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90)Mode de controcircle en mode eacutecriture

I2C_Wr(0xAC)Accegraves au registre de configuration

I2C_Wr(0x0A)Registre de configuration mesure en continu

I2C_Stop()Arrecirct du signal

I2C_Start()Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90)Mode de controcircle en mode eacutecriture

I2C_Wr(0xEE)Deacutebut de la conversion

I2C_Stop()Arrecirct du sigal

Station meacuteteacuteo autonome 2012

35

Configuration du mode capture

T1CON=0x31 Configuration du timer1

CCP1CON=0x05 Paramegravetrage du mode capture

PIE1TMR1IE=1 Autorise les deacutebordements du timer 1

Boucle infinie

while(1)

cond=cond+1Increacutemente la variable cond

switch(BP)

case 0

humidite(ampcond)Appel la fonction humiditeacute

if(PORTAF2==1)Ces if permet de changer la valeur de BP

BP=1

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)Temps quon relacircche bien le bouton

break

case 1

temperature(ampcond)Appel la fonction tempeacuterature

if(PORTAF2==1)

BP=2

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)

break

case 2

vent(ampcond)Appel la fonction vent

if(PORTAF2==1)

BP=0

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)

break

Fonction humiditeacute

void humidite(int cond)

long H U VLDeacuteclaration des variables

char HH hum[8] humtxt[]=Humidite

VL=Adc_read(0) Valeur lue sur RA0(humiditeacute)

U=(VL5000)1023 Convertit la valeur lue en tension x1000

H=(U-810)(0031) Convertit la tension en humiditeacute x1000

Station meacuteteacuteo autonome 2012

36

if(Hgt100000)Si H gt 100(impossible) alors = 100

H=100000

if(Hlt0)Si H lt 0(impossible) alors = 0

H=0

hum[0]=(H100000)+48Valeur des centaines affecteacute en ascii(48=0)

HH=(H10000)10

hum[1]=HH+48Valeur des dizaines affecteacute en ascii

HH=(H1000)10

hum[2]=HH+48Valeur des uniteacutes affecteacute en ascii

hum[3]=44Virgule affecteacute en ascii

HH=(H100)10

hum[4]=HH+48Valeur de la premiegravere deacutecimale affecteacute en ascii

HH=(H10)10

hum[5]=HH+48Valeur de la deuxiegraveme deacutecimale affecteacute en ascii

hum[6]=37Pourcentage affecteacute en ascii

if(cond==50)Appel la fonction LCD tous les 1000

lcd(1 1 8 humtxt)Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 7 hum)Affiche la chaine de caractegravere hum sur le LCD

cond=0Remise a 0 de la condition

Xbee(7 hum) Envoi la chaicircne de caractegravere hum dans la fonction xbee

Fonction tempeacuterature

void temperature(int cond)

char temp[7] temptxt[]=Temperature LSB

signed char MSB

I2C_Start()Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90)Mode de controcircle en mode eacutecriture

I2C_Wr(0xAA)Lecture de la tempeacuterature

I2C_Stop()Arrecirct du sigal

I2C_Start()Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x91)Mode de controcircle en mode lecture

MSB = I2C_Rd(1)Nombre signeacute donnant la tempeacuterature entre +125deg et -55degC

LSB = I2C_Rd(0)Si bit 7 = 1 tempeacuterature MSB +05degC

I2C_Stop()Arrecirct du sigal

if(MSBlt0)

MSB = abs(MSB) Si temperature neacutegative valeur absolue de MSB

Temp[0]=45 Signe - affecteacute en ascii

else

Station meacuteteacuteo autonome 2012

37

Temp[0]=43signe + affecteacute en ascii

Temp[1]=(MSB10)+48 Valeur des dizaines affecteacute en ascii

Temp[2]=(MSB10)+48 Valeur des uniteacutes affecteacute en ascii

Temp[3]=44 Virgule affecteacute en ascii

if (LSB==128) Si bit 7 agrave 1 alors +05deg

Temp[4]=5

else Si bit 7 agrave 0 alors +00deg

Temp[4]=0

Temp[5]=223 degreacute affecteacute en ascii

Temp[6]=67 C affecteacute en ascii

if(cond==50)Appel la fonction LCD tous les 1000

lcd(1 1 11 temptxt)Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 7 temp)Affiche la chaine de caractegravere hum sur le LCD

cond=0Remise a 0 de la condition

Xbee(7 temp) Envoi la chaicircne de caractegravere temp dans la fonction xbee

Fonction vent

void vent(int cond)

unsigned long tl th per

int vitfreq

char vent[13] txtvent[]=Vitesse du vent VV

if(PIR1CCP1IF==1) Test si front montant agrave lieu

TMR1H=0 Initialisation du timer1 bit de point fort

TMR1L=0 Initialisation du timer1 bit de point faible

th=CCPR1H Les valeurs sont copieacute dans des variables

tl=CCPR1L

th=thltlt8 Deacutecalage car th =gt bit de point fort

per = th|tl On concategravene les deux valeurs nous obtenons la peacuteriode

PIR1CCP1IF=0 Remise a 0 du drapeau

if(PIR1TMR1IF==1) Si deacutepassement du timer 1

per=65535+per On ajoute une retenue lorsquon a fait un tour (16bit)

PIR1TMR1IF=0 Remise a 0 du drapeau deacutepassement

Station meacuteteacuteo autonome 2012

38

freq=671310perCalacul de la freacutequence

vit=freq179 + 692Calcul de la vitesse que lon x100

if(vitlt200)En dessous 2ms la mesure est aleacuteatoire agrave cause du 2egraveme deacutebordement

vit=0

vent[0]=(vit10000)+48Valeur des centaines affecteacute en ascii(48=0)

VV=(vit1000)10

vent[1]=VV+48Valeur des dizaines affecteacute en ascii

VV=(vit100)10

vent[2]=VV+48Valeur des uniteacute affecteacute en ascii

VV=(vit10)10

vent[3]=44Virgule affecteacute en ascii

vent[4]=VV+48Valeur de la 1er deacutecimale affecteacute en ascii

VV=vit10

vent[5]=VV+48Valeur de la 2egraveme deacutecimale affecteacute en ascii

vent[6]=109m affecteacute en ascii

vent[7]=47 affecteacute en ascii

vent[8]=115s affecteacute en ascii

if(cond==50)Appel la fonction LCD tous les 1000

lcd(1 1 15 txtvent)Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 9 vent)Affiche la chaine de caractegravere hum sur le LCD

cond=0Remise a 0 de la condition

Xbee(9 vent) Envoi la chaicircne de caractegravere vent dans la fonction xbee

Fonction affichage

void lcd(int li int co int nb char receive[15])

int i

for(i=0 iltnb i++)Boucle for

Lcd_chr(li (co+i) receive[i])Affiche les caractegraveres jusquagrave i

Usart

void xbee(int nb char receive[15])

int i

Usart_Init(9600)Vitesse de transmission

for(i=0 iltnb i++)Boucle for

Usart_Write(receive[i])Envoi les caractegraveres sur lHyperTerminal jusquagrave i

Station meacuteteacuteo autonome 2012

4

B Prise en main du microcontrocircleur

Nrsquoayant jamais programmeacute sur un microcontrocircleur notre eacutequipe peacutedagogique nous a conseilleacute

de commencer par nous familiariser avec le PIC agrave lrsquoaide drsquoun mini TP Ce TP drsquoinitiation proposeacute par le

logiciel Mikroelektronika marque du logiciel utiliseacute pour programmer le PIC (MikroC) consiste agrave faire

clignoter une LED

Pour le quartz qui deacutefinit la freacutequence drsquohorloge on nous a donneacute un 20Mhz Pour choisir les

condensateurs nous avons regardeacute dans la datasheet du quartz

Au vue de cette datasheet nous avons pris des condensateurs de 22pF car ils eacutetaient agrave notre

disposition

C Scheacutema du microcontrocircleur avec la LED

Nous avons donc commenceacute par implanter les composants et agrave les cacircbler entre eux sur la platine

qursquoon nous a fourni Comme vous pouvez le voir sur la figure 2 le scheacutema de la partie laquo LED raquo eacutetabli

sur le logiciel Proteus ISIS 78 Crsquoest ce Logiciel qui nous a permis tout au long du projet de faire les

scheacutemas et les simulations

On peut voir sur le scheacutema de la figure 2 qursquoil yrsquoa un bornier brancher sur les bornes RB6 RB7

et Vpp Il repreacutesente en fait le cacircble USB qui va au PC Ce cacircble nous permet de transfeacuterer le

programme Par la suite nous ne le repreacutesenterons plus de mecircme pour chaque partie nous

repreacutesenterons que les capteurs en question Ceci pour un souci de clarteacute

Figure 2 Scheacutema avec la LED

Station meacuteteacuteo autonome 2012

5

D Programme pour le clignotement de la LED

Nous avons ensuite agrave lrsquoaide du TP et du logiciel MikroC programmeacute le microcontrocircleur 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 deacuteclarations des bornes

Voici le programme eacutetablit avec ccedila description

void main()

PORTC=0 Initialisation du port C

PORTB=0 Initialisation du port B

TRISC=0 Le port C affecteacute en sortie

TRISB=0 Le port B affecteacute en sortie

while(1)Boucle infinie

PORTCF7 = ~PORTCF7 Allumeeacuteteint la LED

Delay_ms(1000) Temporisation de 1 seconde

VI Lrsquoeacutecran LCD

Ensuite nous sommes rentreacute dans le vif du sujet nous avons installeacute programmeacute lrsquoeacutecran LCD et

essayeacute drsquoafficher des caractegraveres dessus Nous avons aussi rajouteacute un bouton poussoir en vue de

preacuteparer le terrain pour la suite du projet

A Scheacutema du microcontrocircleur avec lrsquoeacutecran LCD

Figure 3 scheacutema avec eacutecran LCD et le bouton poussoir

Station meacuteteacuteo autonome 2012

6

Pour cacircbler lrsquoeacutecran LCD nous nous sommes aideacutes de sa datasheet ainsi que lrsquoaide du logiciel

MikroC Le point qui nous semble important est la borne R(read)W(write) On peut voir qursquoelle est

connecteacutee agrave la masse En effet pour eacutecrire sur lrsquoeacutecran il faut mettre RW = 0 pour lire on le met agrave 1

B Programme pour lrsquoeacutecran LCD

Voici un petit exemple de programme qui utilise agrave la fois le bouton poussoir et qui affiche du

texte sur lrsquoeacutecran LCD void main()

int cond=0 BP=0

Initialisation et affectation des ports

PORTB=0 Initialisation du port B

PORTA=0 Initialisation du port A

TRISB=0 Le port B affecteacute en sortie

TRISA = 0xFF Port A en entreacutee

ADCON1 = 0x84 RA2 en entreacutee

Configuration et initialisation de leacutecran LCD

Lcd_Config(ampPORTB 0 1 WR 5 4 3 2) Configure leacutecran

Lcd_Init(ampPORTB) initialisation du LCD

Lcd_Cmd(Lcd_CURSOR_OFF) Enlegraveve le curseur

Lcd_Cmd(Lcd_CLEAR) Efface leacutecran

Boucle infini

while(1)

cond=cond+1

switch(BP)

case 0

if(PORTAF2==1) Ces if permet de changer la valeur de BP

BP=1

Delay_ms(250) Temps quon relacircche bien le bouton

if(cond==1000)

Lcd_Cmd(Lcd_CLEAR)

Lcd_Out(1 1 Bonjour) Affiche Bonjour ligne 1 colonne 1

break

case 1

if(PORTAF2==1)

BP=0

Delay_ms(250)

if(cond==1000)

Lcd_Cmd(Lcd_CLEAR)

Lcd_Out(1 1 Mme Leymarie )

break

Station meacuteteacuteo autonome 2012

7

Fonctionnement de ce programme

Affiche laquo bonjourhellip raquo sur lrsquoeacutecran LCD

Appuie sur le BP

Affiche laquo Mme Leymarie raquo sur lrsquoeacutecran LCD

Appuie sur le BP

Affiche laquo bonjourhellip raquo sur lrsquoeacutecran LCD

Etc

Les fonctions de lrsquoeacutecran LCD sont expliqueacutees dans lrsquoaide du logiciel MikroC La variable laquo cond raquo

est une condition pour ne pas afficher le mot agrave chaque boucle mais tous les 1000 iteacuterations ce qui

permet de ne pas faire clignoter lrsquoeacutecran ADCON1 sera expliqueacute agrave la suite de ce rapport

VII Le capteur drsquohumiditeacute

Apregraves avoir pris en main

lrsquoeacutecran LCD ainsi que le logiciel

nous avons deacutecideacute drsquoinstaller le

capteur drsquohumiditeacute On nous a mis

agrave disposition un capteur

drsquohumiditeacute de reacutefeacuterence HIH-

4000-001 Crsquoest un capteur qui

renvoie une tension analogique

(cf figure 4) Nous avons

commenceacute par chercher sa

datasheet et regarder les

proprieacuteteacutes du capteur

A Caracteacuteristiques du capteur drsquohumiditeacute

Voici les proprieacuteteacutes importantes du capteur donneacutee par la notice

Gamme dhumiditeacute 0 agrave 100 RH (Relative Humidity) avec une Preacutecision de plusmn 35 RH

Gamme de tension dalimentation 4V agrave 58V

Tempeacuterature de fonctionnement -40degC agrave +85degC (-40 degF to 185 degF)

Courant alimentation 500μA

Sortie Analogique

Figure 4 Capteur dhumiditeacute HIH 4000-001

Station meacuteteacuteo autonome 2012

8

Pour ce qui est lrsquoeacutequation de la tension

en fonction de lrsquohumiditeacute le constructeur nous

donne la courbe drsquoeacutetalonnage suivante (cf

figure 5)

De cette courbe nous en avons tireacute les

valeurs suivantes (cf figure 6)

Nous avons ensuite deacutecideacute de la retracer sur Excel et drsquoen tirer llsquoeacutequation qui sera utiliseacute dans le

programme du microcontrocircleur

On voit qursquoExcel nous donne lrsquoeacutequation suivante

U=0031H +081

Donc H= (U-081)0031

De plus nous multiplierons par 1000 la valeur de H pour pouvoir reacutecupeacuterer les chiffres

deacutecimales et les rentrer dans une chaine de caractegraveres et les afficher sur lrsquoeacutecran LCD H=

(U810)0031

La valeur maximum de H est donc de 100 000 nous la deacuteclarerons donc en long (une

deacuteclaration en int ne serais pas suffisant -32768 agrave 32767)

Figure 5 Courbes donneacutee par le constructeur

Figure 6 tableau de mesure

Figure 7 Courbe traceacute sur Excel

Station meacuteteacuteo autonome 2012

9

Nous avons remarqueacute sur la courbe ainsi qursquoen simulation que le capteur peut avoir des

valeurs supeacuterieur agrave 100 et infeacuterieur agrave 0 Il faudra donc mettre deux conditions pour ne pas

deacutepasser la plage de valeur

B Configuration du microcontrocircleur

Maintenant nous arrivons agrave point important de cette partie celle de la configuration des

ports du microcontrocircleur En effet le PIC16F876 est constitueacute drsquoun module convertisseur agrave 5 entreacutees

Ces entreacutees sont situeacutees sur les bornes RA0 RA1 RA2 RA3 et RA5 (cf figure1) Le reacutesultat de la

conversion est codeacute sur 10 bits Crsquoest une valeur comprise entre hrsquo000rsquo et hrsquo3FFrsquo

hlsquo3FFrsquo = brsquo1 1111 1111rsquo = drsquo1023rsquo

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 eacutequation

U = (Valeur lue sur le CAN 5)1023

Pour les mecircme raison que lrsquoeacutequation du capteur drsquohumiditeacute nous avons multiplieacute par

1000 la tension nous obtenons donc U= (Valeur lue sur le CAN 5000)1023

Il faut ensuite reacutegler les entreacutees analogiques avec les registres ADCON0 et ADCON1 en

sachant que nous avons deacutecideacute 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 (Freacutequence drsquooscillation)2

01= Fosc8

10= Fosc32

11= Oscillateur RC interne

Pour que la conversion soit correct il faut que T(ad) soit au minimum de 16micros nous

disposons drsquoun quartz de 20Mhz =gt 20Mhz32 =gt 16micros Nous mettrons donc le bit 7 agrave 1 et

le 6 agrave 0

Bit 5 bit4 et bit 3 CHS2 CHS1 et CHS0 = Channel Select bits

Ces 3 bits permettent de choisir lentreacutee qui va ecirctre convertie

Station meacuteteacuteo autonome 2012

10

Nous voulons convertir lrsquoentreacutee RA0 pour cela il faut mettre les bits 5 4 3 agrave 0

Bit 2 GODONE Status bit si ADON=1

1 = Deacutemarre la conversion AD Ce bit est remis agrave 0 par hard

0 = La conversion AD est termineacutee

Il nous faut deacutemarrer la conversion

Bit 1 Bit non implanteacute

Bit 0 ADON AD on bit

1= Convertisseur AD en service

0 = Convertisseur AD agrave larrecirct

Il nous faut mettre le convertisseur en service

ADCON0 = brsquo1000 0101rsquo = hrsquo85rsquo

Bit 7 ADFM = AD Result format

1 = Justifieacute agrave droite

0 = Justifieacute agrave gauche

Nous avons justifieacute agrave droite

Bit 6 bit 5 et bit 4 Bits non impleacutementeacutes

Bit 3 bit 2 bit 1 et bit 0 PCFG3 PCFG2 PCFG1 et PCFG0

Bits de controcircle de la configuration des Ports

Ces bits permettent de choisir le partage entre entreacutees analogiques et digitales sur les PORTS A et E

On a choisi drsquoactiver RA0 RA1 et RA3 en entreacutee analogique les autres resteront en

digitales ce qui signifie qursquoau vue de la datasheet il faut mettre le bit 2 agrave 1 et les autres agrave 0

ADCON1 = brsquo10000100rsquo = hrsquo84rsquo

Station meacuteteacuteo autonome 2012

11

C Le scheacutema du microcontrocircleur avec le capteur drsquohumiditeacute

Voici le scheacutema de cacircblage du capteur drsquohumiditeacute uniquement A noter que le capteur est

remplaceacute par un potentiomegravetre nrsquoeacutetant pas dans la librairie de Proteus On constate qursquoil est bien

brancheacute sur RA0

D Programme pour la mesure de lrsquohumiditeacute

Voici le programme pour mesurer lrsquohumiditeacute avec les affectations deacutecrites ci-dessus ainsi

que les eacutequations de conversions

Deacuteclaration des fonctions

void humidite(int cond)

void lcd(int li int co int nb char receive[11])

void main()

deacuteclaration des variables

int cond=0 Condition pour laffichage sur leacutecran LCD

Initialisation et affectation des ports

PORTB=0 initialisation

TRISB=0 Port B deacuteclarer en sortie

TRISA = 0xFF Port A en entreacutee

ADCON1 = 0x84 Justifieacute agrave droite active RA0RA1RA3 analogique

ADCON0 = 0x85 Fosc32 sur PA0 en service

Configuration et initialisation de leacutecran LCD

Lcd_Config(ampPORTB 0 1 WR 5 4 3 2) Configure leacutecran

Lcd_Init(ampPORTB) initialisation du LCD

Lcd_Cmd(Lcd_CURSOR_OFF) Enlegraveve le curseur

Lcd_Cmd(Lcd_CLEAR) Efface leacutecran

Figure 8 Scheacutema de cacircblage du capteur dhumiditeacute

Station meacuteteacuteo autonome 2012

12

Boucle infinie

while(1)

cond=cond+1 Increacutemente la variable cond

humidite(ampcond) Appel la fonction humiditeacute

Fonction humiditeacute

void humidite(int cond)

long H U VL Deacuteclaration des variables

char HH hum[8] humtxt[]=Humidite

VL=Adc_read(0) Valeur lue sur RA0(humiditeacute)

U=(VL5000)1023 Convertit la valeur lue en tension x1000

H=(U-810)(0031) Convertit la tension en humiditeacute x1000

if(Hgt100000) Si H gt 100(impossible) alors = 100

H=100000

if(Hlt0) Si H lt 0(impossible) alors = 0

H=0

hum[0]=(H100000)+48 Valeur des centaines affecteacute en ascii(48=0)

HH=(H10000)10

hum[1]=HH+48 Valeur des dizaines affecteacute en ascii

HH=(H1000)10

hum[2]=HH+48 Valeur des uniteacutes affecteacute en ascii

hum[3]=44Virgule affecteacute en ascii

HH=(H100)10

hum[4]=HH+48 Valeur de la premiegravere deacutecimale affecteacute en ascii

HH=(H10)10

hum[5]=HH+48 Valeur de la deuxiegraveme deacutecimale affecteacute en ascii

hum[6]=37 Pourcentage affecteacute en ascii

if(cond==1000)Appel la fonction LCD tous les 1000

lcd(1 1 10 humtxt) Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 7 hum) Affiche la chaine de caractegravere hum sur le LCD

cond=0 Remise a 0 de la condition

Fonction affichage

void lcd(int li int co int nb char receive[11])

int i

for(i=0 ilt=nb i++)Boucle for

Lcd_chr(li (co+i) receive[i]) Affiche les caractegraveres jusquagrave i

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

Station meacuteteacuteo autonome 2012

13

VIII Le capteur de tempeacuterature

A preacutesent comme toute station meacuteteacuteo

nous avons installeacute un capteur de tempeacuterature le

DS1621 Ce capteur communique avec le

microcontrocircleur gracircce au protocole I2C

A Le protocole I2C

Le bus I2C (Inter Integrated Circuit) a eacuteteacute deacuteveloppeacute au deacutebut des anneacutees 80 par Philips

semiconductors pour permettre de relier facilement agrave un microprocesseur les diffeacuterents circuits dun

teacuteleacuteviseur moderne

Le bus I2C permet de faire communiquer entre eux des composants eacutelectroniques tregraves divers

gracircce agrave seulement trois fils Un signal de donneacutee (SDA) un signal dhorloge (SCL) et un signal de

reacutefeacuterence eacutelectrique (Masse)

Ceci permet de reacutealiser des eacutequipements ayant des fonctionnaliteacutes tregraves puissantes (En

apportant toute la puissance des systegravemes micro programmeacutes) et conservant un circuit imprimeacute tregraves

simple par rapport un scheacutema classique (8bits de donneacutees 16 bits dadresse + les bits de controcircle)

Les donneacutees sont transmises en seacuterie agrave 100Kbitss en mode standard et jusquagrave 400Kbitss en

mode rapide Ce qui ouvre la porte de cette technologie agrave toutes les applications ougrave la vitesse nest

pas primordiale

Voici un exemple de protocole qursquoutilise le bus I2C

1 Pour initier le dialogue le maicirctre creacutee une condition Start

2 Le maicirctre envoie ladresse de lesclave (1010100) suivi du bit 0 (bit Write)

3 Lesclave reacutepond (accuseacute de reacuteception bit Acknowledge)

4 Le maicirctre envoie ladresse du registre (0x04) agrave eacutecrire

5 Lesclave reacutepond (accuseacute de reacuteception bit Acknowledge)

6 Le maicirctre envoie la donneacutee (0x27) agrave eacutecrire

7 Lesclave eacutecrit la donneacutee puis envoie un accuseacute de reacuteception (bit Acknowledge)

8 Le maicirctre termine le dialogue avec une condition Stop

9 Le bus I2C est maintenant libre (SCL = 1 SDA = 1 niveaux de repos)

Figure 9 scheacutema du DS1621

Station meacuteteacuteo autonome 2012

14

B Caracteacuteristique du DS1621

Comme on peut voir sur la figure 9 le capteur est composeacute de 8 bornes

SDA =gt Liaison seacuterie entreacutee sortie

SCL =gt Signal drsquohorloge

Tout =gt Signal de sortie du thermostat (inutile dans notre cas)

GND =gt Masse

VDD =gt Alimentation +5V

A0 A1 A2 =gt Entreacutee drsquoadressage (dans notre cas les 3 agrave la masse car nous nrsquoavons qursquoun

module I2C)

Les circuits connecteacutes sur un bus I2C ont des sorties de type drain ouvert (ou collecteur

ouvert) Deux reacutesistances de pull-up sont bien sucircr placeacutees entre les lignes SDA SCL et lalimentation

(VDD)Quand le bus nest pas utiliseacute SDA et SCL sont au niveau haut (niveau de repos)

1 Speacutecificiteacute des commandes

Tous dialogue du maicirctre(PIC16F876) avec un DS1621 esclave doit deacutebuter par lrsquoenvoi drsquoun

mot de controcircle

Le maicirctre envoi ensuite une commande suivi ou non de donneacutees Voici la liste des

commandes avec leur description

Les commandes AC EE et 22 ne sont pas suivies de lenvoi de donneacutees Par contre la

commande AA qui nous inteacuteresse est suivie de lrsquoenvoi par le DS1621 de 2 octets repreacutesentant la

tempeacuterature

Station meacuteteacuteo autonome 2012

15

Voici le registre de configuration(AC) qursquoil nous faut deacuteterminer

DONE 1 = conversion finie 0 = conversion en cours En mode 1 SHOT uniquement

THF Flag seuil haut du thermostat Passe agrave 1 et y reste si tempeacuterature supeacuterieure agrave TH

TLF Flag seuil bas du thermostat Passe agrave 1 et y reste si tempeacuterature infeacuterieure agrave TL

NVB 1 = meacutemoire EEPROM en eacutecriture 0 = meacutemoire EEPROM eacutecriture termineacutee

Nous nrsquoactiverons pas lrsquoeacutecriture de la meacutemoire

POL Polariteacute de Tout (pin 3) 1 = actif sera un niveau HAUT 0 = actif sera un niveau BAS

Il faut activer la polariteacute donc nous le mettons agrave 1

ONE SHOT 0 = conversion en continu 1 = conversion 1 fois

Nous le mettons en mode continu

AC = brsquo00001010rsquo = hrsquo0Arsquo

La commande AA qui permet de lire la tempeacuterature renvoie 2 octets

MSB (Most Significant Bit) Nombre signeacute donnant la tempeacuterature entre +125deg et -55degC

LSB (Least Significant Bit ) Seul le bit 7 de cet octet est significatif Si 1 tempeacuterature

MSB +05degC

Pour bien comprendre comment est codeacute un nombre signeacute un tableau avec des exemples de

valeurs eacutetait agrave notre disposition dans la notice

Station meacuteteacuteo autonome 2012

16

2 Dialogue I2C pour avoir la tempeacuterature

Voici un scheacutema qui montre le dialogue agrave effectuer entre le microcontrocircleur et le capteur

pour avoir la tempeacuterature Crsquoest gracircce agrave ce mecircme scheacutema que nous avons pu programmer le PIC

Station meacuteteacuteo autonome 2012

17

C Le scheacutema du microcontrocircleur avec le capteur de tempeacuterature

Voici le scheacutema du capteur de tempeacuterature uniquement Le capteur est brancheacute sur les

borne SCL(RC3) et SDA(RC4) du PIC Qursquoelles soient deacuteclareacutees en entreacutee ou en sortie les bornes SCL et

SDA sont fonctionnelles Il ne faut pas oublier les reacutesistances de tirages (R1 et R3) Lrsquoadressage A0 A1

A2 toutes misent agrave la masse car nous nrsquoavons qursquoun seul capteur I2C relieacute au PIC et le Tout

(thermostat) inutile car nous faisons juste un releveacute de tempeacuterature

D Programme pour la mesure de la tempeacuterature

Deacuteclaration des fonctions

void temperature(int cond)

void lcd(int li int co int nb char receive[14])

void main()

deacuteclaration des variables

int cond=0Condition pour laffichage sur leacutecran LCD

Initialisation et affectation des ports

PORTB=0 initialisation

PORTC=0

TRISB=0 Port B deacuteclarer en sortie

TRISC = 0xFF Port C en entreacutee

Configuration et initialisation de leacutecran LCD

Lcd_Config(ampPORTB 0 1 WR 5 4 3 2) Configure leacutecran

Lcd_Init(ampPORTB) initialisation du LCD

Lcd_Cmd(Lcd_CURSOR_OFF) Enlegraveve le curseur

Lcd_Cmd(Lcd_CLEAR) Efface leacutecran

Initialisation du module I2C

I2C_Init(100000) initialisation de la communication I2C

I2C_Start() Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90) Mode de controcircle en mode eacutecriture

I2C_Wr(0xAC) Accegraves au registre de configuration

I2C_Wr(0x0A) Registre de configuration mesure en continu

I2C_Stop() Arrecirct du signal

I2C_Start() Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90) Mode de controcircle en mode eacutecriture

Figure 10 Scheacutema de cacircblage avec le capteur de tempeacuterature

Station meacuteteacuteo autonome 2012

18

I2C_Wr(0xEE) Deacutebut de la conversion

I2C_Stop()Arrecirct du sigal

Boucle infinie

while(1)

cond=cond+1 Increacutemente la variable cond

temperature(ampcond) Appel la fonction humiditeacute

Fonction tempeacuterature

void temperature(int cond)

char temp[7] temptxt[]=Temperature LSB

signed char MSB

I2C_Start() Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90) Mode de controcircle en mode eacutecriture

I2C_Wr(0xAA) Lecture de la tempeacuterature

I2C_Stop() Arrecirct du signal

I2C_Start() Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x91) Mode de controcircle en mode lecture

MSB = I2C_Rd(1) Nombre signeacute donnant la tempeacuterature entre +125deg et -55degC

LSB = I2C_Rd(0) Si bit 7 = 1 tempeacuterature MSB +05degC

I2C_Stop() Arrecirct du signal

if(MSBlt0)

MSB = abs(MSB) Si tempeacuterature neacutegative valeur absolue de MSB

Temp[0]=45 Signe - affecteacute en ascii

else

Temp[0]=43 signe + affecteacute en ascii

Temp[1]=(MSB10)+48 Valeur des dizaines affecteacute en ascii

Temp[2]=(MSB10)+48 Valeur des uniteacutes affecteacute en ascii

Temp[3]=44 Virgule affecteacute en ascii

if (LSB==128) Si bit 7 agrave 1 alors +05deg

Temp[4]=5

Else Si bit 7 agrave 0 alors +00deg

Temp[4]=0

Temp[5]=223 degreacute affecteacute en ascii

Temp[6]=67 C affecteacute en ascii

if(cond==10) Appel la fonction LCD tous les 1000

lcd(1 1 13 temptxt) Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 6 temp) Affiche la chaine de caractegravere hum sur le LCD

cond=0 Remise a 0 de la condition

Fonction affichage

void lcd(int li int co int nb char receive[14])

int i

for(i=0 ilt=nb i++)Boucle for

Lcd_chr(li (co+i) receive[i]) Affiche les caractegraveres jusquagrave i

Le scheacutema preacuteceacutedent est bien respecteacute comme on peut le voir crsquoest tregraves facile agrave programmer

gracircce aux librairies I2C du logiciel MikroC

Station meacuteteacuteo autonome 2012

19

IX Lrsquoaneacutemomegravetre

A Conception

Pour lrsquoaneacutemomegravetre lrsquoeacutequipe peacutedagogique

nous a juste fourni lrsquoheacutelice du capteur donc il a fallu

concevoir toute la partie eacutelectronique Lrsquoideacutee est

drsquoinstaller une diode et un transistor photonique par

de lagrave lrsquoheacutelice et lorsqursquoelle tourne elle vient couper le

faisceau Succinctement le transistor envoit soit 1 soit

0 sur le PIC Le but est de relever la freacutequence agrave

laquelle tourne lrsquoheacutelice puis la convertir en vitesse (cf

figure 11)

La photodiode choisie est de reacutefeacuterence SD5455-3 Ce choix a eacuteteacute fait car lrsquoangle du faisceau

est de 20deg pour que le flux infrarouge soit bien concentreacute sur le phototransistor pour un

fonctionnement optimal

Comme on le voit sur le scheacutema de principe (cf figure 11) il a fallu dimensionner la

reacutesistance qui sert agrave reacuteguler le courant qui circule dans la LED avec les informations donneacutees par la

documentation technique nous avons pu la calculer

Forward voltage VF = 17V et IF = 01A

Ualim = 5V

RD = (Ualim ndash UF)IF = (5 ndash 17)01

RD = 33Ω

Pour le phototransistor nous avons choisi celui qui allait avec la diode de reacutefeacuterence SE5455-3

Cette fois la valeur de la reacutesistance nous eacutetait donneacute par le constructeur

RL=1000Ω

Lors des seacuteances nous avons implanteacute la diode et le

transistor sur le support du capteur Pour des raisons

pratiques et estheacutetiques nous avons seacutepareacute la partie

aneacutemomegravetre et la partie platine par des borniers (cf figure

12)

Figure 11 scheacutema descriptif de laneacutemomegravetre

Figure 12 Notre aneacutemomegravetre

Station meacuteteacuteo autonome 2012

20

B Mesure de la peacuteriode sur le microcontrocircleur

Le but est de relever la peacuteriode du signal envoyer par lrsquoaneacutemomegravetre pour cela le PIC est

eacutequipeacute drsquoun mode capture Le principe est de recopier agrave un moment voulu la valeur du timer 1 La

capture peut avoir lieux agrave chaque front descendant agrave chaque front montant tous les 4 ou tous les 16

fronts montants Quand la capture a eu lieu un flag est mis agrave 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 constitueacute de 2 registres de 8 bits TMR1H et TMR1L que lon peut lire ou eacutecrire Le registre TMR1

(constitueacute de TMR1H et TMR1L) sincreacutemente de h0000 jusquagrave hFFFF et repasse ensuite agrave h0000

pour continuer le comptage Quand il y a deacutebordement une interruption peut ecirctre geacuteneacutereacutee si on lrsquoa

autoriseacutee par TMR1IE =1 (bit 0 de PIE1) et le Flag TMR1IF (bit 0 de PIR1) passe agrave 1 Le controcircle du

timer 1 ce fait par le registre T1CON

Bit 7 et bit 6 bits non impleacutementeacutes

Bit 5 et bit 4 T1CKPS = Seacutelection du preacute diviseur placeacute avant le TIMER

Vu qursquoon a un quartz eacuteleveacute nous avons deacutecideacute de choisir un preacute-diviseur de 8 donc

F=Fosc(48) Pour cela mettre les bit 4 et 5 agrave 1

Bit 3 T1OSCEN Bit dautorisation de loscillateur du Timer 1

1 = oscillateur autoriseacute

0 = oscillateur stoppeacute

Oscillateur interne inutile donc bit 3 agrave 0

Bit 2 T1SYNC Bit de controcircle de la synchronisation du CLK externe

1 = Pas de synchronisation de lhorloge externe

0 = Synchronisation de lhorloge externe

Nous nous mettrons en mode synchrone

Bit1 TMR1CS Bit de seacutelection de la source horloge

1 = Mode Compteur Clk externe sur la broche PC0 ou Quartz entre PC0 et PC1

0 = Mode Timer Clk interne = Fosc4

Station meacuteteacuteo autonome 2012

21

On mettra ce bit agrave 0 car on utilise le mode Timer

Bit 0 TMR1ON Bit dautorisation du Timer 1

1 = Timer 1 en service

0 = Timer 1 stoppeacute

Il faut eacutevidemment mettre la timer 1 en service

Nous avons aussi autoriseacute le deacutebordement du timer 1 pour avoir plus de preacutecisions pour cela il faut

mettre la commande PIE1TMR1 agrave 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 parameacutetrer le registre

CCP1CON

Bit 7 et Bit 6 bits non impleacutementeacutes

Bit 5 et Bit 4 CCP1X et CCP1Y

Bits non utiliseacutes 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 agrave Bit 0 CCP1M3 agrave CCP1M0 bits de seacutelection du mode

Nous avons seacutelectionneacute le mode capture sur chaque front montant Pour cela nous avons

mis les bits 1 et 3 agrave 0 et les bits 0 et 2 agrave 1

Pour savoir si un front montant agrave eu lieu le flag CCP1F est mis agrave 1 Ce flag doit ecirctre remis agrave 0 par

lrsquoutilisateur La valeur des 16 bits des registres du Timer 1 TMR1L (bit de poids faible) et TMR1H (bit

de poids fort) sont recopieacutees dans les registres CCPR1 CCPRIH (bit de poids faible) et CCPR1L (bit de

poids fort)

Nous avons programmeacute le mode capture de faccedilon agrave afficher sur lrsquoeacutecran LCD la valeur du registre

CCPR1 crsquoest-agrave-dire la peacuteriode du signal de lrsquoaneacutemomegravetre Il ne nous reste maintenant plus qursquoagrave

eacutetalonner notre aneacutemomegravetre

Station meacuteteacuteo autonome 2012

22

C Etalonnage de lrsquoaneacutemomegravetre

Pour eacutetalonner le capteur nous avons commenceacute par savoir agrave quelle freacutequence correspond la

valeur releveacutee par le mode capture Pour cela nous avons brancheacute un GBF agrave la place du capteur et

avec un oscilloscope nous avons compareacute leurs valeurs

Nous avons ensuite traceacute agrave lrsquoaide des valeurs du tableau la courbe F(Hz) en fonction du

compteur De cette courbe nous relevons lrsquoeacutequation

F = 671310compteur^(-101)

Soit environ F = 671310compteur

Puis nous avons brancheacute notre aneacutemomegravetre sur le microcontrocircleur Cela dans le but de

relever sa peacuteriode sur lrsquoeacutecran LCD agrave lrsquoaide drsquoune soufflerie variable et du manomegravetre GDH (reacutef

121552 200-13) nous avons compareacute leurs valeurs pour connaitre lrsquoeacutetalonnage de notre capteur

Nous avons noteacute plusieurs valeurs puis traceacute diffeacuterentes courbe pour trouver les eacutequations qui nous

permettrons de calculer la vitesse dans notre programme

Station meacuteteacuteo autonome 2012

23

Voici les valeurs que nous avons releveacutees puis la courbe traceacutee sur Excel

De cette courbe nous obtenons lrsquoeacutequation

Vitesse du vent = 0179F + 0629

Nous les multiplierons par 100 pour reacutecupeacuterer les deacutecimales et les implanter dans une chaine

de caractegravere

Vitesse du vent = 179F + 629

Nous avons agrave preacutesent agrave notre disposition toutes les eacutequations neacutecessaires pour pouvoir

convertir la valeur releveacutee par le mode capture en une vitesse

D Le scheacutema du microcontrocircleur avec lrsquoaneacutemomegravetre

On voit sur le scheacutema que le capteur est bien relieacute sur la borne RC2 Nous avons aussi

repreacutesenteacute les borniers J1 et J2 A droite tous ce qui est sur le support et agrave gauche tous ce qui est sur

la platine

Figure 13 Scheacutema avec laneacutemomegravetre

Station meacuteteacuteo autonome 2012

24

E Programme pour la mesure de la vitesse du vent

Voici le programme pour mesurer la vitesse du vent avec les affectations deacutecrites ci-dessus

ainsi que les eacutequations de conversions

Deacuteclaration des fonctions

void vent(int cond)

void lcd(int li int co int nb char receive[20])

void main()

deacuteclaration des variables

int cond=0

Initialisation et affectation des ports

PORTB=0 initialisation

PORTC=0 initialisation

TRISC=0x04 Port C deacuteclarer en sortie sauf RC2 en mode capture

TRISB=0 Port B deacuteclarer en sortie

Configuration du mode capture

T1CON=0x31 Configuration du timer1

CCP1CON=0x05 Parameacutetrage du mode capture

PIE1TMR1IE=1 Autorise les deacutebordements du timer 1

Configuration et initialisation de leacutecran LCD

Lcd_Config(ampPORTB 0 1 WR 5 4 3 2) Configure leacutecran

Lcd_Init(ampPORTB) Initialisation du LCD

Lcd_Cmd(Lcd_CURSOR_OFF) Enlegraveve le curseur

Lcd_Cmd(Lcd_CLEAR) Efface leacutecran

Boucle infinie

while(1)

cond=cond+1

vent(ampcond)

Fonction vent

void vent(int cond)

unsigned long tl th per

int vitfreq

char vent[13] txtvent[]=vitesse du vent VV

if(PIR1CCP1IF==1) Test si front montant agrave lieu

TMR1H=0 Initialisation du timer1 bit de point fort

TMR1L=0 Initialisation du timer1 bit de point faible

th=CCPR1H Les valeurs sont copieacute dans des variables

tl=CCPR1L

th=thltlt8 Deacutecalage car th =gt bit de point fort

per = th|tl On concategravene les deux valeurs nous obtenons la peacuteriode

PIR1CCP1IF=0 Remise a 0 du drapeau

if(PIR1TMR1IF==1) Si deacutepassement du timer 1

per=65535+per On ajoute une retenue lorsquon a fait un tour (16bit)

PIR1TMR1IF=0 Remise a 0 du drapeau deacutepassement

freq=671310per Calcul de la freacutequence

vit=freq179 + 692 Calcul de la vitesse que lon x100

Station meacuteteacuteo autonome 2012

25

if(vitlt200) En dessous 2ms la mesure est aleacuteatoire agrave cause du 2egraveme deacutebordement

vit=0

vent[0]=(vit10000)+48 Valeur des centaines affecteacute en ascii(48=0)

VV=(vit1000)10

vent[1]=VV+48 Valeur des dizaines affecteacute en ascii

VV=(vit100)10

vent[2]=VV+48 Valeur des uniteacute affecteacute en ascii

VV=(vit10)10

vent[3]=44 Virgule affecteacute en ascii

vent[4]=VV+48 Valeur de la 1er deacutecimale affecteacute en ascii

VV=vit10

vent[5]=VV+48 Valeur de la 2egraveme deacutecimale affecteacute en ascii

vent[6]=109 m affecteacute en ascii

vent[7]=47 affecteacute en ascii

vent[8]=115 s affecteacute en ascii

if(cond==1000) Appel la fonction LCD tous les 1000

lcd(1 1 16 txtvent) Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 8 vent) Affiche la chaine de caractegravere hum sur le LCD

cond=0 Remise a 0 de la condition

Fonction affichage

void lcd(int li int co int nb char receive[20])

int i

for(i=0 ilt=nb i++) Boucle for

Lcd_chr(li (co+i) receive[i]) Affiche les caractegraveres jusquagrave i

Station meacuteteacuteo autonome 2012

26

X Simulation une station meacuteteacuteo autonome

Maintenant que tous nos capteurs sont installeacutes nous allons mettre agrave profit le bouton

poussoir installeacute dans la partie LCD Crsquoest-agrave-dire que nous allons rassembler tous les programmes

preacuteceacutedents pour nrsquoen faire qursquoun Il suffira drsquoappuyer sur le bouton poussoir pour faire deacutefiler les

diffeacuterentes valeurs comme une vraie station meacuteteacuteo

A La structure du programme

Boucle infinie

while(1)

cond=cond+1 Increacutemente la variable cond

switch(BP)

case 0

humidite(ampcond) Appel la fonction humiditeacute

if(PORTAF2==1) Ces if permet de changer la valeur de BP

BP=1

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250) Temps quon relacircche bien le bouton

break

case 1

temperature(ampcond) Appel la fonction tempeacuterature

if(PORTAF2==1)

BP=2

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)

break

case 2

vent(ampcond) Appel la fonction vent

if(PORTAF2==1)

BP=0

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)

break

Nous avons choisi drsquoutiliser un Switch nous avons donc juste rajouteacute une variable BP

Lorsqursquoil y a appui sur le bouton poussoir la variable BP srsquoincreacutemente et le programme passe agrave une

autre case et donc utilise une nouvelle fonction La temporisation nous donne le temps de relacirccher le

bouton pour eacuteviter de faire deacutefiler le menu sans le vouloir

Station meacuteteacuteo autonome 2012

27

B La simulation

Etant donneacute que nous ne pouvions pas prendre le mateacuteriel avec nous il eacutetait impeacuteratif de

pouvoir faire des simulations Pour cela nous avons utiliseacute un logiciel tregraves utile Proteus ISIS Ce

logiciel possegravede une tregraves grande librairie et permet de rentrer nos programmes sur le PIC virtuel

geacuteneacutereacute par le logiciel Pour simuler le capteur drsquohumiditeacute nous avons utiliseacute un potentiomegravetre Pour

celui de lrsquoaneacutemomegravetre comme pour nos mesures nous avons brancheacute virtuellement un GBF sur la

borne associeacute et observeacute son signal agrave lrsquoaide drsquoun oscilloscope

Voilagrave un aperccedilu de la simulation effectueacute sur ISIS

Veacuterification theacuteorique du vent

Vitesse du vent = 0179 37 + 0629

Vitesse du vent = 7657ms

Veacuterification theacuteorique de lrsquohumiditeacute

H= (315-081)0031

H=7548

Veacuterification theacuteorique de la

tempeacuterature

La valeur afficheacutee correspond bien

aux 27degC seacutelectionneacute sur le capteur

Station meacuteteacuteo autonome 2012

28

XI Transmission des donneacutees par liaison ZigBee

ZigBee est un protocole de haut niveau permettant la communication de petites radios agrave

consommation reacuteduite baseacutee sur le standard IEEE 802154

Cette technologie a pour but la communication de courte distance telle que le propose deacutejagrave

la technologie Bluetooth tout en eacutetant moins chegravere plus simple et avec une fiabiliteacute assez eacuteleveacutee

Dans notre projet nous nous servirons de ZigBee pour permettre une transmission par ondes

de nos donneacutees de la station meacuteteacuteo vers un ordinateur Pour cela nous avons 2 modules Xbee pro 2

platines drsquointerfaces une avec des pattes (liaison platine) et lrsquoautre avec une sortie RS232 (liaison pc)

Caracteacuteristique eacutelectrique

Les signaux Xbee ont une amplitude de 33V mais sont alimenteacutes en 5V (tension de notre

source USB) cacircbleacutes sur la bornes VIN (laquo Power input from 6-12Vdc 300mA or higher raquo) Mais

notre source nrsquoeacutetant pas assez puissante pour alimenter toute notre installation Nous utiliserons

donc une source externe de 5V qui sera utiliseacutee pour alimenter les 2 systegravemes Xbee

Description des Bornes du Xbee qui nous inteacuteresse

Station meacuteteacuteo autonome 2012

29

A Scheacutema eacutelectrique du module Xbee

Nous avons cacircbleacute la sortie TX du microcontrocircleur qui eacutemet un signal jusqursquoagrave la borne RX du

Xbee qui reacuteceptionne ce signal Apregraves la transmission se fait par onde entre les 2 modules Xbee Pour

le module qui reccediloit le signal un cacircble RS232 suffit agrave faire la liaison entre celui-ci et le PC

B Envoi des donneacutees la liaison Usart

Un USART (Universal synchronous amp Asynchronous Receiver Transmitter) est un eacutemetteur-

reacutecepteur universel En langage courant cest le composant utiliseacute pour faire la liaison entre

lordinateur et le port seacuterie Lordinateur envoie les donneacutees en parallegravele (autant de fils que de bits

de donneacutees) Il faut donc transformer ces donneacutees pour les faire passer agrave travers une liaison seacuterie qui

utilise un mecircme fil pour faire passer tous les bits de donneacutees

Constitution dune trame USART

un bit de start toujours agrave 0 servant agrave la synchronisation du reacutecepteur

les donneacutees la taille peut varier (geacuteneacuteralement entre 5 et 9 bits)

eacuteventuellement un bit de pariteacute paire ou impaire

et un bit de stop toujours agrave 1 (la dureacutee peut varier entre 1 15 et 2 temps bit)

Le niveau logique de repos est le 1

Figure 14 Trame USART

Station meacuteteacuteo autonome 2012

30

Afin de faciliter les liaisons entre peacuteripheacuteriques (PC microcontrocircleur modem hellip) des vitesses

de transmission sont normaliseacutees luniteacute baud correspondant agrave un temps bit Dans notre cas nous

choisirons une vitesse de transmission de 9600bps

C Programme drsquoenvoi des donneacutees par liaison Usart

Gracircce agrave la librairie de MikroC il est tregraves facile drsquoenvoyer des donneacutees par liaison Usart Cela

fonctionne comme pour envoyer des caractegraveres sur lrsquoeacutecran LCD Il faut juste ensuite choisir la vitesse

de transmission qui sera 9600bps Voici la fonction et un morceau du programme qui sert agrave envoyer

les caractegraveres sur Xbee et de Xbee agrave un HyperTerminal

Fonction humiditeacute

void humidite(int cond)

long H U VL Deacuteclaration des variables

char HH hum[8] humtxt[]=Humidite

helliphellip

Xbee(8 hum) Envoi la chaicircne de caractegravere hum dans la fonction xbee

Usart

void xbee(int nb char receive[20])

int i

Usart_Init(9600) Vitesse de transmission

for(i=0 ilt=nb i++) Boucle for

Usart_Write(receive[i]) Envoi les caractegraveres sur lrsquoHyperTerminal jusquagrave i

Station meacuteteacuteo autonome 2012

31

XII Estimation du coucirct du projet

On peut voir sur ce tableau que le prix de reviens pour les eacuteleacutements que nous avons utiliseacute

est de 14506euro TTC Ce qui est plutocirct oneacutereux compareacute aux stations meacuteteacuteo du marcheacute qui oscille

entre 6euro et 400euro En sachant que la nocirctre est loin drsquoecirctre finaliseacute (finition estheacutetique ergonomie et

ajout de nouvelle fonction comme la date et lrsquoheure)

Composant Quantiteacute Prix (TVA inclus) Liens Quartz 20000MHz 1 111 euro Lien

Capaciteacute 22pF 2 010 euro lien

PIC 16F876 1 427 euro lien

LCD MODULE 1 1575 euro lien

Potentiomegravetre 10KΩ 1 618 euro lien

Reacutesistance 33 Ω 1 035 euro lien

Reacutesistance 10 K Ω 2 070 euro lien

Reacutesistance 1 KΩ 3 105 euro lien

LED rouge 1 013 euro lien

DS1621 1 650 euro lien

Bouton poussoir 1 060 euro lien

Module Xbee 2 4000 euro lien

Platine dinterface (XBEE) RS232 1 1890 euro lien

Platine dinterface (XBEE) 1 1364 euro lien

Capteur drsquohumiditeacute 1 2692 euro lien

Transistor 1 561 euro lien

Diode 1 325 euro lien

Totales 1 14506 euro

Station meacuteteacuteo autonome 2012

32

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

panelsbut 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 Itrsquos also possible to measure

humidity and wind speed Then itrsquos 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 its 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 Itrsquos 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

Station meacuteteacuteo autonome 2012

33

XIV Conclusion

Ce projet sur la conception drsquoune station meacuteteacuteo autonome qui nous a eacuteteacute confieacute a eacuteteacute tregraves

enrichissant Il nous a permis de mettre en relations les connaissances acquises durant lrsquoanneacutee mais

aussi acqueacuterir de nouvelles connaissances comme le fonctionnement drsquoun microcontrocircleur En effet

nous nrsquoavions jamais programmeacute sur microcontrocircleur Il a fallu srsquoadapter et apprendre agrave utiliser des

nouveaux logiciels tels que Proteus MikroC ainsi que Labview

De cette expeacuterience nous avons aussi appris agrave ecirctre autonome Nous avons saisi que la

compreacutehension des documents techniques et des librairies eacutetait un point essentiel de notre projet

En programmation nous nrsquoavions pas le droit agrave lrsquoerreur car la moindre faute pouvait conduire le

systegraveme agrave un dysfonctionnement Ce projet nous a demandeacute beaucoup de rigueur de patience et de

temps

Toutefois nous nrsquoavons pas eu malheureusement le temps drsquoinstaller le capteur de

tempeacuterature inteacuterieure par manque de temps Plus encore nous aurions aimeacute approfondir certains

points Par exemple pouvoir installer les composants sur circuit imprimeacute et concevoir un support

viable pour en faire une vraie station meacuteteacuteo Lrsquoinstallation drsquoune girouette aurait eacuteteacute appreacuteciable

pour connaicirctre le sens du vent Aussi le programme aurait sans doute pu ecirctre encore ameacutelioreacute pour

de meilleures performances

Malgreacute ce manque de temps nous sommes tregraves satisfaits du fonctionnement de ce module

qui nous a permis de comprendre lrsquoutiliteacute des parties theacuteoriques pour lrsquoapplication et la mise en

œuvre drsquoun systegraveme Lrsquoapproche peacutedagogique de nous diriger vers les solutions sans jamais les

donner de nous laisser un grand degreacute de liberteacute et drsquoautonomie a eacuteteacute au deacutebut assez deacuteroutante

mais tregraves instructif

Enfin nous tenions agrave remercier Mme Leymarie qui nous a suivis et aiguilleacute tout au long de ce

projet

Station meacuteteacuteo autonome 2012

34

XV ANNEXES

Programme complet

Deacuteclaration 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()

deacuteclaration des variables

int cond=0Condition pour laffichage sur leacutecran LCD

int BP=0

Initialisation et affectation des ports

PORTA=0

PORTB=0 initialisation

PORTC=0

TRISB=0 Port B deacuteclarer en sortie

TRISA=0xFF Port A en entreacutee

ADCON1=0x84 Justifieacute agrave droite active RA0RA1RA3 analogique

ADCON0=0x85 Fosc32 sur PA0 en service

TRISB=0 Port B deacuteclarer en sortie

TRISC=0xFFPort C deacuteclarer en entreacutee

Configuration et initialisation de leacutecran LCD

Lcd_Config(ampPORTB 0 1 WR 5 4 3 2) Configure lecran

Lcd_Init(ampPORTB) initialisation du LCD

Lcd_Cmd(Lcd_CURSOR_OFF) Enleve le curseur

Lcd_Cmd(Lcd_CLEAR) Efface lecran

Initialisation du module I2C

I2C_Init(100000)initialisation de la communication I2C

I2C_Start()Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90)Mode de controcircle en mode eacutecriture

I2C_Wr(0xAC)Accegraves au registre de configuration

I2C_Wr(0x0A)Registre de configuration mesure en continu

I2C_Stop()Arrecirct du signal

I2C_Start()Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90)Mode de controcircle en mode eacutecriture

I2C_Wr(0xEE)Deacutebut de la conversion

I2C_Stop()Arrecirct du sigal

Station meacuteteacuteo autonome 2012

35

Configuration du mode capture

T1CON=0x31 Configuration du timer1

CCP1CON=0x05 Paramegravetrage du mode capture

PIE1TMR1IE=1 Autorise les deacutebordements du timer 1

Boucle infinie

while(1)

cond=cond+1Increacutemente la variable cond

switch(BP)

case 0

humidite(ampcond)Appel la fonction humiditeacute

if(PORTAF2==1)Ces if permet de changer la valeur de BP

BP=1

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)Temps quon relacircche bien le bouton

break

case 1

temperature(ampcond)Appel la fonction tempeacuterature

if(PORTAF2==1)

BP=2

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)

break

case 2

vent(ampcond)Appel la fonction vent

if(PORTAF2==1)

BP=0

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)

break

Fonction humiditeacute

void humidite(int cond)

long H U VLDeacuteclaration des variables

char HH hum[8] humtxt[]=Humidite

VL=Adc_read(0) Valeur lue sur RA0(humiditeacute)

U=(VL5000)1023 Convertit la valeur lue en tension x1000

H=(U-810)(0031) Convertit la tension en humiditeacute x1000

Station meacuteteacuteo autonome 2012

36

if(Hgt100000)Si H gt 100(impossible) alors = 100

H=100000

if(Hlt0)Si H lt 0(impossible) alors = 0

H=0

hum[0]=(H100000)+48Valeur des centaines affecteacute en ascii(48=0)

HH=(H10000)10

hum[1]=HH+48Valeur des dizaines affecteacute en ascii

HH=(H1000)10

hum[2]=HH+48Valeur des uniteacutes affecteacute en ascii

hum[3]=44Virgule affecteacute en ascii

HH=(H100)10

hum[4]=HH+48Valeur de la premiegravere deacutecimale affecteacute en ascii

HH=(H10)10

hum[5]=HH+48Valeur de la deuxiegraveme deacutecimale affecteacute en ascii

hum[6]=37Pourcentage affecteacute en ascii

if(cond==50)Appel la fonction LCD tous les 1000

lcd(1 1 8 humtxt)Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 7 hum)Affiche la chaine de caractegravere hum sur le LCD

cond=0Remise a 0 de la condition

Xbee(7 hum) Envoi la chaicircne de caractegravere hum dans la fonction xbee

Fonction tempeacuterature

void temperature(int cond)

char temp[7] temptxt[]=Temperature LSB

signed char MSB

I2C_Start()Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90)Mode de controcircle en mode eacutecriture

I2C_Wr(0xAA)Lecture de la tempeacuterature

I2C_Stop()Arrecirct du sigal

I2C_Start()Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x91)Mode de controcircle en mode lecture

MSB = I2C_Rd(1)Nombre signeacute donnant la tempeacuterature entre +125deg et -55degC

LSB = I2C_Rd(0)Si bit 7 = 1 tempeacuterature MSB +05degC

I2C_Stop()Arrecirct du sigal

if(MSBlt0)

MSB = abs(MSB) Si temperature neacutegative valeur absolue de MSB

Temp[0]=45 Signe - affecteacute en ascii

else

Station meacuteteacuteo autonome 2012

37

Temp[0]=43signe + affecteacute en ascii

Temp[1]=(MSB10)+48 Valeur des dizaines affecteacute en ascii

Temp[2]=(MSB10)+48 Valeur des uniteacutes affecteacute en ascii

Temp[3]=44 Virgule affecteacute en ascii

if (LSB==128) Si bit 7 agrave 1 alors +05deg

Temp[4]=5

else Si bit 7 agrave 0 alors +00deg

Temp[4]=0

Temp[5]=223 degreacute affecteacute en ascii

Temp[6]=67 C affecteacute en ascii

if(cond==50)Appel la fonction LCD tous les 1000

lcd(1 1 11 temptxt)Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 7 temp)Affiche la chaine de caractegravere hum sur le LCD

cond=0Remise a 0 de la condition

Xbee(7 temp) Envoi la chaicircne de caractegravere temp dans la fonction xbee

Fonction vent

void vent(int cond)

unsigned long tl th per

int vitfreq

char vent[13] txtvent[]=Vitesse du vent VV

if(PIR1CCP1IF==1) Test si front montant agrave lieu

TMR1H=0 Initialisation du timer1 bit de point fort

TMR1L=0 Initialisation du timer1 bit de point faible

th=CCPR1H Les valeurs sont copieacute dans des variables

tl=CCPR1L

th=thltlt8 Deacutecalage car th =gt bit de point fort

per = th|tl On concategravene les deux valeurs nous obtenons la peacuteriode

PIR1CCP1IF=0 Remise a 0 du drapeau

if(PIR1TMR1IF==1) Si deacutepassement du timer 1

per=65535+per On ajoute une retenue lorsquon a fait un tour (16bit)

PIR1TMR1IF=0 Remise a 0 du drapeau deacutepassement

Station meacuteteacuteo autonome 2012

38

freq=671310perCalacul de la freacutequence

vit=freq179 + 692Calcul de la vitesse que lon x100

if(vitlt200)En dessous 2ms la mesure est aleacuteatoire agrave cause du 2egraveme deacutebordement

vit=0

vent[0]=(vit10000)+48Valeur des centaines affecteacute en ascii(48=0)

VV=(vit1000)10

vent[1]=VV+48Valeur des dizaines affecteacute en ascii

VV=(vit100)10

vent[2]=VV+48Valeur des uniteacute affecteacute en ascii

VV=(vit10)10

vent[3]=44Virgule affecteacute en ascii

vent[4]=VV+48Valeur de la 1er deacutecimale affecteacute en ascii

VV=vit10

vent[5]=VV+48Valeur de la 2egraveme deacutecimale affecteacute en ascii

vent[6]=109m affecteacute en ascii

vent[7]=47 affecteacute en ascii

vent[8]=115s affecteacute en ascii

if(cond==50)Appel la fonction LCD tous les 1000

lcd(1 1 15 txtvent)Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 9 vent)Affiche la chaine de caractegravere hum sur le LCD

cond=0Remise a 0 de la condition

Xbee(9 vent) Envoi la chaicircne de caractegravere vent dans la fonction xbee

Fonction affichage

void lcd(int li int co int nb char receive[15])

int i

for(i=0 iltnb i++)Boucle for

Lcd_chr(li (co+i) receive[i])Affiche les caractegraveres jusquagrave i

Usart

void xbee(int nb char receive[15])

int i

Usart_Init(9600)Vitesse de transmission

for(i=0 iltnb i++)Boucle for

Usart_Write(receive[i])Envoi les caractegraveres sur lHyperTerminal jusquagrave i

Station meacuteteacuteo autonome 2012

5

D Programme pour le clignotement de la LED

Nous avons ensuite agrave lrsquoaide du TP et du logiciel MikroC programmeacute le microcontrocircleur 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 deacuteclarations des bornes

Voici le programme eacutetablit avec ccedila description

void main()

PORTC=0 Initialisation du port C

PORTB=0 Initialisation du port B

TRISC=0 Le port C affecteacute en sortie

TRISB=0 Le port B affecteacute en sortie

while(1)Boucle infinie

PORTCF7 = ~PORTCF7 Allumeeacuteteint la LED

Delay_ms(1000) Temporisation de 1 seconde

VI Lrsquoeacutecran LCD

Ensuite nous sommes rentreacute dans le vif du sujet nous avons installeacute programmeacute lrsquoeacutecran LCD et

essayeacute drsquoafficher des caractegraveres dessus Nous avons aussi rajouteacute un bouton poussoir en vue de

preacuteparer le terrain pour la suite du projet

A Scheacutema du microcontrocircleur avec lrsquoeacutecran LCD

Figure 3 scheacutema avec eacutecran LCD et le bouton poussoir

Station meacuteteacuteo autonome 2012

6

Pour cacircbler lrsquoeacutecran LCD nous nous sommes aideacutes de sa datasheet ainsi que lrsquoaide du logiciel

MikroC Le point qui nous semble important est la borne R(read)W(write) On peut voir qursquoelle est

connecteacutee agrave la masse En effet pour eacutecrire sur lrsquoeacutecran il faut mettre RW = 0 pour lire on le met agrave 1

B Programme pour lrsquoeacutecran LCD

Voici un petit exemple de programme qui utilise agrave la fois le bouton poussoir et qui affiche du

texte sur lrsquoeacutecran LCD void main()

int cond=0 BP=0

Initialisation et affectation des ports

PORTB=0 Initialisation du port B

PORTA=0 Initialisation du port A

TRISB=0 Le port B affecteacute en sortie

TRISA = 0xFF Port A en entreacutee

ADCON1 = 0x84 RA2 en entreacutee

Configuration et initialisation de leacutecran LCD

Lcd_Config(ampPORTB 0 1 WR 5 4 3 2) Configure leacutecran

Lcd_Init(ampPORTB) initialisation du LCD

Lcd_Cmd(Lcd_CURSOR_OFF) Enlegraveve le curseur

Lcd_Cmd(Lcd_CLEAR) Efface leacutecran

Boucle infini

while(1)

cond=cond+1

switch(BP)

case 0

if(PORTAF2==1) Ces if permet de changer la valeur de BP

BP=1

Delay_ms(250) Temps quon relacircche bien le bouton

if(cond==1000)

Lcd_Cmd(Lcd_CLEAR)

Lcd_Out(1 1 Bonjour) Affiche Bonjour ligne 1 colonne 1

break

case 1

if(PORTAF2==1)

BP=0

Delay_ms(250)

if(cond==1000)

Lcd_Cmd(Lcd_CLEAR)

Lcd_Out(1 1 Mme Leymarie )

break

Station meacuteteacuteo autonome 2012

7

Fonctionnement de ce programme

Affiche laquo bonjourhellip raquo sur lrsquoeacutecran LCD

Appuie sur le BP

Affiche laquo Mme Leymarie raquo sur lrsquoeacutecran LCD

Appuie sur le BP

Affiche laquo bonjourhellip raquo sur lrsquoeacutecran LCD

Etc

Les fonctions de lrsquoeacutecran LCD sont expliqueacutees dans lrsquoaide du logiciel MikroC La variable laquo cond raquo

est une condition pour ne pas afficher le mot agrave chaque boucle mais tous les 1000 iteacuterations ce qui

permet de ne pas faire clignoter lrsquoeacutecran ADCON1 sera expliqueacute agrave la suite de ce rapport

VII Le capteur drsquohumiditeacute

Apregraves avoir pris en main

lrsquoeacutecran LCD ainsi que le logiciel

nous avons deacutecideacute drsquoinstaller le

capteur drsquohumiditeacute On nous a mis

agrave disposition un capteur

drsquohumiditeacute de reacutefeacuterence HIH-

4000-001 Crsquoest un capteur qui

renvoie une tension analogique

(cf figure 4) Nous avons

commenceacute par chercher sa

datasheet et regarder les

proprieacuteteacutes du capteur

A Caracteacuteristiques du capteur drsquohumiditeacute

Voici les proprieacuteteacutes importantes du capteur donneacutee par la notice

Gamme dhumiditeacute 0 agrave 100 RH (Relative Humidity) avec une Preacutecision de plusmn 35 RH

Gamme de tension dalimentation 4V agrave 58V

Tempeacuterature de fonctionnement -40degC agrave +85degC (-40 degF to 185 degF)

Courant alimentation 500μA

Sortie Analogique

Figure 4 Capteur dhumiditeacute HIH 4000-001

Station meacuteteacuteo autonome 2012

8

Pour ce qui est lrsquoeacutequation de la tension

en fonction de lrsquohumiditeacute le constructeur nous

donne la courbe drsquoeacutetalonnage suivante (cf

figure 5)

De cette courbe nous en avons tireacute les

valeurs suivantes (cf figure 6)

Nous avons ensuite deacutecideacute de la retracer sur Excel et drsquoen tirer llsquoeacutequation qui sera utiliseacute dans le

programme du microcontrocircleur

On voit qursquoExcel nous donne lrsquoeacutequation suivante

U=0031H +081

Donc H= (U-081)0031

De plus nous multiplierons par 1000 la valeur de H pour pouvoir reacutecupeacuterer les chiffres

deacutecimales et les rentrer dans une chaine de caractegraveres et les afficher sur lrsquoeacutecran LCD H=

(U810)0031

La valeur maximum de H est donc de 100 000 nous la deacuteclarerons donc en long (une

deacuteclaration en int ne serais pas suffisant -32768 agrave 32767)

Figure 5 Courbes donneacutee par le constructeur

Figure 6 tableau de mesure

Figure 7 Courbe traceacute sur Excel

Station meacuteteacuteo autonome 2012

9

Nous avons remarqueacute sur la courbe ainsi qursquoen simulation que le capteur peut avoir des

valeurs supeacuterieur agrave 100 et infeacuterieur agrave 0 Il faudra donc mettre deux conditions pour ne pas

deacutepasser la plage de valeur

B Configuration du microcontrocircleur

Maintenant nous arrivons agrave point important de cette partie celle de la configuration des

ports du microcontrocircleur En effet le PIC16F876 est constitueacute drsquoun module convertisseur agrave 5 entreacutees

Ces entreacutees sont situeacutees sur les bornes RA0 RA1 RA2 RA3 et RA5 (cf figure1) Le reacutesultat de la

conversion est codeacute sur 10 bits Crsquoest une valeur comprise entre hrsquo000rsquo et hrsquo3FFrsquo

hlsquo3FFrsquo = brsquo1 1111 1111rsquo = drsquo1023rsquo

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 eacutequation

U = (Valeur lue sur le CAN 5)1023

Pour les mecircme raison que lrsquoeacutequation du capteur drsquohumiditeacute nous avons multiplieacute par

1000 la tension nous obtenons donc U= (Valeur lue sur le CAN 5000)1023

Il faut ensuite reacutegler les entreacutees analogiques avec les registres ADCON0 et ADCON1 en

sachant que nous avons deacutecideacute 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 (Freacutequence drsquooscillation)2

01= Fosc8

10= Fosc32

11= Oscillateur RC interne

Pour que la conversion soit correct il faut que T(ad) soit au minimum de 16micros nous

disposons drsquoun quartz de 20Mhz =gt 20Mhz32 =gt 16micros Nous mettrons donc le bit 7 agrave 1 et

le 6 agrave 0

Bit 5 bit4 et bit 3 CHS2 CHS1 et CHS0 = Channel Select bits

Ces 3 bits permettent de choisir lentreacutee qui va ecirctre convertie

Station meacuteteacuteo autonome 2012

10

Nous voulons convertir lrsquoentreacutee RA0 pour cela il faut mettre les bits 5 4 3 agrave 0

Bit 2 GODONE Status bit si ADON=1

1 = Deacutemarre la conversion AD Ce bit est remis agrave 0 par hard

0 = La conversion AD est termineacutee

Il nous faut deacutemarrer la conversion

Bit 1 Bit non implanteacute

Bit 0 ADON AD on bit

1= Convertisseur AD en service

0 = Convertisseur AD agrave larrecirct

Il nous faut mettre le convertisseur en service

ADCON0 = brsquo1000 0101rsquo = hrsquo85rsquo

Bit 7 ADFM = AD Result format

1 = Justifieacute agrave droite

0 = Justifieacute agrave gauche

Nous avons justifieacute agrave droite

Bit 6 bit 5 et bit 4 Bits non impleacutementeacutes

Bit 3 bit 2 bit 1 et bit 0 PCFG3 PCFG2 PCFG1 et PCFG0

Bits de controcircle de la configuration des Ports

Ces bits permettent de choisir le partage entre entreacutees analogiques et digitales sur les PORTS A et E

On a choisi drsquoactiver RA0 RA1 et RA3 en entreacutee analogique les autres resteront en

digitales ce qui signifie qursquoau vue de la datasheet il faut mettre le bit 2 agrave 1 et les autres agrave 0

ADCON1 = brsquo10000100rsquo = hrsquo84rsquo

Station meacuteteacuteo autonome 2012

11

C Le scheacutema du microcontrocircleur avec le capteur drsquohumiditeacute

Voici le scheacutema de cacircblage du capteur drsquohumiditeacute uniquement A noter que le capteur est

remplaceacute par un potentiomegravetre nrsquoeacutetant pas dans la librairie de Proteus On constate qursquoil est bien

brancheacute sur RA0

D Programme pour la mesure de lrsquohumiditeacute

Voici le programme pour mesurer lrsquohumiditeacute avec les affectations deacutecrites ci-dessus ainsi

que les eacutequations de conversions

Deacuteclaration des fonctions

void humidite(int cond)

void lcd(int li int co int nb char receive[11])

void main()

deacuteclaration des variables

int cond=0 Condition pour laffichage sur leacutecran LCD

Initialisation et affectation des ports

PORTB=0 initialisation

TRISB=0 Port B deacuteclarer en sortie

TRISA = 0xFF Port A en entreacutee

ADCON1 = 0x84 Justifieacute agrave droite active RA0RA1RA3 analogique

ADCON0 = 0x85 Fosc32 sur PA0 en service

Configuration et initialisation de leacutecran LCD

Lcd_Config(ampPORTB 0 1 WR 5 4 3 2) Configure leacutecran

Lcd_Init(ampPORTB) initialisation du LCD

Lcd_Cmd(Lcd_CURSOR_OFF) Enlegraveve le curseur

Lcd_Cmd(Lcd_CLEAR) Efface leacutecran

Figure 8 Scheacutema de cacircblage du capteur dhumiditeacute

Station meacuteteacuteo autonome 2012

12

Boucle infinie

while(1)

cond=cond+1 Increacutemente la variable cond

humidite(ampcond) Appel la fonction humiditeacute

Fonction humiditeacute

void humidite(int cond)

long H U VL Deacuteclaration des variables

char HH hum[8] humtxt[]=Humidite

VL=Adc_read(0) Valeur lue sur RA0(humiditeacute)

U=(VL5000)1023 Convertit la valeur lue en tension x1000

H=(U-810)(0031) Convertit la tension en humiditeacute x1000

if(Hgt100000) Si H gt 100(impossible) alors = 100

H=100000

if(Hlt0) Si H lt 0(impossible) alors = 0

H=0

hum[0]=(H100000)+48 Valeur des centaines affecteacute en ascii(48=0)

HH=(H10000)10

hum[1]=HH+48 Valeur des dizaines affecteacute en ascii

HH=(H1000)10

hum[2]=HH+48 Valeur des uniteacutes affecteacute en ascii

hum[3]=44Virgule affecteacute en ascii

HH=(H100)10

hum[4]=HH+48 Valeur de la premiegravere deacutecimale affecteacute en ascii

HH=(H10)10

hum[5]=HH+48 Valeur de la deuxiegraveme deacutecimale affecteacute en ascii

hum[6]=37 Pourcentage affecteacute en ascii

if(cond==1000)Appel la fonction LCD tous les 1000

lcd(1 1 10 humtxt) Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 7 hum) Affiche la chaine de caractegravere hum sur le LCD

cond=0 Remise a 0 de la condition

Fonction affichage

void lcd(int li int co int nb char receive[11])

int i

for(i=0 ilt=nb i++)Boucle for

Lcd_chr(li (co+i) receive[i]) Affiche les caractegraveres jusquagrave i

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

Station meacuteteacuteo autonome 2012

13

VIII Le capteur de tempeacuterature

A preacutesent comme toute station meacuteteacuteo

nous avons installeacute un capteur de tempeacuterature le

DS1621 Ce capteur communique avec le

microcontrocircleur gracircce au protocole I2C

A Le protocole I2C

Le bus I2C (Inter Integrated Circuit) a eacuteteacute deacuteveloppeacute au deacutebut des anneacutees 80 par Philips

semiconductors pour permettre de relier facilement agrave un microprocesseur les diffeacuterents circuits dun

teacuteleacuteviseur moderne

Le bus I2C permet de faire communiquer entre eux des composants eacutelectroniques tregraves divers

gracircce agrave seulement trois fils Un signal de donneacutee (SDA) un signal dhorloge (SCL) et un signal de

reacutefeacuterence eacutelectrique (Masse)

Ceci permet de reacutealiser des eacutequipements ayant des fonctionnaliteacutes tregraves puissantes (En

apportant toute la puissance des systegravemes micro programmeacutes) et conservant un circuit imprimeacute tregraves

simple par rapport un scheacutema classique (8bits de donneacutees 16 bits dadresse + les bits de controcircle)

Les donneacutees sont transmises en seacuterie agrave 100Kbitss en mode standard et jusquagrave 400Kbitss en

mode rapide Ce qui ouvre la porte de cette technologie agrave toutes les applications ougrave la vitesse nest

pas primordiale

Voici un exemple de protocole qursquoutilise le bus I2C

1 Pour initier le dialogue le maicirctre creacutee une condition Start

2 Le maicirctre envoie ladresse de lesclave (1010100) suivi du bit 0 (bit Write)

3 Lesclave reacutepond (accuseacute de reacuteception bit Acknowledge)

4 Le maicirctre envoie ladresse du registre (0x04) agrave eacutecrire

5 Lesclave reacutepond (accuseacute de reacuteception bit Acknowledge)

6 Le maicirctre envoie la donneacutee (0x27) agrave eacutecrire

7 Lesclave eacutecrit la donneacutee puis envoie un accuseacute de reacuteception (bit Acknowledge)

8 Le maicirctre termine le dialogue avec une condition Stop

9 Le bus I2C est maintenant libre (SCL = 1 SDA = 1 niveaux de repos)

Figure 9 scheacutema du DS1621

Station meacuteteacuteo autonome 2012

14

B Caracteacuteristique du DS1621

Comme on peut voir sur la figure 9 le capteur est composeacute de 8 bornes

SDA =gt Liaison seacuterie entreacutee sortie

SCL =gt Signal drsquohorloge

Tout =gt Signal de sortie du thermostat (inutile dans notre cas)

GND =gt Masse

VDD =gt Alimentation +5V

A0 A1 A2 =gt Entreacutee drsquoadressage (dans notre cas les 3 agrave la masse car nous nrsquoavons qursquoun

module I2C)

Les circuits connecteacutes sur un bus I2C ont des sorties de type drain ouvert (ou collecteur

ouvert) Deux reacutesistances de pull-up sont bien sucircr placeacutees entre les lignes SDA SCL et lalimentation

(VDD)Quand le bus nest pas utiliseacute SDA et SCL sont au niveau haut (niveau de repos)

1 Speacutecificiteacute des commandes

Tous dialogue du maicirctre(PIC16F876) avec un DS1621 esclave doit deacutebuter par lrsquoenvoi drsquoun

mot de controcircle

Le maicirctre envoi ensuite une commande suivi ou non de donneacutees Voici la liste des

commandes avec leur description

Les commandes AC EE et 22 ne sont pas suivies de lenvoi de donneacutees Par contre la

commande AA qui nous inteacuteresse est suivie de lrsquoenvoi par le DS1621 de 2 octets repreacutesentant la

tempeacuterature

Station meacuteteacuteo autonome 2012

15

Voici le registre de configuration(AC) qursquoil nous faut deacuteterminer

DONE 1 = conversion finie 0 = conversion en cours En mode 1 SHOT uniquement

THF Flag seuil haut du thermostat Passe agrave 1 et y reste si tempeacuterature supeacuterieure agrave TH

TLF Flag seuil bas du thermostat Passe agrave 1 et y reste si tempeacuterature infeacuterieure agrave TL

NVB 1 = meacutemoire EEPROM en eacutecriture 0 = meacutemoire EEPROM eacutecriture termineacutee

Nous nrsquoactiverons pas lrsquoeacutecriture de la meacutemoire

POL Polariteacute de Tout (pin 3) 1 = actif sera un niveau HAUT 0 = actif sera un niveau BAS

Il faut activer la polariteacute donc nous le mettons agrave 1

ONE SHOT 0 = conversion en continu 1 = conversion 1 fois

Nous le mettons en mode continu

AC = brsquo00001010rsquo = hrsquo0Arsquo

La commande AA qui permet de lire la tempeacuterature renvoie 2 octets

MSB (Most Significant Bit) Nombre signeacute donnant la tempeacuterature entre +125deg et -55degC

LSB (Least Significant Bit ) Seul le bit 7 de cet octet est significatif Si 1 tempeacuterature

MSB +05degC

Pour bien comprendre comment est codeacute un nombre signeacute un tableau avec des exemples de

valeurs eacutetait agrave notre disposition dans la notice

Station meacuteteacuteo autonome 2012

16

2 Dialogue I2C pour avoir la tempeacuterature

Voici un scheacutema qui montre le dialogue agrave effectuer entre le microcontrocircleur et le capteur

pour avoir la tempeacuterature Crsquoest gracircce agrave ce mecircme scheacutema que nous avons pu programmer le PIC

Station meacuteteacuteo autonome 2012

17

C Le scheacutema du microcontrocircleur avec le capteur de tempeacuterature

Voici le scheacutema du capteur de tempeacuterature uniquement Le capteur est brancheacute sur les

borne SCL(RC3) et SDA(RC4) du PIC Qursquoelles soient deacuteclareacutees en entreacutee ou en sortie les bornes SCL et

SDA sont fonctionnelles Il ne faut pas oublier les reacutesistances de tirages (R1 et R3) Lrsquoadressage A0 A1

A2 toutes misent agrave la masse car nous nrsquoavons qursquoun seul capteur I2C relieacute au PIC et le Tout

(thermostat) inutile car nous faisons juste un releveacute de tempeacuterature

D Programme pour la mesure de la tempeacuterature

Deacuteclaration des fonctions

void temperature(int cond)

void lcd(int li int co int nb char receive[14])

void main()

deacuteclaration des variables

int cond=0Condition pour laffichage sur leacutecran LCD

Initialisation et affectation des ports

PORTB=0 initialisation

PORTC=0

TRISB=0 Port B deacuteclarer en sortie

TRISC = 0xFF Port C en entreacutee

Configuration et initialisation de leacutecran LCD

Lcd_Config(ampPORTB 0 1 WR 5 4 3 2) Configure leacutecran

Lcd_Init(ampPORTB) initialisation du LCD

Lcd_Cmd(Lcd_CURSOR_OFF) Enlegraveve le curseur

Lcd_Cmd(Lcd_CLEAR) Efface leacutecran

Initialisation du module I2C

I2C_Init(100000) initialisation de la communication I2C

I2C_Start() Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90) Mode de controcircle en mode eacutecriture

I2C_Wr(0xAC) Accegraves au registre de configuration

I2C_Wr(0x0A) Registre de configuration mesure en continu

I2C_Stop() Arrecirct du signal

I2C_Start() Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90) Mode de controcircle en mode eacutecriture

Figure 10 Scheacutema de cacircblage avec le capteur de tempeacuterature

Station meacuteteacuteo autonome 2012

18

I2C_Wr(0xEE) Deacutebut de la conversion

I2C_Stop()Arrecirct du sigal

Boucle infinie

while(1)

cond=cond+1 Increacutemente la variable cond

temperature(ampcond) Appel la fonction humiditeacute

Fonction tempeacuterature

void temperature(int cond)

char temp[7] temptxt[]=Temperature LSB

signed char MSB

I2C_Start() Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90) Mode de controcircle en mode eacutecriture

I2C_Wr(0xAA) Lecture de la tempeacuterature

I2C_Stop() Arrecirct du signal

I2C_Start() Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x91) Mode de controcircle en mode lecture

MSB = I2C_Rd(1) Nombre signeacute donnant la tempeacuterature entre +125deg et -55degC

LSB = I2C_Rd(0) Si bit 7 = 1 tempeacuterature MSB +05degC

I2C_Stop() Arrecirct du signal

if(MSBlt0)

MSB = abs(MSB) Si tempeacuterature neacutegative valeur absolue de MSB

Temp[0]=45 Signe - affecteacute en ascii

else

Temp[0]=43 signe + affecteacute en ascii

Temp[1]=(MSB10)+48 Valeur des dizaines affecteacute en ascii

Temp[2]=(MSB10)+48 Valeur des uniteacutes affecteacute en ascii

Temp[3]=44 Virgule affecteacute en ascii

if (LSB==128) Si bit 7 agrave 1 alors +05deg

Temp[4]=5

Else Si bit 7 agrave 0 alors +00deg

Temp[4]=0

Temp[5]=223 degreacute affecteacute en ascii

Temp[6]=67 C affecteacute en ascii

if(cond==10) Appel la fonction LCD tous les 1000

lcd(1 1 13 temptxt) Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 6 temp) Affiche la chaine de caractegravere hum sur le LCD

cond=0 Remise a 0 de la condition

Fonction affichage

void lcd(int li int co int nb char receive[14])

int i

for(i=0 ilt=nb i++)Boucle for

Lcd_chr(li (co+i) receive[i]) Affiche les caractegraveres jusquagrave i

Le scheacutema preacuteceacutedent est bien respecteacute comme on peut le voir crsquoest tregraves facile agrave programmer

gracircce aux librairies I2C du logiciel MikroC

Station meacuteteacuteo autonome 2012

19

IX Lrsquoaneacutemomegravetre

A Conception

Pour lrsquoaneacutemomegravetre lrsquoeacutequipe peacutedagogique

nous a juste fourni lrsquoheacutelice du capteur donc il a fallu

concevoir toute la partie eacutelectronique Lrsquoideacutee est

drsquoinstaller une diode et un transistor photonique par

de lagrave lrsquoheacutelice et lorsqursquoelle tourne elle vient couper le

faisceau Succinctement le transistor envoit soit 1 soit

0 sur le PIC Le but est de relever la freacutequence agrave

laquelle tourne lrsquoheacutelice puis la convertir en vitesse (cf

figure 11)

La photodiode choisie est de reacutefeacuterence SD5455-3 Ce choix a eacuteteacute fait car lrsquoangle du faisceau

est de 20deg pour que le flux infrarouge soit bien concentreacute sur le phototransistor pour un

fonctionnement optimal

Comme on le voit sur le scheacutema de principe (cf figure 11) il a fallu dimensionner la

reacutesistance qui sert agrave reacuteguler le courant qui circule dans la LED avec les informations donneacutees par la

documentation technique nous avons pu la calculer

Forward voltage VF = 17V et IF = 01A

Ualim = 5V

RD = (Ualim ndash UF)IF = (5 ndash 17)01

RD = 33Ω

Pour le phototransistor nous avons choisi celui qui allait avec la diode de reacutefeacuterence SE5455-3

Cette fois la valeur de la reacutesistance nous eacutetait donneacute par le constructeur

RL=1000Ω

Lors des seacuteances nous avons implanteacute la diode et le

transistor sur le support du capteur Pour des raisons

pratiques et estheacutetiques nous avons seacutepareacute la partie

aneacutemomegravetre et la partie platine par des borniers (cf figure

12)

Figure 11 scheacutema descriptif de laneacutemomegravetre

Figure 12 Notre aneacutemomegravetre

Station meacuteteacuteo autonome 2012

20

B Mesure de la peacuteriode sur le microcontrocircleur

Le but est de relever la peacuteriode du signal envoyer par lrsquoaneacutemomegravetre pour cela le PIC est

eacutequipeacute drsquoun mode capture Le principe est de recopier agrave un moment voulu la valeur du timer 1 La

capture peut avoir lieux agrave chaque front descendant agrave chaque front montant tous les 4 ou tous les 16

fronts montants Quand la capture a eu lieu un flag est mis agrave 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 constitueacute de 2 registres de 8 bits TMR1H et TMR1L que lon peut lire ou eacutecrire Le registre TMR1

(constitueacute de TMR1H et TMR1L) sincreacutemente de h0000 jusquagrave hFFFF et repasse ensuite agrave h0000

pour continuer le comptage Quand il y a deacutebordement une interruption peut ecirctre geacuteneacutereacutee si on lrsquoa

autoriseacutee par TMR1IE =1 (bit 0 de PIE1) et le Flag TMR1IF (bit 0 de PIR1) passe agrave 1 Le controcircle du

timer 1 ce fait par le registre T1CON

Bit 7 et bit 6 bits non impleacutementeacutes

Bit 5 et bit 4 T1CKPS = Seacutelection du preacute diviseur placeacute avant le TIMER

Vu qursquoon a un quartz eacuteleveacute nous avons deacutecideacute de choisir un preacute-diviseur de 8 donc

F=Fosc(48) Pour cela mettre les bit 4 et 5 agrave 1

Bit 3 T1OSCEN Bit dautorisation de loscillateur du Timer 1

1 = oscillateur autoriseacute

0 = oscillateur stoppeacute

Oscillateur interne inutile donc bit 3 agrave 0

Bit 2 T1SYNC Bit de controcircle de la synchronisation du CLK externe

1 = Pas de synchronisation de lhorloge externe

0 = Synchronisation de lhorloge externe

Nous nous mettrons en mode synchrone

Bit1 TMR1CS Bit de seacutelection de la source horloge

1 = Mode Compteur Clk externe sur la broche PC0 ou Quartz entre PC0 et PC1

0 = Mode Timer Clk interne = Fosc4

Station meacuteteacuteo autonome 2012

21

On mettra ce bit agrave 0 car on utilise le mode Timer

Bit 0 TMR1ON Bit dautorisation du Timer 1

1 = Timer 1 en service

0 = Timer 1 stoppeacute

Il faut eacutevidemment mettre la timer 1 en service

Nous avons aussi autoriseacute le deacutebordement du timer 1 pour avoir plus de preacutecisions pour cela il faut

mettre la commande PIE1TMR1 agrave 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 parameacutetrer le registre

CCP1CON

Bit 7 et Bit 6 bits non impleacutementeacutes

Bit 5 et Bit 4 CCP1X et CCP1Y

Bits non utiliseacutes 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 agrave Bit 0 CCP1M3 agrave CCP1M0 bits de seacutelection du mode

Nous avons seacutelectionneacute le mode capture sur chaque front montant Pour cela nous avons

mis les bits 1 et 3 agrave 0 et les bits 0 et 2 agrave 1

Pour savoir si un front montant agrave eu lieu le flag CCP1F est mis agrave 1 Ce flag doit ecirctre remis agrave 0 par

lrsquoutilisateur La valeur des 16 bits des registres du Timer 1 TMR1L (bit de poids faible) et TMR1H (bit

de poids fort) sont recopieacutees dans les registres CCPR1 CCPRIH (bit de poids faible) et CCPR1L (bit de

poids fort)

Nous avons programmeacute le mode capture de faccedilon agrave afficher sur lrsquoeacutecran LCD la valeur du registre

CCPR1 crsquoest-agrave-dire la peacuteriode du signal de lrsquoaneacutemomegravetre Il ne nous reste maintenant plus qursquoagrave

eacutetalonner notre aneacutemomegravetre

Station meacuteteacuteo autonome 2012

22

C Etalonnage de lrsquoaneacutemomegravetre

Pour eacutetalonner le capteur nous avons commenceacute par savoir agrave quelle freacutequence correspond la

valeur releveacutee par le mode capture Pour cela nous avons brancheacute un GBF agrave la place du capteur et

avec un oscilloscope nous avons compareacute leurs valeurs

Nous avons ensuite traceacute agrave lrsquoaide des valeurs du tableau la courbe F(Hz) en fonction du

compteur De cette courbe nous relevons lrsquoeacutequation

F = 671310compteur^(-101)

Soit environ F = 671310compteur

Puis nous avons brancheacute notre aneacutemomegravetre sur le microcontrocircleur Cela dans le but de

relever sa peacuteriode sur lrsquoeacutecran LCD agrave lrsquoaide drsquoune soufflerie variable et du manomegravetre GDH (reacutef

121552 200-13) nous avons compareacute leurs valeurs pour connaitre lrsquoeacutetalonnage de notre capteur

Nous avons noteacute plusieurs valeurs puis traceacute diffeacuterentes courbe pour trouver les eacutequations qui nous

permettrons de calculer la vitesse dans notre programme

Station meacuteteacuteo autonome 2012

23

Voici les valeurs que nous avons releveacutees puis la courbe traceacutee sur Excel

De cette courbe nous obtenons lrsquoeacutequation

Vitesse du vent = 0179F + 0629

Nous les multiplierons par 100 pour reacutecupeacuterer les deacutecimales et les implanter dans une chaine

de caractegravere

Vitesse du vent = 179F + 629

Nous avons agrave preacutesent agrave notre disposition toutes les eacutequations neacutecessaires pour pouvoir

convertir la valeur releveacutee par le mode capture en une vitesse

D Le scheacutema du microcontrocircleur avec lrsquoaneacutemomegravetre

On voit sur le scheacutema que le capteur est bien relieacute sur la borne RC2 Nous avons aussi

repreacutesenteacute les borniers J1 et J2 A droite tous ce qui est sur le support et agrave gauche tous ce qui est sur

la platine

Figure 13 Scheacutema avec laneacutemomegravetre

Station meacuteteacuteo autonome 2012

24

E Programme pour la mesure de la vitesse du vent

Voici le programme pour mesurer la vitesse du vent avec les affectations deacutecrites ci-dessus

ainsi que les eacutequations de conversions

Deacuteclaration des fonctions

void vent(int cond)

void lcd(int li int co int nb char receive[20])

void main()

deacuteclaration des variables

int cond=0

Initialisation et affectation des ports

PORTB=0 initialisation

PORTC=0 initialisation

TRISC=0x04 Port C deacuteclarer en sortie sauf RC2 en mode capture

TRISB=0 Port B deacuteclarer en sortie

Configuration du mode capture

T1CON=0x31 Configuration du timer1

CCP1CON=0x05 Parameacutetrage du mode capture

PIE1TMR1IE=1 Autorise les deacutebordements du timer 1

Configuration et initialisation de leacutecran LCD

Lcd_Config(ampPORTB 0 1 WR 5 4 3 2) Configure leacutecran

Lcd_Init(ampPORTB) Initialisation du LCD

Lcd_Cmd(Lcd_CURSOR_OFF) Enlegraveve le curseur

Lcd_Cmd(Lcd_CLEAR) Efface leacutecran

Boucle infinie

while(1)

cond=cond+1

vent(ampcond)

Fonction vent

void vent(int cond)

unsigned long tl th per

int vitfreq

char vent[13] txtvent[]=vitesse du vent VV

if(PIR1CCP1IF==1) Test si front montant agrave lieu

TMR1H=0 Initialisation du timer1 bit de point fort

TMR1L=0 Initialisation du timer1 bit de point faible

th=CCPR1H Les valeurs sont copieacute dans des variables

tl=CCPR1L

th=thltlt8 Deacutecalage car th =gt bit de point fort

per = th|tl On concategravene les deux valeurs nous obtenons la peacuteriode

PIR1CCP1IF=0 Remise a 0 du drapeau

if(PIR1TMR1IF==1) Si deacutepassement du timer 1

per=65535+per On ajoute une retenue lorsquon a fait un tour (16bit)

PIR1TMR1IF=0 Remise a 0 du drapeau deacutepassement

freq=671310per Calcul de la freacutequence

vit=freq179 + 692 Calcul de la vitesse que lon x100

Station meacuteteacuteo autonome 2012

25

if(vitlt200) En dessous 2ms la mesure est aleacuteatoire agrave cause du 2egraveme deacutebordement

vit=0

vent[0]=(vit10000)+48 Valeur des centaines affecteacute en ascii(48=0)

VV=(vit1000)10

vent[1]=VV+48 Valeur des dizaines affecteacute en ascii

VV=(vit100)10

vent[2]=VV+48 Valeur des uniteacute affecteacute en ascii

VV=(vit10)10

vent[3]=44 Virgule affecteacute en ascii

vent[4]=VV+48 Valeur de la 1er deacutecimale affecteacute en ascii

VV=vit10

vent[5]=VV+48 Valeur de la 2egraveme deacutecimale affecteacute en ascii

vent[6]=109 m affecteacute en ascii

vent[7]=47 affecteacute en ascii

vent[8]=115 s affecteacute en ascii

if(cond==1000) Appel la fonction LCD tous les 1000

lcd(1 1 16 txtvent) Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 8 vent) Affiche la chaine de caractegravere hum sur le LCD

cond=0 Remise a 0 de la condition

Fonction affichage

void lcd(int li int co int nb char receive[20])

int i

for(i=0 ilt=nb i++) Boucle for

Lcd_chr(li (co+i) receive[i]) Affiche les caractegraveres jusquagrave i

Station meacuteteacuteo autonome 2012

26

X Simulation une station meacuteteacuteo autonome

Maintenant que tous nos capteurs sont installeacutes nous allons mettre agrave profit le bouton

poussoir installeacute dans la partie LCD Crsquoest-agrave-dire que nous allons rassembler tous les programmes

preacuteceacutedents pour nrsquoen faire qursquoun Il suffira drsquoappuyer sur le bouton poussoir pour faire deacutefiler les

diffeacuterentes valeurs comme une vraie station meacuteteacuteo

A La structure du programme

Boucle infinie

while(1)

cond=cond+1 Increacutemente la variable cond

switch(BP)

case 0

humidite(ampcond) Appel la fonction humiditeacute

if(PORTAF2==1) Ces if permet de changer la valeur de BP

BP=1

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250) Temps quon relacircche bien le bouton

break

case 1

temperature(ampcond) Appel la fonction tempeacuterature

if(PORTAF2==1)

BP=2

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)

break

case 2

vent(ampcond) Appel la fonction vent

if(PORTAF2==1)

BP=0

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)

break

Nous avons choisi drsquoutiliser un Switch nous avons donc juste rajouteacute une variable BP

Lorsqursquoil y a appui sur le bouton poussoir la variable BP srsquoincreacutemente et le programme passe agrave une

autre case et donc utilise une nouvelle fonction La temporisation nous donne le temps de relacirccher le

bouton pour eacuteviter de faire deacutefiler le menu sans le vouloir

Station meacuteteacuteo autonome 2012

27

B La simulation

Etant donneacute que nous ne pouvions pas prendre le mateacuteriel avec nous il eacutetait impeacuteratif de

pouvoir faire des simulations Pour cela nous avons utiliseacute un logiciel tregraves utile Proteus ISIS Ce

logiciel possegravede une tregraves grande librairie et permet de rentrer nos programmes sur le PIC virtuel

geacuteneacutereacute par le logiciel Pour simuler le capteur drsquohumiditeacute nous avons utiliseacute un potentiomegravetre Pour

celui de lrsquoaneacutemomegravetre comme pour nos mesures nous avons brancheacute virtuellement un GBF sur la

borne associeacute et observeacute son signal agrave lrsquoaide drsquoun oscilloscope

Voilagrave un aperccedilu de la simulation effectueacute sur ISIS

Veacuterification theacuteorique du vent

Vitesse du vent = 0179 37 + 0629

Vitesse du vent = 7657ms

Veacuterification theacuteorique de lrsquohumiditeacute

H= (315-081)0031

H=7548

Veacuterification theacuteorique de la

tempeacuterature

La valeur afficheacutee correspond bien

aux 27degC seacutelectionneacute sur le capteur

Station meacuteteacuteo autonome 2012

28

XI Transmission des donneacutees par liaison ZigBee

ZigBee est un protocole de haut niveau permettant la communication de petites radios agrave

consommation reacuteduite baseacutee sur le standard IEEE 802154

Cette technologie a pour but la communication de courte distance telle que le propose deacutejagrave

la technologie Bluetooth tout en eacutetant moins chegravere plus simple et avec une fiabiliteacute assez eacuteleveacutee

Dans notre projet nous nous servirons de ZigBee pour permettre une transmission par ondes

de nos donneacutees de la station meacuteteacuteo vers un ordinateur Pour cela nous avons 2 modules Xbee pro 2

platines drsquointerfaces une avec des pattes (liaison platine) et lrsquoautre avec une sortie RS232 (liaison pc)

Caracteacuteristique eacutelectrique

Les signaux Xbee ont une amplitude de 33V mais sont alimenteacutes en 5V (tension de notre

source USB) cacircbleacutes sur la bornes VIN (laquo Power input from 6-12Vdc 300mA or higher raquo) Mais

notre source nrsquoeacutetant pas assez puissante pour alimenter toute notre installation Nous utiliserons

donc une source externe de 5V qui sera utiliseacutee pour alimenter les 2 systegravemes Xbee

Description des Bornes du Xbee qui nous inteacuteresse

Station meacuteteacuteo autonome 2012

29

A Scheacutema eacutelectrique du module Xbee

Nous avons cacircbleacute la sortie TX du microcontrocircleur qui eacutemet un signal jusqursquoagrave la borne RX du

Xbee qui reacuteceptionne ce signal Apregraves la transmission se fait par onde entre les 2 modules Xbee Pour

le module qui reccediloit le signal un cacircble RS232 suffit agrave faire la liaison entre celui-ci et le PC

B Envoi des donneacutees la liaison Usart

Un USART (Universal synchronous amp Asynchronous Receiver Transmitter) est un eacutemetteur-

reacutecepteur universel En langage courant cest le composant utiliseacute pour faire la liaison entre

lordinateur et le port seacuterie Lordinateur envoie les donneacutees en parallegravele (autant de fils que de bits

de donneacutees) Il faut donc transformer ces donneacutees pour les faire passer agrave travers une liaison seacuterie qui

utilise un mecircme fil pour faire passer tous les bits de donneacutees

Constitution dune trame USART

un bit de start toujours agrave 0 servant agrave la synchronisation du reacutecepteur

les donneacutees la taille peut varier (geacuteneacuteralement entre 5 et 9 bits)

eacuteventuellement un bit de pariteacute paire ou impaire

et un bit de stop toujours agrave 1 (la dureacutee peut varier entre 1 15 et 2 temps bit)

Le niveau logique de repos est le 1

Figure 14 Trame USART

Station meacuteteacuteo autonome 2012

30

Afin de faciliter les liaisons entre peacuteripheacuteriques (PC microcontrocircleur modem hellip) des vitesses

de transmission sont normaliseacutees luniteacute baud correspondant agrave un temps bit Dans notre cas nous

choisirons une vitesse de transmission de 9600bps

C Programme drsquoenvoi des donneacutees par liaison Usart

Gracircce agrave la librairie de MikroC il est tregraves facile drsquoenvoyer des donneacutees par liaison Usart Cela

fonctionne comme pour envoyer des caractegraveres sur lrsquoeacutecran LCD Il faut juste ensuite choisir la vitesse

de transmission qui sera 9600bps Voici la fonction et un morceau du programme qui sert agrave envoyer

les caractegraveres sur Xbee et de Xbee agrave un HyperTerminal

Fonction humiditeacute

void humidite(int cond)

long H U VL Deacuteclaration des variables

char HH hum[8] humtxt[]=Humidite

helliphellip

Xbee(8 hum) Envoi la chaicircne de caractegravere hum dans la fonction xbee

Usart

void xbee(int nb char receive[20])

int i

Usart_Init(9600) Vitesse de transmission

for(i=0 ilt=nb i++) Boucle for

Usart_Write(receive[i]) Envoi les caractegraveres sur lrsquoHyperTerminal jusquagrave i

Station meacuteteacuteo autonome 2012

31

XII Estimation du coucirct du projet

On peut voir sur ce tableau que le prix de reviens pour les eacuteleacutements que nous avons utiliseacute

est de 14506euro TTC Ce qui est plutocirct oneacutereux compareacute aux stations meacuteteacuteo du marcheacute qui oscille

entre 6euro et 400euro En sachant que la nocirctre est loin drsquoecirctre finaliseacute (finition estheacutetique ergonomie et

ajout de nouvelle fonction comme la date et lrsquoheure)

Composant Quantiteacute Prix (TVA inclus) Liens Quartz 20000MHz 1 111 euro Lien

Capaciteacute 22pF 2 010 euro lien

PIC 16F876 1 427 euro lien

LCD MODULE 1 1575 euro lien

Potentiomegravetre 10KΩ 1 618 euro lien

Reacutesistance 33 Ω 1 035 euro lien

Reacutesistance 10 K Ω 2 070 euro lien

Reacutesistance 1 KΩ 3 105 euro lien

LED rouge 1 013 euro lien

DS1621 1 650 euro lien

Bouton poussoir 1 060 euro lien

Module Xbee 2 4000 euro lien

Platine dinterface (XBEE) RS232 1 1890 euro lien

Platine dinterface (XBEE) 1 1364 euro lien

Capteur drsquohumiditeacute 1 2692 euro lien

Transistor 1 561 euro lien

Diode 1 325 euro lien

Totales 1 14506 euro

Station meacuteteacuteo autonome 2012

32

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

panelsbut 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 Itrsquos also possible to measure

humidity and wind speed Then itrsquos 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 its 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 Itrsquos 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

Station meacuteteacuteo autonome 2012

33

XIV Conclusion

Ce projet sur la conception drsquoune station meacuteteacuteo autonome qui nous a eacuteteacute confieacute a eacuteteacute tregraves

enrichissant Il nous a permis de mettre en relations les connaissances acquises durant lrsquoanneacutee mais

aussi acqueacuterir de nouvelles connaissances comme le fonctionnement drsquoun microcontrocircleur En effet

nous nrsquoavions jamais programmeacute sur microcontrocircleur Il a fallu srsquoadapter et apprendre agrave utiliser des

nouveaux logiciels tels que Proteus MikroC ainsi que Labview

De cette expeacuterience nous avons aussi appris agrave ecirctre autonome Nous avons saisi que la

compreacutehension des documents techniques et des librairies eacutetait un point essentiel de notre projet

En programmation nous nrsquoavions pas le droit agrave lrsquoerreur car la moindre faute pouvait conduire le

systegraveme agrave un dysfonctionnement Ce projet nous a demandeacute beaucoup de rigueur de patience et de

temps

Toutefois nous nrsquoavons pas eu malheureusement le temps drsquoinstaller le capteur de

tempeacuterature inteacuterieure par manque de temps Plus encore nous aurions aimeacute approfondir certains

points Par exemple pouvoir installer les composants sur circuit imprimeacute et concevoir un support

viable pour en faire une vraie station meacuteteacuteo Lrsquoinstallation drsquoune girouette aurait eacuteteacute appreacuteciable

pour connaicirctre le sens du vent Aussi le programme aurait sans doute pu ecirctre encore ameacutelioreacute pour

de meilleures performances

Malgreacute ce manque de temps nous sommes tregraves satisfaits du fonctionnement de ce module

qui nous a permis de comprendre lrsquoutiliteacute des parties theacuteoriques pour lrsquoapplication et la mise en

œuvre drsquoun systegraveme Lrsquoapproche peacutedagogique de nous diriger vers les solutions sans jamais les

donner de nous laisser un grand degreacute de liberteacute et drsquoautonomie a eacuteteacute au deacutebut assez deacuteroutante

mais tregraves instructif

Enfin nous tenions agrave remercier Mme Leymarie qui nous a suivis et aiguilleacute tout au long de ce

projet

Station meacuteteacuteo autonome 2012

34

XV ANNEXES

Programme complet

Deacuteclaration 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()

deacuteclaration des variables

int cond=0Condition pour laffichage sur leacutecran LCD

int BP=0

Initialisation et affectation des ports

PORTA=0

PORTB=0 initialisation

PORTC=0

TRISB=0 Port B deacuteclarer en sortie

TRISA=0xFF Port A en entreacutee

ADCON1=0x84 Justifieacute agrave droite active RA0RA1RA3 analogique

ADCON0=0x85 Fosc32 sur PA0 en service

TRISB=0 Port B deacuteclarer en sortie

TRISC=0xFFPort C deacuteclarer en entreacutee

Configuration et initialisation de leacutecran LCD

Lcd_Config(ampPORTB 0 1 WR 5 4 3 2) Configure lecran

Lcd_Init(ampPORTB) initialisation du LCD

Lcd_Cmd(Lcd_CURSOR_OFF) Enleve le curseur

Lcd_Cmd(Lcd_CLEAR) Efface lecran

Initialisation du module I2C

I2C_Init(100000)initialisation de la communication I2C

I2C_Start()Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90)Mode de controcircle en mode eacutecriture

I2C_Wr(0xAC)Accegraves au registre de configuration

I2C_Wr(0x0A)Registre de configuration mesure en continu

I2C_Stop()Arrecirct du signal

I2C_Start()Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90)Mode de controcircle en mode eacutecriture

I2C_Wr(0xEE)Deacutebut de la conversion

I2C_Stop()Arrecirct du sigal

Station meacuteteacuteo autonome 2012

35

Configuration du mode capture

T1CON=0x31 Configuration du timer1

CCP1CON=0x05 Paramegravetrage du mode capture

PIE1TMR1IE=1 Autorise les deacutebordements du timer 1

Boucle infinie

while(1)

cond=cond+1Increacutemente la variable cond

switch(BP)

case 0

humidite(ampcond)Appel la fonction humiditeacute

if(PORTAF2==1)Ces if permet de changer la valeur de BP

BP=1

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)Temps quon relacircche bien le bouton

break

case 1

temperature(ampcond)Appel la fonction tempeacuterature

if(PORTAF2==1)

BP=2

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)

break

case 2

vent(ampcond)Appel la fonction vent

if(PORTAF2==1)

BP=0

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)

break

Fonction humiditeacute

void humidite(int cond)

long H U VLDeacuteclaration des variables

char HH hum[8] humtxt[]=Humidite

VL=Adc_read(0) Valeur lue sur RA0(humiditeacute)

U=(VL5000)1023 Convertit la valeur lue en tension x1000

H=(U-810)(0031) Convertit la tension en humiditeacute x1000

Station meacuteteacuteo autonome 2012

36

if(Hgt100000)Si H gt 100(impossible) alors = 100

H=100000

if(Hlt0)Si H lt 0(impossible) alors = 0

H=0

hum[0]=(H100000)+48Valeur des centaines affecteacute en ascii(48=0)

HH=(H10000)10

hum[1]=HH+48Valeur des dizaines affecteacute en ascii

HH=(H1000)10

hum[2]=HH+48Valeur des uniteacutes affecteacute en ascii

hum[3]=44Virgule affecteacute en ascii

HH=(H100)10

hum[4]=HH+48Valeur de la premiegravere deacutecimale affecteacute en ascii

HH=(H10)10

hum[5]=HH+48Valeur de la deuxiegraveme deacutecimale affecteacute en ascii

hum[6]=37Pourcentage affecteacute en ascii

if(cond==50)Appel la fonction LCD tous les 1000

lcd(1 1 8 humtxt)Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 7 hum)Affiche la chaine de caractegravere hum sur le LCD

cond=0Remise a 0 de la condition

Xbee(7 hum) Envoi la chaicircne de caractegravere hum dans la fonction xbee

Fonction tempeacuterature

void temperature(int cond)

char temp[7] temptxt[]=Temperature LSB

signed char MSB

I2C_Start()Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90)Mode de controcircle en mode eacutecriture

I2C_Wr(0xAA)Lecture de la tempeacuterature

I2C_Stop()Arrecirct du sigal

I2C_Start()Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x91)Mode de controcircle en mode lecture

MSB = I2C_Rd(1)Nombre signeacute donnant la tempeacuterature entre +125deg et -55degC

LSB = I2C_Rd(0)Si bit 7 = 1 tempeacuterature MSB +05degC

I2C_Stop()Arrecirct du sigal

if(MSBlt0)

MSB = abs(MSB) Si temperature neacutegative valeur absolue de MSB

Temp[0]=45 Signe - affecteacute en ascii

else

Station meacuteteacuteo autonome 2012

37

Temp[0]=43signe + affecteacute en ascii

Temp[1]=(MSB10)+48 Valeur des dizaines affecteacute en ascii

Temp[2]=(MSB10)+48 Valeur des uniteacutes affecteacute en ascii

Temp[3]=44 Virgule affecteacute en ascii

if (LSB==128) Si bit 7 agrave 1 alors +05deg

Temp[4]=5

else Si bit 7 agrave 0 alors +00deg

Temp[4]=0

Temp[5]=223 degreacute affecteacute en ascii

Temp[6]=67 C affecteacute en ascii

if(cond==50)Appel la fonction LCD tous les 1000

lcd(1 1 11 temptxt)Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 7 temp)Affiche la chaine de caractegravere hum sur le LCD

cond=0Remise a 0 de la condition

Xbee(7 temp) Envoi la chaicircne de caractegravere temp dans la fonction xbee

Fonction vent

void vent(int cond)

unsigned long tl th per

int vitfreq

char vent[13] txtvent[]=Vitesse du vent VV

if(PIR1CCP1IF==1) Test si front montant agrave lieu

TMR1H=0 Initialisation du timer1 bit de point fort

TMR1L=0 Initialisation du timer1 bit de point faible

th=CCPR1H Les valeurs sont copieacute dans des variables

tl=CCPR1L

th=thltlt8 Deacutecalage car th =gt bit de point fort

per = th|tl On concategravene les deux valeurs nous obtenons la peacuteriode

PIR1CCP1IF=0 Remise a 0 du drapeau

if(PIR1TMR1IF==1) Si deacutepassement du timer 1

per=65535+per On ajoute une retenue lorsquon a fait un tour (16bit)

PIR1TMR1IF=0 Remise a 0 du drapeau deacutepassement

Station meacuteteacuteo autonome 2012

38

freq=671310perCalacul de la freacutequence

vit=freq179 + 692Calcul de la vitesse que lon x100

if(vitlt200)En dessous 2ms la mesure est aleacuteatoire agrave cause du 2egraveme deacutebordement

vit=0

vent[0]=(vit10000)+48Valeur des centaines affecteacute en ascii(48=0)

VV=(vit1000)10

vent[1]=VV+48Valeur des dizaines affecteacute en ascii

VV=(vit100)10

vent[2]=VV+48Valeur des uniteacute affecteacute en ascii

VV=(vit10)10

vent[3]=44Virgule affecteacute en ascii

vent[4]=VV+48Valeur de la 1er deacutecimale affecteacute en ascii

VV=vit10

vent[5]=VV+48Valeur de la 2egraveme deacutecimale affecteacute en ascii

vent[6]=109m affecteacute en ascii

vent[7]=47 affecteacute en ascii

vent[8]=115s affecteacute en ascii

if(cond==50)Appel la fonction LCD tous les 1000

lcd(1 1 15 txtvent)Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 9 vent)Affiche la chaine de caractegravere hum sur le LCD

cond=0Remise a 0 de la condition

Xbee(9 vent) Envoi la chaicircne de caractegravere vent dans la fonction xbee

Fonction affichage

void lcd(int li int co int nb char receive[15])

int i

for(i=0 iltnb i++)Boucle for

Lcd_chr(li (co+i) receive[i])Affiche les caractegraveres jusquagrave i

Usart

void xbee(int nb char receive[15])

int i

Usart_Init(9600)Vitesse de transmission

for(i=0 iltnb i++)Boucle for

Usart_Write(receive[i])Envoi les caractegraveres sur lHyperTerminal jusquagrave i

Station meacuteteacuteo autonome 2012

6

Pour cacircbler lrsquoeacutecran LCD nous nous sommes aideacutes de sa datasheet ainsi que lrsquoaide du logiciel

MikroC Le point qui nous semble important est la borne R(read)W(write) On peut voir qursquoelle est

connecteacutee agrave la masse En effet pour eacutecrire sur lrsquoeacutecran il faut mettre RW = 0 pour lire on le met agrave 1

B Programme pour lrsquoeacutecran LCD

Voici un petit exemple de programme qui utilise agrave la fois le bouton poussoir et qui affiche du

texte sur lrsquoeacutecran LCD void main()

int cond=0 BP=0

Initialisation et affectation des ports

PORTB=0 Initialisation du port B

PORTA=0 Initialisation du port A

TRISB=0 Le port B affecteacute en sortie

TRISA = 0xFF Port A en entreacutee

ADCON1 = 0x84 RA2 en entreacutee

Configuration et initialisation de leacutecran LCD

Lcd_Config(ampPORTB 0 1 WR 5 4 3 2) Configure leacutecran

Lcd_Init(ampPORTB) initialisation du LCD

Lcd_Cmd(Lcd_CURSOR_OFF) Enlegraveve le curseur

Lcd_Cmd(Lcd_CLEAR) Efface leacutecran

Boucle infini

while(1)

cond=cond+1

switch(BP)

case 0

if(PORTAF2==1) Ces if permet de changer la valeur de BP

BP=1

Delay_ms(250) Temps quon relacircche bien le bouton

if(cond==1000)

Lcd_Cmd(Lcd_CLEAR)

Lcd_Out(1 1 Bonjour) Affiche Bonjour ligne 1 colonne 1

break

case 1

if(PORTAF2==1)

BP=0

Delay_ms(250)

if(cond==1000)

Lcd_Cmd(Lcd_CLEAR)

Lcd_Out(1 1 Mme Leymarie )

break

Station meacuteteacuteo autonome 2012

7

Fonctionnement de ce programme

Affiche laquo bonjourhellip raquo sur lrsquoeacutecran LCD

Appuie sur le BP

Affiche laquo Mme Leymarie raquo sur lrsquoeacutecran LCD

Appuie sur le BP

Affiche laquo bonjourhellip raquo sur lrsquoeacutecran LCD

Etc

Les fonctions de lrsquoeacutecran LCD sont expliqueacutees dans lrsquoaide du logiciel MikroC La variable laquo cond raquo

est une condition pour ne pas afficher le mot agrave chaque boucle mais tous les 1000 iteacuterations ce qui

permet de ne pas faire clignoter lrsquoeacutecran ADCON1 sera expliqueacute agrave la suite de ce rapport

VII Le capteur drsquohumiditeacute

Apregraves avoir pris en main

lrsquoeacutecran LCD ainsi que le logiciel

nous avons deacutecideacute drsquoinstaller le

capteur drsquohumiditeacute On nous a mis

agrave disposition un capteur

drsquohumiditeacute de reacutefeacuterence HIH-

4000-001 Crsquoest un capteur qui

renvoie une tension analogique

(cf figure 4) Nous avons

commenceacute par chercher sa

datasheet et regarder les

proprieacuteteacutes du capteur

A Caracteacuteristiques du capteur drsquohumiditeacute

Voici les proprieacuteteacutes importantes du capteur donneacutee par la notice

Gamme dhumiditeacute 0 agrave 100 RH (Relative Humidity) avec une Preacutecision de plusmn 35 RH

Gamme de tension dalimentation 4V agrave 58V

Tempeacuterature de fonctionnement -40degC agrave +85degC (-40 degF to 185 degF)

Courant alimentation 500μA

Sortie Analogique

Figure 4 Capteur dhumiditeacute HIH 4000-001

Station meacuteteacuteo autonome 2012

8

Pour ce qui est lrsquoeacutequation de la tension

en fonction de lrsquohumiditeacute le constructeur nous

donne la courbe drsquoeacutetalonnage suivante (cf

figure 5)

De cette courbe nous en avons tireacute les

valeurs suivantes (cf figure 6)

Nous avons ensuite deacutecideacute de la retracer sur Excel et drsquoen tirer llsquoeacutequation qui sera utiliseacute dans le

programme du microcontrocircleur

On voit qursquoExcel nous donne lrsquoeacutequation suivante

U=0031H +081

Donc H= (U-081)0031

De plus nous multiplierons par 1000 la valeur de H pour pouvoir reacutecupeacuterer les chiffres

deacutecimales et les rentrer dans une chaine de caractegraveres et les afficher sur lrsquoeacutecran LCD H=

(U810)0031

La valeur maximum de H est donc de 100 000 nous la deacuteclarerons donc en long (une

deacuteclaration en int ne serais pas suffisant -32768 agrave 32767)

Figure 5 Courbes donneacutee par le constructeur

Figure 6 tableau de mesure

Figure 7 Courbe traceacute sur Excel

Station meacuteteacuteo autonome 2012

9

Nous avons remarqueacute sur la courbe ainsi qursquoen simulation que le capteur peut avoir des

valeurs supeacuterieur agrave 100 et infeacuterieur agrave 0 Il faudra donc mettre deux conditions pour ne pas

deacutepasser la plage de valeur

B Configuration du microcontrocircleur

Maintenant nous arrivons agrave point important de cette partie celle de la configuration des

ports du microcontrocircleur En effet le PIC16F876 est constitueacute drsquoun module convertisseur agrave 5 entreacutees

Ces entreacutees sont situeacutees sur les bornes RA0 RA1 RA2 RA3 et RA5 (cf figure1) Le reacutesultat de la

conversion est codeacute sur 10 bits Crsquoest une valeur comprise entre hrsquo000rsquo et hrsquo3FFrsquo

hlsquo3FFrsquo = brsquo1 1111 1111rsquo = drsquo1023rsquo

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 eacutequation

U = (Valeur lue sur le CAN 5)1023

Pour les mecircme raison que lrsquoeacutequation du capteur drsquohumiditeacute nous avons multiplieacute par

1000 la tension nous obtenons donc U= (Valeur lue sur le CAN 5000)1023

Il faut ensuite reacutegler les entreacutees analogiques avec les registres ADCON0 et ADCON1 en

sachant que nous avons deacutecideacute 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 (Freacutequence drsquooscillation)2

01= Fosc8

10= Fosc32

11= Oscillateur RC interne

Pour que la conversion soit correct il faut que T(ad) soit au minimum de 16micros nous

disposons drsquoun quartz de 20Mhz =gt 20Mhz32 =gt 16micros Nous mettrons donc le bit 7 agrave 1 et

le 6 agrave 0

Bit 5 bit4 et bit 3 CHS2 CHS1 et CHS0 = Channel Select bits

Ces 3 bits permettent de choisir lentreacutee qui va ecirctre convertie

Station meacuteteacuteo autonome 2012

10

Nous voulons convertir lrsquoentreacutee RA0 pour cela il faut mettre les bits 5 4 3 agrave 0

Bit 2 GODONE Status bit si ADON=1

1 = Deacutemarre la conversion AD Ce bit est remis agrave 0 par hard

0 = La conversion AD est termineacutee

Il nous faut deacutemarrer la conversion

Bit 1 Bit non implanteacute

Bit 0 ADON AD on bit

1= Convertisseur AD en service

0 = Convertisseur AD agrave larrecirct

Il nous faut mettre le convertisseur en service

ADCON0 = brsquo1000 0101rsquo = hrsquo85rsquo

Bit 7 ADFM = AD Result format

1 = Justifieacute agrave droite

0 = Justifieacute agrave gauche

Nous avons justifieacute agrave droite

Bit 6 bit 5 et bit 4 Bits non impleacutementeacutes

Bit 3 bit 2 bit 1 et bit 0 PCFG3 PCFG2 PCFG1 et PCFG0

Bits de controcircle de la configuration des Ports

Ces bits permettent de choisir le partage entre entreacutees analogiques et digitales sur les PORTS A et E

On a choisi drsquoactiver RA0 RA1 et RA3 en entreacutee analogique les autres resteront en

digitales ce qui signifie qursquoau vue de la datasheet il faut mettre le bit 2 agrave 1 et les autres agrave 0

ADCON1 = brsquo10000100rsquo = hrsquo84rsquo

Station meacuteteacuteo autonome 2012

11

C Le scheacutema du microcontrocircleur avec le capteur drsquohumiditeacute

Voici le scheacutema de cacircblage du capteur drsquohumiditeacute uniquement A noter que le capteur est

remplaceacute par un potentiomegravetre nrsquoeacutetant pas dans la librairie de Proteus On constate qursquoil est bien

brancheacute sur RA0

D Programme pour la mesure de lrsquohumiditeacute

Voici le programme pour mesurer lrsquohumiditeacute avec les affectations deacutecrites ci-dessus ainsi

que les eacutequations de conversions

Deacuteclaration des fonctions

void humidite(int cond)

void lcd(int li int co int nb char receive[11])

void main()

deacuteclaration des variables

int cond=0 Condition pour laffichage sur leacutecran LCD

Initialisation et affectation des ports

PORTB=0 initialisation

TRISB=0 Port B deacuteclarer en sortie

TRISA = 0xFF Port A en entreacutee

ADCON1 = 0x84 Justifieacute agrave droite active RA0RA1RA3 analogique

ADCON0 = 0x85 Fosc32 sur PA0 en service

Configuration et initialisation de leacutecran LCD

Lcd_Config(ampPORTB 0 1 WR 5 4 3 2) Configure leacutecran

Lcd_Init(ampPORTB) initialisation du LCD

Lcd_Cmd(Lcd_CURSOR_OFF) Enlegraveve le curseur

Lcd_Cmd(Lcd_CLEAR) Efface leacutecran

Figure 8 Scheacutema de cacircblage du capteur dhumiditeacute

Station meacuteteacuteo autonome 2012

12

Boucle infinie

while(1)

cond=cond+1 Increacutemente la variable cond

humidite(ampcond) Appel la fonction humiditeacute

Fonction humiditeacute

void humidite(int cond)

long H U VL Deacuteclaration des variables

char HH hum[8] humtxt[]=Humidite

VL=Adc_read(0) Valeur lue sur RA0(humiditeacute)

U=(VL5000)1023 Convertit la valeur lue en tension x1000

H=(U-810)(0031) Convertit la tension en humiditeacute x1000

if(Hgt100000) Si H gt 100(impossible) alors = 100

H=100000

if(Hlt0) Si H lt 0(impossible) alors = 0

H=0

hum[0]=(H100000)+48 Valeur des centaines affecteacute en ascii(48=0)

HH=(H10000)10

hum[1]=HH+48 Valeur des dizaines affecteacute en ascii

HH=(H1000)10

hum[2]=HH+48 Valeur des uniteacutes affecteacute en ascii

hum[3]=44Virgule affecteacute en ascii

HH=(H100)10

hum[4]=HH+48 Valeur de la premiegravere deacutecimale affecteacute en ascii

HH=(H10)10

hum[5]=HH+48 Valeur de la deuxiegraveme deacutecimale affecteacute en ascii

hum[6]=37 Pourcentage affecteacute en ascii

if(cond==1000)Appel la fonction LCD tous les 1000

lcd(1 1 10 humtxt) Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 7 hum) Affiche la chaine de caractegravere hum sur le LCD

cond=0 Remise a 0 de la condition

Fonction affichage

void lcd(int li int co int nb char receive[11])

int i

for(i=0 ilt=nb i++)Boucle for

Lcd_chr(li (co+i) receive[i]) Affiche les caractegraveres jusquagrave i

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

Station meacuteteacuteo autonome 2012

13

VIII Le capteur de tempeacuterature

A preacutesent comme toute station meacuteteacuteo

nous avons installeacute un capteur de tempeacuterature le

DS1621 Ce capteur communique avec le

microcontrocircleur gracircce au protocole I2C

A Le protocole I2C

Le bus I2C (Inter Integrated Circuit) a eacuteteacute deacuteveloppeacute au deacutebut des anneacutees 80 par Philips

semiconductors pour permettre de relier facilement agrave un microprocesseur les diffeacuterents circuits dun

teacuteleacuteviseur moderne

Le bus I2C permet de faire communiquer entre eux des composants eacutelectroniques tregraves divers

gracircce agrave seulement trois fils Un signal de donneacutee (SDA) un signal dhorloge (SCL) et un signal de

reacutefeacuterence eacutelectrique (Masse)

Ceci permet de reacutealiser des eacutequipements ayant des fonctionnaliteacutes tregraves puissantes (En

apportant toute la puissance des systegravemes micro programmeacutes) et conservant un circuit imprimeacute tregraves

simple par rapport un scheacutema classique (8bits de donneacutees 16 bits dadresse + les bits de controcircle)

Les donneacutees sont transmises en seacuterie agrave 100Kbitss en mode standard et jusquagrave 400Kbitss en

mode rapide Ce qui ouvre la porte de cette technologie agrave toutes les applications ougrave la vitesse nest

pas primordiale

Voici un exemple de protocole qursquoutilise le bus I2C

1 Pour initier le dialogue le maicirctre creacutee une condition Start

2 Le maicirctre envoie ladresse de lesclave (1010100) suivi du bit 0 (bit Write)

3 Lesclave reacutepond (accuseacute de reacuteception bit Acknowledge)

4 Le maicirctre envoie ladresse du registre (0x04) agrave eacutecrire

5 Lesclave reacutepond (accuseacute de reacuteception bit Acknowledge)

6 Le maicirctre envoie la donneacutee (0x27) agrave eacutecrire

7 Lesclave eacutecrit la donneacutee puis envoie un accuseacute de reacuteception (bit Acknowledge)

8 Le maicirctre termine le dialogue avec une condition Stop

9 Le bus I2C est maintenant libre (SCL = 1 SDA = 1 niveaux de repos)

Figure 9 scheacutema du DS1621

Station meacuteteacuteo autonome 2012

14

B Caracteacuteristique du DS1621

Comme on peut voir sur la figure 9 le capteur est composeacute de 8 bornes

SDA =gt Liaison seacuterie entreacutee sortie

SCL =gt Signal drsquohorloge

Tout =gt Signal de sortie du thermostat (inutile dans notre cas)

GND =gt Masse

VDD =gt Alimentation +5V

A0 A1 A2 =gt Entreacutee drsquoadressage (dans notre cas les 3 agrave la masse car nous nrsquoavons qursquoun

module I2C)

Les circuits connecteacutes sur un bus I2C ont des sorties de type drain ouvert (ou collecteur

ouvert) Deux reacutesistances de pull-up sont bien sucircr placeacutees entre les lignes SDA SCL et lalimentation

(VDD)Quand le bus nest pas utiliseacute SDA et SCL sont au niveau haut (niveau de repos)

1 Speacutecificiteacute des commandes

Tous dialogue du maicirctre(PIC16F876) avec un DS1621 esclave doit deacutebuter par lrsquoenvoi drsquoun

mot de controcircle

Le maicirctre envoi ensuite une commande suivi ou non de donneacutees Voici la liste des

commandes avec leur description

Les commandes AC EE et 22 ne sont pas suivies de lenvoi de donneacutees Par contre la

commande AA qui nous inteacuteresse est suivie de lrsquoenvoi par le DS1621 de 2 octets repreacutesentant la

tempeacuterature

Station meacuteteacuteo autonome 2012

15

Voici le registre de configuration(AC) qursquoil nous faut deacuteterminer

DONE 1 = conversion finie 0 = conversion en cours En mode 1 SHOT uniquement

THF Flag seuil haut du thermostat Passe agrave 1 et y reste si tempeacuterature supeacuterieure agrave TH

TLF Flag seuil bas du thermostat Passe agrave 1 et y reste si tempeacuterature infeacuterieure agrave TL

NVB 1 = meacutemoire EEPROM en eacutecriture 0 = meacutemoire EEPROM eacutecriture termineacutee

Nous nrsquoactiverons pas lrsquoeacutecriture de la meacutemoire

POL Polariteacute de Tout (pin 3) 1 = actif sera un niveau HAUT 0 = actif sera un niveau BAS

Il faut activer la polariteacute donc nous le mettons agrave 1

ONE SHOT 0 = conversion en continu 1 = conversion 1 fois

Nous le mettons en mode continu

AC = brsquo00001010rsquo = hrsquo0Arsquo

La commande AA qui permet de lire la tempeacuterature renvoie 2 octets

MSB (Most Significant Bit) Nombre signeacute donnant la tempeacuterature entre +125deg et -55degC

LSB (Least Significant Bit ) Seul le bit 7 de cet octet est significatif Si 1 tempeacuterature

MSB +05degC

Pour bien comprendre comment est codeacute un nombre signeacute un tableau avec des exemples de

valeurs eacutetait agrave notre disposition dans la notice

Station meacuteteacuteo autonome 2012

16

2 Dialogue I2C pour avoir la tempeacuterature

Voici un scheacutema qui montre le dialogue agrave effectuer entre le microcontrocircleur et le capteur

pour avoir la tempeacuterature Crsquoest gracircce agrave ce mecircme scheacutema que nous avons pu programmer le PIC

Station meacuteteacuteo autonome 2012

17

C Le scheacutema du microcontrocircleur avec le capteur de tempeacuterature

Voici le scheacutema du capteur de tempeacuterature uniquement Le capteur est brancheacute sur les

borne SCL(RC3) et SDA(RC4) du PIC Qursquoelles soient deacuteclareacutees en entreacutee ou en sortie les bornes SCL et

SDA sont fonctionnelles Il ne faut pas oublier les reacutesistances de tirages (R1 et R3) Lrsquoadressage A0 A1

A2 toutes misent agrave la masse car nous nrsquoavons qursquoun seul capteur I2C relieacute au PIC et le Tout

(thermostat) inutile car nous faisons juste un releveacute de tempeacuterature

D Programme pour la mesure de la tempeacuterature

Deacuteclaration des fonctions

void temperature(int cond)

void lcd(int li int co int nb char receive[14])

void main()

deacuteclaration des variables

int cond=0Condition pour laffichage sur leacutecran LCD

Initialisation et affectation des ports

PORTB=0 initialisation

PORTC=0

TRISB=0 Port B deacuteclarer en sortie

TRISC = 0xFF Port C en entreacutee

Configuration et initialisation de leacutecran LCD

Lcd_Config(ampPORTB 0 1 WR 5 4 3 2) Configure leacutecran

Lcd_Init(ampPORTB) initialisation du LCD

Lcd_Cmd(Lcd_CURSOR_OFF) Enlegraveve le curseur

Lcd_Cmd(Lcd_CLEAR) Efface leacutecran

Initialisation du module I2C

I2C_Init(100000) initialisation de la communication I2C

I2C_Start() Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90) Mode de controcircle en mode eacutecriture

I2C_Wr(0xAC) Accegraves au registre de configuration

I2C_Wr(0x0A) Registre de configuration mesure en continu

I2C_Stop() Arrecirct du signal

I2C_Start() Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90) Mode de controcircle en mode eacutecriture

Figure 10 Scheacutema de cacircblage avec le capteur de tempeacuterature

Station meacuteteacuteo autonome 2012

18

I2C_Wr(0xEE) Deacutebut de la conversion

I2C_Stop()Arrecirct du sigal

Boucle infinie

while(1)

cond=cond+1 Increacutemente la variable cond

temperature(ampcond) Appel la fonction humiditeacute

Fonction tempeacuterature

void temperature(int cond)

char temp[7] temptxt[]=Temperature LSB

signed char MSB

I2C_Start() Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90) Mode de controcircle en mode eacutecriture

I2C_Wr(0xAA) Lecture de la tempeacuterature

I2C_Stop() Arrecirct du signal

I2C_Start() Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x91) Mode de controcircle en mode lecture

MSB = I2C_Rd(1) Nombre signeacute donnant la tempeacuterature entre +125deg et -55degC

LSB = I2C_Rd(0) Si bit 7 = 1 tempeacuterature MSB +05degC

I2C_Stop() Arrecirct du signal

if(MSBlt0)

MSB = abs(MSB) Si tempeacuterature neacutegative valeur absolue de MSB

Temp[0]=45 Signe - affecteacute en ascii

else

Temp[0]=43 signe + affecteacute en ascii

Temp[1]=(MSB10)+48 Valeur des dizaines affecteacute en ascii

Temp[2]=(MSB10)+48 Valeur des uniteacutes affecteacute en ascii

Temp[3]=44 Virgule affecteacute en ascii

if (LSB==128) Si bit 7 agrave 1 alors +05deg

Temp[4]=5

Else Si bit 7 agrave 0 alors +00deg

Temp[4]=0

Temp[5]=223 degreacute affecteacute en ascii

Temp[6]=67 C affecteacute en ascii

if(cond==10) Appel la fonction LCD tous les 1000

lcd(1 1 13 temptxt) Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 6 temp) Affiche la chaine de caractegravere hum sur le LCD

cond=0 Remise a 0 de la condition

Fonction affichage

void lcd(int li int co int nb char receive[14])

int i

for(i=0 ilt=nb i++)Boucle for

Lcd_chr(li (co+i) receive[i]) Affiche les caractegraveres jusquagrave i

Le scheacutema preacuteceacutedent est bien respecteacute comme on peut le voir crsquoest tregraves facile agrave programmer

gracircce aux librairies I2C du logiciel MikroC

Station meacuteteacuteo autonome 2012

19

IX Lrsquoaneacutemomegravetre

A Conception

Pour lrsquoaneacutemomegravetre lrsquoeacutequipe peacutedagogique

nous a juste fourni lrsquoheacutelice du capteur donc il a fallu

concevoir toute la partie eacutelectronique Lrsquoideacutee est

drsquoinstaller une diode et un transistor photonique par

de lagrave lrsquoheacutelice et lorsqursquoelle tourne elle vient couper le

faisceau Succinctement le transistor envoit soit 1 soit

0 sur le PIC Le but est de relever la freacutequence agrave

laquelle tourne lrsquoheacutelice puis la convertir en vitesse (cf

figure 11)

La photodiode choisie est de reacutefeacuterence SD5455-3 Ce choix a eacuteteacute fait car lrsquoangle du faisceau

est de 20deg pour que le flux infrarouge soit bien concentreacute sur le phototransistor pour un

fonctionnement optimal

Comme on le voit sur le scheacutema de principe (cf figure 11) il a fallu dimensionner la

reacutesistance qui sert agrave reacuteguler le courant qui circule dans la LED avec les informations donneacutees par la

documentation technique nous avons pu la calculer

Forward voltage VF = 17V et IF = 01A

Ualim = 5V

RD = (Ualim ndash UF)IF = (5 ndash 17)01

RD = 33Ω

Pour le phototransistor nous avons choisi celui qui allait avec la diode de reacutefeacuterence SE5455-3

Cette fois la valeur de la reacutesistance nous eacutetait donneacute par le constructeur

RL=1000Ω

Lors des seacuteances nous avons implanteacute la diode et le

transistor sur le support du capteur Pour des raisons

pratiques et estheacutetiques nous avons seacutepareacute la partie

aneacutemomegravetre et la partie platine par des borniers (cf figure

12)

Figure 11 scheacutema descriptif de laneacutemomegravetre

Figure 12 Notre aneacutemomegravetre

Station meacuteteacuteo autonome 2012

20

B Mesure de la peacuteriode sur le microcontrocircleur

Le but est de relever la peacuteriode du signal envoyer par lrsquoaneacutemomegravetre pour cela le PIC est

eacutequipeacute drsquoun mode capture Le principe est de recopier agrave un moment voulu la valeur du timer 1 La

capture peut avoir lieux agrave chaque front descendant agrave chaque front montant tous les 4 ou tous les 16

fronts montants Quand la capture a eu lieu un flag est mis agrave 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 constitueacute de 2 registres de 8 bits TMR1H et TMR1L que lon peut lire ou eacutecrire Le registre TMR1

(constitueacute de TMR1H et TMR1L) sincreacutemente de h0000 jusquagrave hFFFF et repasse ensuite agrave h0000

pour continuer le comptage Quand il y a deacutebordement une interruption peut ecirctre geacuteneacutereacutee si on lrsquoa

autoriseacutee par TMR1IE =1 (bit 0 de PIE1) et le Flag TMR1IF (bit 0 de PIR1) passe agrave 1 Le controcircle du

timer 1 ce fait par le registre T1CON

Bit 7 et bit 6 bits non impleacutementeacutes

Bit 5 et bit 4 T1CKPS = Seacutelection du preacute diviseur placeacute avant le TIMER

Vu qursquoon a un quartz eacuteleveacute nous avons deacutecideacute de choisir un preacute-diviseur de 8 donc

F=Fosc(48) Pour cela mettre les bit 4 et 5 agrave 1

Bit 3 T1OSCEN Bit dautorisation de loscillateur du Timer 1

1 = oscillateur autoriseacute

0 = oscillateur stoppeacute

Oscillateur interne inutile donc bit 3 agrave 0

Bit 2 T1SYNC Bit de controcircle de la synchronisation du CLK externe

1 = Pas de synchronisation de lhorloge externe

0 = Synchronisation de lhorloge externe

Nous nous mettrons en mode synchrone

Bit1 TMR1CS Bit de seacutelection de la source horloge

1 = Mode Compteur Clk externe sur la broche PC0 ou Quartz entre PC0 et PC1

0 = Mode Timer Clk interne = Fosc4

Station meacuteteacuteo autonome 2012

21

On mettra ce bit agrave 0 car on utilise le mode Timer

Bit 0 TMR1ON Bit dautorisation du Timer 1

1 = Timer 1 en service

0 = Timer 1 stoppeacute

Il faut eacutevidemment mettre la timer 1 en service

Nous avons aussi autoriseacute le deacutebordement du timer 1 pour avoir plus de preacutecisions pour cela il faut

mettre la commande PIE1TMR1 agrave 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 parameacutetrer le registre

CCP1CON

Bit 7 et Bit 6 bits non impleacutementeacutes

Bit 5 et Bit 4 CCP1X et CCP1Y

Bits non utiliseacutes 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 agrave Bit 0 CCP1M3 agrave CCP1M0 bits de seacutelection du mode

Nous avons seacutelectionneacute le mode capture sur chaque front montant Pour cela nous avons

mis les bits 1 et 3 agrave 0 et les bits 0 et 2 agrave 1

Pour savoir si un front montant agrave eu lieu le flag CCP1F est mis agrave 1 Ce flag doit ecirctre remis agrave 0 par

lrsquoutilisateur La valeur des 16 bits des registres du Timer 1 TMR1L (bit de poids faible) et TMR1H (bit

de poids fort) sont recopieacutees dans les registres CCPR1 CCPRIH (bit de poids faible) et CCPR1L (bit de

poids fort)

Nous avons programmeacute le mode capture de faccedilon agrave afficher sur lrsquoeacutecran LCD la valeur du registre

CCPR1 crsquoest-agrave-dire la peacuteriode du signal de lrsquoaneacutemomegravetre Il ne nous reste maintenant plus qursquoagrave

eacutetalonner notre aneacutemomegravetre

Station meacuteteacuteo autonome 2012

22

C Etalonnage de lrsquoaneacutemomegravetre

Pour eacutetalonner le capteur nous avons commenceacute par savoir agrave quelle freacutequence correspond la

valeur releveacutee par le mode capture Pour cela nous avons brancheacute un GBF agrave la place du capteur et

avec un oscilloscope nous avons compareacute leurs valeurs

Nous avons ensuite traceacute agrave lrsquoaide des valeurs du tableau la courbe F(Hz) en fonction du

compteur De cette courbe nous relevons lrsquoeacutequation

F = 671310compteur^(-101)

Soit environ F = 671310compteur

Puis nous avons brancheacute notre aneacutemomegravetre sur le microcontrocircleur Cela dans le but de

relever sa peacuteriode sur lrsquoeacutecran LCD agrave lrsquoaide drsquoune soufflerie variable et du manomegravetre GDH (reacutef

121552 200-13) nous avons compareacute leurs valeurs pour connaitre lrsquoeacutetalonnage de notre capteur

Nous avons noteacute plusieurs valeurs puis traceacute diffeacuterentes courbe pour trouver les eacutequations qui nous

permettrons de calculer la vitesse dans notre programme

Station meacuteteacuteo autonome 2012

23

Voici les valeurs que nous avons releveacutees puis la courbe traceacutee sur Excel

De cette courbe nous obtenons lrsquoeacutequation

Vitesse du vent = 0179F + 0629

Nous les multiplierons par 100 pour reacutecupeacuterer les deacutecimales et les implanter dans une chaine

de caractegravere

Vitesse du vent = 179F + 629

Nous avons agrave preacutesent agrave notre disposition toutes les eacutequations neacutecessaires pour pouvoir

convertir la valeur releveacutee par le mode capture en une vitesse

D Le scheacutema du microcontrocircleur avec lrsquoaneacutemomegravetre

On voit sur le scheacutema que le capteur est bien relieacute sur la borne RC2 Nous avons aussi

repreacutesenteacute les borniers J1 et J2 A droite tous ce qui est sur le support et agrave gauche tous ce qui est sur

la platine

Figure 13 Scheacutema avec laneacutemomegravetre

Station meacuteteacuteo autonome 2012

24

E Programme pour la mesure de la vitesse du vent

Voici le programme pour mesurer la vitesse du vent avec les affectations deacutecrites ci-dessus

ainsi que les eacutequations de conversions

Deacuteclaration des fonctions

void vent(int cond)

void lcd(int li int co int nb char receive[20])

void main()

deacuteclaration des variables

int cond=0

Initialisation et affectation des ports

PORTB=0 initialisation

PORTC=0 initialisation

TRISC=0x04 Port C deacuteclarer en sortie sauf RC2 en mode capture

TRISB=0 Port B deacuteclarer en sortie

Configuration du mode capture

T1CON=0x31 Configuration du timer1

CCP1CON=0x05 Parameacutetrage du mode capture

PIE1TMR1IE=1 Autorise les deacutebordements du timer 1

Configuration et initialisation de leacutecran LCD

Lcd_Config(ampPORTB 0 1 WR 5 4 3 2) Configure leacutecran

Lcd_Init(ampPORTB) Initialisation du LCD

Lcd_Cmd(Lcd_CURSOR_OFF) Enlegraveve le curseur

Lcd_Cmd(Lcd_CLEAR) Efface leacutecran

Boucle infinie

while(1)

cond=cond+1

vent(ampcond)

Fonction vent

void vent(int cond)

unsigned long tl th per

int vitfreq

char vent[13] txtvent[]=vitesse du vent VV

if(PIR1CCP1IF==1) Test si front montant agrave lieu

TMR1H=0 Initialisation du timer1 bit de point fort

TMR1L=0 Initialisation du timer1 bit de point faible

th=CCPR1H Les valeurs sont copieacute dans des variables

tl=CCPR1L

th=thltlt8 Deacutecalage car th =gt bit de point fort

per = th|tl On concategravene les deux valeurs nous obtenons la peacuteriode

PIR1CCP1IF=0 Remise a 0 du drapeau

if(PIR1TMR1IF==1) Si deacutepassement du timer 1

per=65535+per On ajoute une retenue lorsquon a fait un tour (16bit)

PIR1TMR1IF=0 Remise a 0 du drapeau deacutepassement

freq=671310per Calcul de la freacutequence

vit=freq179 + 692 Calcul de la vitesse que lon x100

Station meacuteteacuteo autonome 2012

25

if(vitlt200) En dessous 2ms la mesure est aleacuteatoire agrave cause du 2egraveme deacutebordement

vit=0

vent[0]=(vit10000)+48 Valeur des centaines affecteacute en ascii(48=0)

VV=(vit1000)10

vent[1]=VV+48 Valeur des dizaines affecteacute en ascii

VV=(vit100)10

vent[2]=VV+48 Valeur des uniteacute affecteacute en ascii

VV=(vit10)10

vent[3]=44 Virgule affecteacute en ascii

vent[4]=VV+48 Valeur de la 1er deacutecimale affecteacute en ascii

VV=vit10

vent[5]=VV+48 Valeur de la 2egraveme deacutecimale affecteacute en ascii

vent[6]=109 m affecteacute en ascii

vent[7]=47 affecteacute en ascii

vent[8]=115 s affecteacute en ascii

if(cond==1000) Appel la fonction LCD tous les 1000

lcd(1 1 16 txtvent) Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 8 vent) Affiche la chaine de caractegravere hum sur le LCD

cond=0 Remise a 0 de la condition

Fonction affichage

void lcd(int li int co int nb char receive[20])

int i

for(i=0 ilt=nb i++) Boucle for

Lcd_chr(li (co+i) receive[i]) Affiche les caractegraveres jusquagrave i

Station meacuteteacuteo autonome 2012

26

X Simulation une station meacuteteacuteo autonome

Maintenant que tous nos capteurs sont installeacutes nous allons mettre agrave profit le bouton

poussoir installeacute dans la partie LCD Crsquoest-agrave-dire que nous allons rassembler tous les programmes

preacuteceacutedents pour nrsquoen faire qursquoun Il suffira drsquoappuyer sur le bouton poussoir pour faire deacutefiler les

diffeacuterentes valeurs comme une vraie station meacuteteacuteo

A La structure du programme

Boucle infinie

while(1)

cond=cond+1 Increacutemente la variable cond

switch(BP)

case 0

humidite(ampcond) Appel la fonction humiditeacute

if(PORTAF2==1) Ces if permet de changer la valeur de BP

BP=1

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250) Temps quon relacircche bien le bouton

break

case 1

temperature(ampcond) Appel la fonction tempeacuterature

if(PORTAF2==1)

BP=2

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)

break

case 2

vent(ampcond) Appel la fonction vent

if(PORTAF2==1)

BP=0

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)

break

Nous avons choisi drsquoutiliser un Switch nous avons donc juste rajouteacute une variable BP

Lorsqursquoil y a appui sur le bouton poussoir la variable BP srsquoincreacutemente et le programme passe agrave une

autre case et donc utilise une nouvelle fonction La temporisation nous donne le temps de relacirccher le

bouton pour eacuteviter de faire deacutefiler le menu sans le vouloir

Station meacuteteacuteo autonome 2012

27

B La simulation

Etant donneacute que nous ne pouvions pas prendre le mateacuteriel avec nous il eacutetait impeacuteratif de

pouvoir faire des simulations Pour cela nous avons utiliseacute un logiciel tregraves utile Proteus ISIS Ce

logiciel possegravede une tregraves grande librairie et permet de rentrer nos programmes sur le PIC virtuel

geacuteneacutereacute par le logiciel Pour simuler le capteur drsquohumiditeacute nous avons utiliseacute un potentiomegravetre Pour

celui de lrsquoaneacutemomegravetre comme pour nos mesures nous avons brancheacute virtuellement un GBF sur la

borne associeacute et observeacute son signal agrave lrsquoaide drsquoun oscilloscope

Voilagrave un aperccedilu de la simulation effectueacute sur ISIS

Veacuterification theacuteorique du vent

Vitesse du vent = 0179 37 + 0629

Vitesse du vent = 7657ms

Veacuterification theacuteorique de lrsquohumiditeacute

H= (315-081)0031

H=7548

Veacuterification theacuteorique de la

tempeacuterature

La valeur afficheacutee correspond bien

aux 27degC seacutelectionneacute sur le capteur

Station meacuteteacuteo autonome 2012

28

XI Transmission des donneacutees par liaison ZigBee

ZigBee est un protocole de haut niveau permettant la communication de petites radios agrave

consommation reacuteduite baseacutee sur le standard IEEE 802154

Cette technologie a pour but la communication de courte distance telle que le propose deacutejagrave

la technologie Bluetooth tout en eacutetant moins chegravere plus simple et avec une fiabiliteacute assez eacuteleveacutee

Dans notre projet nous nous servirons de ZigBee pour permettre une transmission par ondes

de nos donneacutees de la station meacuteteacuteo vers un ordinateur Pour cela nous avons 2 modules Xbee pro 2

platines drsquointerfaces une avec des pattes (liaison platine) et lrsquoautre avec une sortie RS232 (liaison pc)

Caracteacuteristique eacutelectrique

Les signaux Xbee ont une amplitude de 33V mais sont alimenteacutes en 5V (tension de notre

source USB) cacircbleacutes sur la bornes VIN (laquo Power input from 6-12Vdc 300mA or higher raquo) Mais

notre source nrsquoeacutetant pas assez puissante pour alimenter toute notre installation Nous utiliserons

donc une source externe de 5V qui sera utiliseacutee pour alimenter les 2 systegravemes Xbee

Description des Bornes du Xbee qui nous inteacuteresse

Station meacuteteacuteo autonome 2012

29

A Scheacutema eacutelectrique du module Xbee

Nous avons cacircbleacute la sortie TX du microcontrocircleur qui eacutemet un signal jusqursquoagrave la borne RX du

Xbee qui reacuteceptionne ce signal Apregraves la transmission se fait par onde entre les 2 modules Xbee Pour

le module qui reccediloit le signal un cacircble RS232 suffit agrave faire la liaison entre celui-ci et le PC

B Envoi des donneacutees la liaison Usart

Un USART (Universal synchronous amp Asynchronous Receiver Transmitter) est un eacutemetteur-

reacutecepteur universel En langage courant cest le composant utiliseacute pour faire la liaison entre

lordinateur et le port seacuterie Lordinateur envoie les donneacutees en parallegravele (autant de fils que de bits

de donneacutees) Il faut donc transformer ces donneacutees pour les faire passer agrave travers une liaison seacuterie qui

utilise un mecircme fil pour faire passer tous les bits de donneacutees

Constitution dune trame USART

un bit de start toujours agrave 0 servant agrave la synchronisation du reacutecepteur

les donneacutees la taille peut varier (geacuteneacuteralement entre 5 et 9 bits)

eacuteventuellement un bit de pariteacute paire ou impaire

et un bit de stop toujours agrave 1 (la dureacutee peut varier entre 1 15 et 2 temps bit)

Le niveau logique de repos est le 1

Figure 14 Trame USART

Station meacuteteacuteo autonome 2012

30

Afin de faciliter les liaisons entre peacuteripheacuteriques (PC microcontrocircleur modem hellip) des vitesses

de transmission sont normaliseacutees luniteacute baud correspondant agrave un temps bit Dans notre cas nous

choisirons une vitesse de transmission de 9600bps

C Programme drsquoenvoi des donneacutees par liaison Usart

Gracircce agrave la librairie de MikroC il est tregraves facile drsquoenvoyer des donneacutees par liaison Usart Cela

fonctionne comme pour envoyer des caractegraveres sur lrsquoeacutecran LCD Il faut juste ensuite choisir la vitesse

de transmission qui sera 9600bps Voici la fonction et un morceau du programme qui sert agrave envoyer

les caractegraveres sur Xbee et de Xbee agrave un HyperTerminal

Fonction humiditeacute

void humidite(int cond)

long H U VL Deacuteclaration des variables

char HH hum[8] humtxt[]=Humidite

helliphellip

Xbee(8 hum) Envoi la chaicircne de caractegravere hum dans la fonction xbee

Usart

void xbee(int nb char receive[20])

int i

Usart_Init(9600) Vitesse de transmission

for(i=0 ilt=nb i++) Boucle for

Usart_Write(receive[i]) Envoi les caractegraveres sur lrsquoHyperTerminal jusquagrave i

Station meacuteteacuteo autonome 2012

31

XII Estimation du coucirct du projet

On peut voir sur ce tableau que le prix de reviens pour les eacuteleacutements que nous avons utiliseacute

est de 14506euro TTC Ce qui est plutocirct oneacutereux compareacute aux stations meacuteteacuteo du marcheacute qui oscille

entre 6euro et 400euro En sachant que la nocirctre est loin drsquoecirctre finaliseacute (finition estheacutetique ergonomie et

ajout de nouvelle fonction comme la date et lrsquoheure)

Composant Quantiteacute Prix (TVA inclus) Liens Quartz 20000MHz 1 111 euro Lien

Capaciteacute 22pF 2 010 euro lien

PIC 16F876 1 427 euro lien

LCD MODULE 1 1575 euro lien

Potentiomegravetre 10KΩ 1 618 euro lien

Reacutesistance 33 Ω 1 035 euro lien

Reacutesistance 10 K Ω 2 070 euro lien

Reacutesistance 1 KΩ 3 105 euro lien

LED rouge 1 013 euro lien

DS1621 1 650 euro lien

Bouton poussoir 1 060 euro lien

Module Xbee 2 4000 euro lien

Platine dinterface (XBEE) RS232 1 1890 euro lien

Platine dinterface (XBEE) 1 1364 euro lien

Capteur drsquohumiditeacute 1 2692 euro lien

Transistor 1 561 euro lien

Diode 1 325 euro lien

Totales 1 14506 euro

Station meacuteteacuteo autonome 2012

32

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

panelsbut 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 Itrsquos also possible to measure

humidity and wind speed Then itrsquos 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 its 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 Itrsquos 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

Station meacuteteacuteo autonome 2012

33

XIV Conclusion

Ce projet sur la conception drsquoune station meacuteteacuteo autonome qui nous a eacuteteacute confieacute a eacuteteacute tregraves

enrichissant Il nous a permis de mettre en relations les connaissances acquises durant lrsquoanneacutee mais

aussi acqueacuterir de nouvelles connaissances comme le fonctionnement drsquoun microcontrocircleur En effet

nous nrsquoavions jamais programmeacute sur microcontrocircleur Il a fallu srsquoadapter et apprendre agrave utiliser des

nouveaux logiciels tels que Proteus MikroC ainsi que Labview

De cette expeacuterience nous avons aussi appris agrave ecirctre autonome Nous avons saisi que la

compreacutehension des documents techniques et des librairies eacutetait un point essentiel de notre projet

En programmation nous nrsquoavions pas le droit agrave lrsquoerreur car la moindre faute pouvait conduire le

systegraveme agrave un dysfonctionnement Ce projet nous a demandeacute beaucoup de rigueur de patience et de

temps

Toutefois nous nrsquoavons pas eu malheureusement le temps drsquoinstaller le capteur de

tempeacuterature inteacuterieure par manque de temps Plus encore nous aurions aimeacute approfondir certains

points Par exemple pouvoir installer les composants sur circuit imprimeacute et concevoir un support

viable pour en faire une vraie station meacuteteacuteo Lrsquoinstallation drsquoune girouette aurait eacuteteacute appreacuteciable

pour connaicirctre le sens du vent Aussi le programme aurait sans doute pu ecirctre encore ameacutelioreacute pour

de meilleures performances

Malgreacute ce manque de temps nous sommes tregraves satisfaits du fonctionnement de ce module

qui nous a permis de comprendre lrsquoutiliteacute des parties theacuteoriques pour lrsquoapplication et la mise en

œuvre drsquoun systegraveme Lrsquoapproche peacutedagogique de nous diriger vers les solutions sans jamais les

donner de nous laisser un grand degreacute de liberteacute et drsquoautonomie a eacuteteacute au deacutebut assez deacuteroutante

mais tregraves instructif

Enfin nous tenions agrave remercier Mme Leymarie qui nous a suivis et aiguilleacute tout au long de ce

projet

Station meacuteteacuteo autonome 2012

34

XV ANNEXES

Programme complet

Deacuteclaration 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()

deacuteclaration des variables

int cond=0Condition pour laffichage sur leacutecran LCD

int BP=0

Initialisation et affectation des ports

PORTA=0

PORTB=0 initialisation

PORTC=0

TRISB=0 Port B deacuteclarer en sortie

TRISA=0xFF Port A en entreacutee

ADCON1=0x84 Justifieacute agrave droite active RA0RA1RA3 analogique

ADCON0=0x85 Fosc32 sur PA0 en service

TRISB=0 Port B deacuteclarer en sortie

TRISC=0xFFPort C deacuteclarer en entreacutee

Configuration et initialisation de leacutecran LCD

Lcd_Config(ampPORTB 0 1 WR 5 4 3 2) Configure lecran

Lcd_Init(ampPORTB) initialisation du LCD

Lcd_Cmd(Lcd_CURSOR_OFF) Enleve le curseur

Lcd_Cmd(Lcd_CLEAR) Efface lecran

Initialisation du module I2C

I2C_Init(100000)initialisation de la communication I2C

I2C_Start()Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90)Mode de controcircle en mode eacutecriture

I2C_Wr(0xAC)Accegraves au registre de configuration

I2C_Wr(0x0A)Registre de configuration mesure en continu

I2C_Stop()Arrecirct du signal

I2C_Start()Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90)Mode de controcircle en mode eacutecriture

I2C_Wr(0xEE)Deacutebut de la conversion

I2C_Stop()Arrecirct du sigal

Station meacuteteacuteo autonome 2012

35

Configuration du mode capture

T1CON=0x31 Configuration du timer1

CCP1CON=0x05 Paramegravetrage du mode capture

PIE1TMR1IE=1 Autorise les deacutebordements du timer 1

Boucle infinie

while(1)

cond=cond+1Increacutemente la variable cond

switch(BP)

case 0

humidite(ampcond)Appel la fonction humiditeacute

if(PORTAF2==1)Ces if permet de changer la valeur de BP

BP=1

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)Temps quon relacircche bien le bouton

break

case 1

temperature(ampcond)Appel la fonction tempeacuterature

if(PORTAF2==1)

BP=2

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)

break

case 2

vent(ampcond)Appel la fonction vent

if(PORTAF2==1)

BP=0

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)

break

Fonction humiditeacute

void humidite(int cond)

long H U VLDeacuteclaration des variables

char HH hum[8] humtxt[]=Humidite

VL=Adc_read(0) Valeur lue sur RA0(humiditeacute)

U=(VL5000)1023 Convertit la valeur lue en tension x1000

H=(U-810)(0031) Convertit la tension en humiditeacute x1000

Station meacuteteacuteo autonome 2012

36

if(Hgt100000)Si H gt 100(impossible) alors = 100

H=100000

if(Hlt0)Si H lt 0(impossible) alors = 0

H=0

hum[0]=(H100000)+48Valeur des centaines affecteacute en ascii(48=0)

HH=(H10000)10

hum[1]=HH+48Valeur des dizaines affecteacute en ascii

HH=(H1000)10

hum[2]=HH+48Valeur des uniteacutes affecteacute en ascii

hum[3]=44Virgule affecteacute en ascii

HH=(H100)10

hum[4]=HH+48Valeur de la premiegravere deacutecimale affecteacute en ascii

HH=(H10)10

hum[5]=HH+48Valeur de la deuxiegraveme deacutecimale affecteacute en ascii

hum[6]=37Pourcentage affecteacute en ascii

if(cond==50)Appel la fonction LCD tous les 1000

lcd(1 1 8 humtxt)Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 7 hum)Affiche la chaine de caractegravere hum sur le LCD

cond=0Remise a 0 de la condition

Xbee(7 hum) Envoi la chaicircne de caractegravere hum dans la fonction xbee

Fonction tempeacuterature

void temperature(int cond)

char temp[7] temptxt[]=Temperature LSB

signed char MSB

I2C_Start()Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90)Mode de controcircle en mode eacutecriture

I2C_Wr(0xAA)Lecture de la tempeacuterature

I2C_Stop()Arrecirct du sigal

I2C_Start()Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x91)Mode de controcircle en mode lecture

MSB = I2C_Rd(1)Nombre signeacute donnant la tempeacuterature entre +125deg et -55degC

LSB = I2C_Rd(0)Si bit 7 = 1 tempeacuterature MSB +05degC

I2C_Stop()Arrecirct du sigal

if(MSBlt0)

MSB = abs(MSB) Si temperature neacutegative valeur absolue de MSB

Temp[0]=45 Signe - affecteacute en ascii

else

Station meacuteteacuteo autonome 2012

37

Temp[0]=43signe + affecteacute en ascii

Temp[1]=(MSB10)+48 Valeur des dizaines affecteacute en ascii

Temp[2]=(MSB10)+48 Valeur des uniteacutes affecteacute en ascii

Temp[3]=44 Virgule affecteacute en ascii

if (LSB==128) Si bit 7 agrave 1 alors +05deg

Temp[4]=5

else Si bit 7 agrave 0 alors +00deg

Temp[4]=0

Temp[5]=223 degreacute affecteacute en ascii

Temp[6]=67 C affecteacute en ascii

if(cond==50)Appel la fonction LCD tous les 1000

lcd(1 1 11 temptxt)Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 7 temp)Affiche la chaine de caractegravere hum sur le LCD

cond=0Remise a 0 de la condition

Xbee(7 temp) Envoi la chaicircne de caractegravere temp dans la fonction xbee

Fonction vent

void vent(int cond)

unsigned long tl th per

int vitfreq

char vent[13] txtvent[]=Vitesse du vent VV

if(PIR1CCP1IF==1) Test si front montant agrave lieu

TMR1H=0 Initialisation du timer1 bit de point fort

TMR1L=0 Initialisation du timer1 bit de point faible

th=CCPR1H Les valeurs sont copieacute dans des variables

tl=CCPR1L

th=thltlt8 Deacutecalage car th =gt bit de point fort

per = th|tl On concategravene les deux valeurs nous obtenons la peacuteriode

PIR1CCP1IF=0 Remise a 0 du drapeau

if(PIR1TMR1IF==1) Si deacutepassement du timer 1

per=65535+per On ajoute une retenue lorsquon a fait un tour (16bit)

PIR1TMR1IF=0 Remise a 0 du drapeau deacutepassement

Station meacuteteacuteo autonome 2012

38

freq=671310perCalacul de la freacutequence

vit=freq179 + 692Calcul de la vitesse que lon x100

if(vitlt200)En dessous 2ms la mesure est aleacuteatoire agrave cause du 2egraveme deacutebordement

vit=0

vent[0]=(vit10000)+48Valeur des centaines affecteacute en ascii(48=0)

VV=(vit1000)10

vent[1]=VV+48Valeur des dizaines affecteacute en ascii

VV=(vit100)10

vent[2]=VV+48Valeur des uniteacute affecteacute en ascii

VV=(vit10)10

vent[3]=44Virgule affecteacute en ascii

vent[4]=VV+48Valeur de la 1er deacutecimale affecteacute en ascii

VV=vit10

vent[5]=VV+48Valeur de la 2egraveme deacutecimale affecteacute en ascii

vent[6]=109m affecteacute en ascii

vent[7]=47 affecteacute en ascii

vent[8]=115s affecteacute en ascii

if(cond==50)Appel la fonction LCD tous les 1000

lcd(1 1 15 txtvent)Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 9 vent)Affiche la chaine de caractegravere hum sur le LCD

cond=0Remise a 0 de la condition

Xbee(9 vent) Envoi la chaicircne de caractegravere vent dans la fonction xbee

Fonction affichage

void lcd(int li int co int nb char receive[15])

int i

for(i=0 iltnb i++)Boucle for

Lcd_chr(li (co+i) receive[i])Affiche les caractegraveres jusquagrave i

Usart

void xbee(int nb char receive[15])

int i

Usart_Init(9600)Vitesse de transmission

for(i=0 iltnb i++)Boucle for

Usart_Write(receive[i])Envoi les caractegraveres sur lHyperTerminal jusquagrave i

Station meacuteteacuteo autonome 2012

7

Fonctionnement de ce programme

Affiche laquo bonjourhellip raquo sur lrsquoeacutecran LCD

Appuie sur le BP

Affiche laquo Mme Leymarie raquo sur lrsquoeacutecran LCD

Appuie sur le BP

Affiche laquo bonjourhellip raquo sur lrsquoeacutecran LCD

Etc

Les fonctions de lrsquoeacutecran LCD sont expliqueacutees dans lrsquoaide du logiciel MikroC La variable laquo cond raquo

est une condition pour ne pas afficher le mot agrave chaque boucle mais tous les 1000 iteacuterations ce qui

permet de ne pas faire clignoter lrsquoeacutecran ADCON1 sera expliqueacute agrave la suite de ce rapport

VII Le capteur drsquohumiditeacute

Apregraves avoir pris en main

lrsquoeacutecran LCD ainsi que le logiciel

nous avons deacutecideacute drsquoinstaller le

capteur drsquohumiditeacute On nous a mis

agrave disposition un capteur

drsquohumiditeacute de reacutefeacuterence HIH-

4000-001 Crsquoest un capteur qui

renvoie une tension analogique

(cf figure 4) Nous avons

commenceacute par chercher sa

datasheet et regarder les

proprieacuteteacutes du capteur

A Caracteacuteristiques du capteur drsquohumiditeacute

Voici les proprieacuteteacutes importantes du capteur donneacutee par la notice

Gamme dhumiditeacute 0 agrave 100 RH (Relative Humidity) avec une Preacutecision de plusmn 35 RH

Gamme de tension dalimentation 4V agrave 58V

Tempeacuterature de fonctionnement -40degC agrave +85degC (-40 degF to 185 degF)

Courant alimentation 500μA

Sortie Analogique

Figure 4 Capteur dhumiditeacute HIH 4000-001

Station meacuteteacuteo autonome 2012

8

Pour ce qui est lrsquoeacutequation de la tension

en fonction de lrsquohumiditeacute le constructeur nous

donne la courbe drsquoeacutetalonnage suivante (cf

figure 5)

De cette courbe nous en avons tireacute les

valeurs suivantes (cf figure 6)

Nous avons ensuite deacutecideacute de la retracer sur Excel et drsquoen tirer llsquoeacutequation qui sera utiliseacute dans le

programme du microcontrocircleur

On voit qursquoExcel nous donne lrsquoeacutequation suivante

U=0031H +081

Donc H= (U-081)0031

De plus nous multiplierons par 1000 la valeur de H pour pouvoir reacutecupeacuterer les chiffres

deacutecimales et les rentrer dans une chaine de caractegraveres et les afficher sur lrsquoeacutecran LCD H=

(U810)0031

La valeur maximum de H est donc de 100 000 nous la deacuteclarerons donc en long (une

deacuteclaration en int ne serais pas suffisant -32768 agrave 32767)

Figure 5 Courbes donneacutee par le constructeur

Figure 6 tableau de mesure

Figure 7 Courbe traceacute sur Excel

Station meacuteteacuteo autonome 2012

9

Nous avons remarqueacute sur la courbe ainsi qursquoen simulation que le capteur peut avoir des

valeurs supeacuterieur agrave 100 et infeacuterieur agrave 0 Il faudra donc mettre deux conditions pour ne pas

deacutepasser la plage de valeur

B Configuration du microcontrocircleur

Maintenant nous arrivons agrave point important de cette partie celle de la configuration des

ports du microcontrocircleur En effet le PIC16F876 est constitueacute drsquoun module convertisseur agrave 5 entreacutees

Ces entreacutees sont situeacutees sur les bornes RA0 RA1 RA2 RA3 et RA5 (cf figure1) Le reacutesultat de la

conversion est codeacute sur 10 bits Crsquoest une valeur comprise entre hrsquo000rsquo et hrsquo3FFrsquo

hlsquo3FFrsquo = brsquo1 1111 1111rsquo = drsquo1023rsquo

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 eacutequation

U = (Valeur lue sur le CAN 5)1023

Pour les mecircme raison que lrsquoeacutequation du capteur drsquohumiditeacute nous avons multiplieacute par

1000 la tension nous obtenons donc U= (Valeur lue sur le CAN 5000)1023

Il faut ensuite reacutegler les entreacutees analogiques avec les registres ADCON0 et ADCON1 en

sachant que nous avons deacutecideacute 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 (Freacutequence drsquooscillation)2

01= Fosc8

10= Fosc32

11= Oscillateur RC interne

Pour que la conversion soit correct il faut que T(ad) soit au minimum de 16micros nous

disposons drsquoun quartz de 20Mhz =gt 20Mhz32 =gt 16micros Nous mettrons donc le bit 7 agrave 1 et

le 6 agrave 0

Bit 5 bit4 et bit 3 CHS2 CHS1 et CHS0 = Channel Select bits

Ces 3 bits permettent de choisir lentreacutee qui va ecirctre convertie

Station meacuteteacuteo autonome 2012

10

Nous voulons convertir lrsquoentreacutee RA0 pour cela il faut mettre les bits 5 4 3 agrave 0

Bit 2 GODONE Status bit si ADON=1

1 = Deacutemarre la conversion AD Ce bit est remis agrave 0 par hard

0 = La conversion AD est termineacutee

Il nous faut deacutemarrer la conversion

Bit 1 Bit non implanteacute

Bit 0 ADON AD on bit

1= Convertisseur AD en service

0 = Convertisseur AD agrave larrecirct

Il nous faut mettre le convertisseur en service

ADCON0 = brsquo1000 0101rsquo = hrsquo85rsquo

Bit 7 ADFM = AD Result format

1 = Justifieacute agrave droite

0 = Justifieacute agrave gauche

Nous avons justifieacute agrave droite

Bit 6 bit 5 et bit 4 Bits non impleacutementeacutes

Bit 3 bit 2 bit 1 et bit 0 PCFG3 PCFG2 PCFG1 et PCFG0

Bits de controcircle de la configuration des Ports

Ces bits permettent de choisir le partage entre entreacutees analogiques et digitales sur les PORTS A et E

On a choisi drsquoactiver RA0 RA1 et RA3 en entreacutee analogique les autres resteront en

digitales ce qui signifie qursquoau vue de la datasheet il faut mettre le bit 2 agrave 1 et les autres agrave 0

ADCON1 = brsquo10000100rsquo = hrsquo84rsquo

Station meacuteteacuteo autonome 2012

11

C Le scheacutema du microcontrocircleur avec le capteur drsquohumiditeacute

Voici le scheacutema de cacircblage du capteur drsquohumiditeacute uniquement A noter que le capteur est

remplaceacute par un potentiomegravetre nrsquoeacutetant pas dans la librairie de Proteus On constate qursquoil est bien

brancheacute sur RA0

D Programme pour la mesure de lrsquohumiditeacute

Voici le programme pour mesurer lrsquohumiditeacute avec les affectations deacutecrites ci-dessus ainsi

que les eacutequations de conversions

Deacuteclaration des fonctions

void humidite(int cond)

void lcd(int li int co int nb char receive[11])

void main()

deacuteclaration des variables

int cond=0 Condition pour laffichage sur leacutecran LCD

Initialisation et affectation des ports

PORTB=0 initialisation

TRISB=0 Port B deacuteclarer en sortie

TRISA = 0xFF Port A en entreacutee

ADCON1 = 0x84 Justifieacute agrave droite active RA0RA1RA3 analogique

ADCON0 = 0x85 Fosc32 sur PA0 en service

Configuration et initialisation de leacutecran LCD

Lcd_Config(ampPORTB 0 1 WR 5 4 3 2) Configure leacutecran

Lcd_Init(ampPORTB) initialisation du LCD

Lcd_Cmd(Lcd_CURSOR_OFF) Enlegraveve le curseur

Lcd_Cmd(Lcd_CLEAR) Efface leacutecran

Figure 8 Scheacutema de cacircblage du capteur dhumiditeacute

Station meacuteteacuteo autonome 2012

12

Boucle infinie

while(1)

cond=cond+1 Increacutemente la variable cond

humidite(ampcond) Appel la fonction humiditeacute

Fonction humiditeacute

void humidite(int cond)

long H U VL Deacuteclaration des variables

char HH hum[8] humtxt[]=Humidite

VL=Adc_read(0) Valeur lue sur RA0(humiditeacute)

U=(VL5000)1023 Convertit la valeur lue en tension x1000

H=(U-810)(0031) Convertit la tension en humiditeacute x1000

if(Hgt100000) Si H gt 100(impossible) alors = 100

H=100000

if(Hlt0) Si H lt 0(impossible) alors = 0

H=0

hum[0]=(H100000)+48 Valeur des centaines affecteacute en ascii(48=0)

HH=(H10000)10

hum[1]=HH+48 Valeur des dizaines affecteacute en ascii

HH=(H1000)10

hum[2]=HH+48 Valeur des uniteacutes affecteacute en ascii

hum[3]=44Virgule affecteacute en ascii

HH=(H100)10

hum[4]=HH+48 Valeur de la premiegravere deacutecimale affecteacute en ascii

HH=(H10)10

hum[5]=HH+48 Valeur de la deuxiegraveme deacutecimale affecteacute en ascii

hum[6]=37 Pourcentage affecteacute en ascii

if(cond==1000)Appel la fonction LCD tous les 1000

lcd(1 1 10 humtxt) Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 7 hum) Affiche la chaine de caractegravere hum sur le LCD

cond=0 Remise a 0 de la condition

Fonction affichage

void lcd(int li int co int nb char receive[11])

int i

for(i=0 ilt=nb i++)Boucle for

Lcd_chr(li (co+i) receive[i]) Affiche les caractegraveres jusquagrave i

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

Station meacuteteacuteo autonome 2012

13

VIII Le capteur de tempeacuterature

A preacutesent comme toute station meacuteteacuteo

nous avons installeacute un capteur de tempeacuterature le

DS1621 Ce capteur communique avec le

microcontrocircleur gracircce au protocole I2C

A Le protocole I2C

Le bus I2C (Inter Integrated Circuit) a eacuteteacute deacuteveloppeacute au deacutebut des anneacutees 80 par Philips

semiconductors pour permettre de relier facilement agrave un microprocesseur les diffeacuterents circuits dun

teacuteleacuteviseur moderne

Le bus I2C permet de faire communiquer entre eux des composants eacutelectroniques tregraves divers

gracircce agrave seulement trois fils Un signal de donneacutee (SDA) un signal dhorloge (SCL) et un signal de

reacutefeacuterence eacutelectrique (Masse)

Ceci permet de reacutealiser des eacutequipements ayant des fonctionnaliteacutes tregraves puissantes (En

apportant toute la puissance des systegravemes micro programmeacutes) et conservant un circuit imprimeacute tregraves

simple par rapport un scheacutema classique (8bits de donneacutees 16 bits dadresse + les bits de controcircle)

Les donneacutees sont transmises en seacuterie agrave 100Kbitss en mode standard et jusquagrave 400Kbitss en

mode rapide Ce qui ouvre la porte de cette technologie agrave toutes les applications ougrave la vitesse nest

pas primordiale

Voici un exemple de protocole qursquoutilise le bus I2C

1 Pour initier le dialogue le maicirctre creacutee une condition Start

2 Le maicirctre envoie ladresse de lesclave (1010100) suivi du bit 0 (bit Write)

3 Lesclave reacutepond (accuseacute de reacuteception bit Acknowledge)

4 Le maicirctre envoie ladresse du registre (0x04) agrave eacutecrire

5 Lesclave reacutepond (accuseacute de reacuteception bit Acknowledge)

6 Le maicirctre envoie la donneacutee (0x27) agrave eacutecrire

7 Lesclave eacutecrit la donneacutee puis envoie un accuseacute de reacuteception (bit Acknowledge)

8 Le maicirctre termine le dialogue avec une condition Stop

9 Le bus I2C est maintenant libre (SCL = 1 SDA = 1 niveaux de repos)

Figure 9 scheacutema du DS1621

Station meacuteteacuteo autonome 2012

14

B Caracteacuteristique du DS1621

Comme on peut voir sur la figure 9 le capteur est composeacute de 8 bornes

SDA =gt Liaison seacuterie entreacutee sortie

SCL =gt Signal drsquohorloge

Tout =gt Signal de sortie du thermostat (inutile dans notre cas)

GND =gt Masse

VDD =gt Alimentation +5V

A0 A1 A2 =gt Entreacutee drsquoadressage (dans notre cas les 3 agrave la masse car nous nrsquoavons qursquoun

module I2C)

Les circuits connecteacutes sur un bus I2C ont des sorties de type drain ouvert (ou collecteur

ouvert) Deux reacutesistances de pull-up sont bien sucircr placeacutees entre les lignes SDA SCL et lalimentation

(VDD)Quand le bus nest pas utiliseacute SDA et SCL sont au niveau haut (niveau de repos)

1 Speacutecificiteacute des commandes

Tous dialogue du maicirctre(PIC16F876) avec un DS1621 esclave doit deacutebuter par lrsquoenvoi drsquoun

mot de controcircle

Le maicirctre envoi ensuite une commande suivi ou non de donneacutees Voici la liste des

commandes avec leur description

Les commandes AC EE et 22 ne sont pas suivies de lenvoi de donneacutees Par contre la

commande AA qui nous inteacuteresse est suivie de lrsquoenvoi par le DS1621 de 2 octets repreacutesentant la

tempeacuterature

Station meacuteteacuteo autonome 2012

15

Voici le registre de configuration(AC) qursquoil nous faut deacuteterminer

DONE 1 = conversion finie 0 = conversion en cours En mode 1 SHOT uniquement

THF Flag seuil haut du thermostat Passe agrave 1 et y reste si tempeacuterature supeacuterieure agrave TH

TLF Flag seuil bas du thermostat Passe agrave 1 et y reste si tempeacuterature infeacuterieure agrave TL

NVB 1 = meacutemoire EEPROM en eacutecriture 0 = meacutemoire EEPROM eacutecriture termineacutee

Nous nrsquoactiverons pas lrsquoeacutecriture de la meacutemoire

POL Polariteacute de Tout (pin 3) 1 = actif sera un niveau HAUT 0 = actif sera un niveau BAS

Il faut activer la polariteacute donc nous le mettons agrave 1

ONE SHOT 0 = conversion en continu 1 = conversion 1 fois

Nous le mettons en mode continu

AC = brsquo00001010rsquo = hrsquo0Arsquo

La commande AA qui permet de lire la tempeacuterature renvoie 2 octets

MSB (Most Significant Bit) Nombre signeacute donnant la tempeacuterature entre +125deg et -55degC

LSB (Least Significant Bit ) Seul le bit 7 de cet octet est significatif Si 1 tempeacuterature

MSB +05degC

Pour bien comprendre comment est codeacute un nombre signeacute un tableau avec des exemples de

valeurs eacutetait agrave notre disposition dans la notice

Station meacuteteacuteo autonome 2012

16

2 Dialogue I2C pour avoir la tempeacuterature

Voici un scheacutema qui montre le dialogue agrave effectuer entre le microcontrocircleur et le capteur

pour avoir la tempeacuterature Crsquoest gracircce agrave ce mecircme scheacutema que nous avons pu programmer le PIC

Station meacuteteacuteo autonome 2012

17

C Le scheacutema du microcontrocircleur avec le capteur de tempeacuterature

Voici le scheacutema du capteur de tempeacuterature uniquement Le capteur est brancheacute sur les

borne SCL(RC3) et SDA(RC4) du PIC Qursquoelles soient deacuteclareacutees en entreacutee ou en sortie les bornes SCL et

SDA sont fonctionnelles Il ne faut pas oublier les reacutesistances de tirages (R1 et R3) Lrsquoadressage A0 A1

A2 toutes misent agrave la masse car nous nrsquoavons qursquoun seul capteur I2C relieacute au PIC et le Tout

(thermostat) inutile car nous faisons juste un releveacute de tempeacuterature

D Programme pour la mesure de la tempeacuterature

Deacuteclaration des fonctions

void temperature(int cond)

void lcd(int li int co int nb char receive[14])

void main()

deacuteclaration des variables

int cond=0Condition pour laffichage sur leacutecran LCD

Initialisation et affectation des ports

PORTB=0 initialisation

PORTC=0

TRISB=0 Port B deacuteclarer en sortie

TRISC = 0xFF Port C en entreacutee

Configuration et initialisation de leacutecran LCD

Lcd_Config(ampPORTB 0 1 WR 5 4 3 2) Configure leacutecran

Lcd_Init(ampPORTB) initialisation du LCD

Lcd_Cmd(Lcd_CURSOR_OFF) Enlegraveve le curseur

Lcd_Cmd(Lcd_CLEAR) Efface leacutecran

Initialisation du module I2C

I2C_Init(100000) initialisation de la communication I2C

I2C_Start() Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90) Mode de controcircle en mode eacutecriture

I2C_Wr(0xAC) Accegraves au registre de configuration

I2C_Wr(0x0A) Registre de configuration mesure en continu

I2C_Stop() Arrecirct du signal

I2C_Start() Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90) Mode de controcircle en mode eacutecriture

Figure 10 Scheacutema de cacircblage avec le capteur de tempeacuterature

Station meacuteteacuteo autonome 2012

18

I2C_Wr(0xEE) Deacutebut de la conversion

I2C_Stop()Arrecirct du sigal

Boucle infinie

while(1)

cond=cond+1 Increacutemente la variable cond

temperature(ampcond) Appel la fonction humiditeacute

Fonction tempeacuterature

void temperature(int cond)

char temp[7] temptxt[]=Temperature LSB

signed char MSB

I2C_Start() Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90) Mode de controcircle en mode eacutecriture

I2C_Wr(0xAA) Lecture de la tempeacuterature

I2C_Stop() Arrecirct du signal

I2C_Start() Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x91) Mode de controcircle en mode lecture

MSB = I2C_Rd(1) Nombre signeacute donnant la tempeacuterature entre +125deg et -55degC

LSB = I2C_Rd(0) Si bit 7 = 1 tempeacuterature MSB +05degC

I2C_Stop() Arrecirct du signal

if(MSBlt0)

MSB = abs(MSB) Si tempeacuterature neacutegative valeur absolue de MSB

Temp[0]=45 Signe - affecteacute en ascii

else

Temp[0]=43 signe + affecteacute en ascii

Temp[1]=(MSB10)+48 Valeur des dizaines affecteacute en ascii

Temp[2]=(MSB10)+48 Valeur des uniteacutes affecteacute en ascii

Temp[3]=44 Virgule affecteacute en ascii

if (LSB==128) Si bit 7 agrave 1 alors +05deg

Temp[4]=5

Else Si bit 7 agrave 0 alors +00deg

Temp[4]=0

Temp[5]=223 degreacute affecteacute en ascii

Temp[6]=67 C affecteacute en ascii

if(cond==10) Appel la fonction LCD tous les 1000

lcd(1 1 13 temptxt) Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 6 temp) Affiche la chaine de caractegravere hum sur le LCD

cond=0 Remise a 0 de la condition

Fonction affichage

void lcd(int li int co int nb char receive[14])

int i

for(i=0 ilt=nb i++)Boucle for

Lcd_chr(li (co+i) receive[i]) Affiche les caractegraveres jusquagrave i

Le scheacutema preacuteceacutedent est bien respecteacute comme on peut le voir crsquoest tregraves facile agrave programmer

gracircce aux librairies I2C du logiciel MikroC

Station meacuteteacuteo autonome 2012

19

IX Lrsquoaneacutemomegravetre

A Conception

Pour lrsquoaneacutemomegravetre lrsquoeacutequipe peacutedagogique

nous a juste fourni lrsquoheacutelice du capteur donc il a fallu

concevoir toute la partie eacutelectronique Lrsquoideacutee est

drsquoinstaller une diode et un transistor photonique par

de lagrave lrsquoheacutelice et lorsqursquoelle tourne elle vient couper le

faisceau Succinctement le transistor envoit soit 1 soit

0 sur le PIC Le but est de relever la freacutequence agrave

laquelle tourne lrsquoheacutelice puis la convertir en vitesse (cf

figure 11)

La photodiode choisie est de reacutefeacuterence SD5455-3 Ce choix a eacuteteacute fait car lrsquoangle du faisceau

est de 20deg pour que le flux infrarouge soit bien concentreacute sur le phototransistor pour un

fonctionnement optimal

Comme on le voit sur le scheacutema de principe (cf figure 11) il a fallu dimensionner la

reacutesistance qui sert agrave reacuteguler le courant qui circule dans la LED avec les informations donneacutees par la

documentation technique nous avons pu la calculer

Forward voltage VF = 17V et IF = 01A

Ualim = 5V

RD = (Ualim ndash UF)IF = (5 ndash 17)01

RD = 33Ω

Pour le phototransistor nous avons choisi celui qui allait avec la diode de reacutefeacuterence SE5455-3

Cette fois la valeur de la reacutesistance nous eacutetait donneacute par le constructeur

RL=1000Ω

Lors des seacuteances nous avons implanteacute la diode et le

transistor sur le support du capteur Pour des raisons

pratiques et estheacutetiques nous avons seacutepareacute la partie

aneacutemomegravetre et la partie platine par des borniers (cf figure

12)

Figure 11 scheacutema descriptif de laneacutemomegravetre

Figure 12 Notre aneacutemomegravetre

Station meacuteteacuteo autonome 2012

20

B Mesure de la peacuteriode sur le microcontrocircleur

Le but est de relever la peacuteriode du signal envoyer par lrsquoaneacutemomegravetre pour cela le PIC est

eacutequipeacute drsquoun mode capture Le principe est de recopier agrave un moment voulu la valeur du timer 1 La

capture peut avoir lieux agrave chaque front descendant agrave chaque front montant tous les 4 ou tous les 16

fronts montants Quand la capture a eu lieu un flag est mis agrave 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 constitueacute de 2 registres de 8 bits TMR1H et TMR1L que lon peut lire ou eacutecrire Le registre TMR1

(constitueacute de TMR1H et TMR1L) sincreacutemente de h0000 jusquagrave hFFFF et repasse ensuite agrave h0000

pour continuer le comptage Quand il y a deacutebordement une interruption peut ecirctre geacuteneacutereacutee si on lrsquoa

autoriseacutee par TMR1IE =1 (bit 0 de PIE1) et le Flag TMR1IF (bit 0 de PIR1) passe agrave 1 Le controcircle du

timer 1 ce fait par le registre T1CON

Bit 7 et bit 6 bits non impleacutementeacutes

Bit 5 et bit 4 T1CKPS = Seacutelection du preacute diviseur placeacute avant le TIMER

Vu qursquoon a un quartz eacuteleveacute nous avons deacutecideacute de choisir un preacute-diviseur de 8 donc

F=Fosc(48) Pour cela mettre les bit 4 et 5 agrave 1

Bit 3 T1OSCEN Bit dautorisation de loscillateur du Timer 1

1 = oscillateur autoriseacute

0 = oscillateur stoppeacute

Oscillateur interne inutile donc bit 3 agrave 0

Bit 2 T1SYNC Bit de controcircle de la synchronisation du CLK externe

1 = Pas de synchronisation de lhorloge externe

0 = Synchronisation de lhorloge externe

Nous nous mettrons en mode synchrone

Bit1 TMR1CS Bit de seacutelection de la source horloge

1 = Mode Compteur Clk externe sur la broche PC0 ou Quartz entre PC0 et PC1

0 = Mode Timer Clk interne = Fosc4

Station meacuteteacuteo autonome 2012

21

On mettra ce bit agrave 0 car on utilise le mode Timer

Bit 0 TMR1ON Bit dautorisation du Timer 1

1 = Timer 1 en service

0 = Timer 1 stoppeacute

Il faut eacutevidemment mettre la timer 1 en service

Nous avons aussi autoriseacute le deacutebordement du timer 1 pour avoir plus de preacutecisions pour cela il faut

mettre la commande PIE1TMR1 agrave 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 parameacutetrer le registre

CCP1CON

Bit 7 et Bit 6 bits non impleacutementeacutes

Bit 5 et Bit 4 CCP1X et CCP1Y

Bits non utiliseacutes 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 agrave Bit 0 CCP1M3 agrave CCP1M0 bits de seacutelection du mode

Nous avons seacutelectionneacute le mode capture sur chaque front montant Pour cela nous avons

mis les bits 1 et 3 agrave 0 et les bits 0 et 2 agrave 1

Pour savoir si un front montant agrave eu lieu le flag CCP1F est mis agrave 1 Ce flag doit ecirctre remis agrave 0 par

lrsquoutilisateur La valeur des 16 bits des registres du Timer 1 TMR1L (bit de poids faible) et TMR1H (bit

de poids fort) sont recopieacutees dans les registres CCPR1 CCPRIH (bit de poids faible) et CCPR1L (bit de

poids fort)

Nous avons programmeacute le mode capture de faccedilon agrave afficher sur lrsquoeacutecran LCD la valeur du registre

CCPR1 crsquoest-agrave-dire la peacuteriode du signal de lrsquoaneacutemomegravetre Il ne nous reste maintenant plus qursquoagrave

eacutetalonner notre aneacutemomegravetre

Station meacuteteacuteo autonome 2012

22

C Etalonnage de lrsquoaneacutemomegravetre

Pour eacutetalonner le capteur nous avons commenceacute par savoir agrave quelle freacutequence correspond la

valeur releveacutee par le mode capture Pour cela nous avons brancheacute un GBF agrave la place du capteur et

avec un oscilloscope nous avons compareacute leurs valeurs

Nous avons ensuite traceacute agrave lrsquoaide des valeurs du tableau la courbe F(Hz) en fonction du

compteur De cette courbe nous relevons lrsquoeacutequation

F = 671310compteur^(-101)

Soit environ F = 671310compteur

Puis nous avons brancheacute notre aneacutemomegravetre sur le microcontrocircleur Cela dans le but de

relever sa peacuteriode sur lrsquoeacutecran LCD agrave lrsquoaide drsquoune soufflerie variable et du manomegravetre GDH (reacutef

121552 200-13) nous avons compareacute leurs valeurs pour connaitre lrsquoeacutetalonnage de notre capteur

Nous avons noteacute plusieurs valeurs puis traceacute diffeacuterentes courbe pour trouver les eacutequations qui nous

permettrons de calculer la vitesse dans notre programme

Station meacuteteacuteo autonome 2012

23

Voici les valeurs que nous avons releveacutees puis la courbe traceacutee sur Excel

De cette courbe nous obtenons lrsquoeacutequation

Vitesse du vent = 0179F + 0629

Nous les multiplierons par 100 pour reacutecupeacuterer les deacutecimales et les implanter dans une chaine

de caractegravere

Vitesse du vent = 179F + 629

Nous avons agrave preacutesent agrave notre disposition toutes les eacutequations neacutecessaires pour pouvoir

convertir la valeur releveacutee par le mode capture en une vitesse

D Le scheacutema du microcontrocircleur avec lrsquoaneacutemomegravetre

On voit sur le scheacutema que le capteur est bien relieacute sur la borne RC2 Nous avons aussi

repreacutesenteacute les borniers J1 et J2 A droite tous ce qui est sur le support et agrave gauche tous ce qui est sur

la platine

Figure 13 Scheacutema avec laneacutemomegravetre

Station meacuteteacuteo autonome 2012

24

E Programme pour la mesure de la vitesse du vent

Voici le programme pour mesurer la vitesse du vent avec les affectations deacutecrites ci-dessus

ainsi que les eacutequations de conversions

Deacuteclaration des fonctions

void vent(int cond)

void lcd(int li int co int nb char receive[20])

void main()

deacuteclaration des variables

int cond=0

Initialisation et affectation des ports

PORTB=0 initialisation

PORTC=0 initialisation

TRISC=0x04 Port C deacuteclarer en sortie sauf RC2 en mode capture

TRISB=0 Port B deacuteclarer en sortie

Configuration du mode capture

T1CON=0x31 Configuration du timer1

CCP1CON=0x05 Parameacutetrage du mode capture

PIE1TMR1IE=1 Autorise les deacutebordements du timer 1

Configuration et initialisation de leacutecran LCD

Lcd_Config(ampPORTB 0 1 WR 5 4 3 2) Configure leacutecran

Lcd_Init(ampPORTB) Initialisation du LCD

Lcd_Cmd(Lcd_CURSOR_OFF) Enlegraveve le curseur

Lcd_Cmd(Lcd_CLEAR) Efface leacutecran

Boucle infinie

while(1)

cond=cond+1

vent(ampcond)

Fonction vent

void vent(int cond)

unsigned long tl th per

int vitfreq

char vent[13] txtvent[]=vitesse du vent VV

if(PIR1CCP1IF==1) Test si front montant agrave lieu

TMR1H=0 Initialisation du timer1 bit de point fort

TMR1L=0 Initialisation du timer1 bit de point faible

th=CCPR1H Les valeurs sont copieacute dans des variables

tl=CCPR1L

th=thltlt8 Deacutecalage car th =gt bit de point fort

per = th|tl On concategravene les deux valeurs nous obtenons la peacuteriode

PIR1CCP1IF=0 Remise a 0 du drapeau

if(PIR1TMR1IF==1) Si deacutepassement du timer 1

per=65535+per On ajoute une retenue lorsquon a fait un tour (16bit)

PIR1TMR1IF=0 Remise a 0 du drapeau deacutepassement

freq=671310per Calcul de la freacutequence

vit=freq179 + 692 Calcul de la vitesse que lon x100

Station meacuteteacuteo autonome 2012

25

if(vitlt200) En dessous 2ms la mesure est aleacuteatoire agrave cause du 2egraveme deacutebordement

vit=0

vent[0]=(vit10000)+48 Valeur des centaines affecteacute en ascii(48=0)

VV=(vit1000)10

vent[1]=VV+48 Valeur des dizaines affecteacute en ascii

VV=(vit100)10

vent[2]=VV+48 Valeur des uniteacute affecteacute en ascii

VV=(vit10)10

vent[3]=44 Virgule affecteacute en ascii

vent[4]=VV+48 Valeur de la 1er deacutecimale affecteacute en ascii

VV=vit10

vent[5]=VV+48 Valeur de la 2egraveme deacutecimale affecteacute en ascii

vent[6]=109 m affecteacute en ascii

vent[7]=47 affecteacute en ascii

vent[8]=115 s affecteacute en ascii

if(cond==1000) Appel la fonction LCD tous les 1000

lcd(1 1 16 txtvent) Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 8 vent) Affiche la chaine de caractegravere hum sur le LCD

cond=0 Remise a 0 de la condition

Fonction affichage

void lcd(int li int co int nb char receive[20])

int i

for(i=0 ilt=nb i++) Boucle for

Lcd_chr(li (co+i) receive[i]) Affiche les caractegraveres jusquagrave i

Station meacuteteacuteo autonome 2012

26

X Simulation une station meacuteteacuteo autonome

Maintenant que tous nos capteurs sont installeacutes nous allons mettre agrave profit le bouton

poussoir installeacute dans la partie LCD Crsquoest-agrave-dire que nous allons rassembler tous les programmes

preacuteceacutedents pour nrsquoen faire qursquoun Il suffira drsquoappuyer sur le bouton poussoir pour faire deacutefiler les

diffeacuterentes valeurs comme une vraie station meacuteteacuteo

A La structure du programme

Boucle infinie

while(1)

cond=cond+1 Increacutemente la variable cond

switch(BP)

case 0

humidite(ampcond) Appel la fonction humiditeacute

if(PORTAF2==1) Ces if permet de changer la valeur de BP

BP=1

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250) Temps quon relacircche bien le bouton

break

case 1

temperature(ampcond) Appel la fonction tempeacuterature

if(PORTAF2==1)

BP=2

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)

break

case 2

vent(ampcond) Appel la fonction vent

if(PORTAF2==1)

BP=0

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)

break

Nous avons choisi drsquoutiliser un Switch nous avons donc juste rajouteacute une variable BP

Lorsqursquoil y a appui sur le bouton poussoir la variable BP srsquoincreacutemente et le programme passe agrave une

autre case et donc utilise une nouvelle fonction La temporisation nous donne le temps de relacirccher le

bouton pour eacuteviter de faire deacutefiler le menu sans le vouloir

Station meacuteteacuteo autonome 2012

27

B La simulation

Etant donneacute que nous ne pouvions pas prendre le mateacuteriel avec nous il eacutetait impeacuteratif de

pouvoir faire des simulations Pour cela nous avons utiliseacute un logiciel tregraves utile Proteus ISIS Ce

logiciel possegravede une tregraves grande librairie et permet de rentrer nos programmes sur le PIC virtuel

geacuteneacutereacute par le logiciel Pour simuler le capteur drsquohumiditeacute nous avons utiliseacute un potentiomegravetre Pour

celui de lrsquoaneacutemomegravetre comme pour nos mesures nous avons brancheacute virtuellement un GBF sur la

borne associeacute et observeacute son signal agrave lrsquoaide drsquoun oscilloscope

Voilagrave un aperccedilu de la simulation effectueacute sur ISIS

Veacuterification theacuteorique du vent

Vitesse du vent = 0179 37 + 0629

Vitesse du vent = 7657ms

Veacuterification theacuteorique de lrsquohumiditeacute

H= (315-081)0031

H=7548

Veacuterification theacuteorique de la

tempeacuterature

La valeur afficheacutee correspond bien

aux 27degC seacutelectionneacute sur le capteur

Station meacuteteacuteo autonome 2012

28

XI Transmission des donneacutees par liaison ZigBee

ZigBee est un protocole de haut niveau permettant la communication de petites radios agrave

consommation reacuteduite baseacutee sur le standard IEEE 802154

Cette technologie a pour but la communication de courte distance telle que le propose deacutejagrave

la technologie Bluetooth tout en eacutetant moins chegravere plus simple et avec une fiabiliteacute assez eacuteleveacutee

Dans notre projet nous nous servirons de ZigBee pour permettre une transmission par ondes

de nos donneacutees de la station meacuteteacuteo vers un ordinateur Pour cela nous avons 2 modules Xbee pro 2

platines drsquointerfaces une avec des pattes (liaison platine) et lrsquoautre avec une sortie RS232 (liaison pc)

Caracteacuteristique eacutelectrique

Les signaux Xbee ont une amplitude de 33V mais sont alimenteacutes en 5V (tension de notre

source USB) cacircbleacutes sur la bornes VIN (laquo Power input from 6-12Vdc 300mA or higher raquo) Mais

notre source nrsquoeacutetant pas assez puissante pour alimenter toute notre installation Nous utiliserons

donc une source externe de 5V qui sera utiliseacutee pour alimenter les 2 systegravemes Xbee

Description des Bornes du Xbee qui nous inteacuteresse

Station meacuteteacuteo autonome 2012

29

A Scheacutema eacutelectrique du module Xbee

Nous avons cacircbleacute la sortie TX du microcontrocircleur qui eacutemet un signal jusqursquoagrave la borne RX du

Xbee qui reacuteceptionne ce signal Apregraves la transmission se fait par onde entre les 2 modules Xbee Pour

le module qui reccediloit le signal un cacircble RS232 suffit agrave faire la liaison entre celui-ci et le PC

B Envoi des donneacutees la liaison Usart

Un USART (Universal synchronous amp Asynchronous Receiver Transmitter) est un eacutemetteur-

reacutecepteur universel En langage courant cest le composant utiliseacute pour faire la liaison entre

lordinateur et le port seacuterie Lordinateur envoie les donneacutees en parallegravele (autant de fils que de bits

de donneacutees) Il faut donc transformer ces donneacutees pour les faire passer agrave travers une liaison seacuterie qui

utilise un mecircme fil pour faire passer tous les bits de donneacutees

Constitution dune trame USART

un bit de start toujours agrave 0 servant agrave la synchronisation du reacutecepteur

les donneacutees la taille peut varier (geacuteneacuteralement entre 5 et 9 bits)

eacuteventuellement un bit de pariteacute paire ou impaire

et un bit de stop toujours agrave 1 (la dureacutee peut varier entre 1 15 et 2 temps bit)

Le niveau logique de repos est le 1

Figure 14 Trame USART

Station meacuteteacuteo autonome 2012

30

Afin de faciliter les liaisons entre peacuteripheacuteriques (PC microcontrocircleur modem hellip) des vitesses

de transmission sont normaliseacutees luniteacute baud correspondant agrave un temps bit Dans notre cas nous

choisirons une vitesse de transmission de 9600bps

C Programme drsquoenvoi des donneacutees par liaison Usart

Gracircce agrave la librairie de MikroC il est tregraves facile drsquoenvoyer des donneacutees par liaison Usart Cela

fonctionne comme pour envoyer des caractegraveres sur lrsquoeacutecran LCD Il faut juste ensuite choisir la vitesse

de transmission qui sera 9600bps Voici la fonction et un morceau du programme qui sert agrave envoyer

les caractegraveres sur Xbee et de Xbee agrave un HyperTerminal

Fonction humiditeacute

void humidite(int cond)

long H U VL Deacuteclaration des variables

char HH hum[8] humtxt[]=Humidite

helliphellip

Xbee(8 hum) Envoi la chaicircne de caractegravere hum dans la fonction xbee

Usart

void xbee(int nb char receive[20])

int i

Usart_Init(9600) Vitesse de transmission

for(i=0 ilt=nb i++) Boucle for

Usart_Write(receive[i]) Envoi les caractegraveres sur lrsquoHyperTerminal jusquagrave i

Station meacuteteacuteo autonome 2012

31

XII Estimation du coucirct du projet

On peut voir sur ce tableau que le prix de reviens pour les eacuteleacutements que nous avons utiliseacute

est de 14506euro TTC Ce qui est plutocirct oneacutereux compareacute aux stations meacuteteacuteo du marcheacute qui oscille

entre 6euro et 400euro En sachant que la nocirctre est loin drsquoecirctre finaliseacute (finition estheacutetique ergonomie et

ajout de nouvelle fonction comme la date et lrsquoheure)

Composant Quantiteacute Prix (TVA inclus) Liens Quartz 20000MHz 1 111 euro Lien

Capaciteacute 22pF 2 010 euro lien

PIC 16F876 1 427 euro lien

LCD MODULE 1 1575 euro lien

Potentiomegravetre 10KΩ 1 618 euro lien

Reacutesistance 33 Ω 1 035 euro lien

Reacutesistance 10 K Ω 2 070 euro lien

Reacutesistance 1 KΩ 3 105 euro lien

LED rouge 1 013 euro lien

DS1621 1 650 euro lien

Bouton poussoir 1 060 euro lien

Module Xbee 2 4000 euro lien

Platine dinterface (XBEE) RS232 1 1890 euro lien

Platine dinterface (XBEE) 1 1364 euro lien

Capteur drsquohumiditeacute 1 2692 euro lien

Transistor 1 561 euro lien

Diode 1 325 euro lien

Totales 1 14506 euro

Station meacuteteacuteo autonome 2012

32

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

panelsbut 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 Itrsquos also possible to measure

humidity and wind speed Then itrsquos 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 its 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 Itrsquos 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

Station meacuteteacuteo autonome 2012

33

XIV Conclusion

Ce projet sur la conception drsquoune station meacuteteacuteo autonome qui nous a eacuteteacute confieacute a eacuteteacute tregraves

enrichissant Il nous a permis de mettre en relations les connaissances acquises durant lrsquoanneacutee mais

aussi acqueacuterir de nouvelles connaissances comme le fonctionnement drsquoun microcontrocircleur En effet

nous nrsquoavions jamais programmeacute sur microcontrocircleur Il a fallu srsquoadapter et apprendre agrave utiliser des

nouveaux logiciels tels que Proteus MikroC ainsi que Labview

De cette expeacuterience nous avons aussi appris agrave ecirctre autonome Nous avons saisi que la

compreacutehension des documents techniques et des librairies eacutetait un point essentiel de notre projet

En programmation nous nrsquoavions pas le droit agrave lrsquoerreur car la moindre faute pouvait conduire le

systegraveme agrave un dysfonctionnement Ce projet nous a demandeacute beaucoup de rigueur de patience et de

temps

Toutefois nous nrsquoavons pas eu malheureusement le temps drsquoinstaller le capteur de

tempeacuterature inteacuterieure par manque de temps Plus encore nous aurions aimeacute approfondir certains

points Par exemple pouvoir installer les composants sur circuit imprimeacute et concevoir un support

viable pour en faire une vraie station meacuteteacuteo Lrsquoinstallation drsquoune girouette aurait eacuteteacute appreacuteciable

pour connaicirctre le sens du vent Aussi le programme aurait sans doute pu ecirctre encore ameacutelioreacute pour

de meilleures performances

Malgreacute ce manque de temps nous sommes tregraves satisfaits du fonctionnement de ce module

qui nous a permis de comprendre lrsquoutiliteacute des parties theacuteoriques pour lrsquoapplication et la mise en

œuvre drsquoun systegraveme Lrsquoapproche peacutedagogique de nous diriger vers les solutions sans jamais les

donner de nous laisser un grand degreacute de liberteacute et drsquoautonomie a eacuteteacute au deacutebut assez deacuteroutante

mais tregraves instructif

Enfin nous tenions agrave remercier Mme Leymarie qui nous a suivis et aiguilleacute tout au long de ce

projet

Station meacuteteacuteo autonome 2012

34

XV ANNEXES

Programme complet

Deacuteclaration 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()

deacuteclaration des variables

int cond=0Condition pour laffichage sur leacutecran LCD

int BP=0

Initialisation et affectation des ports

PORTA=0

PORTB=0 initialisation

PORTC=0

TRISB=0 Port B deacuteclarer en sortie

TRISA=0xFF Port A en entreacutee

ADCON1=0x84 Justifieacute agrave droite active RA0RA1RA3 analogique

ADCON0=0x85 Fosc32 sur PA0 en service

TRISB=0 Port B deacuteclarer en sortie

TRISC=0xFFPort C deacuteclarer en entreacutee

Configuration et initialisation de leacutecran LCD

Lcd_Config(ampPORTB 0 1 WR 5 4 3 2) Configure lecran

Lcd_Init(ampPORTB) initialisation du LCD

Lcd_Cmd(Lcd_CURSOR_OFF) Enleve le curseur

Lcd_Cmd(Lcd_CLEAR) Efface lecran

Initialisation du module I2C

I2C_Init(100000)initialisation de la communication I2C

I2C_Start()Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90)Mode de controcircle en mode eacutecriture

I2C_Wr(0xAC)Accegraves au registre de configuration

I2C_Wr(0x0A)Registre de configuration mesure en continu

I2C_Stop()Arrecirct du signal

I2C_Start()Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90)Mode de controcircle en mode eacutecriture

I2C_Wr(0xEE)Deacutebut de la conversion

I2C_Stop()Arrecirct du sigal

Station meacuteteacuteo autonome 2012

35

Configuration du mode capture

T1CON=0x31 Configuration du timer1

CCP1CON=0x05 Paramegravetrage du mode capture

PIE1TMR1IE=1 Autorise les deacutebordements du timer 1

Boucle infinie

while(1)

cond=cond+1Increacutemente la variable cond

switch(BP)

case 0

humidite(ampcond)Appel la fonction humiditeacute

if(PORTAF2==1)Ces if permet de changer la valeur de BP

BP=1

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)Temps quon relacircche bien le bouton

break

case 1

temperature(ampcond)Appel la fonction tempeacuterature

if(PORTAF2==1)

BP=2

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)

break

case 2

vent(ampcond)Appel la fonction vent

if(PORTAF2==1)

BP=0

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)

break

Fonction humiditeacute

void humidite(int cond)

long H U VLDeacuteclaration des variables

char HH hum[8] humtxt[]=Humidite

VL=Adc_read(0) Valeur lue sur RA0(humiditeacute)

U=(VL5000)1023 Convertit la valeur lue en tension x1000

H=(U-810)(0031) Convertit la tension en humiditeacute x1000

Station meacuteteacuteo autonome 2012

36

if(Hgt100000)Si H gt 100(impossible) alors = 100

H=100000

if(Hlt0)Si H lt 0(impossible) alors = 0

H=0

hum[0]=(H100000)+48Valeur des centaines affecteacute en ascii(48=0)

HH=(H10000)10

hum[1]=HH+48Valeur des dizaines affecteacute en ascii

HH=(H1000)10

hum[2]=HH+48Valeur des uniteacutes affecteacute en ascii

hum[3]=44Virgule affecteacute en ascii

HH=(H100)10

hum[4]=HH+48Valeur de la premiegravere deacutecimale affecteacute en ascii

HH=(H10)10

hum[5]=HH+48Valeur de la deuxiegraveme deacutecimale affecteacute en ascii

hum[6]=37Pourcentage affecteacute en ascii

if(cond==50)Appel la fonction LCD tous les 1000

lcd(1 1 8 humtxt)Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 7 hum)Affiche la chaine de caractegravere hum sur le LCD

cond=0Remise a 0 de la condition

Xbee(7 hum) Envoi la chaicircne de caractegravere hum dans la fonction xbee

Fonction tempeacuterature

void temperature(int cond)

char temp[7] temptxt[]=Temperature LSB

signed char MSB

I2C_Start()Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90)Mode de controcircle en mode eacutecriture

I2C_Wr(0xAA)Lecture de la tempeacuterature

I2C_Stop()Arrecirct du sigal

I2C_Start()Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x91)Mode de controcircle en mode lecture

MSB = I2C_Rd(1)Nombre signeacute donnant la tempeacuterature entre +125deg et -55degC

LSB = I2C_Rd(0)Si bit 7 = 1 tempeacuterature MSB +05degC

I2C_Stop()Arrecirct du sigal

if(MSBlt0)

MSB = abs(MSB) Si temperature neacutegative valeur absolue de MSB

Temp[0]=45 Signe - affecteacute en ascii

else

Station meacuteteacuteo autonome 2012

37

Temp[0]=43signe + affecteacute en ascii

Temp[1]=(MSB10)+48 Valeur des dizaines affecteacute en ascii

Temp[2]=(MSB10)+48 Valeur des uniteacutes affecteacute en ascii

Temp[3]=44 Virgule affecteacute en ascii

if (LSB==128) Si bit 7 agrave 1 alors +05deg

Temp[4]=5

else Si bit 7 agrave 0 alors +00deg

Temp[4]=0

Temp[5]=223 degreacute affecteacute en ascii

Temp[6]=67 C affecteacute en ascii

if(cond==50)Appel la fonction LCD tous les 1000

lcd(1 1 11 temptxt)Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 7 temp)Affiche la chaine de caractegravere hum sur le LCD

cond=0Remise a 0 de la condition

Xbee(7 temp) Envoi la chaicircne de caractegravere temp dans la fonction xbee

Fonction vent

void vent(int cond)

unsigned long tl th per

int vitfreq

char vent[13] txtvent[]=Vitesse du vent VV

if(PIR1CCP1IF==1) Test si front montant agrave lieu

TMR1H=0 Initialisation du timer1 bit de point fort

TMR1L=0 Initialisation du timer1 bit de point faible

th=CCPR1H Les valeurs sont copieacute dans des variables

tl=CCPR1L

th=thltlt8 Deacutecalage car th =gt bit de point fort

per = th|tl On concategravene les deux valeurs nous obtenons la peacuteriode

PIR1CCP1IF=0 Remise a 0 du drapeau

if(PIR1TMR1IF==1) Si deacutepassement du timer 1

per=65535+per On ajoute une retenue lorsquon a fait un tour (16bit)

PIR1TMR1IF=0 Remise a 0 du drapeau deacutepassement

Station meacuteteacuteo autonome 2012

38

freq=671310perCalacul de la freacutequence

vit=freq179 + 692Calcul de la vitesse que lon x100

if(vitlt200)En dessous 2ms la mesure est aleacuteatoire agrave cause du 2egraveme deacutebordement

vit=0

vent[0]=(vit10000)+48Valeur des centaines affecteacute en ascii(48=0)

VV=(vit1000)10

vent[1]=VV+48Valeur des dizaines affecteacute en ascii

VV=(vit100)10

vent[2]=VV+48Valeur des uniteacute affecteacute en ascii

VV=(vit10)10

vent[3]=44Virgule affecteacute en ascii

vent[4]=VV+48Valeur de la 1er deacutecimale affecteacute en ascii

VV=vit10

vent[5]=VV+48Valeur de la 2egraveme deacutecimale affecteacute en ascii

vent[6]=109m affecteacute en ascii

vent[7]=47 affecteacute en ascii

vent[8]=115s affecteacute en ascii

if(cond==50)Appel la fonction LCD tous les 1000

lcd(1 1 15 txtvent)Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 9 vent)Affiche la chaine de caractegravere hum sur le LCD

cond=0Remise a 0 de la condition

Xbee(9 vent) Envoi la chaicircne de caractegravere vent dans la fonction xbee

Fonction affichage

void lcd(int li int co int nb char receive[15])

int i

for(i=0 iltnb i++)Boucle for

Lcd_chr(li (co+i) receive[i])Affiche les caractegraveres jusquagrave i

Usart

void xbee(int nb char receive[15])

int i

Usart_Init(9600)Vitesse de transmission

for(i=0 iltnb i++)Boucle for

Usart_Write(receive[i])Envoi les caractegraveres sur lHyperTerminal jusquagrave i

Station meacuteteacuteo autonome 2012

8

Pour ce qui est lrsquoeacutequation de la tension

en fonction de lrsquohumiditeacute le constructeur nous

donne la courbe drsquoeacutetalonnage suivante (cf

figure 5)

De cette courbe nous en avons tireacute les

valeurs suivantes (cf figure 6)

Nous avons ensuite deacutecideacute de la retracer sur Excel et drsquoen tirer llsquoeacutequation qui sera utiliseacute dans le

programme du microcontrocircleur

On voit qursquoExcel nous donne lrsquoeacutequation suivante

U=0031H +081

Donc H= (U-081)0031

De plus nous multiplierons par 1000 la valeur de H pour pouvoir reacutecupeacuterer les chiffres

deacutecimales et les rentrer dans une chaine de caractegraveres et les afficher sur lrsquoeacutecran LCD H=

(U810)0031

La valeur maximum de H est donc de 100 000 nous la deacuteclarerons donc en long (une

deacuteclaration en int ne serais pas suffisant -32768 agrave 32767)

Figure 5 Courbes donneacutee par le constructeur

Figure 6 tableau de mesure

Figure 7 Courbe traceacute sur Excel

Station meacuteteacuteo autonome 2012

9

Nous avons remarqueacute sur la courbe ainsi qursquoen simulation que le capteur peut avoir des

valeurs supeacuterieur agrave 100 et infeacuterieur agrave 0 Il faudra donc mettre deux conditions pour ne pas

deacutepasser la plage de valeur

B Configuration du microcontrocircleur

Maintenant nous arrivons agrave point important de cette partie celle de la configuration des

ports du microcontrocircleur En effet le PIC16F876 est constitueacute drsquoun module convertisseur agrave 5 entreacutees

Ces entreacutees sont situeacutees sur les bornes RA0 RA1 RA2 RA3 et RA5 (cf figure1) Le reacutesultat de la

conversion est codeacute sur 10 bits Crsquoest une valeur comprise entre hrsquo000rsquo et hrsquo3FFrsquo

hlsquo3FFrsquo = brsquo1 1111 1111rsquo = drsquo1023rsquo

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 eacutequation

U = (Valeur lue sur le CAN 5)1023

Pour les mecircme raison que lrsquoeacutequation du capteur drsquohumiditeacute nous avons multiplieacute par

1000 la tension nous obtenons donc U= (Valeur lue sur le CAN 5000)1023

Il faut ensuite reacutegler les entreacutees analogiques avec les registres ADCON0 et ADCON1 en

sachant que nous avons deacutecideacute 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 (Freacutequence drsquooscillation)2

01= Fosc8

10= Fosc32

11= Oscillateur RC interne

Pour que la conversion soit correct il faut que T(ad) soit au minimum de 16micros nous

disposons drsquoun quartz de 20Mhz =gt 20Mhz32 =gt 16micros Nous mettrons donc le bit 7 agrave 1 et

le 6 agrave 0

Bit 5 bit4 et bit 3 CHS2 CHS1 et CHS0 = Channel Select bits

Ces 3 bits permettent de choisir lentreacutee qui va ecirctre convertie

Station meacuteteacuteo autonome 2012

10

Nous voulons convertir lrsquoentreacutee RA0 pour cela il faut mettre les bits 5 4 3 agrave 0

Bit 2 GODONE Status bit si ADON=1

1 = Deacutemarre la conversion AD Ce bit est remis agrave 0 par hard

0 = La conversion AD est termineacutee

Il nous faut deacutemarrer la conversion

Bit 1 Bit non implanteacute

Bit 0 ADON AD on bit

1= Convertisseur AD en service

0 = Convertisseur AD agrave larrecirct

Il nous faut mettre le convertisseur en service

ADCON0 = brsquo1000 0101rsquo = hrsquo85rsquo

Bit 7 ADFM = AD Result format

1 = Justifieacute agrave droite

0 = Justifieacute agrave gauche

Nous avons justifieacute agrave droite

Bit 6 bit 5 et bit 4 Bits non impleacutementeacutes

Bit 3 bit 2 bit 1 et bit 0 PCFG3 PCFG2 PCFG1 et PCFG0

Bits de controcircle de la configuration des Ports

Ces bits permettent de choisir le partage entre entreacutees analogiques et digitales sur les PORTS A et E

On a choisi drsquoactiver RA0 RA1 et RA3 en entreacutee analogique les autres resteront en

digitales ce qui signifie qursquoau vue de la datasheet il faut mettre le bit 2 agrave 1 et les autres agrave 0

ADCON1 = brsquo10000100rsquo = hrsquo84rsquo

Station meacuteteacuteo autonome 2012

11

C Le scheacutema du microcontrocircleur avec le capteur drsquohumiditeacute

Voici le scheacutema de cacircblage du capteur drsquohumiditeacute uniquement A noter que le capteur est

remplaceacute par un potentiomegravetre nrsquoeacutetant pas dans la librairie de Proteus On constate qursquoil est bien

brancheacute sur RA0

D Programme pour la mesure de lrsquohumiditeacute

Voici le programme pour mesurer lrsquohumiditeacute avec les affectations deacutecrites ci-dessus ainsi

que les eacutequations de conversions

Deacuteclaration des fonctions

void humidite(int cond)

void lcd(int li int co int nb char receive[11])

void main()

deacuteclaration des variables

int cond=0 Condition pour laffichage sur leacutecran LCD

Initialisation et affectation des ports

PORTB=0 initialisation

TRISB=0 Port B deacuteclarer en sortie

TRISA = 0xFF Port A en entreacutee

ADCON1 = 0x84 Justifieacute agrave droite active RA0RA1RA3 analogique

ADCON0 = 0x85 Fosc32 sur PA0 en service

Configuration et initialisation de leacutecran LCD

Lcd_Config(ampPORTB 0 1 WR 5 4 3 2) Configure leacutecran

Lcd_Init(ampPORTB) initialisation du LCD

Lcd_Cmd(Lcd_CURSOR_OFF) Enlegraveve le curseur

Lcd_Cmd(Lcd_CLEAR) Efface leacutecran

Figure 8 Scheacutema de cacircblage du capteur dhumiditeacute

Station meacuteteacuteo autonome 2012

12

Boucle infinie

while(1)

cond=cond+1 Increacutemente la variable cond

humidite(ampcond) Appel la fonction humiditeacute

Fonction humiditeacute

void humidite(int cond)

long H U VL Deacuteclaration des variables

char HH hum[8] humtxt[]=Humidite

VL=Adc_read(0) Valeur lue sur RA0(humiditeacute)

U=(VL5000)1023 Convertit la valeur lue en tension x1000

H=(U-810)(0031) Convertit la tension en humiditeacute x1000

if(Hgt100000) Si H gt 100(impossible) alors = 100

H=100000

if(Hlt0) Si H lt 0(impossible) alors = 0

H=0

hum[0]=(H100000)+48 Valeur des centaines affecteacute en ascii(48=0)

HH=(H10000)10

hum[1]=HH+48 Valeur des dizaines affecteacute en ascii

HH=(H1000)10

hum[2]=HH+48 Valeur des uniteacutes affecteacute en ascii

hum[3]=44Virgule affecteacute en ascii

HH=(H100)10

hum[4]=HH+48 Valeur de la premiegravere deacutecimale affecteacute en ascii

HH=(H10)10

hum[5]=HH+48 Valeur de la deuxiegraveme deacutecimale affecteacute en ascii

hum[6]=37 Pourcentage affecteacute en ascii

if(cond==1000)Appel la fonction LCD tous les 1000

lcd(1 1 10 humtxt) Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 7 hum) Affiche la chaine de caractegravere hum sur le LCD

cond=0 Remise a 0 de la condition

Fonction affichage

void lcd(int li int co int nb char receive[11])

int i

for(i=0 ilt=nb i++)Boucle for

Lcd_chr(li (co+i) receive[i]) Affiche les caractegraveres jusquagrave i

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

Station meacuteteacuteo autonome 2012

13

VIII Le capteur de tempeacuterature

A preacutesent comme toute station meacuteteacuteo

nous avons installeacute un capteur de tempeacuterature le

DS1621 Ce capteur communique avec le

microcontrocircleur gracircce au protocole I2C

A Le protocole I2C

Le bus I2C (Inter Integrated Circuit) a eacuteteacute deacuteveloppeacute au deacutebut des anneacutees 80 par Philips

semiconductors pour permettre de relier facilement agrave un microprocesseur les diffeacuterents circuits dun

teacuteleacuteviseur moderne

Le bus I2C permet de faire communiquer entre eux des composants eacutelectroniques tregraves divers

gracircce agrave seulement trois fils Un signal de donneacutee (SDA) un signal dhorloge (SCL) et un signal de

reacutefeacuterence eacutelectrique (Masse)

Ceci permet de reacutealiser des eacutequipements ayant des fonctionnaliteacutes tregraves puissantes (En

apportant toute la puissance des systegravemes micro programmeacutes) et conservant un circuit imprimeacute tregraves

simple par rapport un scheacutema classique (8bits de donneacutees 16 bits dadresse + les bits de controcircle)

Les donneacutees sont transmises en seacuterie agrave 100Kbitss en mode standard et jusquagrave 400Kbitss en

mode rapide Ce qui ouvre la porte de cette technologie agrave toutes les applications ougrave la vitesse nest

pas primordiale

Voici un exemple de protocole qursquoutilise le bus I2C

1 Pour initier le dialogue le maicirctre creacutee une condition Start

2 Le maicirctre envoie ladresse de lesclave (1010100) suivi du bit 0 (bit Write)

3 Lesclave reacutepond (accuseacute de reacuteception bit Acknowledge)

4 Le maicirctre envoie ladresse du registre (0x04) agrave eacutecrire

5 Lesclave reacutepond (accuseacute de reacuteception bit Acknowledge)

6 Le maicirctre envoie la donneacutee (0x27) agrave eacutecrire

7 Lesclave eacutecrit la donneacutee puis envoie un accuseacute de reacuteception (bit Acknowledge)

8 Le maicirctre termine le dialogue avec une condition Stop

9 Le bus I2C est maintenant libre (SCL = 1 SDA = 1 niveaux de repos)

Figure 9 scheacutema du DS1621

Station meacuteteacuteo autonome 2012

14

B Caracteacuteristique du DS1621

Comme on peut voir sur la figure 9 le capteur est composeacute de 8 bornes

SDA =gt Liaison seacuterie entreacutee sortie

SCL =gt Signal drsquohorloge

Tout =gt Signal de sortie du thermostat (inutile dans notre cas)

GND =gt Masse

VDD =gt Alimentation +5V

A0 A1 A2 =gt Entreacutee drsquoadressage (dans notre cas les 3 agrave la masse car nous nrsquoavons qursquoun

module I2C)

Les circuits connecteacutes sur un bus I2C ont des sorties de type drain ouvert (ou collecteur

ouvert) Deux reacutesistances de pull-up sont bien sucircr placeacutees entre les lignes SDA SCL et lalimentation

(VDD)Quand le bus nest pas utiliseacute SDA et SCL sont au niveau haut (niveau de repos)

1 Speacutecificiteacute des commandes

Tous dialogue du maicirctre(PIC16F876) avec un DS1621 esclave doit deacutebuter par lrsquoenvoi drsquoun

mot de controcircle

Le maicirctre envoi ensuite une commande suivi ou non de donneacutees Voici la liste des

commandes avec leur description

Les commandes AC EE et 22 ne sont pas suivies de lenvoi de donneacutees Par contre la

commande AA qui nous inteacuteresse est suivie de lrsquoenvoi par le DS1621 de 2 octets repreacutesentant la

tempeacuterature

Station meacuteteacuteo autonome 2012

15

Voici le registre de configuration(AC) qursquoil nous faut deacuteterminer

DONE 1 = conversion finie 0 = conversion en cours En mode 1 SHOT uniquement

THF Flag seuil haut du thermostat Passe agrave 1 et y reste si tempeacuterature supeacuterieure agrave TH

TLF Flag seuil bas du thermostat Passe agrave 1 et y reste si tempeacuterature infeacuterieure agrave TL

NVB 1 = meacutemoire EEPROM en eacutecriture 0 = meacutemoire EEPROM eacutecriture termineacutee

Nous nrsquoactiverons pas lrsquoeacutecriture de la meacutemoire

POL Polariteacute de Tout (pin 3) 1 = actif sera un niveau HAUT 0 = actif sera un niveau BAS

Il faut activer la polariteacute donc nous le mettons agrave 1

ONE SHOT 0 = conversion en continu 1 = conversion 1 fois

Nous le mettons en mode continu

AC = brsquo00001010rsquo = hrsquo0Arsquo

La commande AA qui permet de lire la tempeacuterature renvoie 2 octets

MSB (Most Significant Bit) Nombre signeacute donnant la tempeacuterature entre +125deg et -55degC

LSB (Least Significant Bit ) Seul le bit 7 de cet octet est significatif Si 1 tempeacuterature

MSB +05degC

Pour bien comprendre comment est codeacute un nombre signeacute un tableau avec des exemples de

valeurs eacutetait agrave notre disposition dans la notice

Station meacuteteacuteo autonome 2012

16

2 Dialogue I2C pour avoir la tempeacuterature

Voici un scheacutema qui montre le dialogue agrave effectuer entre le microcontrocircleur et le capteur

pour avoir la tempeacuterature Crsquoest gracircce agrave ce mecircme scheacutema que nous avons pu programmer le PIC

Station meacuteteacuteo autonome 2012

17

C Le scheacutema du microcontrocircleur avec le capteur de tempeacuterature

Voici le scheacutema du capteur de tempeacuterature uniquement Le capteur est brancheacute sur les

borne SCL(RC3) et SDA(RC4) du PIC Qursquoelles soient deacuteclareacutees en entreacutee ou en sortie les bornes SCL et

SDA sont fonctionnelles Il ne faut pas oublier les reacutesistances de tirages (R1 et R3) Lrsquoadressage A0 A1

A2 toutes misent agrave la masse car nous nrsquoavons qursquoun seul capteur I2C relieacute au PIC et le Tout

(thermostat) inutile car nous faisons juste un releveacute de tempeacuterature

D Programme pour la mesure de la tempeacuterature

Deacuteclaration des fonctions

void temperature(int cond)

void lcd(int li int co int nb char receive[14])

void main()

deacuteclaration des variables

int cond=0Condition pour laffichage sur leacutecran LCD

Initialisation et affectation des ports

PORTB=0 initialisation

PORTC=0

TRISB=0 Port B deacuteclarer en sortie

TRISC = 0xFF Port C en entreacutee

Configuration et initialisation de leacutecran LCD

Lcd_Config(ampPORTB 0 1 WR 5 4 3 2) Configure leacutecran

Lcd_Init(ampPORTB) initialisation du LCD

Lcd_Cmd(Lcd_CURSOR_OFF) Enlegraveve le curseur

Lcd_Cmd(Lcd_CLEAR) Efface leacutecran

Initialisation du module I2C

I2C_Init(100000) initialisation de la communication I2C

I2C_Start() Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90) Mode de controcircle en mode eacutecriture

I2C_Wr(0xAC) Accegraves au registre de configuration

I2C_Wr(0x0A) Registre de configuration mesure en continu

I2C_Stop() Arrecirct du signal

I2C_Start() Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90) Mode de controcircle en mode eacutecriture

Figure 10 Scheacutema de cacircblage avec le capteur de tempeacuterature

Station meacuteteacuteo autonome 2012

18

I2C_Wr(0xEE) Deacutebut de la conversion

I2C_Stop()Arrecirct du sigal

Boucle infinie

while(1)

cond=cond+1 Increacutemente la variable cond

temperature(ampcond) Appel la fonction humiditeacute

Fonction tempeacuterature

void temperature(int cond)

char temp[7] temptxt[]=Temperature LSB

signed char MSB

I2C_Start() Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90) Mode de controcircle en mode eacutecriture

I2C_Wr(0xAA) Lecture de la tempeacuterature

I2C_Stop() Arrecirct du signal

I2C_Start() Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x91) Mode de controcircle en mode lecture

MSB = I2C_Rd(1) Nombre signeacute donnant la tempeacuterature entre +125deg et -55degC

LSB = I2C_Rd(0) Si bit 7 = 1 tempeacuterature MSB +05degC

I2C_Stop() Arrecirct du signal

if(MSBlt0)

MSB = abs(MSB) Si tempeacuterature neacutegative valeur absolue de MSB

Temp[0]=45 Signe - affecteacute en ascii

else

Temp[0]=43 signe + affecteacute en ascii

Temp[1]=(MSB10)+48 Valeur des dizaines affecteacute en ascii

Temp[2]=(MSB10)+48 Valeur des uniteacutes affecteacute en ascii

Temp[3]=44 Virgule affecteacute en ascii

if (LSB==128) Si bit 7 agrave 1 alors +05deg

Temp[4]=5

Else Si bit 7 agrave 0 alors +00deg

Temp[4]=0

Temp[5]=223 degreacute affecteacute en ascii

Temp[6]=67 C affecteacute en ascii

if(cond==10) Appel la fonction LCD tous les 1000

lcd(1 1 13 temptxt) Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 6 temp) Affiche la chaine de caractegravere hum sur le LCD

cond=0 Remise a 0 de la condition

Fonction affichage

void lcd(int li int co int nb char receive[14])

int i

for(i=0 ilt=nb i++)Boucle for

Lcd_chr(li (co+i) receive[i]) Affiche les caractegraveres jusquagrave i

Le scheacutema preacuteceacutedent est bien respecteacute comme on peut le voir crsquoest tregraves facile agrave programmer

gracircce aux librairies I2C du logiciel MikroC

Station meacuteteacuteo autonome 2012

19

IX Lrsquoaneacutemomegravetre

A Conception

Pour lrsquoaneacutemomegravetre lrsquoeacutequipe peacutedagogique

nous a juste fourni lrsquoheacutelice du capteur donc il a fallu

concevoir toute la partie eacutelectronique Lrsquoideacutee est

drsquoinstaller une diode et un transistor photonique par

de lagrave lrsquoheacutelice et lorsqursquoelle tourne elle vient couper le

faisceau Succinctement le transistor envoit soit 1 soit

0 sur le PIC Le but est de relever la freacutequence agrave

laquelle tourne lrsquoheacutelice puis la convertir en vitesse (cf

figure 11)

La photodiode choisie est de reacutefeacuterence SD5455-3 Ce choix a eacuteteacute fait car lrsquoangle du faisceau

est de 20deg pour que le flux infrarouge soit bien concentreacute sur le phototransistor pour un

fonctionnement optimal

Comme on le voit sur le scheacutema de principe (cf figure 11) il a fallu dimensionner la

reacutesistance qui sert agrave reacuteguler le courant qui circule dans la LED avec les informations donneacutees par la

documentation technique nous avons pu la calculer

Forward voltage VF = 17V et IF = 01A

Ualim = 5V

RD = (Ualim ndash UF)IF = (5 ndash 17)01

RD = 33Ω

Pour le phototransistor nous avons choisi celui qui allait avec la diode de reacutefeacuterence SE5455-3

Cette fois la valeur de la reacutesistance nous eacutetait donneacute par le constructeur

RL=1000Ω

Lors des seacuteances nous avons implanteacute la diode et le

transistor sur le support du capteur Pour des raisons

pratiques et estheacutetiques nous avons seacutepareacute la partie

aneacutemomegravetre et la partie platine par des borniers (cf figure

12)

Figure 11 scheacutema descriptif de laneacutemomegravetre

Figure 12 Notre aneacutemomegravetre

Station meacuteteacuteo autonome 2012

20

B Mesure de la peacuteriode sur le microcontrocircleur

Le but est de relever la peacuteriode du signal envoyer par lrsquoaneacutemomegravetre pour cela le PIC est

eacutequipeacute drsquoun mode capture Le principe est de recopier agrave un moment voulu la valeur du timer 1 La

capture peut avoir lieux agrave chaque front descendant agrave chaque front montant tous les 4 ou tous les 16

fronts montants Quand la capture a eu lieu un flag est mis agrave 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 constitueacute de 2 registres de 8 bits TMR1H et TMR1L que lon peut lire ou eacutecrire Le registre TMR1

(constitueacute de TMR1H et TMR1L) sincreacutemente de h0000 jusquagrave hFFFF et repasse ensuite agrave h0000

pour continuer le comptage Quand il y a deacutebordement une interruption peut ecirctre geacuteneacutereacutee si on lrsquoa

autoriseacutee par TMR1IE =1 (bit 0 de PIE1) et le Flag TMR1IF (bit 0 de PIR1) passe agrave 1 Le controcircle du

timer 1 ce fait par le registre T1CON

Bit 7 et bit 6 bits non impleacutementeacutes

Bit 5 et bit 4 T1CKPS = Seacutelection du preacute diviseur placeacute avant le TIMER

Vu qursquoon a un quartz eacuteleveacute nous avons deacutecideacute de choisir un preacute-diviseur de 8 donc

F=Fosc(48) Pour cela mettre les bit 4 et 5 agrave 1

Bit 3 T1OSCEN Bit dautorisation de loscillateur du Timer 1

1 = oscillateur autoriseacute

0 = oscillateur stoppeacute

Oscillateur interne inutile donc bit 3 agrave 0

Bit 2 T1SYNC Bit de controcircle de la synchronisation du CLK externe

1 = Pas de synchronisation de lhorloge externe

0 = Synchronisation de lhorloge externe

Nous nous mettrons en mode synchrone

Bit1 TMR1CS Bit de seacutelection de la source horloge

1 = Mode Compteur Clk externe sur la broche PC0 ou Quartz entre PC0 et PC1

0 = Mode Timer Clk interne = Fosc4

Station meacuteteacuteo autonome 2012

21

On mettra ce bit agrave 0 car on utilise le mode Timer

Bit 0 TMR1ON Bit dautorisation du Timer 1

1 = Timer 1 en service

0 = Timer 1 stoppeacute

Il faut eacutevidemment mettre la timer 1 en service

Nous avons aussi autoriseacute le deacutebordement du timer 1 pour avoir plus de preacutecisions pour cela il faut

mettre la commande PIE1TMR1 agrave 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 parameacutetrer le registre

CCP1CON

Bit 7 et Bit 6 bits non impleacutementeacutes

Bit 5 et Bit 4 CCP1X et CCP1Y

Bits non utiliseacutes 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 agrave Bit 0 CCP1M3 agrave CCP1M0 bits de seacutelection du mode

Nous avons seacutelectionneacute le mode capture sur chaque front montant Pour cela nous avons

mis les bits 1 et 3 agrave 0 et les bits 0 et 2 agrave 1

Pour savoir si un front montant agrave eu lieu le flag CCP1F est mis agrave 1 Ce flag doit ecirctre remis agrave 0 par

lrsquoutilisateur La valeur des 16 bits des registres du Timer 1 TMR1L (bit de poids faible) et TMR1H (bit

de poids fort) sont recopieacutees dans les registres CCPR1 CCPRIH (bit de poids faible) et CCPR1L (bit de

poids fort)

Nous avons programmeacute le mode capture de faccedilon agrave afficher sur lrsquoeacutecran LCD la valeur du registre

CCPR1 crsquoest-agrave-dire la peacuteriode du signal de lrsquoaneacutemomegravetre Il ne nous reste maintenant plus qursquoagrave

eacutetalonner notre aneacutemomegravetre

Station meacuteteacuteo autonome 2012

22

C Etalonnage de lrsquoaneacutemomegravetre

Pour eacutetalonner le capteur nous avons commenceacute par savoir agrave quelle freacutequence correspond la

valeur releveacutee par le mode capture Pour cela nous avons brancheacute un GBF agrave la place du capteur et

avec un oscilloscope nous avons compareacute leurs valeurs

Nous avons ensuite traceacute agrave lrsquoaide des valeurs du tableau la courbe F(Hz) en fonction du

compteur De cette courbe nous relevons lrsquoeacutequation

F = 671310compteur^(-101)

Soit environ F = 671310compteur

Puis nous avons brancheacute notre aneacutemomegravetre sur le microcontrocircleur Cela dans le but de

relever sa peacuteriode sur lrsquoeacutecran LCD agrave lrsquoaide drsquoune soufflerie variable et du manomegravetre GDH (reacutef

121552 200-13) nous avons compareacute leurs valeurs pour connaitre lrsquoeacutetalonnage de notre capteur

Nous avons noteacute plusieurs valeurs puis traceacute diffeacuterentes courbe pour trouver les eacutequations qui nous

permettrons de calculer la vitesse dans notre programme

Station meacuteteacuteo autonome 2012

23

Voici les valeurs que nous avons releveacutees puis la courbe traceacutee sur Excel

De cette courbe nous obtenons lrsquoeacutequation

Vitesse du vent = 0179F + 0629

Nous les multiplierons par 100 pour reacutecupeacuterer les deacutecimales et les implanter dans une chaine

de caractegravere

Vitesse du vent = 179F + 629

Nous avons agrave preacutesent agrave notre disposition toutes les eacutequations neacutecessaires pour pouvoir

convertir la valeur releveacutee par le mode capture en une vitesse

D Le scheacutema du microcontrocircleur avec lrsquoaneacutemomegravetre

On voit sur le scheacutema que le capteur est bien relieacute sur la borne RC2 Nous avons aussi

repreacutesenteacute les borniers J1 et J2 A droite tous ce qui est sur le support et agrave gauche tous ce qui est sur

la platine

Figure 13 Scheacutema avec laneacutemomegravetre

Station meacuteteacuteo autonome 2012

24

E Programme pour la mesure de la vitesse du vent

Voici le programme pour mesurer la vitesse du vent avec les affectations deacutecrites ci-dessus

ainsi que les eacutequations de conversions

Deacuteclaration des fonctions

void vent(int cond)

void lcd(int li int co int nb char receive[20])

void main()

deacuteclaration des variables

int cond=0

Initialisation et affectation des ports

PORTB=0 initialisation

PORTC=0 initialisation

TRISC=0x04 Port C deacuteclarer en sortie sauf RC2 en mode capture

TRISB=0 Port B deacuteclarer en sortie

Configuration du mode capture

T1CON=0x31 Configuration du timer1

CCP1CON=0x05 Parameacutetrage du mode capture

PIE1TMR1IE=1 Autorise les deacutebordements du timer 1

Configuration et initialisation de leacutecran LCD

Lcd_Config(ampPORTB 0 1 WR 5 4 3 2) Configure leacutecran

Lcd_Init(ampPORTB) Initialisation du LCD

Lcd_Cmd(Lcd_CURSOR_OFF) Enlegraveve le curseur

Lcd_Cmd(Lcd_CLEAR) Efface leacutecran

Boucle infinie

while(1)

cond=cond+1

vent(ampcond)

Fonction vent

void vent(int cond)

unsigned long tl th per

int vitfreq

char vent[13] txtvent[]=vitesse du vent VV

if(PIR1CCP1IF==1) Test si front montant agrave lieu

TMR1H=0 Initialisation du timer1 bit de point fort

TMR1L=0 Initialisation du timer1 bit de point faible

th=CCPR1H Les valeurs sont copieacute dans des variables

tl=CCPR1L

th=thltlt8 Deacutecalage car th =gt bit de point fort

per = th|tl On concategravene les deux valeurs nous obtenons la peacuteriode

PIR1CCP1IF=0 Remise a 0 du drapeau

if(PIR1TMR1IF==1) Si deacutepassement du timer 1

per=65535+per On ajoute une retenue lorsquon a fait un tour (16bit)

PIR1TMR1IF=0 Remise a 0 du drapeau deacutepassement

freq=671310per Calcul de la freacutequence

vit=freq179 + 692 Calcul de la vitesse que lon x100

Station meacuteteacuteo autonome 2012

25

if(vitlt200) En dessous 2ms la mesure est aleacuteatoire agrave cause du 2egraveme deacutebordement

vit=0

vent[0]=(vit10000)+48 Valeur des centaines affecteacute en ascii(48=0)

VV=(vit1000)10

vent[1]=VV+48 Valeur des dizaines affecteacute en ascii

VV=(vit100)10

vent[2]=VV+48 Valeur des uniteacute affecteacute en ascii

VV=(vit10)10

vent[3]=44 Virgule affecteacute en ascii

vent[4]=VV+48 Valeur de la 1er deacutecimale affecteacute en ascii

VV=vit10

vent[5]=VV+48 Valeur de la 2egraveme deacutecimale affecteacute en ascii

vent[6]=109 m affecteacute en ascii

vent[7]=47 affecteacute en ascii

vent[8]=115 s affecteacute en ascii

if(cond==1000) Appel la fonction LCD tous les 1000

lcd(1 1 16 txtvent) Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 8 vent) Affiche la chaine de caractegravere hum sur le LCD

cond=0 Remise a 0 de la condition

Fonction affichage

void lcd(int li int co int nb char receive[20])

int i

for(i=0 ilt=nb i++) Boucle for

Lcd_chr(li (co+i) receive[i]) Affiche les caractegraveres jusquagrave i

Station meacuteteacuteo autonome 2012

26

X Simulation une station meacuteteacuteo autonome

Maintenant que tous nos capteurs sont installeacutes nous allons mettre agrave profit le bouton

poussoir installeacute dans la partie LCD Crsquoest-agrave-dire que nous allons rassembler tous les programmes

preacuteceacutedents pour nrsquoen faire qursquoun Il suffira drsquoappuyer sur le bouton poussoir pour faire deacutefiler les

diffeacuterentes valeurs comme une vraie station meacuteteacuteo

A La structure du programme

Boucle infinie

while(1)

cond=cond+1 Increacutemente la variable cond

switch(BP)

case 0

humidite(ampcond) Appel la fonction humiditeacute

if(PORTAF2==1) Ces if permet de changer la valeur de BP

BP=1

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250) Temps quon relacircche bien le bouton

break

case 1

temperature(ampcond) Appel la fonction tempeacuterature

if(PORTAF2==1)

BP=2

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)

break

case 2

vent(ampcond) Appel la fonction vent

if(PORTAF2==1)

BP=0

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)

break

Nous avons choisi drsquoutiliser un Switch nous avons donc juste rajouteacute une variable BP

Lorsqursquoil y a appui sur le bouton poussoir la variable BP srsquoincreacutemente et le programme passe agrave une

autre case et donc utilise une nouvelle fonction La temporisation nous donne le temps de relacirccher le

bouton pour eacuteviter de faire deacutefiler le menu sans le vouloir

Station meacuteteacuteo autonome 2012

27

B La simulation

Etant donneacute que nous ne pouvions pas prendre le mateacuteriel avec nous il eacutetait impeacuteratif de

pouvoir faire des simulations Pour cela nous avons utiliseacute un logiciel tregraves utile Proteus ISIS Ce

logiciel possegravede une tregraves grande librairie et permet de rentrer nos programmes sur le PIC virtuel

geacuteneacutereacute par le logiciel Pour simuler le capteur drsquohumiditeacute nous avons utiliseacute un potentiomegravetre Pour

celui de lrsquoaneacutemomegravetre comme pour nos mesures nous avons brancheacute virtuellement un GBF sur la

borne associeacute et observeacute son signal agrave lrsquoaide drsquoun oscilloscope

Voilagrave un aperccedilu de la simulation effectueacute sur ISIS

Veacuterification theacuteorique du vent

Vitesse du vent = 0179 37 + 0629

Vitesse du vent = 7657ms

Veacuterification theacuteorique de lrsquohumiditeacute

H= (315-081)0031

H=7548

Veacuterification theacuteorique de la

tempeacuterature

La valeur afficheacutee correspond bien

aux 27degC seacutelectionneacute sur le capteur

Station meacuteteacuteo autonome 2012

28

XI Transmission des donneacutees par liaison ZigBee

ZigBee est un protocole de haut niveau permettant la communication de petites radios agrave

consommation reacuteduite baseacutee sur le standard IEEE 802154

Cette technologie a pour but la communication de courte distance telle que le propose deacutejagrave

la technologie Bluetooth tout en eacutetant moins chegravere plus simple et avec une fiabiliteacute assez eacuteleveacutee

Dans notre projet nous nous servirons de ZigBee pour permettre une transmission par ondes

de nos donneacutees de la station meacuteteacuteo vers un ordinateur Pour cela nous avons 2 modules Xbee pro 2

platines drsquointerfaces une avec des pattes (liaison platine) et lrsquoautre avec une sortie RS232 (liaison pc)

Caracteacuteristique eacutelectrique

Les signaux Xbee ont une amplitude de 33V mais sont alimenteacutes en 5V (tension de notre

source USB) cacircbleacutes sur la bornes VIN (laquo Power input from 6-12Vdc 300mA or higher raquo) Mais

notre source nrsquoeacutetant pas assez puissante pour alimenter toute notre installation Nous utiliserons

donc une source externe de 5V qui sera utiliseacutee pour alimenter les 2 systegravemes Xbee

Description des Bornes du Xbee qui nous inteacuteresse

Station meacuteteacuteo autonome 2012

29

A Scheacutema eacutelectrique du module Xbee

Nous avons cacircbleacute la sortie TX du microcontrocircleur qui eacutemet un signal jusqursquoagrave la borne RX du

Xbee qui reacuteceptionne ce signal Apregraves la transmission se fait par onde entre les 2 modules Xbee Pour

le module qui reccediloit le signal un cacircble RS232 suffit agrave faire la liaison entre celui-ci et le PC

B Envoi des donneacutees la liaison Usart

Un USART (Universal synchronous amp Asynchronous Receiver Transmitter) est un eacutemetteur-

reacutecepteur universel En langage courant cest le composant utiliseacute pour faire la liaison entre

lordinateur et le port seacuterie Lordinateur envoie les donneacutees en parallegravele (autant de fils que de bits

de donneacutees) Il faut donc transformer ces donneacutees pour les faire passer agrave travers une liaison seacuterie qui

utilise un mecircme fil pour faire passer tous les bits de donneacutees

Constitution dune trame USART

un bit de start toujours agrave 0 servant agrave la synchronisation du reacutecepteur

les donneacutees la taille peut varier (geacuteneacuteralement entre 5 et 9 bits)

eacuteventuellement un bit de pariteacute paire ou impaire

et un bit de stop toujours agrave 1 (la dureacutee peut varier entre 1 15 et 2 temps bit)

Le niveau logique de repos est le 1

Figure 14 Trame USART

Station meacuteteacuteo autonome 2012

30

Afin de faciliter les liaisons entre peacuteripheacuteriques (PC microcontrocircleur modem hellip) des vitesses

de transmission sont normaliseacutees luniteacute baud correspondant agrave un temps bit Dans notre cas nous

choisirons une vitesse de transmission de 9600bps

C Programme drsquoenvoi des donneacutees par liaison Usart

Gracircce agrave la librairie de MikroC il est tregraves facile drsquoenvoyer des donneacutees par liaison Usart Cela

fonctionne comme pour envoyer des caractegraveres sur lrsquoeacutecran LCD Il faut juste ensuite choisir la vitesse

de transmission qui sera 9600bps Voici la fonction et un morceau du programme qui sert agrave envoyer

les caractegraveres sur Xbee et de Xbee agrave un HyperTerminal

Fonction humiditeacute

void humidite(int cond)

long H U VL Deacuteclaration des variables

char HH hum[8] humtxt[]=Humidite

helliphellip

Xbee(8 hum) Envoi la chaicircne de caractegravere hum dans la fonction xbee

Usart

void xbee(int nb char receive[20])

int i

Usart_Init(9600) Vitesse de transmission

for(i=0 ilt=nb i++) Boucle for

Usart_Write(receive[i]) Envoi les caractegraveres sur lrsquoHyperTerminal jusquagrave i

Station meacuteteacuteo autonome 2012

31

XII Estimation du coucirct du projet

On peut voir sur ce tableau que le prix de reviens pour les eacuteleacutements que nous avons utiliseacute

est de 14506euro TTC Ce qui est plutocirct oneacutereux compareacute aux stations meacuteteacuteo du marcheacute qui oscille

entre 6euro et 400euro En sachant que la nocirctre est loin drsquoecirctre finaliseacute (finition estheacutetique ergonomie et

ajout de nouvelle fonction comme la date et lrsquoheure)

Composant Quantiteacute Prix (TVA inclus) Liens Quartz 20000MHz 1 111 euro Lien

Capaciteacute 22pF 2 010 euro lien

PIC 16F876 1 427 euro lien

LCD MODULE 1 1575 euro lien

Potentiomegravetre 10KΩ 1 618 euro lien

Reacutesistance 33 Ω 1 035 euro lien

Reacutesistance 10 K Ω 2 070 euro lien

Reacutesistance 1 KΩ 3 105 euro lien

LED rouge 1 013 euro lien

DS1621 1 650 euro lien

Bouton poussoir 1 060 euro lien

Module Xbee 2 4000 euro lien

Platine dinterface (XBEE) RS232 1 1890 euro lien

Platine dinterface (XBEE) 1 1364 euro lien

Capteur drsquohumiditeacute 1 2692 euro lien

Transistor 1 561 euro lien

Diode 1 325 euro lien

Totales 1 14506 euro

Station meacuteteacuteo autonome 2012

32

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

panelsbut 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 Itrsquos also possible to measure

humidity and wind speed Then itrsquos 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 its 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 Itrsquos 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

Station meacuteteacuteo autonome 2012

33

XIV Conclusion

Ce projet sur la conception drsquoune station meacuteteacuteo autonome qui nous a eacuteteacute confieacute a eacuteteacute tregraves

enrichissant Il nous a permis de mettre en relations les connaissances acquises durant lrsquoanneacutee mais

aussi acqueacuterir de nouvelles connaissances comme le fonctionnement drsquoun microcontrocircleur En effet

nous nrsquoavions jamais programmeacute sur microcontrocircleur Il a fallu srsquoadapter et apprendre agrave utiliser des

nouveaux logiciels tels que Proteus MikroC ainsi que Labview

De cette expeacuterience nous avons aussi appris agrave ecirctre autonome Nous avons saisi que la

compreacutehension des documents techniques et des librairies eacutetait un point essentiel de notre projet

En programmation nous nrsquoavions pas le droit agrave lrsquoerreur car la moindre faute pouvait conduire le

systegraveme agrave un dysfonctionnement Ce projet nous a demandeacute beaucoup de rigueur de patience et de

temps

Toutefois nous nrsquoavons pas eu malheureusement le temps drsquoinstaller le capteur de

tempeacuterature inteacuterieure par manque de temps Plus encore nous aurions aimeacute approfondir certains

points Par exemple pouvoir installer les composants sur circuit imprimeacute et concevoir un support

viable pour en faire une vraie station meacuteteacuteo Lrsquoinstallation drsquoune girouette aurait eacuteteacute appreacuteciable

pour connaicirctre le sens du vent Aussi le programme aurait sans doute pu ecirctre encore ameacutelioreacute pour

de meilleures performances

Malgreacute ce manque de temps nous sommes tregraves satisfaits du fonctionnement de ce module

qui nous a permis de comprendre lrsquoutiliteacute des parties theacuteoriques pour lrsquoapplication et la mise en

œuvre drsquoun systegraveme Lrsquoapproche peacutedagogique de nous diriger vers les solutions sans jamais les

donner de nous laisser un grand degreacute de liberteacute et drsquoautonomie a eacuteteacute au deacutebut assez deacuteroutante

mais tregraves instructif

Enfin nous tenions agrave remercier Mme Leymarie qui nous a suivis et aiguilleacute tout au long de ce

projet

Station meacuteteacuteo autonome 2012

34

XV ANNEXES

Programme complet

Deacuteclaration 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()

deacuteclaration des variables

int cond=0Condition pour laffichage sur leacutecran LCD

int BP=0

Initialisation et affectation des ports

PORTA=0

PORTB=0 initialisation

PORTC=0

TRISB=0 Port B deacuteclarer en sortie

TRISA=0xFF Port A en entreacutee

ADCON1=0x84 Justifieacute agrave droite active RA0RA1RA3 analogique

ADCON0=0x85 Fosc32 sur PA0 en service

TRISB=0 Port B deacuteclarer en sortie

TRISC=0xFFPort C deacuteclarer en entreacutee

Configuration et initialisation de leacutecran LCD

Lcd_Config(ampPORTB 0 1 WR 5 4 3 2) Configure lecran

Lcd_Init(ampPORTB) initialisation du LCD

Lcd_Cmd(Lcd_CURSOR_OFF) Enleve le curseur

Lcd_Cmd(Lcd_CLEAR) Efface lecran

Initialisation du module I2C

I2C_Init(100000)initialisation de la communication I2C

I2C_Start()Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90)Mode de controcircle en mode eacutecriture

I2C_Wr(0xAC)Accegraves au registre de configuration

I2C_Wr(0x0A)Registre de configuration mesure en continu

I2C_Stop()Arrecirct du signal

I2C_Start()Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90)Mode de controcircle en mode eacutecriture

I2C_Wr(0xEE)Deacutebut de la conversion

I2C_Stop()Arrecirct du sigal

Station meacuteteacuteo autonome 2012

35

Configuration du mode capture

T1CON=0x31 Configuration du timer1

CCP1CON=0x05 Paramegravetrage du mode capture

PIE1TMR1IE=1 Autorise les deacutebordements du timer 1

Boucle infinie

while(1)

cond=cond+1Increacutemente la variable cond

switch(BP)

case 0

humidite(ampcond)Appel la fonction humiditeacute

if(PORTAF2==1)Ces if permet de changer la valeur de BP

BP=1

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)Temps quon relacircche bien le bouton

break

case 1

temperature(ampcond)Appel la fonction tempeacuterature

if(PORTAF2==1)

BP=2

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)

break

case 2

vent(ampcond)Appel la fonction vent

if(PORTAF2==1)

BP=0

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)

break

Fonction humiditeacute

void humidite(int cond)

long H U VLDeacuteclaration des variables

char HH hum[8] humtxt[]=Humidite

VL=Adc_read(0) Valeur lue sur RA0(humiditeacute)

U=(VL5000)1023 Convertit la valeur lue en tension x1000

H=(U-810)(0031) Convertit la tension en humiditeacute x1000

Station meacuteteacuteo autonome 2012

36

if(Hgt100000)Si H gt 100(impossible) alors = 100

H=100000

if(Hlt0)Si H lt 0(impossible) alors = 0

H=0

hum[0]=(H100000)+48Valeur des centaines affecteacute en ascii(48=0)

HH=(H10000)10

hum[1]=HH+48Valeur des dizaines affecteacute en ascii

HH=(H1000)10

hum[2]=HH+48Valeur des uniteacutes affecteacute en ascii

hum[3]=44Virgule affecteacute en ascii

HH=(H100)10

hum[4]=HH+48Valeur de la premiegravere deacutecimale affecteacute en ascii

HH=(H10)10

hum[5]=HH+48Valeur de la deuxiegraveme deacutecimale affecteacute en ascii

hum[6]=37Pourcentage affecteacute en ascii

if(cond==50)Appel la fonction LCD tous les 1000

lcd(1 1 8 humtxt)Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 7 hum)Affiche la chaine de caractegravere hum sur le LCD

cond=0Remise a 0 de la condition

Xbee(7 hum) Envoi la chaicircne de caractegravere hum dans la fonction xbee

Fonction tempeacuterature

void temperature(int cond)

char temp[7] temptxt[]=Temperature LSB

signed char MSB

I2C_Start()Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90)Mode de controcircle en mode eacutecriture

I2C_Wr(0xAA)Lecture de la tempeacuterature

I2C_Stop()Arrecirct du sigal

I2C_Start()Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x91)Mode de controcircle en mode lecture

MSB = I2C_Rd(1)Nombre signeacute donnant la tempeacuterature entre +125deg et -55degC

LSB = I2C_Rd(0)Si bit 7 = 1 tempeacuterature MSB +05degC

I2C_Stop()Arrecirct du sigal

if(MSBlt0)

MSB = abs(MSB) Si temperature neacutegative valeur absolue de MSB

Temp[0]=45 Signe - affecteacute en ascii

else

Station meacuteteacuteo autonome 2012

37

Temp[0]=43signe + affecteacute en ascii

Temp[1]=(MSB10)+48 Valeur des dizaines affecteacute en ascii

Temp[2]=(MSB10)+48 Valeur des uniteacutes affecteacute en ascii

Temp[3]=44 Virgule affecteacute en ascii

if (LSB==128) Si bit 7 agrave 1 alors +05deg

Temp[4]=5

else Si bit 7 agrave 0 alors +00deg

Temp[4]=0

Temp[5]=223 degreacute affecteacute en ascii

Temp[6]=67 C affecteacute en ascii

if(cond==50)Appel la fonction LCD tous les 1000

lcd(1 1 11 temptxt)Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 7 temp)Affiche la chaine de caractegravere hum sur le LCD

cond=0Remise a 0 de la condition

Xbee(7 temp) Envoi la chaicircne de caractegravere temp dans la fonction xbee

Fonction vent

void vent(int cond)

unsigned long tl th per

int vitfreq

char vent[13] txtvent[]=Vitesse du vent VV

if(PIR1CCP1IF==1) Test si front montant agrave lieu

TMR1H=0 Initialisation du timer1 bit de point fort

TMR1L=0 Initialisation du timer1 bit de point faible

th=CCPR1H Les valeurs sont copieacute dans des variables

tl=CCPR1L

th=thltlt8 Deacutecalage car th =gt bit de point fort

per = th|tl On concategravene les deux valeurs nous obtenons la peacuteriode

PIR1CCP1IF=0 Remise a 0 du drapeau

if(PIR1TMR1IF==1) Si deacutepassement du timer 1

per=65535+per On ajoute une retenue lorsquon a fait un tour (16bit)

PIR1TMR1IF=0 Remise a 0 du drapeau deacutepassement

Station meacuteteacuteo autonome 2012

38

freq=671310perCalacul de la freacutequence

vit=freq179 + 692Calcul de la vitesse que lon x100

if(vitlt200)En dessous 2ms la mesure est aleacuteatoire agrave cause du 2egraveme deacutebordement

vit=0

vent[0]=(vit10000)+48Valeur des centaines affecteacute en ascii(48=0)

VV=(vit1000)10

vent[1]=VV+48Valeur des dizaines affecteacute en ascii

VV=(vit100)10

vent[2]=VV+48Valeur des uniteacute affecteacute en ascii

VV=(vit10)10

vent[3]=44Virgule affecteacute en ascii

vent[4]=VV+48Valeur de la 1er deacutecimale affecteacute en ascii

VV=vit10

vent[5]=VV+48Valeur de la 2egraveme deacutecimale affecteacute en ascii

vent[6]=109m affecteacute en ascii

vent[7]=47 affecteacute en ascii

vent[8]=115s affecteacute en ascii

if(cond==50)Appel la fonction LCD tous les 1000

lcd(1 1 15 txtvent)Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 9 vent)Affiche la chaine de caractegravere hum sur le LCD

cond=0Remise a 0 de la condition

Xbee(9 vent) Envoi la chaicircne de caractegravere vent dans la fonction xbee

Fonction affichage

void lcd(int li int co int nb char receive[15])

int i

for(i=0 iltnb i++)Boucle for

Lcd_chr(li (co+i) receive[i])Affiche les caractegraveres jusquagrave i

Usart

void xbee(int nb char receive[15])

int i

Usart_Init(9600)Vitesse de transmission

for(i=0 iltnb i++)Boucle for

Usart_Write(receive[i])Envoi les caractegraveres sur lHyperTerminal jusquagrave i

Station meacuteteacuteo autonome 2012

9

Nous avons remarqueacute sur la courbe ainsi qursquoen simulation que le capteur peut avoir des

valeurs supeacuterieur agrave 100 et infeacuterieur agrave 0 Il faudra donc mettre deux conditions pour ne pas

deacutepasser la plage de valeur

B Configuration du microcontrocircleur

Maintenant nous arrivons agrave point important de cette partie celle de la configuration des

ports du microcontrocircleur En effet le PIC16F876 est constitueacute drsquoun module convertisseur agrave 5 entreacutees

Ces entreacutees sont situeacutees sur les bornes RA0 RA1 RA2 RA3 et RA5 (cf figure1) Le reacutesultat de la

conversion est codeacute sur 10 bits Crsquoest une valeur comprise entre hrsquo000rsquo et hrsquo3FFrsquo

hlsquo3FFrsquo = brsquo1 1111 1111rsquo = drsquo1023rsquo

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 eacutequation

U = (Valeur lue sur le CAN 5)1023

Pour les mecircme raison que lrsquoeacutequation du capteur drsquohumiditeacute nous avons multiplieacute par

1000 la tension nous obtenons donc U= (Valeur lue sur le CAN 5000)1023

Il faut ensuite reacutegler les entreacutees analogiques avec les registres ADCON0 et ADCON1 en

sachant que nous avons deacutecideacute 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 (Freacutequence drsquooscillation)2

01= Fosc8

10= Fosc32

11= Oscillateur RC interne

Pour que la conversion soit correct il faut que T(ad) soit au minimum de 16micros nous

disposons drsquoun quartz de 20Mhz =gt 20Mhz32 =gt 16micros Nous mettrons donc le bit 7 agrave 1 et

le 6 agrave 0

Bit 5 bit4 et bit 3 CHS2 CHS1 et CHS0 = Channel Select bits

Ces 3 bits permettent de choisir lentreacutee qui va ecirctre convertie

Station meacuteteacuteo autonome 2012

10

Nous voulons convertir lrsquoentreacutee RA0 pour cela il faut mettre les bits 5 4 3 agrave 0

Bit 2 GODONE Status bit si ADON=1

1 = Deacutemarre la conversion AD Ce bit est remis agrave 0 par hard

0 = La conversion AD est termineacutee

Il nous faut deacutemarrer la conversion

Bit 1 Bit non implanteacute

Bit 0 ADON AD on bit

1= Convertisseur AD en service

0 = Convertisseur AD agrave larrecirct

Il nous faut mettre le convertisseur en service

ADCON0 = brsquo1000 0101rsquo = hrsquo85rsquo

Bit 7 ADFM = AD Result format

1 = Justifieacute agrave droite

0 = Justifieacute agrave gauche

Nous avons justifieacute agrave droite

Bit 6 bit 5 et bit 4 Bits non impleacutementeacutes

Bit 3 bit 2 bit 1 et bit 0 PCFG3 PCFG2 PCFG1 et PCFG0

Bits de controcircle de la configuration des Ports

Ces bits permettent de choisir le partage entre entreacutees analogiques et digitales sur les PORTS A et E

On a choisi drsquoactiver RA0 RA1 et RA3 en entreacutee analogique les autres resteront en

digitales ce qui signifie qursquoau vue de la datasheet il faut mettre le bit 2 agrave 1 et les autres agrave 0

ADCON1 = brsquo10000100rsquo = hrsquo84rsquo

Station meacuteteacuteo autonome 2012

11

C Le scheacutema du microcontrocircleur avec le capteur drsquohumiditeacute

Voici le scheacutema de cacircblage du capteur drsquohumiditeacute uniquement A noter que le capteur est

remplaceacute par un potentiomegravetre nrsquoeacutetant pas dans la librairie de Proteus On constate qursquoil est bien

brancheacute sur RA0

D Programme pour la mesure de lrsquohumiditeacute

Voici le programme pour mesurer lrsquohumiditeacute avec les affectations deacutecrites ci-dessus ainsi

que les eacutequations de conversions

Deacuteclaration des fonctions

void humidite(int cond)

void lcd(int li int co int nb char receive[11])

void main()

deacuteclaration des variables

int cond=0 Condition pour laffichage sur leacutecran LCD

Initialisation et affectation des ports

PORTB=0 initialisation

TRISB=0 Port B deacuteclarer en sortie

TRISA = 0xFF Port A en entreacutee

ADCON1 = 0x84 Justifieacute agrave droite active RA0RA1RA3 analogique

ADCON0 = 0x85 Fosc32 sur PA0 en service

Configuration et initialisation de leacutecran LCD

Lcd_Config(ampPORTB 0 1 WR 5 4 3 2) Configure leacutecran

Lcd_Init(ampPORTB) initialisation du LCD

Lcd_Cmd(Lcd_CURSOR_OFF) Enlegraveve le curseur

Lcd_Cmd(Lcd_CLEAR) Efface leacutecran

Figure 8 Scheacutema de cacircblage du capteur dhumiditeacute

Station meacuteteacuteo autonome 2012

12

Boucle infinie

while(1)

cond=cond+1 Increacutemente la variable cond

humidite(ampcond) Appel la fonction humiditeacute

Fonction humiditeacute

void humidite(int cond)

long H U VL Deacuteclaration des variables

char HH hum[8] humtxt[]=Humidite

VL=Adc_read(0) Valeur lue sur RA0(humiditeacute)

U=(VL5000)1023 Convertit la valeur lue en tension x1000

H=(U-810)(0031) Convertit la tension en humiditeacute x1000

if(Hgt100000) Si H gt 100(impossible) alors = 100

H=100000

if(Hlt0) Si H lt 0(impossible) alors = 0

H=0

hum[0]=(H100000)+48 Valeur des centaines affecteacute en ascii(48=0)

HH=(H10000)10

hum[1]=HH+48 Valeur des dizaines affecteacute en ascii

HH=(H1000)10

hum[2]=HH+48 Valeur des uniteacutes affecteacute en ascii

hum[3]=44Virgule affecteacute en ascii

HH=(H100)10

hum[4]=HH+48 Valeur de la premiegravere deacutecimale affecteacute en ascii

HH=(H10)10

hum[5]=HH+48 Valeur de la deuxiegraveme deacutecimale affecteacute en ascii

hum[6]=37 Pourcentage affecteacute en ascii

if(cond==1000)Appel la fonction LCD tous les 1000

lcd(1 1 10 humtxt) Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 7 hum) Affiche la chaine de caractegravere hum sur le LCD

cond=0 Remise a 0 de la condition

Fonction affichage

void lcd(int li int co int nb char receive[11])

int i

for(i=0 ilt=nb i++)Boucle for

Lcd_chr(li (co+i) receive[i]) Affiche les caractegraveres jusquagrave i

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

Station meacuteteacuteo autonome 2012

13

VIII Le capteur de tempeacuterature

A preacutesent comme toute station meacuteteacuteo

nous avons installeacute un capteur de tempeacuterature le

DS1621 Ce capteur communique avec le

microcontrocircleur gracircce au protocole I2C

A Le protocole I2C

Le bus I2C (Inter Integrated Circuit) a eacuteteacute deacuteveloppeacute au deacutebut des anneacutees 80 par Philips

semiconductors pour permettre de relier facilement agrave un microprocesseur les diffeacuterents circuits dun

teacuteleacuteviseur moderne

Le bus I2C permet de faire communiquer entre eux des composants eacutelectroniques tregraves divers

gracircce agrave seulement trois fils Un signal de donneacutee (SDA) un signal dhorloge (SCL) et un signal de

reacutefeacuterence eacutelectrique (Masse)

Ceci permet de reacutealiser des eacutequipements ayant des fonctionnaliteacutes tregraves puissantes (En

apportant toute la puissance des systegravemes micro programmeacutes) et conservant un circuit imprimeacute tregraves

simple par rapport un scheacutema classique (8bits de donneacutees 16 bits dadresse + les bits de controcircle)

Les donneacutees sont transmises en seacuterie agrave 100Kbitss en mode standard et jusquagrave 400Kbitss en

mode rapide Ce qui ouvre la porte de cette technologie agrave toutes les applications ougrave la vitesse nest

pas primordiale

Voici un exemple de protocole qursquoutilise le bus I2C

1 Pour initier le dialogue le maicirctre creacutee une condition Start

2 Le maicirctre envoie ladresse de lesclave (1010100) suivi du bit 0 (bit Write)

3 Lesclave reacutepond (accuseacute de reacuteception bit Acknowledge)

4 Le maicirctre envoie ladresse du registre (0x04) agrave eacutecrire

5 Lesclave reacutepond (accuseacute de reacuteception bit Acknowledge)

6 Le maicirctre envoie la donneacutee (0x27) agrave eacutecrire

7 Lesclave eacutecrit la donneacutee puis envoie un accuseacute de reacuteception (bit Acknowledge)

8 Le maicirctre termine le dialogue avec une condition Stop

9 Le bus I2C est maintenant libre (SCL = 1 SDA = 1 niveaux de repos)

Figure 9 scheacutema du DS1621

Station meacuteteacuteo autonome 2012

14

B Caracteacuteristique du DS1621

Comme on peut voir sur la figure 9 le capteur est composeacute de 8 bornes

SDA =gt Liaison seacuterie entreacutee sortie

SCL =gt Signal drsquohorloge

Tout =gt Signal de sortie du thermostat (inutile dans notre cas)

GND =gt Masse

VDD =gt Alimentation +5V

A0 A1 A2 =gt Entreacutee drsquoadressage (dans notre cas les 3 agrave la masse car nous nrsquoavons qursquoun

module I2C)

Les circuits connecteacutes sur un bus I2C ont des sorties de type drain ouvert (ou collecteur

ouvert) Deux reacutesistances de pull-up sont bien sucircr placeacutees entre les lignes SDA SCL et lalimentation

(VDD)Quand le bus nest pas utiliseacute SDA et SCL sont au niveau haut (niveau de repos)

1 Speacutecificiteacute des commandes

Tous dialogue du maicirctre(PIC16F876) avec un DS1621 esclave doit deacutebuter par lrsquoenvoi drsquoun

mot de controcircle

Le maicirctre envoi ensuite une commande suivi ou non de donneacutees Voici la liste des

commandes avec leur description

Les commandes AC EE et 22 ne sont pas suivies de lenvoi de donneacutees Par contre la

commande AA qui nous inteacuteresse est suivie de lrsquoenvoi par le DS1621 de 2 octets repreacutesentant la

tempeacuterature

Station meacuteteacuteo autonome 2012

15

Voici le registre de configuration(AC) qursquoil nous faut deacuteterminer

DONE 1 = conversion finie 0 = conversion en cours En mode 1 SHOT uniquement

THF Flag seuil haut du thermostat Passe agrave 1 et y reste si tempeacuterature supeacuterieure agrave TH

TLF Flag seuil bas du thermostat Passe agrave 1 et y reste si tempeacuterature infeacuterieure agrave TL

NVB 1 = meacutemoire EEPROM en eacutecriture 0 = meacutemoire EEPROM eacutecriture termineacutee

Nous nrsquoactiverons pas lrsquoeacutecriture de la meacutemoire

POL Polariteacute de Tout (pin 3) 1 = actif sera un niveau HAUT 0 = actif sera un niveau BAS

Il faut activer la polariteacute donc nous le mettons agrave 1

ONE SHOT 0 = conversion en continu 1 = conversion 1 fois

Nous le mettons en mode continu

AC = brsquo00001010rsquo = hrsquo0Arsquo

La commande AA qui permet de lire la tempeacuterature renvoie 2 octets

MSB (Most Significant Bit) Nombre signeacute donnant la tempeacuterature entre +125deg et -55degC

LSB (Least Significant Bit ) Seul le bit 7 de cet octet est significatif Si 1 tempeacuterature

MSB +05degC

Pour bien comprendre comment est codeacute un nombre signeacute un tableau avec des exemples de

valeurs eacutetait agrave notre disposition dans la notice

Station meacuteteacuteo autonome 2012

16

2 Dialogue I2C pour avoir la tempeacuterature

Voici un scheacutema qui montre le dialogue agrave effectuer entre le microcontrocircleur et le capteur

pour avoir la tempeacuterature Crsquoest gracircce agrave ce mecircme scheacutema que nous avons pu programmer le PIC

Station meacuteteacuteo autonome 2012

17

C Le scheacutema du microcontrocircleur avec le capteur de tempeacuterature

Voici le scheacutema du capteur de tempeacuterature uniquement Le capteur est brancheacute sur les

borne SCL(RC3) et SDA(RC4) du PIC Qursquoelles soient deacuteclareacutees en entreacutee ou en sortie les bornes SCL et

SDA sont fonctionnelles Il ne faut pas oublier les reacutesistances de tirages (R1 et R3) Lrsquoadressage A0 A1

A2 toutes misent agrave la masse car nous nrsquoavons qursquoun seul capteur I2C relieacute au PIC et le Tout

(thermostat) inutile car nous faisons juste un releveacute de tempeacuterature

D Programme pour la mesure de la tempeacuterature

Deacuteclaration des fonctions

void temperature(int cond)

void lcd(int li int co int nb char receive[14])

void main()

deacuteclaration des variables

int cond=0Condition pour laffichage sur leacutecran LCD

Initialisation et affectation des ports

PORTB=0 initialisation

PORTC=0

TRISB=0 Port B deacuteclarer en sortie

TRISC = 0xFF Port C en entreacutee

Configuration et initialisation de leacutecran LCD

Lcd_Config(ampPORTB 0 1 WR 5 4 3 2) Configure leacutecran

Lcd_Init(ampPORTB) initialisation du LCD

Lcd_Cmd(Lcd_CURSOR_OFF) Enlegraveve le curseur

Lcd_Cmd(Lcd_CLEAR) Efface leacutecran

Initialisation du module I2C

I2C_Init(100000) initialisation de la communication I2C

I2C_Start() Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90) Mode de controcircle en mode eacutecriture

I2C_Wr(0xAC) Accegraves au registre de configuration

I2C_Wr(0x0A) Registre de configuration mesure en continu

I2C_Stop() Arrecirct du signal

I2C_Start() Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90) Mode de controcircle en mode eacutecriture

Figure 10 Scheacutema de cacircblage avec le capteur de tempeacuterature

Station meacuteteacuteo autonome 2012

18

I2C_Wr(0xEE) Deacutebut de la conversion

I2C_Stop()Arrecirct du sigal

Boucle infinie

while(1)

cond=cond+1 Increacutemente la variable cond

temperature(ampcond) Appel la fonction humiditeacute

Fonction tempeacuterature

void temperature(int cond)

char temp[7] temptxt[]=Temperature LSB

signed char MSB

I2C_Start() Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90) Mode de controcircle en mode eacutecriture

I2C_Wr(0xAA) Lecture de la tempeacuterature

I2C_Stop() Arrecirct du signal

I2C_Start() Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x91) Mode de controcircle en mode lecture

MSB = I2C_Rd(1) Nombre signeacute donnant la tempeacuterature entre +125deg et -55degC

LSB = I2C_Rd(0) Si bit 7 = 1 tempeacuterature MSB +05degC

I2C_Stop() Arrecirct du signal

if(MSBlt0)

MSB = abs(MSB) Si tempeacuterature neacutegative valeur absolue de MSB

Temp[0]=45 Signe - affecteacute en ascii

else

Temp[0]=43 signe + affecteacute en ascii

Temp[1]=(MSB10)+48 Valeur des dizaines affecteacute en ascii

Temp[2]=(MSB10)+48 Valeur des uniteacutes affecteacute en ascii

Temp[3]=44 Virgule affecteacute en ascii

if (LSB==128) Si bit 7 agrave 1 alors +05deg

Temp[4]=5

Else Si bit 7 agrave 0 alors +00deg

Temp[4]=0

Temp[5]=223 degreacute affecteacute en ascii

Temp[6]=67 C affecteacute en ascii

if(cond==10) Appel la fonction LCD tous les 1000

lcd(1 1 13 temptxt) Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 6 temp) Affiche la chaine de caractegravere hum sur le LCD

cond=0 Remise a 0 de la condition

Fonction affichage

void lcd(int li int co int nb char receive[14])

int i

for(i=0 ilt=nb i++)Boucle for

Lcd_chr(li (co+i) receive[i]) Affiche les caractegraveres jusquagrave i

Le scheacutema preacuteceacutedent est bien respecteacute comme on peut le voir crsquoest tregraves facile agrave programmer

gracircce aux librairies I2C du logiciel MikroC

Station meacuteteacuteo autonome 2012

19

IX Lrsquoaneacutemomegravetre

A Conception

Pour lrsquoaneacutemomegravetre lrsquoeacutequipe peacutedagogique

nous a juste fourni lrsquoheacutelice du capteur donc il a fallu

concevoir toute la partie eacutelectronique Lrsquoideacutee est

drsquoinstaller une diode et un transistor photonique par

de lagrave lrsquoheacutelice et lorsqursquoelle tourne elle vient couper le

faisceau Succinctement le transistor envoit soit 1 soit

0 sur le PIC Le but est de relever la freacutequence agrave

laquelle tourne lrsquoheacutelice puis la convertir en vitesse (cf

figure 11)

La photodiode choisie est de reacutefeacuterence SD5455-3 Ce choix a eacuteteacute fait car lrsquoangle du faisceau

est de 20deg pour que le flux infrarouge soit bien concentreacute sur le phototransistor pour un

fonctionnement optimal

Comme on le voit sur le scheacutema de principe (cf figure 11) il a fallu dimensionner la

reacutesistance qui sert agrave reacuteguler le courant qui circule dans la LED avec les informations donneacutees par la

documentation technique nous avons pu la calculer

Forward voltage VF = 17V et IF = 01A

Ualim = 5V

RD = (Ualim ndash UF)IF = (5 ndash 17)01

RD = 33Ω

Pour le phototransistor nous avons choisi celui qui allait avec la diode de reacutefeacuterence SE5455-3

Cette fois la valeur de la reacutesistance nous eacutetait donneacute par le constructeur

RL=1000Ω

Lors des seacuteances nous avons implanteacute la diode et le

transistor sur le support du capteur Pour des raisons

pratiques et estheacutetiques nous avons seacutepareacute la partie

aneacutemomegravetre et la partie platine par des borniers (cf figure

12)

Figure 11 scheacutema descriptif de laneacutemomegravetre

Figure 12 Notre aneacutemomegravetre

Station meacuteteacuteo autonome 2012

20

B Mesure de la peacuteriode sur le microcontrocircleur

Le but est de relever la peacuteriode du signal envoyer par lrsquoaneacutemomegravetre pour cela le PIC est

eacutequipeacute drsquoun mode capture Le principe est de recopier agrave un moment voulu la valeur du timer 1 La

capture peut avoir lieux agrave chaque front descendant agrave chaque front montant tous les 4 ou tous les 16

fronts montants Quand la capture a eu lieu un flag est mis agrave 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 constitueacute de 2 registres de 8 bits TMR1H et TMR1L que lon peut lire ou eacutecrire Le registre TMR1

(constitueacute de TMR1H et TMR1L) sincreacutemente de h0000 jusquagrave hFFFF et repasse ensuite agrave h0000

pour continuer le comptage Quand il y a deacutebordement une interruption peut ecirctre geacuteneacutereacutee si on lrsquoa

autoriseacutee par TMR1IE =1 (bit 0 de PIE1) et le Flag TMR1IF (bit 0 de PIR1) passe agrave 1 Le controcircle du

timer 1 ce fait par le registre T1CON

Bit 7 et bit 6 bits non impleacutementeacutes

Bit 5 et bit 4 T1CKPS = Seacutelection du preacute diviseur placeacute avant le TIMER

Vu qursquoon a un quartz eacuteleveacute nous avons deacutecideacute de choisir un preacute-diviseur de 8 donc

F=Fosc(48) Pour cela mettre les bit 4 et 5 agrave 1

Bit 3 T1OSCEN Bit dautorisation de loscillateur du Timer 1

1 = oscillateur autoriseacute

0 = oscillateur stoppeacute

Oscillateur interne inutile donc bit 3 agrave 0

Bit 2 T1SYNC Bit de controcircle de la synchronisation du CLK externe

1 = Pas de synchronisation de lhorloge externe

0 = Synchronisation de lhorloge externe

Nous nous mettrons en mode synchrone

Bit1 TMR1CS Bit de seacutelection de la source horloge

1 = Mode Compteur Clk externe sur la broche PC0 ou Quartz entre PC0 et PC1

0 = Mode Timer Clk interne = Fosc4

Station meacuteteacuteo autonome 2012

21

On mettra ce bit agrave 0 car on utilise le mode Timer

Bit 0 TMR1ON Bit dautorisation du Timer 1

1 = Timer 1 en service

0 = Timer 1 stoppeacute

Il faut eacutevidemment mettre la timer 1 en service

Nous avons aussi autoriseacute le deacutebordement du timer 1 pour avoir plus de preacutecisions pour cela il faut

mettre la commande PIE1TMR1 agrave 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 parameacutetrer le registre

CCP1CON

Bit 7 et Bit 6 bits non impleacutementeacutes

Bit 5 et Bit 4 CCP1X et CCP1Y

Bits non utiliseacutes 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 agrave Bit 0 CCP1M3 agrave CCP1M0 bits de seacutelection du mode

Nous avons seacutelectionneacute le mode capture sur chaque front montant Pour cela nous avons

mis les bits 1 et 3 agrave 0 et les bits 0 et 2 agrave 1

Pour savoir si un front montant agrave eu lieu le flag CCP1F est mis agrave 1 Ce flag doit ecirctre remis agrave 0 par

lrsquoutilisateur La valeur des 16 bits des registres du Timer 1 TMR1L (bit de poids faible) et TMR1H (bit

de poids fort) sont recopieacutees dans les registres CCPR1 CCPRIH (bit de poids faible) et CCPR1L (bit de

poids fort)

Nous avons programmeacute le mode capture de faccedilon agrave afficher sur lrsquoeacutecran LCD la valeur du registre

CCPR1 crsquoest-agrave-dire la peacuteriode du signal de lrsquoaneacutemomegravetre Il ne nous reste maintenant plus qursquoagrave

eacutetalonner notre aneacutemomegravetre

Station meacuteteacuteo autonome 2012

22

C Etalonnage de lrsquoaneacutemomegravetre

Pour eacutetalonner le capteur nous avons commenceacute par savoir agrave quelle freacutequence correspond la

valeur releveacutee par le mode capture Pour cela nous avons brancheacute un GBF agrave la place du capteur et

avec un oscilloscope nous avons compareacute leurs valeurs

Nous avons ensuite traceacute agrave lrsquoaide des valeurs du tableau la courbe F(Hz) en fonction du

compteur De cette courbe nous relevons lrsquoeacutequation

F = 671310compteur^(-101)

Soit environ F = 671310compteur

Puis nous avons brancheacute notre aneacutemomegravetre sur le microcontrocircleur Cela dans le but de

relever sa peacuteriode sur lrsquoeacutecran LCD agrave lrsquoaide drsquoune soufflerie variable et du manomegravetre GDH (reacutef

121552 200-13) nous avons compareacute leurs valeurs pour connaitre lrsquoeacutetalonnage de notre capteur

Nous avons noteacute plusieurs valeurs puis traceacute diffeacuterentes courbe pour trouver les eacutequations qui nous

permettrons de calculer la vitesse dans notre programme

Station meacuteteacuteo autonome 2012

23

Voici les valeurs que nous avons releveacutees puis la courbe traceacutee sur Excel

De cette courbe nous obtenons lrsquoeacutequation

Vitesse du vent = 0179F + 0629

Nous les multiplierons par 100 pour reacutecupeacuterer les deacutecimales et les implanter dans une chaine

de caractegravere

Vitesse du vent = 179F + 629

Nous avons agrave preacutesent agrave notre disposition toutes les eacutequations neacutecessaires pour pouvoir

convertir la valeur releveacutee par le mode capture en une vitesse

D Le scheacutema du microcontrocircleur avec lrsquoaneacutemomegravetre

On voit sur le scheacutema que le capteur est bien relieacute sur la borne RC2 Nous avons aussi

repreacutesenteacute les borniers J1 et J2 A droite tous ce qui est sur le support et agrave gauche tous ce qui est sur

la platine

Figure 13 Scheacutema avec laneacutemomegravetre

Station meacuteteacuteo autonome 2012

24

E Programme pour la mesure de la vitesse du vent

Voici le programme pour mesurer la vitesse du vent avec les affectations deacutecrites ci-dessus

ainsi que les eacutequations de conversions

Deacuteclaration des fonctions

void vent(int cond)

void lcd(int li int co int nb char receive[20])

void main()

deacuteclaration des variables

int cond=0

Initialisation et affectation des ports

PORTB=0 initialisation

PORTC=0 initialisation

TRISC=0x04 Port C deacuteclarer en sortie sauf RC2 en mode capture

TRISB=0 Port B deacuteclarer en sortie

Configuration du mode capture

T1CON=0x31 Configuration du timer1

CCP1CON=0x05 Parameacutetrage du mode capture

PIE1TMR1IE=1 Autorise les deacutebordements du timer 1

Configuration et initialisation de leacutecran LCD

Lcd_Config(ampPORTB 0 1 WR 5 4 3 2) Configure leacutecran

Lcd_Init(ampPORTB) Initialisation du LCD

Lcd_Cmd(Lcd_CURSOR_OFF) Enlegraveve le curseur

Lcd_Cmd(Lcd_CLEAR) Efface leacutecran

Boucle infinie

while(1)

cond=cond+1

vent(ampcond)

Fonction vent

void vent(int cond)

unsigned long tl th per

int vitfreq

char vent[13] txtvent[]=vitesse du vent VV

if(PIR1CCP1IF==1) Test si front montant agrave lieu

TMR1H=0 Initialisation du timer1 bit de point fort

TMR1L=0 Initialisation du timer1 bit de point faible

th=CCPR1H Les valeurs sont copieacute dans des variables

tl=CCPR1L

th=thltlt8 Deacutecalage car th =gt bit de point fort

per = th|tl On concategravene les deux valeurs nous obtenons la peacuteriode

PIR1CCP1IF=0 Remise a 0 du drapeau

if(PIR1TMR1IF==1) Si deacutepassement du timer 1

per=65535+per On ajoute une retenue lorsquon a fait un tour (16bit)

PIR1TMR1IF=0 Remise a 0 du drapeau deacutepassement

freq=671310per Calcul de la freacutequence

vit=freq179 + 692 Calcul de la vitesse que lon x100

Station meacuteteacuteo autonome 2012

25

if(vitlt200) En dessous 2ms la mesure est aleacuteatoire agrave cause du 2egraveme deacutebordement

vit=0

vent[0]=(vit10000)+48 Valeur des centaines affecteacute en ascii(48=0)

VV=(vit1000)10

vent[1]=VV+48 Valeur des dizaines affecteacute en ascii

VV=(vit100)10

vent[2]=VV+48 Valeur des uniteacute affecteacute en ascii

VV=(vit10)10

vent[3]=44 Virgule affecteacute en ascii

vent[4]=VV+48 Valeur de la 1er deacutecimale affecteacute en ascii

VV=vit10

vent[5]=VV+48 Valeur de la 2egraveme deacutecimale affecteacute en ascii

vent[6]=109 m affecteacute en ascii

vent[7]=47 affecteacute en ascii

vent[8]=115 s affecteacute en ascii

if(cond==1000) Appel la fonction LCD tous les 1000

lcd(1 1 16 txtvent) Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 8 vent) Affiche la chaine de caractegravere hum sur le LCD

cond=0 Remise a 0 de la condition

Fonction affichage

void lcd(int li int co int nb char receive[20])

int i

for(i=0 ilt=nb i++) Boucle for

Lcd_chr(li (co+i) receive[i]) Affiche les caractegraveres jusquagrave i

Station meacuteteacuteo autonome 2012

26

X Simulation une station meacuteteacuteo autonome

Maintenant que tous nos capteurs sont installeacutes nous allons mettre agrave profit le bouton

poussoir installeacute dans la partie LCD Crsquoest-agrave-dire que nous allons rassembler tous les programmes

preacuteceacutedents pour nrsquoen faire qursquoun Il suffira drsquoappuyer sur le bouton poussoir pour faire deacutefiler les

diffeacuterentes valeurs comme une vraie station meacuteteacuteo

A La structure du programme

Boucle infinie

while(1)

cond=cond+1 Increacutemente la variable cond

switch(BP)

case 0

humidite(ampcond) Appel la fonction humiditeacute

if(PORTAF2==1) Ces if permet de changer la valeur de BP

BP=1

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250) Temps quon relacircche bien le bouton

break

case 1

temperature(ampcond) Appel la fonction tempeacuterature

if(PORTAF2==1)

BP=2

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)

break

case 2

vent(ampcond) Appel la fonction vent

if(PORTAF2==1)

BP=0

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)

break

Nous avons choisi drsquoutiliser un Switch nous avons donc juste rajouteacute une variable BP

Lorsqursquoil y a appui sur le bouton poussoir la variable BP srsquoincreacutemente et le programme passe agrave une

autre case et donc utilise une nouvelle fonction La temporisation nous donne le temps de relacirccher le

bouton pour eacuteviter de faire deacutefiler le menu sans le vouloir

Station meacuteteacuteo autonome 2012

27

B La simulation

Etant donneacute que nous ne pouvions pas prendre le mateacuteriel avec nous il eacutetait impeacuteratif de

pouvoir faire des simulations Pour cela nous avons utiliseacute un logiciel tregraves utile Proteus ISIS Ce

logiciel possegravede une tregraves grande librairie et permet de rentrer nos programmes sur le PIC virtuel

geacuteneacutereacute par le logiciel Pour simuler le capteur drsquohumiditeacute nous avons utiliseacute un potentiomegravetre Pour

celui de lrsquoaneacutemomegravetre comme pour nos mesures nous avons brancheacute virtuellement un GBF sur la

borne associeacute et observeacute son signal agrave lrsquoaide drsquoun oscilloscope

Voilagrave un aperccedilu de la simulation effectueacute sur ISIS

Veacuterification theacuteorique du vent

Vitesse du vent = 0179 37 + 0629

Vitesse du vent = 7657ms

Veacuterification theacuteorique de lrsquohumiditeacute

H= (315-081)0031

H=7548

Veacuterification theacuteorique de la

tempeacuterature

La valeur afficheacutee correspond bien

aux 27degC seacutelectionneacute sur le capteur

Station meacuteteacuteo autonome 2012

28

XI Transmission des donneacutees par liaison ZigBee

ZigBee est un protocole de haut niveau permettant la communication de petites radios agrave

consommation reacuteduite baseacutee sur le standard IEEE 802154

Cette technologie a pour but la communication de courte distance telle que le propose deacutejagrave

la technologie Bluetooth tout en eacutetant moins chegravere plus simple et avec une fiabiliteacute assez eacuteleveacutee

Dans notre projet nous nous servirons de ZigBee pour permettre une transmission par ondes

de nos donneacutees de la station meacuteteacuteo vers un ordinateur Pour cela nous avons 2 modules Xbee pro 2

platines drsquointerfaces une avec des pattes (liaison platine) et lrsquoautre avec une sortie RS232 (liaison pc)

Caracteacuteristique eacutelectrique

Les signaux Xbee ont une amplitude de 33V mais sont alimenteacutes en 5V (tension de notre

source USB) cacircbleacutes sur la bornes VIN (laquo Power input from 6-12Vdc 300mA or higher raquo) Mais

notre source nrsquoeacutetant pas assez puissante pour alimenter toute notre installation Nous utiliserons

donc une source externe de 5V qui sera utiliseacutee pour alimenter les 2 systegravemes Xbee

Description des Bornes du Xbee qui nous inteacuteresse

Station meacuteteacuteo autonome 2012

29

A Scheacutema eacutelectrique du module Xbee

Nous avons cacircbleacute la sortie TX du microcontrocircleur qui eacutemet un signal jusqursquoagrave la borne RX du

Xbee qui reacuteceptionne ce signal Apregraves la transmission se fait par onde entre les 2 modules Xbee Pour

le module qui reccediloit le signal un cacircble RS232 suffit agrave faire la liaison entre celui-ci et le PC

B Envoi des donneacutees la liaison Usart

Un USART (Universal synchronous amp Asynchronous Receiver Transmitter) est un eacutemetteur-

reacutecepteur universel En langage courant cest le composant utiliseacute pour faire la liaison entre

lordinateur et le port seacuterie Lordinateur envoie les donneacutees en parallegravele (autant de fils que de bits

de donneacutees) Il faut donc transformer ces donneacutees pour les faire passer agrave travers une liaison seacuterie qui

utilise un mecircme fil pour faire passer tous les bits de donneacutees

Constitution dune trame USART

un bit de start toujours agrave 0 servant agrave la synchronisation du reacutecepteur

les donneacutees la taille peut varier (geacuteneacuteralement entre 5 et 9 bits)

eacuteventuellement un bit de pariteacute paire ou impaire

et un bit de stop toujours agrave 1 (la dureacutee peut varier entre 1 15 et 2 temps bit)

Le niveau logique de repos est le 1

Figure 14 Trame USART

Station meacuteteacuteo autonome 2012

30

Afin de faciliter les liaisons entre peacuteripheacuteriques (PC microcontrocircleur modem hellip) des vitesses

de transmission sont normaliseacutees luniteacute baud correspondant agrave un temps bit Dans notre cas nous

choisirons une vitesse de transmission de 9600bps

C Programme drsquoenvoi des donneacutees par liaison Usart

Gracircce agrave la librairie de MikroC il est tregraves facile drsquoenvoyer des donneacutees par liaison Usart Cela

fonctionne comme pour envoyer des caractegraveres sur lrsquoeacutecran LCD Il faut juste ensuite choisir la vitesse

de transmission qui sera 9600bps Voici la fonction et un morceau du programme qui sert agrave envoyer

les caractegraveres sur Xbee et de Xbee agrave un HyperTerminal

Fonction humiditeacute

void humidite(int cond)

long H U VL Deacuteclaration des variables

char HH hum[8] humtxt[]=Humidite

helliphellip

Xbee(8 hum) Envoi la chaicircne de caractegravere hum dans la fonction xbee

Usart

void xbee(int nb char receive[20])

int i

Usart_Init(9600) Vitesse de transmission

for(i=0 ilt=nb i++) Boucle for

Usart_Write(receive[i]) Envoi les caractegraveres sur lrsquoHyperTerminal jusquagrave i

Station meacuteteacuteo autonome 2012

31

XII Estimation du coucirct du projet

On peut voir sur ce tableau que le prix de reviens pour les eacuteleacutements que nous avons utiliseacute

est de 14506euro TTC Ce qui est plutocirct oneacutereux compareacute aux stations meacuteteacuteo du marcheacute qui oscille

entre 6euro et 400euro En sachant que la nocirctre est loin drsquoecirctre finaliseacute (finition estheacutetique ergonomie et

ajout de nouvelle fonction comme la date et lrsquoheure)

Composant Quantiteacute Prix (TVA inclus) Liens Quartz 20000MHz 1 111 euro Lien

Capaciteacute 22pF 2 010 euro lien

PIC 16F876 1 427 euro lien

LCD MODULE 1 1575 euro lien

Potentiomegravetre 10KΩ 1 618 euro lien

Reacutesistance 33 Ω 1 035 euro lien

Reacutesistance 10 K Ω 2 070 euro lien

Reacutesistance 1 KΩ 3 105 euro lien

LED rouge 1 013 euro lien

DS1621 1 650 euro lien

Bouton poussoir 1 060 euro lien

Module Xbee 2 4000 euro lien

Platine dinterface (XBEE) RS232 1 1890 euro lien

Platine dinterface (XBEE) 1 1364 euro lien

Capteur drsquohumiditeacute 1 2692 euro lien

Transistor 1 561 euro lien

Diode 1 325 euro lien

Totales 1 14506 euro

Station meacuteteacuteo autonome 2012

32

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

panelsbut 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 Itrsquos also possible to measure

humidity and wind speed Then itrsquos 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 its 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 Itrsquos 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

Station meacuteteacuteo autonome 2012

33

XIV Conclusion

Ce projet sur la conception drsquoune station meacuteteacuteo autonome qui nous a eacuteteacute confieacute a eacuteteacute tregraves

enrichissant Il nous a permis de mettre en relations les connaissances acquises durant lrsquoanneacutee mais

aussi acqueacuterir de nouvelles connaissances comme le fonctionnement drsquoun microcontrocircleur En effet

nous nrsquoavions jamais programmeacute sur microcontrocircleur Il a fallu srsquoadapter et apprendre agrave utiliser des

nouveaux logiciels tels que Proteus MikroC ainsi que Labview

De cette expeacuterience nous avons aussi appris agrave ecirctre autonome Nous avons saisi que la

compreacutehension des documents techniques et des librairies eacutetait un point essentiel de notre projet

En programmation nous nrsquoavions pas le droit agrave lrsquoerreur car la moindre faute pouvait conduire le

systegraveme agrave un dysfonctionnement Ce projet nous a demandeacute beaucoup de rigueur de patience et de

temps

Toutefois nous nrsquoavons pas eu malheureusement le temps drsquoinstaller le capteur de

tempeacuterature inteacuterieure par manque de temps Plus encore nous aurions aimeacute approfondir certains

points Par exemple pouvoir installer les composants sur circuit imprimeacute et concevoir un support

viable pour en faire une vraie station meacuteteacuteo Lrsquoinstallation drsquoune girouette aurait eacuteteacute appreacuteciable

pour connaicirctre le sens du vent Aussi le programme aurait sans doute pu ecirctre encore ameacutelioreacute pour

de meilleures performances

Malgreacute ce manque de temps nous sommes tregraves satisfaits du fonctionnement de ce module

qui nous a permis de comprendre lrsquoutiliteacute des parties theacuteoriques pour lrsquoapplication et la mise en

œuvre drsquoun systegraveme Lrsquoapproche peacutedagogique de nous diriger vers les solutions sans jamais les

donner de nous laisser un grand degreacute de liberteacute et drsquoautonomie a eacuteteacute au deacutebut assez deacuteroutante

mais tregraves instructif

Enfin nous tenions agrave remercier Mme Leymarie qui nous a suivis et aiguilleacute tout au long de ce

projet

Station meacuteteacuteo autonome 2012

34

XV ANNEXES

Programme complet

Deacuteclaration 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()

deacuteclaration des variables

int cond=0Condition pour laffichage sur leacutecran LCD

int BP=0

Initialisation et affectation des ports

PORTA=0

PORTB=0 initialisation

PORTC=0

TRISB=0 Port B deacuteclarer en sortie

TRISA=0xFF Port A en entreacutee

ADCON1=0x84 Justifieacute agrave droite active RA0RA1RA3 analogique

ADCON0=0x85 Fosc32 sur PA0 en service

TRISB=0 Port B deacuteclarer en sortie

TRISC=0xFFPort C deacuteclarer en entreacutee

Configuration et initialisation de leacutecran LCD

Lcd_Config(ampPORTB 0 1 WR 5 4 3 2) Configure lecran

Lcd_Init(ampPORTB) initialisation du LCD

Lcd_Cmd(Lcd_CURSOR_OFF) Enleve le curseur

Lcd_Cmd(Lcd_CLEAR) Efface lecran

Initialisation du module I2C

I2C_Init(100000)initialisation de la communication I2C

I2C_Start()Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90)Mode de controcircle en mode eacutecriture

I2C_Wr(0xAC)Accegraves au registre de configuration

I2C_Wr(0x0A)Registre de configuration mesure en continu

I2C_Stop()Arrecirct du signal

I2C_Start()Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90)Mode de controcircle en mode eacutecriture

I2C_Wr(0xEE)Deacutebut de la conversion

I2C_Stop()Arrecirct du sigal

Station meacuteteacuteo autonome 2012

35

Configuration du mode capture

T1CON=0x31 Configuration du timer1

CCP1CON=0x05 Paramegravetrage du mode capture

PIE1TMR1IE=1 Autorise les deacutebordements du timer 1

Boucle infinie

while(1)

cond=cond+1Increacutemente la variable cond

switch(BP)

case 0

humidite(ampcond)Appel la fonction humiditeacute

if(PORTAF2==1)Ces if permet de changer la valeur de BP

BP=1

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)Temps quon relacircche bien le bouton

break

case 1

temperature(ampcond)Appel la fonction tempeacuterature

if(PORTAF2==1)

BP=2

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)

break

case 2

vent(ampcond)Appel la fonction vent

if(PORTAF2==1)

BP=0

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)

break

Fonction humiditeacute

void humidite(int cond)

long H U VLDeacuteclaration des variables

char HH hum[8] humtxt[]=Humidite

VL=Adc_read(0) Valeur lue sur RA0(humiditeacute)

U=(VL5000)1023 Convertit la valeur lue en tension x1000

H=(U-810)(0031) Convertit la tension en humiditeacute x1000

Station meacuteteacuteo autonome 2012

36

if(Hgt100000)Si H gt 100(impossible) alors = 100

H=100000

if(Hlt0)Si H lt 0(impossible) alors = 0

H=0

hum[0]=(H100000)+48Valeur des centaines affecteacute en ascii(48=0)

HH=(H10000)10

hum[1]=HH+48Valeur des dizaines affecteacute en ascii

HH=(H1000)10

hum[2]=HH+48Valeur des uniteacutes affecteacute en ascii

hum[3]=44Virgule affecteacute en ascii

HH=(H100)10

hum[4]=HH+48Valeur de la premiegravere deacutecimale affecteacute en ascii

HH=(H10)10

hum[5]=HH+48Valeur de la deuxiegraveme deacutecimale affecteacute en ascii

hum[6]=37Pourcentage affecteacute en ascii

if(cond==50)Appel la fonction LCD tous les 1000

lcd(1 1 8 humtxt)Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 7 hum)Affiche la chaine de caractegravere hum sur le LCD

cond=0Remise a 0 de la condition

Xbee(7 hum) Envoi la chaicircne de caractegravere hum dans la fonction xbee

Fonction tempeacuterature

void temperature(int cond)

char temp[7] temptxt[]=Temperature LSB

signed char MSB

I2C_Start()Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90)Mode de controcircle en mode eacutecriture

I2C_Wr(0xAA)Lecture de la tempeacuterature

I2C_Stop()Arrecirct du sigal

I2C_Start()Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x91)Mode de controcircle en mode lecture

MSB = I2C_Rd(1)Nombre signeacute donnant la tempeacuterature entre +125deg et -55degC

LSB = I2C_Rd(0)Si bit 7 = 1 tempeacuterature MSB +05degC

I2C_Stop()Arrecirct du sigal

if(MSBlt0)

MSB = abs(MSB) Si temperature neacutegative valeur absolue de MSB

Temp[0]=45 Signe - affecteacute en ascii

else

Station meacuteteacuteo autonome 2012

37

Temp[0]=43signe + affecteacute en ascii

Temp[1]=(MSB10)+48 Valeur des dizaines affecteacute en ascii

Temp[2]=(MSB10)+48 Valeur des uniteacutes affecteacute en ascii

Temp[3]=44 Virgule affecteacute en ascii

if (LSB==128) Si bit 7 agrave 1 alors +05deg

Temp[4]=5

else Si bit 7 agrave 0 alors +00deg

Temp[4]=0

Temp[5]=223 degreacute affecteacute en ascii

Temp[6]=67 C affecteacute en ascii

if(cond==50)Appel la fonction LCD tous les 1000

lcd(1 1 11 temptxt)Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 7 temp)Affiche la chaine de caractegravere hum sur le LCD

cond=0Remise a 0 de la condition

Xbee(7 temp) Envoi la chaicircne de caractegravere temp dans la fonction xbee

Fonction vent

void vent(int cond)

unsigned long tl th per

int vitfreq

char vent[13] txtvent[]=Vitesse du vent VV

if(PIR1CCP1IF==1) Test si front montant agrave lieu

TMR1H=0 Initialisation du timer1 bit de point fort

TMR1L=0 Initialisation du timer1 bit de point faible

th=CCPR1H Les valeurs sont copieacute dans des variables

tl=CCPR1L

th=thltlt8 Deacutecalage car th =gt bit de point fort

per = th|tl On concategravene les deux valeurs nous obtenons la peacuteriode

PIR1CCP1IF=0 Remise a 0 du drapeau

if(PIR1TMR1IF==1) Si deacutepassement du timer 1

per=65535+per On ajoute une retenue lorsquon a fait un tour (16bit)

PIR1TMR1IF=0 Remise a 0 du drapeau deacutepassement

Station meacuteteacuteo autonome 2012

38

freq=671310perCalacul de la freacutequence

vit=freq179 + 692Calcul de la vitesse que lon x100

if(vitlt200)En dessous 2ms la mesure est aleacuteatoire agrave cause du 2egraveme deacutebordement

vit=0

vent[0]=(vit10000)+48Valeur des centaines affecteacute en ascii(48=0)

VV=(vit1000)10

vent[1]=VV+48Valeur des dizaines affecteacute en ascii

VV=(vit100)10

vent[2]=VV+48Valeur des uniteacute affecteacute en ascii

VV=(vit10)10

vent[3]=44Virgule affecteacute en ascii

vent[4]=VV+48Valeur de la 1er deacutecimale affecteacute en ascii

VV=vit10

vent[5]=VV+48Valeur de la 2egraveme deacutecimale affecteacute en ascii

vent[6]=109m affecteacute en ascii

vent[7]=47 affecteacute en ascii

vent[8]=115s affecteacute en ascii

if(cond==50)Appel la fonction LCD tous les 1000

lcd(1 1 15 txtvent)Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 9 vent)Affiche la chaine de caractegravere hum sur le LCD

cond=0Remise a 0 de la condition

Xbee(9 vent) Envoi la chaicircne de caractegravere vent dans la fonction xbee

Fonction affichage

void lcd(int li int co int nb char receive[15])

int i

for(i=0 iltnb i++)Boucle for

Lcd_chr(li (co+i) receive[i])Affiche les caractegraveres jusquagrave i

Usart

void xbee(int nb char receive[15])

int i

Usart_Init(9600)Vitesse de transmission

for(i=0 iltnb i++)Boucle for

Usart_Write(receive[i])Envoi les caractegraveres sur lHyperTerminal jusquagrave i

Station meacuteteacuteo autonome 2012

10

Nous voulons convertir lrsquoentreacutee RA0 pour cela il faut mettre les bits 5 4 3 agrave 0

Bit 2 GODONE Status bit si ADON=1

1 = Deacutemarre la conversion AD Ce bit est remis agrave 0 par hard

0 = La conversion AD est termineacutee

Il nous faut deacutemarrer la conversion

Bit 1 Bit non implanteacute

Bit 0 ADON AD on bit

1= Convertisseur AD en service

0 = Convertisseur AD agrave larrecirct

Il nous faut mettre le convertisseur en service

ADCON0 = brsquo1000 0101rsquo = hrsquo85rsquo

Bit 7 ADFM = AD Result format

1 = Justifieacute agrave droite

0 = Justifieacute agrave gauche

Nous avons justifieacute agrave droite

Bit 6 bit 5 et bit 4 Bits non impleacutementeacutes

Bit 3 bit 2 bit 1 et bit 0 PCFG3 PCFG2 PCFG1 et PCFG0

Bits de controcircle de la configuration des Ports

Ces bits permettent de choisir le partage entre entreacutees analogiques et digitales sur les PORTS A et E

On a choisi drsquoactiver RA0 RA1 et RA3 en entreacutee analogique les autres resteront en

digitales ce qui signifie qursquoau vue de la datasheet il faut mettre le bit 2 agrave 1 et les autres agrave 0

ADCON1 = brsquo10000100rsquo = hrsquo84rsquo

Station meacuteteacuteo autonome 2012

11

C Le scheacutema du microcontrocircleur avec le capteur drsquohumiditeacute

Voici le scheacutema de cacircblage du capteur drsquohumiditeacute uniquement A noter que le capteur est

remplaceacute par un potentiomegravetre nrsquoeacutetant pas dans la librairie de Proteus On constate qursquoil est bien

brancheacute sur RA0

D Programme pour la mesure de lrsquohumiditeacute

Voici le programme pour mesurer lrsquohumiditeacute avec les affectations deacutecrites ci-dessus ainsi

que les eacutequations de conversions

Deacuteclaration des fonctions

void humidite(int cond)

void lcd(int li int co int nb char receive[11])

void main()

deacuteclaration des variables

int cond=0 Condition pour laffichage sur leacutecran LCD

Initialisation et affectation des ports

PORTB=0 initialisation

TRISB=0 Port B deacuteclarer en sortie

TRISA = 0xFF Port A en entreacutee

ADCON1 = 0x84 Justifieacute agrave droite active RA0RA1RA3 analogique

ADCON0 = 0x85 Fosc32 sur PA0 en service

Configuration et initialisation de leacutecran LCD

Lcd_Config(ampPORTB 0 1 WR 5 4 3 2) Configure leacutecran

Lcd_Init(ampPORTB) initialisation du LCD

Lcd_Cmd(Lcd_CURSOR_OFF) Enlegraveve le curseur

Lcd_Cmd(Lcd_CLEAR) Efface leacutecran

Figure 8 Scheacutema de cacircblage du capteur dhumiditeacute

Station meacuteteacuteo autonome 2012

12

Boucle infinie

while(1)

cond=cond+1 Increacutemente la variable cond

humidite(ampcond) Appel la fonction humiditeacute

Fonction humiditeacute

void humidite(int cond)

long H U VL Deacuteclaration des variables

char HH hum[8] humtxt[]=Humidite

VL=Adc_read(0) Valeur lue sur RA0(humiditeacute)

U=(VL5000)1023 Convertit la valeur lue en tension x1000

H=(U-810)(0031) Convertit la tension en humiditeacute x1000

if(Hgt100000) Si H gt 100(impossible) alors = 100

H=100000

if(Hlt0) Si H lt 0(impossible) alors = 0

H=0

hum[0]=(H100000)+48 Valeur des centaines affecteacute en ascii(48=0)

HH=(H10000)10

hum[1]=HH+48 Valeur des dizaines affecteacute en ascii

HH=(H1000)10

hum[2]=HH+48 Valeur des uniteacutes affecteacute en ascii

hum[3]=44Virgule affecteacute en ascii

HH=(H100)10

hum[4]=HH+48 Valeur de la premiegravere deacutecimale affecteacute en ascii

HH=(H10)10

hum[5]=HH+48 Valeur de la deuxiegraveme deacutecimale affecteacute en ascii

hum[6]=37 Pourcentage affecteacute en ascii

if(cond==1000)Appel la fonction LCD tous les 1000

lcd(1 1 10 humtxt) Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 7 hum) Affiche la chaine de caractegravere hum sur le LCD

cond=0 Remise a 0 de la condition

Fonction affichage

void lcd(int li int co int nb char receive[11])

int i

for(i=0 ilt=nb i++)Boucle for

Lcd_chr(li (co+i) receive[i]) Affiche les caractegraveres jusquagrave i

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

Station meacuteteacuteo autonome 2012

13

VIII Le capteur de tempeacuterature

A preacutesent comme toute station meacuteteacuteo

nous avons installeacute un capteur de tempeacuterature le

DS1621 Ce capteur communique avec le

microcontrocircleur gracircce au protocole I2C

A Le protocole I2C

Le bus I2C (Inter Integrated Circuit) a eacuteteacute deacuteveloppeacute au deacutebut des anneacutees 80 par Philips

semiconductors pour permettre de relier facilement agrave un microprocesseur les diffeacuterents circuits dun

teacuteleacuteviseur moderne

Le bus I2C permet de faire communiquer entre eux des composants eacutelectroniques tregraves divers

gracircce agrave seulement trois fils Un signal de donneacutee (SDA) un signal dhorloge (SCL) et un signal de

reacutefeacuterence eacutelectrique (Masse)

Ceci permet de reacutealiser des eacutequipements ayant des fonctionnaliteacutes tregraves puissantes (En

apportant toute la puissance des systegravemes micro programmeacutes) et conservant un circuit imprimeacute tregraves

simple par rapport un scheacutema classique (8bits de donneacutees 16 bits dadresse + les bits de controcircle)

Les donneacutees sont transmises en seacuterie agrave 100Kbitss en mode standard et jusquagrave 400Kbitss en

mode rapide Ce qui ouvre la porte de cette technologie agrave toutes les applications ougrave la vitesse nest

pas primordiale

Voici un exemple de protocole qursquoutilise le bus I2C

1 Pour initier le dialogue le maicirctre creacutee une condition Start

2 Le maicirctre envoie ladresse de lesclave (1010100) suivi du bit 0 (bit Write)

3 Lesclave reacutepond (accuseacute de reacuteception bit Acknowledge)

4 Le maicirctre envoie ladresse du registre (0x04) agrave eacutecrire

5 Lesclave reacutepond (accuseacute de reacuteception bit Acknowledge)

6 Le maicirctre envoie la donneacutee (0x27) agrave eacutecrire

7 Lesclave eacutecrit la donneacutee puis envoie un accuseacute de reacuteception (bit Acknowledge)

8 Le maicirctre termine le dialogue avec une condition Stop

9 Le bus I2C est maintenant libre (SCL = 1 SDA = 1 niveaux de repos)

Figure 9 scheacutema du DS1621

Station meacuteteacuteo autonome 2012

14

B Caracteacuteristique du DS1621

Comme on peut voir sur la figure 9 le capteur est composeacute de 8 bornes

SDA =gt Liaison seacuterie entreacutee sortie

SCL =gt Signal drsquohorloge

Tout =gt Signal de sortie du thermostat (inutile dans notre cas)

GND =gt Masse

VDD =gt Alimentation +5V

A0 A1 A2 =gt Entreacutee drsquoadressage (dans notre cas les 3 agrave la masse car nous nrsquoavons qursquoun

module I2C)

Les circuits connecteacutes sur un bus I2C ont des sorties de type drain ouvert (ou collecteur

ouvert) Deux reacutesistances de pull-up sont bien sucircr placeacutees entre les lignes SDA SCL et lalimentation

(VDD)Quand le bus nest pas utiliseacute SDA et SCL sont au niveau haut (niveau de repos)

1 Speacutecificiteacute des commandes

Tous dialogue du maicirctre(PIC16F876) avec un DS1621 esclave doit deacutebuter par lrsquoenvoi drsquoun

mot de controcircle

Le maicirctre envoi ensuite une commande suivi ou non de donneacutees Voici la liste des

commandes avec leur description

Les commandes AC EE et 22 ne sont pas suivies de lenvoi de donneacutees Par contre la

commande AA qui nous inteacuteresse est suivie de lrsquoenvoi par le DS1621 de 2 octets repreacutesentant la

tempeacuterature

Station meacuteteacuteo autonome 2012

15

Voici le registre de configuration(AC) qursquoil nous faut deacuteterminer

DONE 1 = conversion finie 0 = conversion en cours En mode 1 SHOT uniquement

THF Flag seuil haut du thermostat Passe agrave 1 et y reste si tempeacuterature supeacuterieure agrave TH

TLF Flag seuil bas du thermostat Passe agrave 1 et y reste si tempeacuterature infeacuterieure agrave TL

NVB 1 = meacutemoire EEPROM en eacutecriture 0 = meacutemoire EEPROM eacutecriture termineacutee

Nous nrsquoactiverons pas lrsquoeacutecriture de la meacutemoire

POL Polariteacute de Tout (pin 3) 1 = actif sera un niveau HAUT 0 = actif sera un niveau BAS

Il faut activer la polariteacute donc nous le mettons agrave 1

ONE SHOT 0 = conversion en continu 1 = conversion 1 fois

Nous le mettons en mode continu

AC = brsquo00001010rsquo = hrsquo0Arsquo

La commande AA qui permet de lire la tempeacuterature renvoie 2 octets

MSB (Most Significant Bit) Nombre signeacute donnant la tempeacuterature entre +125deg et -55degC

LSB (Least Significant Bit ) Seul le bit 7 de cet octet est significatif Si 1 tempeacuterature

MSB +05degC

Pour bien comprendre comment est codeacute un nombre signeacute un tableau avec des exemples de

valeurs eacutetait agrave notre disposition dans la notice

Station meacuteteacuteo autonome 2012

16

2 Dialogue I2C pour avoir la tempeacuterature

Voici un scheacutema qui montre le dialogue agrave effectuer entre le microcontrocircleur et le capteur

pour avoir la tempeacuterature Crsquoest gracircce agrave ce mecircme scheacutema que nous avons pu programmer le PIC

Station meacuteteacuteo autonome 2012

17

C Le scheacutema du microcontrocircleur avec le capteur de tempeacuterature

Voici le scheacutema du capteur de tempeacuterature uniquement Le capteur est brancheacute sur les

borne SCL(RC3) et SDA(RC4) du PIC Qursquoelles soient deacuteclareacutees en entreacutee ou en sortie les bornes SCL et

SDA sont fonctionnelles Il ne faut pas oublier les reacutesistances de tirages (R1 et R3) Lrsquoadressage A0 A1

A2 toutes misent agrave la masse car nous nrsquoavons qursquoun seul capteur I2C relieacute au PIC et le Tout

(thermostat) inutile car nous faisons juste un releveacute de tempeacuterature

D Programme pour la mesure de la tempeacuterature

Deacuteclaration des fonctions

void temperature(int cond)

void lcd(int li int co int nb char receive[14])

void main()

deacuteclaration des variables

int cond=0Condition pour laffichage sur leacutecran LCD

Initialisation et affectation des ports

PORTB=0 initialisation

PORTC=0

TRISB=0 Port B deacuteclarer en sortie

TRISC = 0xFF Port C en entreacutee

Configuration et initialisation de leacutecran LCD

Lcd_Config(ampPORTB 0 1 WR 5 4 3 2) Configure leacutecran

Lcd_Init(ampPORTB) initialisation du LCD

Lcd_Cmd(Lcd_CURSOR_OFF) Enlegraveve le curseur

Lcd_Cmd(Lcd_CLEAR) Efface leacutecran

Initialisation du module I2C

I2C_Init(100000) initialisation de la communication I2C

I2C_Start() Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90) Mode de controcircle en mode eacutecriture

I2C_Wr(0xAC) Accegraves au registre de configuration

I2C_Wr(0x0A) Registre de configuration mesure en continu

I2C_Stop() Arrecirct du signal

I2C_Start() Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90) Mode de controcircle en mode eacutecriture

Figure 10 Scheacutema de cacircblage avec le capteur de tempeacuterature

Station meacuteteacuteo autonome 2012

18

I2C_Wr(0xEE) Deacutebut de la conversion

I2C_Stop()Arrecirct du sigal

Boucle infinie

while(1)

cond=cond+1 Increacutemente la variable cond

temperature(ampcond) Appel la fonction humiditeacute

Fonction tempeacuterature

void temperature(int cond)

char temp[7] temptxt[]=Temperature LSB

signed char MSB

I2C_Start() Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90) Mode de controcircle en mode eacutecriture

I2C_Wr(0xAA) Lecture de la tempeacuterature

I2C_Stop() Arrecirct du signal

I2C_Start() Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x91) Mode de controcircle en mode lecture

MSB = I2C_Rd(1) Nombre signeacute donnant la tempeacuterature entre +125deg et -55degC

LSB = I2C_Rd(0) Si bit 7 = 1 tempeacuterature MSB +05degC

I2C_Stop() Arrecirct du signal

if(MSBlt0)

MSB = abs(MSB) Si tempeacuterature neacutegative valeur absolue de MSB

Temp[0]=45 Signe - affecteacute en ascii

else

Temp[0]=43 signe + affecteacute en ascii

Temp[1]=(MSB10)+48 Valeur des dizaines affecteacute en ascii

Temp[2]=(MSB10)+48 Valeur des uniteacutes affecteacute en ascii

Temp[3]=44 Virgule affecteacute en ascii

if (LSB==128) Si bit 7 agrave 1 alors +05deg

Temp[4]=5

Else Si bit 7 agrave 0 alors +00deg

Temp[4]=0

Temp[5]=223 degreacute affecteacute en ascii

Temp[6]=67 C affecteacute en ascii

if(cond==10) Appel la fonction LCD tous les 1000

lcd(1 1 13 temptxt) Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 6 temp) Affiche la chaine de caractegravere hum sur le LCD

cond=0 Remise a 0 de la condition

Fonction affichage

void lcd(int li int co int nb char receive[14])

int i

for(i=0 ilt=nb i++)Boucle for

Lcd_chr(li (co+i) receive[i]) Affiche les caractegraveres jusquagrave i

Le scheacutema preacuteceacutedent est bien respecteacute comme on peut le voir crsquoest tregraves facile agrave programmer

gracircce aux librairies I2C du logiciel MikroC

Station meacuteteacuteo autonome 2012

19

IX Lrsquoaneacutemomegravetre

A Conception

Pour lrsquoaneacutemomegravetre lrsquoeacutequipe peacutedagogique

nous a juste fourni lrsquoheacutelice du capteur donc il a fallu

concevoir toute la partie eacutelectronique Lrsquoideacutee est

drsquoinstaller une diode et un transistor photonique par

de lagrave lrsquoheacutelice et lorsqursquoelle tourne elle vient couper le

faisceau Succinctement le transistor envoit soit 1 soit

0 sur le PIC Le but est de relever la freacutequence agrave

laquelle tourne lrsquoheacutelice puis la convertir en vitesse (cf

figure 11)

La photodiode choisie est de reacutefeacuterence SD5455-3 Ce choix a eacuteteacute fait car lrsquoangle du faisceau

est de 20deg pour que le flux infrarouge soit bien concentreacute sur le phototransistor pour un

fonctionnement optimal

Comme on le voit sur le scheacutema de principe (cf figure 11) il a fallu dimensionner la

reacutesistance qui sert agrave reacuteguler le courant qui circule dans la LED avec les informations donneacutees par la

documentation technique nous avons pu la calculer

Forward voltage VF = 17V et IF = 01A

Ualim = 5V

RD = (Ualim ndash UF)IF = (5 ndash 17)01

RD = 33Ω

Pour le phototransistor nous avons choisi celui qui allait avec la diode de reacutefeacuterence SE5455-3

Cette fois la valeur de la reacutesistance nous eacutetait donneacute par le constructeur

RL=1000Ω

Lors des seacuteances nous avons implanteacute la diode et le

transistor sur le support du capteur Pour des raisons

pratiques et estheacutetiques nous avons seacutepareacute la partie

aneacutemomegravetre et la partie platine par des borniers (cf figure

12)

Figure 11 scheacutema descriptif de laneacutemomegravetre

Figure 12 Notre aneacutemomegravetre

Station meacuteteacuteo autonome 2012

20

B Mesure de la peacuteriode sur le microcontrocircleur

Le but est de relever la peacuteriode du signal envoyer par lrsquoaneacutemomegravetre pour cela le PIC est

eacutequipeacute drsquoun mode capture Le principe est de recopier agrave un moment voulu la valeur du timer 1 La

capture peut avoir lieux agrave chaque front descendant agrave chaque front montant tous les 4 ou tous les 16

fronts montants Quand la capture a eu lieu un flag est mis agrave 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 constitueacute de 2 registres de 8 bits TMR1H et TMR1L que lon peut lire ou eacutecrire Le registre TMR1

(constitueacute de TMR1H et TMR1L) sincreacutemente de h0000 jusquagrave hFFFF et repasse ensuite agrave h0000

pour continuer le comptage Quand il y a deacutebordement une interruption peut ecirctre geacuteneacutereacutee si on lrsquoa

autoriseacutee par TMR1IE =1 (bit 0 de PIE1) et le Flag TMR1IF (bit 0 de PIR1) passe agrave 1 Le controcircle du

timer 1 ce fait par le registre T1CON

Bit 7 et bit 6 bits non impleacutementeacutes

Bit 5 et bit 4 T1CKPS = Seacutelection du preacute diviseur placeacute avant le TIMER

Vu qursquoon a un quartz eacuteleveacute nous avons deacutecideacute de choisir un preacute-diviseur de 8 donc

F=Fosc(48) Pour cela mettre les bit 4 et 5 agrave 1

Bit 3 T1OSCEN Bit dautorisation de loscillateur du Timer 1

1 = oscillateur autoriseacute

0 = oscillateur stoppeacute

Oscillateur interne inutile donc bit 3 agrave 0

Bit 2 T1SYNC Bit de controcircle de la synchronisation du CLK externe

1 = Pas de synchronisation de lhorloge externe

0 = Synchronisation de lhorloge externe

Nous nous mettrons en mode synchrone

Bit1 TMR1CS Bit de seacutelection de la source horloge

1 = Mode Compteur Clk externe sur la broche PC0 ou Quartz entre PC0 et PC1

0 = Mode Timer Clk interne = Fosc4

Station meacuteteacuteo autonome 2012

21

On mettra ce bit agrave 0 car on utilise le mode Timer

Bit 0 TMR1ON Bit dautorisation du Timer 1

1 = Timer 1 en service

0 = Timer 1 stoppeacute

Il faut eacutevidemment mettre la timer 1 en service

Nous avons aussi autoriseacute le deacutebordement du timer 1 pour avoir plus de preacutecisions pour cela il faut

mettre la commande PIE1TMR1 agrave 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 parameacutetrer le registre

CCP1CON

Bit 7 et Bit 6 bits non impleacutementeacutes

Bit 5 et Bit 4 CCP1X et CCP1Y

Bits non utiliseacutes 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 agrave Bit 0 CCP1M3 agrave CCP1M0 bits de seacutelection du mode

Nous avons seacutelectionneacute le mode capture sur chaque front montant Pour cela nous avons

mis les bits 1 et 3 agrave 0 et les bits 0 et 2 agrave 1

Pour savoir si un front montant agrave eu lieu le flag CCP1F est mis agrave 1 Ce flag doit ecirctre remis agrave 0 par

lrsquoutilisateur La valeur des 16 bits des registres du Timer 1 TMR1L (bit de poids faible) et TMR1H (bit

de poids fort) sont recopieacutees dans les registres CCPR1 CCPRIH (bit de poids faible) et CCPR1L (bit de

poids fort)

Nous avons programmeacute le mode capture de faccedilon agrave afficher sur lrsquoeacutecran LCD la valeur du registre

CCPR1 crsquoest-agrave-dire la peacuteriode du signal de lrsquoaneacutemomegravetre Il ne nous reste maintenant plus qursquoagrave

eacutetalonner notre aneacutemomegravetre

Station meacuteteacuteo autonome 2012

22

C Etalonnage de lrsquoaneacutemomegravetre

Pour eacutetalonner le capteur nous avons commenceacute par savoir agrave quelle freacutequence correspond la

valeur releveacutee par le mode capture Pour cela nous avons brancheacute un GBF agrave la place du capteur et

avec un oscilloscope nous avons compareacute leurs valeurs

Nous avons ensuite traceacute agrave lrsquoaide des valeurs du tableau la courbe F(Hz) en fonction du

compteur De cette courbe nous relevons lrsquoeacutequation

F = 671310compteur^(-101)

Soit environ F = 671310compteur

Puis nous avons brancheacute notre aneacutemomegravetre sur le microcontrocircleur Cela dans le but de

relever sa peacuteriode sur lrsquoeacutecran LCD agrave lrsquoaide drsquoune soufflerie variable et du manomegravetre GDH (reacutef

121552 200-13) nous avons compareacute leurs valeurs pour connaitre lrsquoeacutetalonnage de notre capteur

Nous avons noteacute plusieurs valeurs puis traceacute diffeacuterentes courbe pour trouver les eacutequations qui nous

permettrons de calculer la vitesse dans notre programme

Station meacuteteacuteo autonome 2012

23

Voici les valeurs que nous avons releveacutees puis la courbe traceacutee sur Excel

De cette courbe nous obtenons lrsquoeacutequation

Vitesse du vent = 0179F + 0629

Nous les multiplierons par 100 pour reacutecupeacuterer les deacutecimales et les implanter dans une chaine

de caractegravere

Vitesse du vent = 179F + 629

Nous avons agrave preacutesent agrave notre disposition toutes les eacutequations neacutecessaires pour pouvoir

convertir la valeur releveacutee par le mode capture en une vitesse

D Le scheacutema du microcontrocircleur avec lrsquoaneacutemomegravetre

On voit sur le scheacutema que le capteur est bien relieacute sur la borne RC2 Nous avons aussi

repreacutesenteacute les borniers J1 et J2 A droite tous ce qui est sur le support et agrave gauche tous ce qui est sur

la platine

Figure 13 Scheacutema avec laneacutemomegravetre

Station meacuteteacuteo autonome 2012

24

E Programme pour la mesure de la vitesse du vent

Voici le programme pour mesurer la vitesse du vent avec les affectations deacutecrites ci-dessus

ainsi que les eacutequations de conversions

Deacuteclaration des fonctions

void vent(int cond)

void lcd(int li int co int nb char receive[20])

void main()

deacuteclaration des variables

int cond=0

Initialisation et affectation des ports

PORTB=0 initialisation

PORTC=0 initialisation

TRISC=0x04 Port C deacuteclarer en sortie sauf RC2 en mode capture

TRISB=0 Port B deacuteclarer en sortie

Configuration du mode capture

T1CON=0x31 Configuration du timer1

CCP1CON=0x05 Parameacutetrage du mode capture

PIE1TMR1IE=1 Autorise les deacutebordements du timer 1

Configuration et initialisation de leacutecran LCD

Lcd_Config(ampPORTB 0 1 WR 5 4 3 2) Configure leacutecran

Lcd_Init(ampPORTB) Initialisation du LCD

Lcd_Cmd(Lcd_CURSOR_OFF) Enlegraveve le curseur

Lcd_Cmd(Lcd_CLEAR) Efface leacutecran

Boucle infinie

while(1)

cond=cond+1

vent(ampcond)

Fonction vent

void vent(int cond)

unsigned long tl th per

int vitfreq

char vent[13] txtvent[]=vitesse du vent VV

if(PIR1CCP1IF==1) Test si front montant agrave lieu

TMR1H=0 Initialisation du timer1 bit de point fort

TMR1L=0 Initialisation du timer1 bit de point faible

th=CCPR1H Les valeurs sont copieacute dans des variables

tl=CCPR1L

th=thltlt8 Deacutecalage car th =gt bit de point fort

per = th|tl On concategravene les deux valeurs nous obtenons la peacuteriode

PIR1CCP1IF=0 Remise a 0 du drapeau

if(PIR1TMR1IF==1) Si deacutepassement du timer 1

per=65535+per On ajoute une retenue lorsquon a fait un tour (16bit)

PIR1TMR1IF=0 Remise a 0 du drapeau deacutepassement

freq=671310per Calcul de la freacutequence

vit=freq179 + 692 Calcul de la vitesse que lon x100

Station meacuteteacuteo autonome 2012

25

if(vitlt200) En dessous 2ms la mesure est aleacuteatoire agrave cause du 2egraveme deacutebordement

vit=0

vent[0]=(vit10000)+48 Valeur des centaines affecteacute en ascii(48=0)

VV=(vit1000)10

vent[1]=VV+48 Valeur des dizaines affecteacute en ascii

VV=(vit100)10

vent[2]=VV+48 Valeur des uniteacute affecteacute en ascii

VV=(vit10)10

vent[3]=44 Virgule affecteacute en ascii

vent[4]=VV+48 Valeur de la 1er deacutecimale affecteacute en ascii

VV=vit10

vent[5]=VV+48 Valeur de la 2egraveme deacutecimale affecteacute en ascii

vent[6]=109 m affecteacute en ascii

vent[7]=47 affecteacute en ascii

vent[8]=115 s affecteacute en ascii

if(cond==1000) Appel la fonction LCD tous les 1000

lcd(1 1 16 txtvent) Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 8 vent) Affiche la chaine de caractegravere hum sur le LCD

cond=0 Remise a 0 de la condition

Fonction affichage

void lcd(int li int co int nb char receive[20])

int i

for(i=0 ilt=nb i++) Boucle for

Lcd_chr(li (co+i) receive[i]) Affiche les caractegraveres jusquagrave i

Station meacuteteacuteo autonome 2012

26

X Simulation une station meacuteteacuteo autonome

Maintenant que tous nos capteurs sont installeacutes nous allons mettre agrave profit le bouton

poussoir installeacute dans la partie LCD Crsquoest-agrave-dire que nous allons rassembler tous les programmes

preacuteceacutedents pour nrsquoen faire qursquoun Il suffira drsquoappuyer sur le bouton poussoir pour faire deacutefiler les

diffeacuterentes valeurs comme une vraie station meacuteteacuteo

A La structure du programme

Boucle infinie

while(1)

cond=cond+1 Increacutemente la variable cond

switch(BP)

case 0

humidite(ampcond) Appel la fonction humiditeacute

if(PORTAF2==1) Ces if permet de changer la valeur de BP

BP=1

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250) Temps quon relacircche bien le bouton

break

case 1

temperature(ampcond) Appel la fonction tempeacuterature

if(PORTAF2==1)

BP=2

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)

break

case 2

vent(ampcond) Appel la fonction vent

if(PORTAF2==1)

BP=0

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)

break

Nous avons choisi drsquoutiliser un Switch nous avons donc juste rajouteacute une variable BP

Lorsqursquoil y a appui sur le bouton poussoir la variable BP srsquoincreacutemente et le programme passe agrave une

autre case et donc utilise une nouvelle fonction La temporisation nous donne le temps de relacirccher le

bouton pour eacuteviter de faire deacutefiler le menu sans le vouloir

Station meacuteteacuteo autonome 2012

27

B La simulation

Etant donneacute que nous ne pouvions pas prendre le mateacuteriel avec nous il eacutetait impeacuteratif de

pouvoir faire des simulations Pour cela nous avons utiliseacute un logiciel tregraves utile Proteus ISIS Ce

logiciel possegravede une tregraves grande librairie et permet de rentrer nos programmes sur le PIC virtuel

geacuteneacutereacute par le logiciel Pour simuler le capteur drsquohumiditeacute nous avons utiliseacute un potentiomegravetre Pour

celui de lrsquoaneacutemomegravetre comme pour nos mesures nous avons brancheacute virtuellement un GBF sur la

borne associeacute et observeacute son signal agrave lrsquoaide drsquoun oscilloscope

Voilagrave un aperccedilu de la simulation effectueacute sur ISIS

Veacuterification theacuteorique du vent

Vitesse du vent = 0179 37 + 0629

Vitesse du vent = 7657ms

Veacuterification theacuteorique de lrsquohumiditeacute

H= (315-081)0031

H=7548

Veacuterification theacuteorique de la

tempeacuterature

La valeur afficheacutee correspond bien

aux 27degC seacutelectionneacute sur le capteur

Station meacuteteacuteo autonome 2012

28

XI Transmission des donneacutees par liaison ZigBee

ZigBee est un protocole de haut niveau permettant la communication de petites radios agrave

consommation reacuteduite baseacutee sur le standard IEEE 802154

Cette technologie a pour but la communication de courte distance telle que le propose deacutejagrave

la technologie Bluetooth tout en eacutetant moins chegravere plus simple et avec une fiabiliteacute assez eacuteleveacutee

Dans notre projet nous nous servirons de ZigBee pour permettre une transmission par ondes

de nos donneacutees de la station meacuteteacuteo vers un ordinateur Pour cela nous avons 2 modules Xbee pro 2

platines drsquointerfaces une avec des pattes (liaison platine) et lrsquoautre avec une sortie RS232 (liaison pc)

Caracteacuteristique eacutelectrique

Les signaux Xbee ont une amplitude de 33V mais sont alimenteacutes en 5V (tension de notre

source USB) cacircbleacutes sur la bornes VIN (laquo Power input from 6-12Vdc 300mA or higher raquo) Mais

notre source nrsquoeacutetant pas assez puissante pour alimenter toute notre installation Nous utiliserons

donc une source externe de 5V qui sera utiliseacutee pour alimenter les 2 systegravemes Xbee

Description des Bornes du Xbee qui nous inteacuteresse

Station meacuteteacuteo autonome 2012

29

A Scheacutema eacutelectrique du module Xbee

Nous avons cacircbleacute la sortie TX du microcontrocircleur qui eacutemet un signal jusqursquoagrave la borne RX du

Xbee qui reacuteceptionne ce signal Apregraves la transmission se fait par onde entre les 2 modules Xbee Pour

le module qui reccediloit le signal un cacircble RS232 suffit agrave faire la liaison entre celui-ci et le PC

B Envoi des donneacutees la liaison Usart

Un USART (Universal synchronous amp Asynchronous Receiver Transmitter) est un eacutemetteur-

reacutecepteur universel En langage courant cest le composant utiliseacute pour faire la liaison entre

lordinateur et le port seacuterie Lordinateur envoie les donneacutees en parallegravele (autant de fils que de bits

de donneacutees) Il faut donc transformer ces donneacutees pour les faire passer agrave travers une liaison seacuterie qui

utilise un mecircme fil pour faire passer tous les bits de donneacutees

Constitution dune trame USART

un bit de start toujours agrave 0 servant agrave la synchronisation du reacutecepteur

les donneacutees la taille peut varier (geacuteneacuteralement entre 5 et 9 bits)

eacuteventuellement un bit de pariteacute paire ou impaire

et un bit de stop toujours agrave 1 (la dureacutee peut varier entre 1 15 et 2 temps bit)

Le niveau logique de repos est le 1

Figure 14 Trame USART

Station meacuteteacuteo autonome 2012

30

Afin de faciliter les liaisons entre peacuteripheacuteriques (PC microcontrocircleur modem hellip) des vitesses

de transmission sont normaliseacutees luniteacute baud correspondant agrave un temps bit Dans notre cas nous

choisirons une vitesse de transmission de 9600bps

C Programme drsquoenvoi des donneacutees par liaison Usart

Gracircce agrave la librairie de MikroC il est tregraves facile drsquoenvoyer des donneacutees par liaison Usart Cela

fonctionne comme pour envoyer des caractegraveres sur lrsquoeacutecran LCD Il faut juste ensuite choisir la vitesse

de transmission qui sera 9600bps Voici la fonction et un morceau du programme qui sert agrave envoyer

les caractegraveres sur Xbee et de Xbee agrave un HyperTerminal

Fonction humiditeacute

void humidite(int cond)

long H U VL Deacuteclaration des variables

char HH hum[8] humtxt[]=Humidite

helliphellip

Xbee(8 hum) Envoi la chaicircne de caractegravere hum dans la fonction xbee

Usart

void xbee(int nb char receive[20])

int i

Usart_Init(9600) Vitesse de transmission

for(i=0 ilt=nb i++) Boucle for

Usart_Write(receive[i]) Envoi les caractegraveres sur lrsquoHyperTerminal jusquagrave i

Station meacuteteacuteo autonome 2012

31

XII Estimation du coucirct du projet

On peut voir sur ce tableau que le prix de reviens pour les eacuteleacutements que nous avons utiliseacute

est de 14506euro TTC Ce qui est plutocirct oneacutereux compareacute aux stations meacuteteacuteo du marcheacute qui oscille

entre 6euro et 400euro En sachant que la nocirctre est loin drsquoecirctre finaliseacute (finition estheacutetique ergonomie et

ajout de nouvelle fonction comme la date et lrsquoheure)

Composant Quantiteacute Prix (TVA inclus) Liens Quartz 20000MHz 1 111 euro Lien

Capaciteacute 22pF 2 010 euro lien

PIC 16F876 1 427 euro lien

LCD MODULE 1 1575 euro lien

Potentiomegravetre 10KΩ 1 618 euro lien

Reacutesistance 33 Ω 1 035 euro lien

Reacutesistance 10 K Ω 2 070 euro lien

Reacutesistance 1 KΩ 3 105 euro lien

LED rouge 1 013 euro lien

DS1621 1 650 euro lien

Bouton poussoir 1 060 euro lien

Module Xbee 2 4000 euro lien

Platine dinterface (XBEE) RS232 1 1890 euro lien

Platine dinterface (XBEE) 1 1364 euro lien

Capteur drsquohumiditeacute 1 2692 euro lien

Transistor 1 561 euro lien

Diode 1 325 euro lien

Totales 1 14506 euro

Station meacuteteacuteo autonome 2012

32

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

panelsbut 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 Itrsquos also possible to measure

humidity and wind speed Then itrsquos 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 its 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 Itrsquos 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

Station meacuteteacuteo autonome 2012

33

XIV Conclusion

Ce projet sur la conception drsquoune station meacuteteacuteo autonome qui nous a eacuteteacute confieacute a eacuteteacute tregraves

enrichissant Il nous a permis de mettre en relations les connaissances acquises durant lrsquoanneacutee mais

aussi acqueacuterir de nouvelles connaissances comme le fonctionnement drsquoun microcontrocircleur En effet

nous nrsquoavions jamais programmeacute sur microcontrocircleur Il a fallu srsquoadapter et apprendre agrave utiliser des

nouveaux logiciels tels que Proteus MikroC ainsi que Labview

De cette expeacuterience nous avons aussi appris agrave ecirctre autonome Nous avons saisi que la

compreacutehension des documents techniques et des librairies eacutetait un point essentiel de notre projet

En programmation nous nrsquoavions pas le droit agrave lrsquoerreur car la moindre faute pouvait conduire le

systegraveme agrave un dysfonctionnement Ce projet nous a demandeacute beaucoup de rigueur de patience et de

temps

Toutefois nous nrsquoavons pas eu malheureusement le temps drsquoinstaller le capteur de

tempeacuterature inteacuterieure par manque de temps Plus encore nous aurions aimeacute approfondir certains

points Par exemple pouvoir installer les composants sur circuit imprimeacute et concevoir un support

viable pour en faire une vraie station meacuteteacuteo Lrsquoinstallation drsquoune girouette aurait eacuteteacute appreacuteciable

pour connaicirctre le sens du vent Aussi le programme aurait sans doute pu ecirctre encore ameacutelioreacute pour

de meilleures performances

Malgreacute ce manque de temps nous sommes tregraves satisfaits du fonctionnement de ce module

qui nous a permis de comprendre lrsquoutiliteacute des parties theacuteoriques pour lrsquoapplication et la mise en

œuvre drsquoun systegraveme Lrsquoapproche peacutedagogique de nous diriger vers les solutions sans jamais les

donner de nous laisser un grand degreacute de liberteacute et drsquoautonomie a eacuteteacute au deacutebut assez deacuteroutante

mais tregraves instructif

Enfin nous tenions agrave remercier Mme Leymarie qui nous a suivis et aiguilleacute tout au long de ce

projet

Station meacuteteacuteo autonome 2012

34

XV ANNEXES

Programme complet

Deacuteclaration 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()

deacuteclaration des variables

int cond=0Condition pour laffichage sur leacutecran LCD

int BP=0

Initialisation et affectation des ports

PORTA=0

PORTB=0 initialisation

PORTC=0

TRISB=0 Port B deacuteclarer en sortie

TRISA=0xFF Port A en entreacutee

ADCON1=0x84 Justifieacute agrave droite active RA0RA1RA3 analogique

ADCON0=0x85 Fosc32 sur PA0 en service

TRISB=0 Port B deacuteclarer en sortie

TRISC=0xFFPort C deacuteclarer en entreacutee

Configuration et initialisation de leacutecran LCD

Lcd_Config(ampPORTB 0 1 WR 5 4 3 2) Configure lecran

Lcd_Init(ampPORTB) initialisation du LCD

Lcd_Cmd(Lcd_CURSOR_OFF) Enleve le curseur

Lcd_Cmd(Lcd_CLEAR) Efface lecran

Initialisation du module I2C

I2C_Init(100000)initialisation de la communication I2C

I2C_Start()Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90)Mode de controcircle en mode eacutecriture

I2C_Wr(0xAC)Accegraves au registre de configuration

I2C_Wr(0x0A)Registre de configuration mesure en continu

I2C_Stop()Arrecirct du signal

I2C_Start()Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90)Mode de controcircle en mode eacutecriture

I2C_Wr(0xEE)Deacutebut de la conversion

I2C_Stop()Arrecirct du sigal

Station meacuteteacuteo autonome 2012

35

Configuration du mode capture

T1CON=0x31 Configuration du timer1

CCP1CON=0x05 Paramegravetrage du mode capture

PIE1TMR1IE=1 Autorise les deacutebordements du timer 1

Boucle infinie

while(1)

cond=cond+1Increacutemente la variable cond

switch(BP)

case 0

humidite(ampcond)Appel la fonction humiditeacute

if(PORTAF2==1)Ces if permet de changer la valeur de BP

BP=1

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)Temps quon relacircche bien le bouton

break

case 1

temperature(ampcond)Appel la fonction tempeacuterature

if(PORTAF2==1)

BP=2

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)

break

case 2

vent(ampcond)Appel la fonction vent

if(PORTAF2==1)

BP=0

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)

break

Fonction humiditeacute

void humidite(int cond)

long H U VLDeacuteclaration des variables

char HH hum[8] humtxt[]=Humidite

VL=Adc_read(0) Valeur lue sur RA0(humiditeacute)

U=(VL5000)1023 Convertit la valeur lue en tension x1000

H=(U-810)(0031) Convertit la tension en humiditeacute x1000

Station meacuteteacuteo autonome 2012

36

if(Hgt100000)Si H gt 100(impossible) alors = 100

H=100000

if(Hlt0)Si H lt 0(impossible) alors = 0

H=0

hum[0]=(H100000)+48Valeur des centaines affecteacute en ascii(48=0)

HH=(H10000)10

hum[1]=HH+48Valeur des dizaines affecteacute en ascii

HH=(H1000)10

hum[2]=HH+48Valeur des uniteacutes affecteacute en ascii

hum[3]=44Virgule affecteacute en ascii

HH=(H100)10

hum[4]=HH+48Valeur de la premiegravere deacutecimale affecteacute en ascii

HH=(H10)10

hum[5]=HH+48Valeur de la deuxiegraveme deacutecimale affecteacute en ascii

hum[6]=37Pourcentage affecteacute en ascii

if(cond==50)Appel la fonction LCD tous les 1000

lcd(1 1 8 humtxt)Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 7 hum)Affiche la chaine de caractegravere hum sur le LCD

cond=0Remise a 0 de la condition

Xbee(7 hum) Envoi la chaicircne de caractegravere hum dans la fonction xbee

Fonction tempeacuterature

void temperature(int cond)

char temp[7] temptxt[]=Temperature LSB

signed char MSB

I2C_Start()Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90)Mode de controcircle en mode eacutecriture

I2C_Wr(0xAA)Lecture de la tempeacuterature

I2C_Stop()Arrecirct du sigal

I2C_Start()Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x91)Mode de controcircle en mode lecture

MSB = I2C_Rd(1)Nombre signeacute donnant la tempeacuterature entre +125deg et -55degC

LSB = I2C_Rd(0)Si bit 7 = 1 tempeacuterature MSB +05degC

I2C_Stop()Arrecirct du sigal

if(MSBlt0)

MSB = abs(MSB) Si temperature neacutegative valeur absolue de MSB

Temp[0]=45 Signe - affecteacute en ascii

else

Station meacuteteacuteo autonome 2012

37

Temp[0]=43signe + affecteacute en ascii

Temp[1]=(MSB10)+48 Valeur des dizaines affecteacute en ascii

Temp[2]=(MSB10)+48 Valeur des uniteacutes affecteacute en ascii

Temp[3]=44 Virgule affecteacute en ascii

if (LSB==128) Si bit 7 agrave 1 alors +05deg

Temp[4]=5

else Si bit 7 agrave 0 alors +00deg

Temp[4]=0

Temp[5]=223 degreacute affecteacute en ascii

Temp[6]=67 C affecteacute en ascii

if(cond==50)Appel la fonction LCD tous les 1000

lcd(1 1 11 temptxt)Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 7 temp)Affiche la chaine de caractegravere hum sur le LCD

cond=0Remise a 0 de la condition

Xbee(7 temp) Envoi la chaicircne de caractegravere temp dans la fonction xbee

Fonction vent

void vent(int cond)

unsigned long tl th per

int vitfreq

char vent[13] txtvent[]=Vitesse du vent VV

if(PIR1CCP1IF==1) Test si front montant agrave lieu

TMR1H=0 Initialisation du timer1 bit de point fort

TMR1L=0 Initialisation du timer1 bit de point faible

th=CCPR1H Les valeurs sont copieacute dans des variables

tl=CCPR1L

th=thltlt8 Deacutecalage car th =gt bit de point fort

per = th|tl On concategravene les deux valeurs nous obtenons la peacuteriode

PIR1CCP1IF=0 Remise a 0 du drapeau

if(PIR1TMR1IF==1) Si deacutepassement du timer 1

per=65535+per On ajoute une retenue lorsquon a fait un tour (16bit)

PIR1TMR1IF=0 Remise a 0 du drapeau deacutepassement

Station meacuteteacuteo autonome 2012

38

freq=671310perCalacul de la freacutequence

vit=freq179 + 692Calcul de la vitesse que lon x100

if(vitlt200)En dessous 2ms la mesure est aleacuteatoire agrave cause du 2egraveme deacutebordement

vit=0

vent[0]=(vit10000)+48Valeur des centaines affecteacute en ascii(48=0)

VV=(vit1000)10

vent[1]=VV+48Valeur des dizaines affecteacute en ascii

VV=(vit100)10

vent[2]=VV+48Valeur des uniteacute affecteacute en ascii

VV=(vit10)10

vent[3]=44Virgule affecteacute en ascii

vent[4]=VV+48Valeur de la 1er deacutecimale affecteacute en ascii

VV=vit10

vent[5]=VV+48Valeur de la 2egraveme deacutecimale affecteacute en ascii

vent[6]=109m affecteacute en ascii

vent[7]=47 affecteacute en ascii

vent[8]=115s affecteacute en ascii

if(cond==50)Appel la fonction LCD tous les 1000

lcd(1 1 15 txtvent)Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 9 vent)Affiche la chaine de caractegravere hum sur le LCD

cond=0Remise a 0 de la condition

Xbee(9 vent) Envoi la chaicircne de caractegravere vent dans la fonction xbee

Fonction affichage

void lcd(int li int co int nb char receive[15])

int i

for(i=0 iltnb i++)Boucle for

Lcd_chr(li (co+i) receive[i])Affiche les caractegraveres jusquagrave i

Usart

void xbee(int nb char receive[15])

int i

Usart_Init(9600)Vitesse de transmission

for(i=0 iltnb i++)Boucle for

Usart_Write(receive[i])Envoi les caractegraveres sur lHyperTerminal jusquagrave i

Station meacuteteacuteo autonome 2012

11

C Le scheacutema du microcontrocircleur avec le capteur drsquohumiditeacute

Voici le scheacutema de cacircblage du capteur drsquohumiditeacute uniquement A noter que le capteur est

remplaceacute par un potentiomegravetre nrsquoeacutetant pas dans la librairie de Proteus On constate qursquoil est bien

brancheacute sur RA0

D Programme pour la mesure de lrsquohumiditeacute

Voici le programme pour mesurer lrsquohumiditeacute avec les affectations deacutecrites ci-dessus ainsi

que les eacutequations de conversions

Deacuteclaration des fonctions

void humidite(int cond)

void lcd(int li int co int nb char receive[11])

void main()

deacuteclaration des variables

int cond=0 Condition pour laffichage sur leacutecran LCD

Initialisation et affectation des ports

PORTB=0 initialisation

TRISB=0 Port B deacuteclarer en sortie

TRISA = 0xFF Port A en entreacutee

ADCON1 = 0x84 Justifieacute agrave droite active RA0RA1RA3 analogique

ADCON0 = 0x85 Fosc32 sur PA0 en service

Configuration et initialisation de leacutecran LCD

Lcd_Config(ampPORTB 0 1 WR 5 4 3 2) Configure leacutecran

Lcd_Init(ampPORTB) initialisation du LCD

Lcd_Cmd(Lcd_CURSOR_OFF) Enlegraveve le curseur

Lcd_Cmd(Lcd_CLEAR) Efface leacutecran

Figure 8 Scheacutema de cacircblage du capteur dhumiditeacute

Station meacuteteacuteo autonome 2012

12

Boucle infinie

while(1)

cond=cond+1 Increacutemente la variable cond

humidite(ampcond) Appel la fonction humiditeacute

Fonction humiditeacute

void humidite(int cond)

long H U VL Deacuteclaration des variables

char HH hum[8] humtxt[]=Humidite

VL=Adc_read(0) Valeur lue sur RA0(humiditeacute)

U=(VL5000)1023 Convertit la valeur lue en tension x1000

H=(U-810)(0031) Convertit la tension en humiditeacute x1000

if(Hgt100000) Si H gt 100(impossible) alors = 100

H=100000

if(Hlt0) Si H lt 0(impossible) alors = 0

H=0

hum[0]=(H100000)+48 Valeur des centaines affecteacute en ascii(48=0)

HH=(H10000)10

hum[1]=HH+48 Valeur des dizaines affecteacute en ascii

HH=(H1000)10

hum[2]=HH+48 Valeur des uniteacutes affecteacute en ascii

hum[3]=44Virgule affecteacute en ascii

HH=(H100)10

hum[4]=HH+48 Valeur de la premiegravere deacutecimale affecteacute en ascii

HH=(H10)10

hum[5]=HH+48 Valeur de la deuxiegraveme deacutecimale affecteacute en ascii

hum[6]=37 Pourcentage affecteacute en ascii

if(cond==1000)Appel la fonction LCD tous les 1000

lcd(1 1 10 humtxt) Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 7 hum) Affiche la chaine de caractegravere hum sur le LCD

cond=0 Remise a 0 de la condition

Fonction affichage

void lcd(int li int co int nb char receive[11])

int i

for(i=0 ilt=nb i++)Boucle for

Lcd_chr(li (co+i) receive[i]) Affiche les caractegraveres jusquagrave i

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

Station meacuteteacuteo autonome 2012

13

VIII Le capteur de tempeacuterature

A preacutesent comme toute station meacuteteacuteo

nous avons installeacute un capteur de tempeacuterature le

DS1621 Ce capteur communique avec le

microcontrocircleur gracircce au protocole I2C

A Le protocole I2C

Le bus I2C (Inter Integrated Circuit) a eacuteteacute deacuteveloppeacute au deacutebut des anneacutees 80 par Philips

semiconductors pour permettre de relier facilement agrave un microprocesseur les diffeacuterents circuits dun

teacuteleacuteviseur moderne

Le bus I2C permet de faire communiquer entre eux des composants eacutelectroniques tregraves divers

gracircce agrave seulement trois fils Un signal de donneacutee (SDA) un signal dhorloge (SCL) et un signal de

reacutefeacuterence eacutelectrique (Masse)

Ceci permet de reacutealiser des eacutequipements ayant des fonctionnaliteacutes tregraves puissantes (En

apportant toute la puissance des systegravemes micro programmeacutes) et conservant un circuit imprimeacute tregraves

simple par rapport un scheacutema classique (8bits de donneacutees 16 bits dadresse + les bits de controcircle)

Les donneacutees sont transmises en seacuterie agrave 100Kbitss en mode standard et jusquagrave 400Kbitss en

mode rapide Ce qui ouvre la porte de cette technologie agrave toutes les applications ougrave la vitesse nest

pas primordiale

Voici un exemple de protocole qursquoutilise le bus I2C

1 Pour initier le dialogue le maicirctre creacutee une condition Start

2 Le maicirctre envoie ladresse de lesclave (1010100) suivi du bit 0 (bit Write)

3 Lesclave reacutepond (accuseacute de reacuteception bit Acknowledge)

4 Le maicirctre envoie ladresse du registre (0x04) agrave eacutecrire

5 Lesclave reacutepond (accuseacute de reacuteception bit Acknowledge)

6 Le maicirctre envoie la donneacutee (0x27) agrave eacutecrire

7 Lesclave eacutecrit la donneacutee puis envoie un accuseacute de reacuteception (bit Acknowledge)

8 Le maicirctre termine le dialogue avec une condition Stop

9 Le bus I2C est maintenant libre (SCL = 1 SDA = 1 niveaux de repos)

Figure 9 scheacutema du DS1621

Station meacuteteacuteo autonome 2012

14

B Caracteacuteristique du DS1621

Comme on peut voir sur la figure 9 le capteur est composeacute de 8 bornes

SDA =gt Liaison seacuterie entreacutee sortie

SCL =gt Signal drsquohorloge

Tout =gt Signal de sortie du thermostat (inutile dans notre cas)

GND =gt Masse

VDD =gt Alimentation +5V

A0 A1 A2 =gt Entreacutee drsquoadressage (dans notre cas les 3 agrave la masse car nous nrsquoavons qursquoun

module I2C)

Les circuits connecteacutes sur un bus I2C ont des sorties de type drain ouvert (ou collecteur

ouvert) Deux reacutesistances de pull-up sont bien sucircr placeacutees entre les lignes SDA SCL et lalimentation

(VDD)Quand le bus nest pas utiliseacute SDA et SCL sont au niveau haut (niveau de repos)

1 Speacutecificiteacute des commandes

Tous dialogue du maicirctre(PIC16F876) avec un DS1621 esclave doit deacutebuter par lrsquoenvoi drsquoun

mot de controcircle

Le maicirctre envoi ensuite une commande suivi ou non de donneacutees Voici la liste des

commandes avec leur description

Les commandes AC EE et 22 ne sont pas suivies de lenvoi de donneacutees Par contre la

commande AA qui nous inteacuteresse est suivie de lrsquoenvoi par le DS1621 de 2 octets repreacutesentant la

tempeacuterature

Station meacuteteacuteo autonome 2012

15

Voici le registre de configuration(AC) qursquoil nous faut deacuteterminer

DONE 1 = conversion finie 0 = conversion en cours En mode 1 SHOT uniquement

THF Flag seuil haut du thermostat Passe agrave 1 et y reste si tempeacuterature supeacuterieure agrave TH

TLF Flag seuil bas du thermostat Passe agrave 1 et y reste si tempeacuterature infeacuterieure agrave TL

NVB 1 = meacutemoire EEPROM en eacutecriture 0 = meacutemoire EEPROM eacutecriture termineacutee

Nous nrsquoactiverons pas lrsquoeacutecriture de la meacutemoire

POL Polariteacute de Tout (pin 3) 1 = actif sera un niveau HAUT 0 = actif sera un niveau BAS

Il faut activer la polariteacute donc nous le mettons agrave 1

ONE SHOT 0 = conversion en continu 1 = conversion 1 fois

Nous le mettons en mode continu

AC = brsquo00001010rsquo = hrsquo0Arsquo

La commande AA qui permet de lire la tempeacuterature renvoie 2 octets

MSB (Most Significant Bit) Nombre signeacute donnant la tempeacuterature entre +125deg et -55degC

LSB (Least Significant Bit ) Seul le bit 7 de cet octet est significatif Si 1 tempeacuterature

MSB +05degC

Pour bien comprendre comment est codeacute un nombre signeacute un tableau avec des exemples de

valeurs eacutetait agrave notre disposition dans la notice

Station meacuteteacuteo autonome 2012

16

2 Dialogue I2C pour avoir la tempeacuterature

Voici un scheacutema qui montre le dialogue agrave effectuer entre le microcontrocircleur et le capteur

pour avoir la tempeacuterature Crsquoest gracircce agrave ce mecircme scheacutema que nous avons pu programmer le PIC

Station meacuteteacuteo autonome 2012

17

C Le scheacutema du microcontrocircleur avec le capteur de tempeacuterature

Voici le scheacutema du capteur de tempeacuterature uniquement Le capteur est brancheacute sur les

borne SCL(RC3) et SDA(RC4) du PIC Qursquoelles soient deacuteclareacutees en entreacutee ou en sortie les bornes SCL et

SDA sont fonctionnelles Il ne faut pas oublier les reacutesistances de tirages (R1 et R3) Lrsquoadressage A0 A1

A2 toutes misent agrave la masse car nous nrsquoavons qursquoun seul capteur I2C relieacute au PIC et le Tout

(thermostat) inutile car nous faisons juste un releveacute de tempeacuterature

D Programme pour la mesure de la tempeacuterature

Deacuteclaration des fonctions

void temperature(int cond)

void lcd(int li int co int nb char receive[14])

void main()

deacuteclaration des variables

int cond=0Condition pour laffichage sur leacutecran LCD

Initialisation et affectation des ports

PORTB=0 initialisation

PORTC=0

TRISB=0 Port B deacuteclarer en sortie

TRISC = 0xFF Port C en entreacutee

Configuration et initialisation de leacutecran LCD

Lcd_Config(ampPORTB 0 1 WR 5 4 3 2) Configure leacutecran

Lcd_Init(ampPORTB) initialisation du LCD

Lcd_Cmd(Lcd_CURSOR_OFF) Enlegraveve le curseur

Lcd_Cmd(Lcd_CLEAR) Efface leacutecran

Initialisation du module I2C

I2C_Init(100000) initialisation de la communication I2C

I2C_Start() Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90) Mode de controcircle en mode eacutecriture

I2C_Wr(0xAC) Accegraves au registre de configuration

I2C_Wr(0x0A) Registre de configuration mesure en continu

I2C_Stop() Arrecirct du signal

I2C_Start() Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90) Mode de controcircle en mode eacutecriture

Figure 10 Scheacutema de cacircblage avec le capteur de tempeacuterature

Station meacuteteacuteo autonome 2012

18

I2C_Wr(0xEE) Deacutebut de la conversion

I2C_Stop()Arrecirct du sigal

Boucle infinie

while(1)

cond=cond+1 Increacutemente la variable cond

temperature(ampcond) Appel la fonction humiditeacute

Fonction tempeacuterature

void temperature(int cond)

char temp[7] temptxt[]=Temperature LSB

signed char MSB

I2C_Start() Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90) Mode de controcircle en mode eacutecriture

I2C_Wr(0xAA) Lecture de la tempeacuterature

I2C_Stop() Arrecirct du signal

I2C_Start() Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x91) Mode de controcircle en mode lecture

MSB = I2C_Rd(1) Nombre signeacute donnant la tempeacuterature entre +125deg et -55degC

LSB = I2C_Rd(0) Si bit 7 = 1 tempeacuterature MSB +05degC

I2C_Stop() Arrecirct du signal

if(MSBlt0)

MSB = abs(MSB) Si tempeacuterature neacutegative valeur absolue de MSB

Temp[0]=45 Signe - affecteacute en ascii

else

Temp[0]=43 signe + affecteacute en ascii

Temp[1]=(MSB10)+48 Valeur des dizaines affecteacute en ascii

Temp[2]=(MSB10)+48 Valeur des uniteacutes affecteacute en ascii

Temp[3]=44 Virgule affecteacute en ascii

if (LSB==128) Si bit 7 agrave 1 alors +05deg

Temp[4]=5

Else Si bit 7 agrave 0 alors +00deg

Temp[4]=0

Temp[5]=223 degreacute affecteacute en ascii

Temp[6]=67 C affecteacute en ascii

if(cond==10) Appel la fonction LCD tous les 1000

lcd(1 1 13 temptxt) Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 6 temp) Affiche la chaine de caractegravere hum sur le LCD

cond=0 Remise a 0 de la condition

Fonction affichage

void lcd(int li int co int nb char receive[14])

int i

for(i=0 ilt=nb i++)Boucle for

Lcd_chr(li (co+i) receive[i]) Affiche les caractegraveres jusquagrave i

Le scheacutema preacuteceacutedent est bien respecteacute comme on peut le voir crsquoest tregraves facile agrave programmer

gracircce aux librairies I2C du logiciel MikroC

Station meacuteteacuteo autonome 2012

19

IX Lrsquoaneacutemomegravetre

A Conception

Pour lrsquoaneacutemomegravetre lrsquoeacutequipe peacutedagogique

nous a juste fourni lrsquoheacutelice du capteur donc il a fallu

concevoir toute la partie eacutelectronique Lrsquoideacutee est

drsquoinstaller une diode et un transistor photonique par

de lagrave lrsquoheacutelice et lorsqursquoelle tourne elle vient couper le

faisceau Succinctement le transistor envoit soit 1 soit

0 sur le PIC Le but est de relever la freacutequence agrave

laquelle tourne lrsquoheacutelice puis la convertir en vitesse (cf

figure 11)

La photodiode choisie est de reacutefeacuterence SD5455-3 Ce choix a eacuteteacute fait car lrsquoangle du faisceau

est de 20deg pour que le flux infrarouge soit bien concentreacute sur le phototransistor pour un

fonctionnement optimal

Comme on le voit sur le scheacutema de principe (cf figure 11) il a fallu dimensionner la

reacutesistance qui sert agrave reacuteguler le courant qui circule dans la LED avec les informations donneacutees par la

documentation technique nous avons pu la calculer

Forward voltage VF = 17V et IF = 01A

Ualim = 5V

RD = (Ualim ndash UF)IF = (5 ndash 17)01

RD = 33Ω

Pour le phototransistor nous avons choisi celui qui allait avec la diode de reacutefeacuterence SE5455-3

Cette fois la valeur de la reacutesistance nous eacutetait donneacute par le constructeur

RL=1000Ω

Lors des seacuteances nous avons implanteacute la diode et le

transistor sur le support du capteur Pour des raisons

pratiques et estheacutetiques nous avons seacutepareacute la partie

aneacutemomegravetre et la partie platine par des borniers (cf figure

12)

Figure 11 scheacutema descriptif de laneacutemomegravetre

Figure 12 Notre aneacutemomegravetre

Station meacuteteacuteo autonome 2012

20

B Mesure de la peacuteriode sur le microcontrocircleur

Le but est de relever la peacuteriode du signal envoyer par lrsquoaneacutemomegravetre pour cela le PIC est

eacutequipeacute drsquoun mode capture Le principe est de recopier agrave un moment voulu la valeur du timer 1 La

capture peut avoir lieux agrave chaque front descendant agrave chaque front montant tous les 4 ou tous les 16

fronts montants Quand la capture a eu lieu un flag est mis agrave 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 constitueacute de 2 registres de 8 bits TMR1H et TMR1L que lon peut lire ou eacutecrire Le registre TMR1

(constitueacute de TMR1H et TMR1L) sincreacutemente de h0000 jusquagrave hFFFF et repasse ensuite agrave h0000

pour continuer le comptage Quand il y a deacutebordement une interruption peut ecirctre geacuteneacutereacutee si on lrsquoa

autoriseacutee par TMR1IE =1 (bit 0 de PIE1) et le Flag TMR1IF (bit 0 de PIR1) passe agrave 1 Le controcircle du

timer 1 ce fait par le registre T1CON

Bit 7 et bit 6 bits non impleacutementeacutes

Bit 5 et bit 4 T1CKPS = Seacutelection du preacute diviseur placeacute avant le TIMER

Vu qursquoon a un quartz eacuteleveacute nous avons deacutecideacute de choisir un preacute-diviseur de 8 donc

F=Fosc(48) Pour cela mettre les bit 4 et 5 agrave 1

Bit 3 T1OSCEN Bit dautorisation de loscillateur du Timer 1

1 = oscillateur autoriseacute

0 = oscillateur stoppeacute

Oscillateur interne inutile donc bit 3 agrave 0

Bit 2 T1SYNC Bit de controcircle de la synchronisation du CLK externe

1 = Pas de synchronisation de lhorloge externe

0 = Synchronisation de lhorloge externe

Nous nous mettrons en mode synchrone

Bit1 TMR1CS Bit de seacutelection de la source horloge

1 = Mode Compteur Clk externe sur la broche PC0 ou Quartz entre PC0 et PC1

0 = Mode Timer Clk interne = Fosc4

Station meacuteteacuteo autonome 2012

21

On mettra ce bit agrave 0 car on utilise le mode Timer

Bit 0 TMR1ON Bit dautorisation du Timer 1

1 = Timer 1 en service

0 = Timer 1 stoppeacute

Il faut eacutevidemment mettre la timer 1 en service

Nous avons aussi autoriseacute le deacutebordement du timer 1 pour avoir plus de preacutecisions pour cela il faut

mettre la commande PIE1TMR1 agrave 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 parameacutetrer le registre

CCP1CON

Bit 7 et Bit 6 bits non impleacutementeacutes

Bit 5 et Bit 4 CCP1X et CCP1Y

Bits non utiliseacutes 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 agrave Bit 0 CCP1M3 agrave CCP1M0 bits de seacutelection du mode

Nous avons seacutelectionneacute le mode capture sur chaque front montant Pour cela nous avons

mis les bits 1 et 3 agrave 0 et les bits 0 et 2 agrave 1

Pour savoir si un front montant agrave eu lieu le flag CCP1F est mis agrave 1 Ce flag doit ecirctre remis agrave 0 par

lrsquoutilisateur La valeur des 16 bits des registres du Timer 1 TMR1L (bit de poids faible) et TMR1H (bit

de poids fort) sont recopieacutees dans les registres CCPR1 CCPRIH (bit de poids faible) et CCPR1L (bit de

poids fort)

Nous avons programmeacute le mode capture de faccedilon agrave afficher sur lrsquoeacutecran LCD la valeur du registre

CCPR1 crsquoest-agrave-dire la peacuteriode du signal de lrsquoaneacutemomegravetre Il ne nous reste maintenant plus qursquoagrave

eacutetalonner notre aneacutemomegravetre

Station meacuteteacuteo autonome 2012

22

C Etalonnage de lrsquoaneacutemomegravetre

Pour eacutetalonner le capteur nous avons commenceacute par savoir agrave quelle freacutequence correspond la

valeur releveacutee par le mode capture Pour cela nous avons brancheacute un GBF agrave la place du capteur et

avec un oscilloscope nous avons compareacute leurs valeurs

Nous avons ensuite traceacute agrave lrsquoaide des valeurs du tableau la courbe F(Hz) en fonction du

compteur De cette courbe nous relevons lrsquoeacutequation

F = 671310compteur^(-101)

Soit environ F = 671310compteur

Puis nous avons brancheacute notre aneacutemomegravetre sur le microcontrocircleur Cela dans le but de

relever sa peacuteriode sur lrsquoeacutecran LCD agrave lrsquoaide drsquoune soufflerie variable et du manomegravetre GDH (reacutef

121552 200-13) nous avons compareacute leurs valeurs pour connaitre lrsquoeacutetalonnage de notre capteur

Nous avons noteacute plusieurs valeurs puis traceacute diffeacuterentes courbe pour trouver les eacutequations qui nous

permettrons de calculer la vitesse dans notre programme

Station meacuteteacuteo autonome 2012

23

Voici les valeurs que nous avons releveacutees puis la courbe traceacutee sur Excel

De cette courbe nous obtenons lrsquoeacutequation

Vitesse du vent = 0179F + 0629

Nous les multiplierons par 100 pour reacutecupeacuterer les deacutecimales et les implanter dans une chaine

de caractegravere

Vitesse du vent = 179F + 629

Nous avons agrave preacutesent agrave notre disposition toutes les eacutequations neacutecessaires pour pouvoir

convertir la valeur releveacutee par le mode capture en une vitesse

D Le scheacutema du microcontrocircleur avec lrsquoaneacutemomegravetre

On voit sur le scheacutema que le capteur est bien relieacute sur la borne RC2 Nous avons aussi

repreacutesenteacute les borniers J1 et J2 A droite tous ce qui est sur le support et agrave gauche tous ce qui est sur

la platine

Figure 13 Scheacutema avec laneacutemomegravetre

Station meacuteteacuteo autonome 2012

24

E Programme pour la mesure de la vitesse du vent

Voici le programme pour mesurer la vitesse du vent avec les affectations deacutecrites ci-dessus

ainsi que les eacutequations de conversions

Deacuteclaration des fonctions

void vent(int cond)

void lcd(int li int co int nb char receive[20])

void main()

deacuteclaration des variables

int cond=0

Initialisation et affectation des ports

PORTB=0 initialisation

PORTC=0 initialisation

TRISC=0x04 Port C deacuteclarer en sortie sauf RC2 en mode capture

TRISB=0 Port B deacuteclarer en sortie

Configuration du mode capture

T1CON=0x31 Configuration du timer1

CCP1CON=0x05 Parameacutetrage du mode capture

PIE1TMR1IE=1 Autorise les deacutebordements du timer 1

Configuration et initialisation de leacutecran LCD

Lcd_Config(ampPORTB 0 1 WR 5 4 3 2) Configure leacutecran

Lcd_Init(ampPORTB) Initialisation du LCD

Lcd_Cmd(Lcd_CURSOR_OFF) Enlegraveve le curseur

Lcd_Cmd(Lcd_CLEAR) Efface leacutecran

Boucle infinie

while(1)

cond=cond+1

vent(ampcond)

Fonction vent

void vent(int cond)

unsigned long tl th per

int vitfreq

char vent[13] txtvent[]=vitesse du vent VV

if(PIR1CCP1IF==1) Test si front montant agrave lieu

TMR1H=0 Initialisation du timer1 bit de point fort

TMR1L=0 Initialisation du timer1 bit de point faible

th=CCPR1H Les valeurs sont copieacute dans des variables

tl=CCPR1L

th=thltlt8 Deacutecalage car th =gt bit de point fort

per = th|tl On concategravene les deux valeurs nous obtenons la peacuteriode

PIR1CCP1IF=0 Remise a 0 du drapeau

if(PIR1TMR1IF==1) Si deacutepassement du timer 1

per=65535+per On ajoute une retenue lorsquon a fait un tour (16bit)

PIR1TMR1IF=0 Remise a 0 du drapeau deacutepassement

freq=671310per Calcul de la freacutequence

vit=freq179 + 692 Calcul de la vitesse que lon x100

Station meacuteteacuteo autonome 2012

25

if(vitlt200) En dessous 2ms la mesure est aleacuteatoire agrave cause du 2egraveme deacutebordement

vit=0

vent[0]=(vit10000)+48 Valeur des centaines affecteacute en ascii(48=0)

VV=(vit1000)10

vent[1]=VV+48 Valeur des dizaines affecteacute en ascii

VV=(vit100)10

vent[2]=VV+48 Valeur des uniteacute affecteacute en ascii

VV=(vit10)10

vent[3]=44 Virgule affecteacute en ascii

vent[4]=VV+48 Valeur de la 1er deacutecimale affecteacute en ascii

VV=vit10

vent[5]=VV+48 Valeur de la 2egraveme deacutecimale affecteacute en ascii

vent[6]=109 m affecteacute en ascii

vent[7]=47 affecteacute en ascii

vent[8]=115 s affecteacute en ascii

if(cond==1000) Appel la fonction LCD tous les 1000

lcd(1 1 16 txtvent) Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 8 vent) Affiche la chaine de caractegravere hum sur le LCD

cond=0 Remise a 0 de la condition

Fonction affichage

void lcd(int li int co int nb char receive[20])

int i

for(i=0 ilt=nb i++) Boucle for

Lcd_chr(li (co+i) receive[i]) Affiche les caractegraveres jusquagrave i

Station meacuteteacuteo autonome 2012

26

X Simulation une station meacuteteacuteo autonome

Maintenant que tous nos capteurs sont installeacutes nous allons mettre agrave profit le bouton

poussoir installeacute dans la partie LCD Crsquoest-agrave-dire que nous allons rassembler tous les programmes

preacuteceacutedents pour nrsquoen faire qursquoun Il suffira drsquoappuyer sur le bouton poussoir pour faire deacutefiler les

diffeacuterentes valeurs comme une vraie station meacuteteacuteo

A La structure du programme

Boucle infinie

while(1)

cond=cond+1 Increacutemente la variable cond

switch(BP)

case 0

humidite(ampcond) Appel la fonction humiditeacute

if(PORTAF2==1) Ces if permet de changer la valeur de BP

BP=1

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250) Temps quon relacircche bien le bouton

break

case 1

temperature(ampcond) Appel la fonction tempeacuterature

if(PORTAF2==1)

BP=2

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)

break

case 2

vent(ampcond) Appel la fonction vent

if(PORTAF2==1)

BP=0

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)

break

Nous avons choisi drsquoutiliser un Switch nous avons donc juste rajouteacute une variable BP

Lorsqursquoil y a appui sur le bouton poussoir la variable BP srsquoincreacutemente et le programme passe agrave une

autre case et donc utilise une nouvelle fonction La temporisation nous donne le temps de relacirccher le

bouton pour eacuteviter de faire deacutefiler le menu sans le vouloir

Station meacuteteacuteo autonome 2012

27

B La simulation

Etant donneacute que nous ne pouvions pas prendre le mateacuteriel avec nous il eacutetait impeacuteratif de

pouvoir faire des simulations Pour cela nous avons utiliseacute un logiciel tregraves utile Proteus ISIS Ce

logiciel possegravede une tregraves grande librairie et permet de rentrer nos programmes sur le PIC virtuel

geacuteneacutereacute par le logiciel Pour simuler le capteur drsquohumiditeacute nous avons utiliseacute un potentiomegravetre Pour

celui de lrsquoaneacutemomegravetre comme pour nos mesures nous avons brancheacute virtuellement un GBF sur la

borne associeacute et observeacute son signal agrave lrsquoaide drsquoun oscilloscope

Voilagrave un aperccedilu de la simulation effectueacute sur ISIS

Veacuterification theacuteorique du vent

Vitesse du vent = 0179 37 + 0629

Vitesse du vent = 7657ms

Veacuterification theacuteorique de lrsquohumiditeacute

H= (315-081)0031

H=7548

Veacuterification theacuteorique de la

tempeacuterature

La valeur afficheacutee correspond bien

aux 27degC seacutelectionneacute sur le capteur

Station meacuteteacuteo autonome 2012

28

XI Transmission des donneacutees par liaison ZigBee

ZigBee est un protocole de haut niveau permettant la communication de petites radios agrave

consommation reacuteduite baseacutee sur le standard IEEE 802154

Cette technologie a pour but la communication de courte distance telle que le propose deacutejagrave

la technologie Bluetooth tout en eacutetant moins chegravere plus simple et avec une fiabiliteacute assez eacuteleveacutee

Dans notre projet nous nous servirons de ZigBee pour permettre une transmission par ondes

de nos donneacutees de la station meacuteteacuteo vers un ordinateur Pour cela nous avons 2 modules Xbee pro 2

platines drsquointerfaces une avec des pattes (liaison platine) et lrsquoautre avec une sortie RS232 (liaison pc)

Caracteacuteristique eacutelectrique

Les signaux Xbee ont une amplitude de 33V mais sont alimenteacutes en 5V (tension de notre

source USB) cacircbleacutes sur la bornes VIN (laquo Power input from 6-12Vdc 300mA or higher raquo) Mais

notre source nrsquoeacutetant pas assez puissante pour alimenter toute notre installation Nous utiliserons

donc une source externe de 5V qui sera utiliseacutee pour alimenter les 2 systegravemes Xbee

Description des Bornes du Xbee qui nous inteacuteresse

Station meacuteteacuteo autonome 2012

29

A Scheacutema eacutelectrique du module Xbee

Nous avons cacircbleacute la sortie TX du microcontrocircleur qui eacutemet un signal jusqursquoagrave la borne RX du

Xbee qui reacuteceptionne ce signal Apregraves la transmission se fait par onde entre les 2 modules Xbee Pour

le module qui reccediloit le signal un cacircble RS232 suffit agrave faire la liaison entre celui-ci et le PC

B Envoi des donneacutees la liaison Usart

Un USART (Universal synchronous amp Asynchronous Receiver Transmitter) est un eacutemetteur-

reacutecepteur universel En langage courant cest le composant utiliseacute pour faire la liaison entre

lordinateur et le port seacuterie Lordinateur envoie les donneacutees en parallegravele (autant de fils que de bits

de donneacutees) Il faut donc transformer ces donneacutees pour les faire passer agrave travers une liaison seacuterie qui

utilise un mecircme fil pour faire passer tous les bits de donneacutees

Constitution dune trame USART

un bit de start toujours agrave 0 servant agrave la synchronisation du reacutecepteur

les donneacutees la taille peut varier (geacuteneacuteralement entre 5 et 9 bits)

eacuteventuellement un bit de pariteacute paire ou impaire

et un bit de stop toujours agrave 1 (la dureacutee peut varier entre 1 15 et 2 temps bit)

Le niveau logique de repos est le 1

Figure 14 Trame USART

Station meacuteteacuteo autonome 2012

30

Afin de faciliter les liaisons entre peacuteripheacuteriques (PC microcontrocircleur modem hellip) des vitesses

de transmission sont normaliseacutees luniteacute baud correspondant agrave un temps bit Dans notre cas nous

choisirons une vitesse de transmission de 9600bps

C Programme drsquoenvoi des donneacutees par liaison Usart

Gracircce agrave la librairie de MikroC il est tregraves facile drsquoenvoyer des donneacutees par liaison Usart Cela

fonctionne comme pour envoyer des caractegraveres sur lrsquoeacutecran LCD Il faut juste ensuite choisir la vitesse

de transmission qui sera 9600bps Voici la fonction et un morceau du programme qui sert agrave envoyer

les caractegraveres sur Xbee et de Xbee agrave un HyperTerminal

Fonction humiditeacute

void humidite(int cond)

long H U VL Deacuteclaration des variables

char HH hum[8] humtxt[]=Humidite

helliphellip

Xbee(8 hum) Envoi la chaicircne de caractegravere hum dans la fonction xbee

Usart

void xbee(int nb char receive[20])

int i

Usart_Init(9600) Vitesse de transmission

for(i=0 ilt=nb i++) Boucle for

Usart_Write(receive[i]) Envoi les caractegraveres sur lrsquoHyperTerminal jusquagrave i

Station meacuteteacuteo autonome 2012

31

XII Estimation du coucirct du projet

On peut voir sur ce tableau que le prix de reviens pour les eacuteleacutements que nous avons utiliseacute

est de 14506euro TTC Ce qui est plutocirct oneacutereux compareacute aux stations meacuteteacuteo du marcheacute qui oscille

entre 6euro et 400euro En sachant que la nocirctre est loin drsquoecirctre finaliseacute (finition estheacutetique ergonomie et

ajout de nouvelle fonction comme la date et lrsquoheure)

Composant Quantiteacute Prix (TVA inclus) Liens Quartz 20000MHz 1 111 euro Lien

Capaciteacute 22pF 2 010 euro lien

PIC 16F876 1 427 euro lien

LCD MODULE 1 1575 euro lien

Potentiomegravetre 10KΩ 1 618 euro lien

Reacutesistance 33 Ω 1 035 euro lien

Reacutesistance 10 K Ω 2 070 euro lien

Reacutesistance 1 KΩ 3 105 euro lien

LED rouge 1 013 euro lien

DS1621 1 650 euro lien

Bouton poussoir 1 060 euro lien

Module Xbee 2 4000 euro lien

Platine dinterface (XBEE) RS232 1 1890 euro lien

Platine dinterface (XBEE) 1 1364 euro lien

Capteur drsquohumiditeacute 1 2692 euro lien

Transistor 1 561 euro lien

Diode 1 325 euro lien

Totales 1 14506 euro

Station meacuteteacuteo autonome 2012

32

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

panelsbut 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 Itrsquos also possible to measure

humidity and wind speed Then itrsquos 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 its 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 Itrsquos 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

Station meacuteteacuteo autonome 2012

33

XIV Conclusion

Ce projet sur la conception drsquoune station meacuteteacuteo autonome qui nous a eacuteteacute confieacute a eacuteteacute tregraves

enrichissant Il nous a permis de mettre en relations les connaissances acquises durant lrsquoanneacutee mais

aussi acqueacuterir de nouvelles connaissances comme le fonctionnement drsquoun microcontrocircleur En effet

nous nrsquoavions jamais programmeacute sur microcontrocircleur Il a fallu srsquoadapter et apprendre agrave utiliser des

nouveaux logiciels tels que Proteus MikroC ainsi que Labview

De cette expeacuterience nous avons aussi appris agrave ecirctre autonome Nous avons saisi que la

compreacutehension des documents techniques et des librairies eacutetait un point essentiel de notre projet

En programmation nous nrsquoavions pas le droit agrave lrsquoerreur car la moindre faute pouvait conduire le

systegraveme agrave un dysfonctionnement Ce projet nous a demandeacute beaucoup de rigueur de patience et de

temps

Toutefois nous nrsquoavons pas eu malheureusement le temps drsquoinstaller le capteur de

tempeacuterature inteacuterieure par manque de temps Plus encore nous aurions aimeacute approfondir certains

points Par exemple pouvoir installer les composants sur circuit imprimeacute et concevoir un support

viable pour en faire une vraie station meacuteteacuteo Lrsquoinstallation drsquoune girouette aurait eacuteteacute appreacuteciable

pour connaicirctre le sens du vent Aussi le programme aurait sans doute pu ecirctre encore ameacutelioreacute pour

de meilleures performances

Malgreacute ce manque de temps nous sommes tregraves satisfaits du fonctionnement de ce module

qui nous a permis de comprendre lrsquoutiliteacute des parties theacuteoriques pour lrsquoapplication et la mise en

œuvre drsquoun systegraveme Lrsquoapproche peacutedagogique de nous diriger vers les solutions sans jamais les

donner de nous laisser un grand degreacute de liberteacute et drsquoautonomie a eacuteteacute au deacutebut assez deacuteroutante

mais tregraves instructif

Enfin nous tenions agrave remercier Mme Leymarie qui nous a suivis et aiguilleacute tout au long de ce

projet

Station meacuteteacuteo autonome 2012

34

XV ANNEXES

Programme complet

Deacuteclaration 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()

deacuteclaration des variables

int cond=0Condition pour laffichage sur leacutecran LCD

int BP=0

Initialisation et affectation des ports

PORTA=0

PORTB=0 initialisation

PORTC=0

TRISB=0 Port B deacuteclarer en sortie

TRISA=0xFF Port A en entreacutee

ADCON1=0x84 Justifieacute agrave droite active RA0RA1RA3 analogique

ADCON0=0x85 Fosc32 sur PA0 en service

TRISB=0 Port B deacuteclarer en sortie

TRISC=0xFFPort C deacuteclarer en entreacutee

Configuration et initialisation de leacutecran LCD

Lcd_Config(ampPORTB 0 1 WR 5 4 3 2) Configure lecran

Lcd_Init(ampPORTB) initialisation du LCD

Lcd_Cmd(Lcd_CURSOR_OFF) Enleve le curseur

Lcd_Cmd(Lcd_CLEAR) Efface lecran

Initialisation du module I2C

I2C_Init(100000)initialisation de la communication I2C

I2C_Start()Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90)Mode de controcircle en mode eacutecriture

I2C_Wr(0xAC)Accegraves au registre de configuration

I2C_Wr(0x0A)Registre de configuration mesure en continu

I2C_Stop()Arrecirct du signal

I2C_Start()Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90)Mode de controcircle en mode eacutecriture

I2C_Wr(0xEE)Deacutebut de la conversion

I2C_Stop()Arrecirct du sigal

Station meacuteteacuteo autonome 2012

35

Configuration du mode capture

T1CON=0x31 Configuration du timer1

CCP1CON=0x05 Paramegravetrage du mode capture

PIE1TMR1IE=1 Autorise les deacutebordements du timer 1

Boucle infinie

while(1)

cond=cond+1Increacutemente la variable cond

switch(BP)

case 0

humidite(ampcond)Appel la fonction humiditeacute

if(PORTAF2==1)Ces if permet de changer la valeur de BP

BP=1

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)Temps quon relacircche bien le bouton

break

case 1

temperature(ampcond)Appel la fonction tempeacuterature

if(PORTAF2==1)

BP=2

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)

break

case 2

vent(ampcond)Appel la fonction vent

if(PORTAF2==1)

BP=0

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)

break

Fonction humiditeacute

void humidite(int cond)

long H U VLDeacuteclaration des variables

char HH hum[8] humtxt[]=Humidite

VL=Adc_read(0) Valeur lue sur RA0(humiditeacute)

U=(VL5000)1023 Convertit la valeur lue en tension x1000

H=(U-810)(0031) Convertit la tension en humiditeacute x1000

Station meacuteteacuteo autonome 2012

36

if(Hgt100000)Si H gt 100(impossible) alors = 100

H=100000

if(Hlt0)Si H lt 0(impossible) alors = 0

H=0

hum[0]=(H100000)+48Valeur des centaines affecteacute en ascii(48=0)

HH=(H10000)10

hum[1]=HH+48Valeur des dizaines affecteacute en ascii

HH=(H1000)10

hum[2]=HH+48Valeur des uniteacutes affecteacute en ascii

hum[3]=44Virgule affecteacute en ascii

HH=(H100)10

hum[4]=HH+48Valeur de la premiegravere deacutecimale affecteacute en ascii

HH=(H10)10

hum[5]=HH+48Valeur de la deuxiegraveme deacutecimale affecteacute en ascii

hum[6]=37Pourcentage affecteacute en ascii

if(cond==50)Appel la fonction LCD tous les 1000

lcd(1 1 8 humtxt)Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 7 hum)Affiche la chaine de caractegravere hum sur le LCD

cond=0Remise a 0 de la condition

Xbee(7 hum) Envoi la chaicircne de caractegravere hum dans la fonction xbee

Fonction tempeacuterature

void temperature(int cond)

char temp[7] temptxt[]=Temperature LSB

signed char MSB

I2C_Start()Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90)Mode de controcircle en mode eacutecriture

I2C_Wr(0xAA)Lecture de la tempeacuterature

I2C_Stop()Arrecirct du sigal

I2C_Start()Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x91)Mode de controcircle en mode lecture

MSB = I2C_Rd(1)Nombre signeacute donnant la tempeacuterature entre +125deg et -55degC

LSB = I2C_Rd(0)Si bit 7 = 1 tempeacuterature MSB +05degC

I2C_Stop()Arrecirct du sigal

if(MSBlt0)

MSB = abs(MSB) Si temperature neacutegative valeur absolue de MSB

Temp[0]=45 Signe - affecteacute en ascii

else

Station meacuteteacuteo autonome 2012

37

Temp[0]=43signe + affecteacute en ascii

Temp[1]=(MSB10)+48 Valeur des dizaines affecteacute en ascii

Temp[2]=(MSB10)+48 Valeur des uniteacutes affecteacute en ascii

Temp[3]=44 Virgule affecteacute en ascii

if (LSB==128) Si bit 7 agrave 1 alors +05deg

Temp[4]=5

else Si bit 7 agrave 0 alors +00deg

Temp[4]=0

Temp[5]=223 degreacute affecteacute en ascii

Temp[6]=67 C affecteacute en ascii

if(cond==50)Appel la fonction LCD tous les 1000

lcd(1 1 11 temptxt)Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 7 temp)Affiche la chaine de caractegravere hum sur le LCD

cond=0Remise a 0 de la condition

Xbee(7 temp) Envoi la chaicircne de caractegravere temp dans la fonction xbee

Fonction vent

void vent(int cond)

unsigned long tl th per

int vitfreq

char vent[13] txtvent[]=Vitesse du vent VV

if(PIR1CCP1IF==1) Test si front montant agrave lieu

TMR1H=0 Initialisation du timer1 bit de point fort

TMR1L=0 Initialisation du timer1 bit de point faible

th=CCPR1H Les valeurs sont copieacute dans des variables

tl=CCPR1L

th=thltlt8 Deacutecalage car th =gt bit de point fort

per = th|tl On concategravene les deux valeurs nous obtenons la peacuteriode

PIR1CCP1IF=0 Remise a 0 du drapeau

if(PIR1TMR1IF==1) Si deacutepassement du timer 1

per=65535+per On ajoute une retenue lorsquon a fait un tour (16bit)

PIR1TMR1IF=0 Remise a 0 du drapeau deacutepassement

Station meacuteteacuteo autonome 2012

38

freq=671310perCalacul de la freacutequence

vit=freq179 + 692Calcul de la vitesse que lon x100

if(vitlt200)En dessous 2ms la mesure est aleacuteatoire agrave cause du 2egraveme deacutebordement

vit=0

vent[0]=(vit10000)+48Valeur des centaines affecteacute en ascii(48=0)

VV=(vit1000)10

vent[1]=VV+48Valeur des dizaines affecteacute en ascii

VV=(vit100)10

vent[2]=VV+48Valeur des uniteacute affecteacute en ascii

VV=(vit10)10

vent[3]=44Virgule affecteacute en ascii

vent[4]=VV+48Valeur de la 1er deacutecimale affecteacute en ascii

VV=vit10

vent[5]=VV+48Valeur de la 2egraveme deacutecimale affecteacute en ascii

vent[6]=109m affecteacute en ascii

vent[7]=47 affecteacute en ascii

vent[8]=115s affecteacute en ascii

if(cond==50)Appel la fonction LCD tous les 1000

lcd(1 1 15 txtvent)Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 9 vent)Affiche la chaine de caractegravere hum sur le LCD

cond=0Remise a 0 de la condition

Xbee(9 vent) Envoi la chaicircne de caractegravere vent dans la fonction xbee

Fonction affichage

void lcd(int li int co int nb char receive[15])

int i

for(i=0 iltnb i++)Boucle for

Lcd_chr(li (co+i) receive[i])Affiche les caractegraveres jusquagrave i

Usart

void xbee(int nb char receive[15])

int i

Usart_Init(9600)Vitesse de transmission

for(i=0 iltnb i++)Boucle for

Usart_Write(receive[i])Envoi les caractegraveres sur lHyperTerminal jusquagrave i

Station meacuteteacuteo autonome 2012

12

Boucle infinie

while(1)

cond=cond+1 Increacutemente la variable cond

humidite(ampcond) Appel la fonction humiditeacute

Fonction humiditeacute

void humidite(int cond)

long H U VL Deacuteclaration des variables

char HH hum[8] humtxt[]=Humidite

VL=Adc_read(0) Valeur lue sur RA0(humiditeacute)

U=(VL5000)1023 Convertit la valeur lue en tension x1000

H=(U-810)(0031) Convertit la tension en humiditeacute x1000

if(Hgt100000) Si H gt 100(impossible) alors = 100

H=100000

if(Hlt0) Si H lt 0(impossible) alors = 0

H=0

hum[0]=(H100000)+48 Valeur des centaines affecteacute en ascii(48=0)

HH=(H10000)10

hum[1]=HH+48 Valeur des dizaines affecteacute en ascii

HH=(H1000)10

hum[2]=HH+48 Valeur des uniteacutes affecteacute en ascii

hum[3]=44Virgule affecteacute en ascii

HH=(H100)10

hum[4]=HH+48 Valeur de la premiegravere deacutecimale affecteacute en ascii

HH=(H10)10

hum[5]=HH+48 Valeur de la deuxiegraveme deacutecimale affecteacute en ascii

hum[6]=37 Pourcentage affecteacute en ascii

if(cond==1000)Appel la fonction LCD tous les 1000

lcd(1 1 10 humtxt) Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 7 hum) Affiche la chaine de caractegravere hum sur le LCD

cond=0 Remise a 0 de la condition

Fonction affichage

void lcd(int li int co int nb char receive[11])

int i

for(i=0 ilt=nb i++)Boucle for

Lcd_chr(li (co+i) receive[i]) Affiche les caractegraveres jusquagrave i

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

Station meacuteteacuteo autonome 2012

13

VIII Le capteur de tempeacuterature

A preacutesent comme toute station meacuteteacuteo

nous avons installeacute un capteur de tempeacuterature le

DS1621 Ce capteur communique avec le

microcontrocircleur gracircce au protocole I2C

A Le protocole I2C

Le bus I2C (Inter Integrated Circuit) a eacuteteacute deacuteveloppeacute au deacutebut des anneacutees 80 par Philips

semiconductors pour permettre de relier facilement agrave un microprocesseur les diffeacuterents circuits dun

teacuteleacuteviseur moderne

Le bus I2C permet de faire communiquer entre eux des composants eacutelectroniques tregraves divers

gracircce agrave seulement trois fils Un signal de donneacutee (SDA) un signal dhorloge (SCL) et un signal de

reacutefeacuterence eacutelectrique (Masse)

Ceci permet de reacutealiser des eacutequipements ayant des fonctionnaliteacutes tregraves puissantes (En

apportant toute la puissance des systegravemes micro programmeacutes) et conservant un circuit imprimeacute tregraves

simple par rapport un scheacutema classique (8bits de donneacutees 16 bits dadresse + les bits de controcircle)

Les donneacutees sont transmises en seacuterie agrave 100Kbitss en mode standard et jusquagrave 400Kbitss en

mode rapide Ce qui ouvre la porte de cette technologie agrave toutes les applications ougrave la vitesse nest

pas primordiale

Voici un exemple de protocole qursquoutilise le bus I2C

1 Pour initier le dialogue le maicirctre creacutee une condition Start

2 Le maicirctre envoie ladresse de lesclave (1010100) suivi du bit 0 (bit Write)

3 Lesclave reacutepond (accuseacute de reacuteception bit Acknowledge)

4 Le maicirctre envoie ladresse du registre (0x04) agrave eacutecrire

5 Lesclave reacutepond (accuseacute de reacuteception bit Acknowledge)

6 Le maicirctre envoie la donneacutee (0x27) agrave eacutecrire

7 Lesclave eacutecrit la donneacutee puis envoie un accuseacute de reacuteception (bit Acknowledge)

8 Le maicirctre termine le dialogue avec une condition Stop

9 Le bus I2C est maintenant libre (SCL = 1 SDA = 1 niveaux de repos)

Figure 9 scheacutema du DS1621

Station meacuteteacuteo autonome 2012

14

B Caracteacuteristique du DS1621

Comme on peut voir sur la figure 9 le capteur est composeacute de 8 bornes

SDA =gt Liaison seacuterie entreacutee sortie

SCL =gt Signal drsquohorloge

Tout =gt Signal de sortie du thermostat (inutile dans notre cas)

GND =gt Masse

VDD =gt Alimentation +5V

A0 A1 A2 =gt Entreacutee drsquoadressage (dans notre cas les 3 agrave la masse car nous nrsquoavons qursquoun

module I2C)

Les circuits connecteacutes sur un bus I2C ont des sorties de type drain ouvert (ou collecteur

ouvert) Deux reacutesistances de pull-up sont bien sucircr placeacutees entre les lignes SDA SCL et lalimentation

(VDD)Quand le bus nest pas utiliseacute SDA et SCL sont au niveau haut (niveau de repos)

1 Speacutecificiteacute des commandes

Tous dialogue du maicirctre(PIC16F876) avec un DS1621 esclave doit deacutebuter par lrsquoenvoi drsquoun

mot de controcircle

Le maicirctre envoi ensuite une commande suivi ou non de donneacutees Voici la liste des

commandes avec leur description

Les commandes AC EE et 22 ne sont pas suivies de lenvoi de donneacutees Par contre la

commande AA qui nous inteacuteresse est suivie de lrsquoenvoi par le DS1621 de 2 octets repreacutesentant la

tempeacuterature

Station meacuteteacuteo autonome 2012

15

Voici le registre de configuration(AC) qursquoil nous faut deacuteterminer

DONE 1 = conversion finie 0 = conversion en cours En mode 1 SHOT uniquement

THF Flag seuil haut du thermostat Passe agrave 1 et y reste si tempeacuterature supeacuterieure agrave TH

TLF Flag seuil bas du thermostat Passe agrave 1 et y reste si tempeacuterature infeacuterieure agrave TL

NVB 1 = meacutemoire EEPROM en eacutecriture 0 = meacutemoire EEPROM eacutecriture termineacutee

Nous nrsquoactiverons pas lrsquoeacutecriture de la meacutemoire

POL Polariteacute de Tout (pin 3) 1 = actif sera un niveau HAUT 0 = actif sera un niveau BAS

Il faut activer la polariteacute donc nous le mettons agrave 1

ONE SHOT 0 = conversion en continu 1 = conversion 1 fois

Nous le mettons en mode continu

AC = brsquo00001010rsquo = hrsquo0Arsquo

La commande AA qui permet de lire la tempeacuterature renvoie 2 octets

MSB (Most Significant Bit) Nombre signeacute donnant la tempeacuterature entre +125deg et -55degC

LSB (Least Significant Bit ) Seul le bit 7 de cet octet est significatif Si 1 tempeacuterature

MSB +05degC

Pour bien comprendre comment est codeacute un nombre signeacute un tableau avec des exemples de

valeurs eacutetait agrave notre disposition dans la notice

Station meacuteteacuteo autonome 2012

16

2 Dialogue I2C pour avoir la tempeacuterature

Voici un scheacutema qui montre le dialogue agrave effectuer entre le microcontrocircleur et le capteur

pour avoir la tempeacuterature Crsquoest gracircce agrave ce mecircme scheacutema que nous avons pu programmer le PIC

Station meacuteteacuteo autonome 2012

17

C Le scheacutema du microcontrocircleur avec le capteur de tempeacuterature

Voici le scheacutema du capteur de tempeacuterature uniquement Le capteur est brancheacute sur les

borne SCL(RC3) et SDA(RC4) du PIC Qursquoelles soient deacuteclareacutees en entreacutee ou en sortie les bornes SCL et

SDA sont fonctionnelles Il ne faut pas oublier les reacutesistances de tirages (R1 et R3) Lrsquoadressage A0 A1

A2 toutes misent agrave la masse car nous nrsquoavons qursquoun seul capteur I2C relieacute au PIC et le Tout

(thermostat) inutile car nous faisons juste un releveacute de tempeacuterature

D Programme pour la mesure de la tempeacuterature

Deacuteclaration des fonctions

void temperature(int cond)

void lcd(int li int co int nb char receive[14])

void main()

deacuteclaration des variables

int cond=0Condition pour laffichage sur leacutecran LCD

Initialisation et affectation des ports

PORTB=0 initialisation

PORTC=0

TRISB=0 Port B deacuteclarer en sortie

TRISC = 0xFF Port C en entreacutee

Configuration et initialisation de leacutecran LCD

Lcd_Config(ampPORTB 0 1 WR 5 4 3 2) Configure leacutecran

Lcd_Init(ampPORTB) initialisation du LCD

Lcd_Cmd(Lcd_CURSOR_OFF) Enlegraveve le curseur

Lcd_Cmd(Lcd_CLEAR) Efface leacutecran

Initialisation du module I2C

I2C_Init(100000) initialisation de la communication I2C

I2C_Start() Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90) Mode de controcircle en mode eacutecriture

I2C_Wr(0xAC) Accegraves au registre de configuration

I2C_Wr(0x0A) Registre de configuration mesure en continu

I2C_Stop() Arrecirct du signal

I2C_Start() Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90) Mode de controcircle en mode eacutecriture

Figure 10 Scheacutema de cacircblage avec le capteur de tempeacuterature

Station meacuteteacuteo autonome 2012

18

I2C_Wr(0xEE) Deacutebut de la conversion

I2C_Stop()Arrecirct du sigal

Boucle infinie

while(1)

cond=cond+1 Increacutemente la variable cond

temperature(ampcond) Appel la fonction humiditeacute

Fonction tempeacuterature

void temperature(int cond)

char temp[7] temptxt[]=Temperature LSB

signed char MSB

I2C_Start() Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90) Mode de controcircle en mode eacutecriture

I2C_Wr(0xAA) Lecture de la tempeacuterature

I2C_Stop() Arrecirct du signal

I2C_Start() Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x91) Mode de controcircle en mode lecture

MSB = I2C_Rd(1) Nombre signeacute donnant la tempeacuterature entre +125deg et -55degC

LSB = I2C_Rd(0) Si bit 7 = 1 tempeacuterature MSB +05degC

I2C_Stop() Arrecirct du signal

if(MSBlt0)

MSB = abs(MSB) Si tempeacuterature neacutegative valeur absolue de MSB

Temp[0]=45 Signe - affecteacute en ascii

else

Temp[0]=43 signe + affecteacute en ascii

Temp[1]=(MSB10)+48 Valeur des dizaines affecteacute en ascii

Temp[2]=(MSB10)+48 Valeur des uniteacutes affecteacute en ascii

Temp[3]=44 Virgule affecteacute en ascii

if (LSB==128) Si bit 7 agrave 1 alors +05deg

Temp[4]=5

Else Si bit 7 agrave 0 alors +00deg

Temp[4]=0

Temp[5]=223 degreacute affecteacute en ascii

Temp[6]=67 C affecteacute en ascii

if(cond==10) Appel la fonction LCD tous les 1000

lcd(1 1 13 temptxt) Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 6 temp) Affiche la chaine de caractegravere hum sur le LCD

cond=0 Remise a 0 de la condition

Fonction affichage

void lcd(int li int co int nb char receive[14])

int i

for(i=0 ilt=nb i++)Boucle for

Lcd_chr(li (co+i) receive[i]) Affiche les caractegraveres jusquagrave i

Le scheacutema preacuteceacutedent est bien respecteacute comme on peut le voir crsquoest tregraves facile agrave programmer

gracircce aux librairies I2C du logiciel MikroC

Station meacuteteacuteo autonome 2012

19

IX Lrsquoaneacutemomegravetre

A Conception

Pour lrsquoaneacutemomegravetre lrsquoeacutequipe peacutedagogique

nous a juste fourni lrsquoheacutelice du capteur donc il a fallu

concevoir toute la partie eacutelectronique Lrsquoideacutee est

drsquoinstaller une diode et un transistor photonique par

de lagrave lrsquoheacutelice et lorsqursquoelle tourne elle vient couper le

faisceau Succinctement le transistor envoit soit 1 soit

0 sur le PIC Le but est de relever la freacutequence agrave

laquelle tourne lrsquoheacutelice puis la convertir en vitesse (cf

figure 11)

La photodiode choisie est de reacutefeacuterence SD5455-3 Ce choix a eacuteteacute fait car lrsquoangle du faisceau

est de 20deg pour que le flux infrarouge soit bien concentreacute sur le phototransistor pour un

fonctionnement optimal

Comme on le voit sur le scheacutema de principe (cf figure 11) il a fallu dimensionner la

reacutesistance qui sert agrave reacuteguler le courant qui circule dans la LED avec les informations donneacutees par la

documentation technique nous avons pu la calculer

Forward voltage VF = 17V et IF = 01A

Ualim = 5V

RD = (Ualim ndash UF)IF = (5 ndash 17)01

RD = 33Ω

Pour le phototransistor nous avons choisi celui qui allait avec la diode de reacutefeacuterence SE5455-3

Cette fois la valeur de la reacutesistance nous eacutetait donneacute par le constructeur

RL=1000Ω

Lors des seacuteances nous avons implanteacute la diode et le

transistor sur le support du capteur Pour des raisons

pratiques et estheacutetiques nous avons seacutepareacute la partie

aneacutemomegravetre et la partie platine par des borniers (cf figure

12)

Figure 11 scheacutema descriptif de laneacutemomegravetre

Figure 12 Notre aneacutemomegravetre

Station meacuteteacuteo autonome 2012

20

B Mesure de la peacuteriode sur le microcontrocircleur

Le but est de relever la peacuteriode du signal envoyer par lrsquoaneacutemomegravetre pour cela le PIC est

eacutequipeacute drsquoun mode capture Le principe est de recopier agrave un moment voulu la valeur du timer 1 La

capture peut avoir lieux agrave chaque front descendant agrave chaque front montant tous les 4 ou tous les 16

fronts montants Quand la capture a eu lieu un flag est mis agrave 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 constitueacute de 2 registres de 8 bits TMR1H et TMR1L que lon peut lire ou eacutecrire Le registre TMR1

(constitueacute de TMR1H et TMR1L) sincreacutemente de h0000 jusquagrave hFFFF et repasse ensuite agrave h0000

pour continuer le comptage Quand il y a deacutebordement une interruption peut ecirctre geacuteneacutereacutee si on lrsquoa

autoriseacutee par TMR1IE =1 (bit 0 de PIE1) et le Flag TMR1IF (bit 0 de PIR1) passe agrave 1 Le controcircle du

timer 1 ce fait par le registre T1CON

Bit 7 et bit 6 bits non impleacutementeacutes

Bit 5 et bit 4 T1CKPS = Seacutelection du preacute diviseur placeacute avant le TIMER

Vu qursquoon a un quartz eacuteleveacute nous avons deacutecideacute de choisir un preacute-diviseur de 8 donc

F=Fosc(48) Pour cela mettre les bit 4 et 5 agrave 1

Bit 3 T1OSCEN Bit dautorisation de loscillateur du Timer 1

1 = oscillateur autoriseacute

0 = oscillateur stoppeacute

Oscillateur interne inutile donc bit 3 agrave 0

Bit 2 T1SYNC Bit de controcircle de la synchronisation du CLK externe

1 = Pas de synchronisation de lhorloge externe

0 = Synchronisation de lhorloge externe

Nous nous mettrons en mode synchrone

Bit1 TMR1CS Bit de seacutelection de la source horloge

1 = Mode Compteur Clk externe sur la broche PC0 ou Quartz entre PC0 et PC1

0 = Mode Timer Clk interne = Fosc4

Station meacuteteacuteo autonome 2012

21

On mettra ce bit agrave 0 car on utilise le mode Timer

Bit 0 TMR1ON Bit dautorisation du Timer 1

1 = Timer 1 en service

0 = Timer 1 stoppeacute

Il faut eacutevidemment mettre la timer 1 en service

Nous avons aussi autoriseacute le deacutebordement du timer 1 pour avoir plus de preacutecisions pour cela il faut

mettre la commande PIE1TMR1 agrave 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 parameacutetrer le registre

CCP1CON

Bit 7 et Bit 6 bits non impleacutementeacutes

Bit 5 et Bit 4 CCP1X et CCP1Y

Bits non utiliseacutes 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 agrave Bit 0 CCP1M3 agrave CCP1M0 bits de seacutelection du mode

Nous avons seacutelectionneacute le mode capture sur chaque front montant Pour cela nous avons

mis les bits 1 et 3 agrave 0 et les bits 0 et 2 agrave 1

Pour savoir si un front montant agrave eu lieu le flag CCP1F est mis agrave 1 Ce flag doit ecirctre remis agrave 0 par

lrsquoutilisateur La valeur des 16 bits des registres du Timer 1 TMR1L (bit de poids faible) et TMR1H (bit

de poids fort) sont recopieacutees dans les registres CCPR1 CCPRIH (bit de poids faible) et CCPR1L (bit de

poids fort)

Nous avons programmeacute le mode capture de faccedilon agrave afficher sur lrsquoeacutecran LCD la valeur du registre

CCPR1 crsquoest-agrave-dire la peacuteriode du signal de lrsquoaneacutemomegravetre Il ne nous reste maintenant plus qursquoagrave

eacutetalonner notre aneacutemomegravetre

Station meacuteteacuteo autonome 2012

22

C Etalonnage de lrsquoaneacutemomegravetre

Pour eacutetalonner le capteur nous avons commenceacute par savoir agrave quelle freacutequence correspond la

valeur releveacutee par le mode capture Pour cela nous avons brancheacute un GBF agrave la place du capteur et

avec un oscilloscope nous avons compareacute leurs valeurs

Nous avons ensuite traceacute agrave lrsquoaide des valeurs du tableau la courbe F(Hz) en fonction du

compteur De cette courbe nous relevons lrsquoeacutequation

F = 671310compteur^(-101)

Soit environ F = 671310compteur

Puis nous avons brancheacute notre aneacutemomegravetre sur le microcontrocircleur Cela dans le but de

relever sa peacuteriode sur lrsquoeacutecran LCD agrave lrsquoaide drsquoune soufflerie variable et du manomegravetre GDH (reacutef

121552 200-13) nous avons compareacute leurs valeurs pour connaitre lrsquoeacutetalonnage de notre capteur

Nous avons noteacute plusieurs valeurs puis traceacute diffeacuterentes courbe pour trouver les eacutequations qui nous

permettrons de calculer la vitesse dans notre programme

Station meacuteteacuteo autonome 2012

23

Voici les valeurs que nous avons releveacutees puis la courbe traceacutee sur Excel

De cette courbe nous obtenons lrsquoeacutequation

Vitesse du vent = 0179F + 0629

Nous les multiplierons par 100 pour reacutecupeacuterer les deacutecimales et les implanter dans une chaine

de caractegravere

Vitesse du vent = 179F + 629

Nous avons agrave preacutesent agrave notre disposition toutes les eacutequations neacutecessaires pour pouvoir

convertir la valeur releveacutee par le mode capture en une vitesse

D Le scheacutema du microcontrocircleur avec lrsquoaneacutemomegravetre

On voit sur le scheacutema que le capteur est bien relieacute sur la borne RC2 Nous avons aussi

repreacutesenteacute les borniers J1 et J2 A droite tous ce qui est sur le support et agrave gauche tous ce qui est sur

la platine

Figure 13 Scheacutema avec laneacutemomegravetre

Station meacuteteacuteo autonome 2012

24

E Programme pour la mesure de la vitesse du vent

Voici le programme pour mesurer la vitesse du vent avec les affectations deacutecrites ci-dessus

ainsi que les eacutequations de conversions

Deacuteclaration des fonctions

void vent(int cond)

void lcd(int li int co int nb char receive[20])

void main()

deacuteclaration des variables

int cond=0

Initialisation et affectation des ports

PORTB=0 initialisation

PORTC=0 initialisation

TRISC=0x04 Port C deacuteclarer en sortie sauf RC2 en mode capture

TRISB=0 Port B deacuteclarer en sortie

Configuration du mode capture

T1CON=0x31 Configuration du timer1

CCP1CON=0x05 Parameacutetrage du mode capture

PIE1TMR1IE=1 Autorise les deacutebordements du timer 1

Configuration et initialisation de leacutecran LCD

Lcd_Config(ampPORTB 0 1 WR 5 4 3 2) Configure leacutecran

Lcd_Init(ampPORTB) Initialisation du LCD

Lcd_Cmd(Lcd_CURSOR_OFF) Enlegraveve le curseur

Lcd_Cmd(Lcd_CLEAR) Efface leacutecran

Boucle infinie

while(1)

cond=cond+1

vent(ampcond)

Fonction vent

void vent(int cond)

unsigned long tl th per

int vitfreq

char vent[13] txtvent[]=vitesse du vent VV

if(PIR1CCP1IF==1) Test si front montant agrave lieu

TMR1H=0 Initialisation du timer1 bit de point fort

TMR1L=0 Initialisation du timer1 bit de point faible

th=CCPR1H Les valeurs sont copieacute dans des variables

tl=CCPR1L

th=thltlt8 Deacutecalage car th =gt bit de point fort

per = th|tl On concategravene les deux valeurs nous obtenons la peacuteriode

PIR1CCP1IF=0 Remise a 0 du drapeau

if(PIR1TMR1IF==1) Si deacutepassement du timer 1

per=65535+per On ajoute une retenue lorsquon a fait un tour (16bit)

PIR1TMR1IF=0 Remise a 0 du drapeau deacutepassement

freq=671310per Calcul de la freacutequence

vit=freq179 + 692 Calcul de la vitesse que lon x100

Station meacuteteacuteo autonome 2012

25

if(vitlt200) En dessous 2ms la mesure est aleacuteatoire agrave cause du 2egraveme deacutebordement

vit=0

vent[0]=(vit10000)+48 Valeur des centaines affecteacute en ascii(48=0)

VV=(vit1000)10

vent[1]=VV+48 Valeur des dizaines affecteacute en ascii

VV=(vit100)10

vent[2]=VV+48 Valeur des uniteacute affecteacute en ascii

VV=(vit10)10

vent[3]=44 Virgule affecteacute en ascii

vent[4]=VV+48 Valeur de la 1er deacutecimale affecteacute en ascii

VV=vit10

vent[5]=VV+48 Valeur de la 2egraveme deacutecimale affecteacute en ascii

vent[6]=109 m affecteacute en ascii

vent[7]=47 affecteacute en ascii

vent[8]=115 s affecteacute en ascii

if(cond==1000) Appel la fonction LCD tous les 1000

lcd(1 1 16 txtvent) Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 8 vent) Affiche la chaine de caractegravere hum sur le LCD

cond=0 Remise a 0 de la condition

Fonction affichage

void lcd(int li int co int nb char receive[20])

int i

for(i=0 ilt=nb i++) Boucle for

Lcd_chr(li (co+i) receive[i]) Affiche les caractegraveres jusquagrave i

Station meacuteteacuteo autonome 2012

26

X Simulation une station meacuteteacuteo autonome

Maintenant que tous nos capteurs sont installeacutes nous allons mettre agrave profit le bouton

poussoir installeacute dans la partie LCD Crsquoest-agrave-dire que nous allons rassembler tous les programmes

preacuteceacutedents pour nrsquoen faire qursquoun Il suffira drsquoappuyer sur le bouton poussoir pour faire deacutefiler les

diffeacuterentes valeurs comme une vraie station meacuteteacuteo

A La structure du programme

Boucle infinie

while(1)

cond=cond+1 Increacutemente la variable cond

switch(BP)

case 0

humidite(ampcond) Appel la fonction humiditeacute

if(PORTAF2==1) Ces if permet de changer la valeur de BP

BP=1

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250) Temps quon relacircche bien le bouton

break

case 1

temperature(ampcond) Appel la fonction tempeacuterature

if(PORTAF2==1)

BP=2

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)

break

case 2

vent(ampcond) Appel la fonction vent

if(PORTAF2==1)

BP=0

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)

break

Nous avons choisi drsquoutiliser un Switch nous avons donc juste rajouteacute une variable BP

Lorsqursquoil y a appui sur le bouton poussoir la variable BP srsquoincreacutemente et le programme passe agrave une

autre case et donc utilise une nouvelle fonction La temporisation nous donne le temps de relacirccher le

bouton pour eacuteviter de faire deacutefiler le menu sans le vouloir

Station meacuteteacuteo autonome 2012

27

B La simulation

Etant donneacute que nous ne pouvions pas prendre le mateacuteriel avec nous il eacutetait impeacuteratif de

pouvoir faire des simulations Pour cela nous avons utiliseacute un logiciel tregraves utile Proteus ISIS Ce

logiciel possegravede une tregraves grande librairie et permet de rentrer nos programmes sur le PIC virtuel

geacuteneacutereacute par le logiciel Pour simuler le capteur drsquohumiditeacute nous avons utiliseacute un potentiomegravetre Pour

celui de lrsquoaneacutemomegravetre comme pour nos mesures nous avons brancheacute virtuellement un GBF sur la

borne associeacute et observeacute son signal agrave lrsquoaide drsquoun oscilloscope

Voilagrave un aperccedilu de la simulation effectueacute sur ISIS

Veacuterification theacuteorique du vent

Vitesse du vent = 0179 37 + 0629

Vitesse du vent = 7657ms

Veacuterification theacuteorique de lrsquohumiditeacute

H= (315-081)0031

H=7548

Veacuterification theacuteorique de la

tempeacuterature

La valeur afficheacutee correspond bien

aux 27degC seacutelectionneacute sur le capteur

Station meacuteteacuteo autonome 2012

28

XI Transmission des donneacutees par liaison ZigBee

ZigBee est un protocole de haut niveau permettant la communication de petites radios agrave

consommation reacuteduite baseacutee sur le standard IEEE 802154

Cette technologie a pour but la communication de courte distance telle que le propose deacutejagrave

la technologie Bluetooth tout en eacutetant moins chegravere plus simple et avec une fiabiliteacute assez eacuteleveacutee

Dans notre projet nous nous servirons de ZigBee pour permettre une transmission par ondes

de nos donneacutees de la station meacuteteacuteo vers un ordinateur Pour cela nous avons 2 modules Xbee pro 2

platines drsquointerfaces une avec des pattes (liaison platine) et lrsquoautre avec une sortie RS232 (liaison pc)

Caracteacuteristique eacutelectrique

Les signaux Xbee ont une amplitude de 33V mais sont alimenteacutes en 5V (tension de notre

source USB) cacircbleacutes sur la bornes VIN (laquo Power input from 6-12Vdc 300mA or higher raquo) Mais

notre source nrsquoeacutetant pas assez puissante pour alimenter toute notre installation Nous utiliserons

donc une source externe de 5V qui sera utiliseacutee pour alimenter les 2 systegravemes Xbee

Description des Bornes du Xbee qui nous inteacuteresse

Station meacuteteacuteo autonome 2012

29

A Scheacutema eacutelectrique du module Xbee

Nous avons cacircbleacute la sortie TX du microcontrocircleur qui eacutemet un signal jusqursquoagrave la borne RX du

Xbee qui reacuteceptionne ce signal Apregraves la transmission se fait par onde entre les 2 modules Xbee Pour

le module qui reccediloit le signal un cacircble RS232 suffit agrave faire la liaison entre celui-ci et le PC

B Envoi des donneacutees la liaison Usart

Un USART (Universal synchronous amp Asynchronous Receiver Transmitter) est un eacutemetteur-

reacutecepteur universel En langage courant cest le composant utiliseacute pour faire la liaison entre

lordinateur et le port seacuterie Lordinateur envoie les donneacutees en parallegravele (autant de fils que de bits

de donneacutees) Il faut donc transformer ces donneacutees pour les faire passer agrave travers une liaison seacuterie qui

utilise un mecircme fil pour faire passer tous les bits de donneacutees

Constitution dune trame USART

un bit de start toujours agrave 0 servant agrave la synchronisation du reacutecepteur

les donneacutees la taille peut varier (geacuteneacuteralement entre 5 et 9 bits)

eacuteventuellement un bit de pariteacute paire ou impaire

et un bit de stop toujours agrave 1 (la dureacutee peut varier entre 1 15 et 2 temps bit)

Le niveau logique de repos est le 1

Figure 14 Trame USART

Station meacuteteacuteo autonome 2012

30

Afin de faciliter les liaisons entre peacuteripheacuteriques (PC microcontrocircleur modem hellip) des vitesses

de transmission sont normaliseacutees luniteacute baud correspondant agrave un temps bit Dans notre cas nous

choisirons une vitesse de transmission de 9600bps

C Programme drsquoenvoi des donneacutees par liaison Usart

Gracircce agrave la librairie de MikroC il est tregraves facile drsquoenvoyer des donneacutees par liaison Usart Cela

fonctionne comme pour envoyer des caractegraveres sur lrsquoeacutecran LCD Il faut juste ensuite choisir la vitesse

de transmission qui sera 9600bps Voici la fonction et un morceau du programme qui sert agrave envoyer

les caractegraveres sur Xbee et de Xbee agrave un HyperTerminal

Fonction humiditeacute

void humidite(int cond)

long H U VL Deacuteclaration des variables

char HH hum[8] humtxt[]=Humidite

helliphellip

Xbee(8 hum) Envoi la chaicircne de caractegravere hum dans la fonction xbee

Usart

void xbee(int nb char receive[20])

int i

Usart_Init(9600) Vitesse de transmission

for(i=0 ilt=nb i++) Boucle for

Usart_Write(receive[i]) Envoi les caractegraveres sur lrsquoHyperTerminal jusquagrave i

Station meacuteteacuteo autonome 2012

31

XII Estimation du coucirct du projet

On peut voir sur ce tableau que le prix de reviens pour les eacuteleacutements que nous avons utiliseacute

est de 14506euro TTC Ce qui est plutocirct oneacutereux compareacute aux stations meacuteteacuteo du marcheacute qui oscille

entre 6euro et 400euro En sachant que la nocirctre est loin drsquoecirctre finaliseacute (finition estheacutetique ergonomie et

ajout de nouvelle fonction comme la date et lrsquoheure)

Composant Quantiteacute Prix (TVA inclus) Liens Quartz 20000MHz 1 111 euro Lien

Capaciteacute 22pF 2 010 euro lien

PIC 16F876 1 427 euro lien

LCD MODULE 1 1575 euro lien

Potentiomegravetre 10KΩ 1 618 euro lien

Reacutesistance 33 Ω 1 035 euro lien

Reacutesistance 10 K Ω 2 070 euro lien

Reacutesistance 1 KΩ 3 105 euro lien

LED rouge 1 013 euro lien

DS1621 1 650 euro lien

Bouton poussoir 1 060 euro lien

Module Xbee 2 4000 euro lien

Platine dinterface (XBEE) RS232 1 1890 euro lien

Platine dinterface (XBEE) 1 1364 euro lien

Capteur drsquohumiditeacute 1 2692 euro lien

Transistor 1 561 euro lien

Diode 1 325 euro lien

Totales 1 14506 euro

Station meacuteteacuteo autonome 2012

32

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

panelsbut 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 Itrsquos also possible to measure

humidity and wind speed Then itrsquos 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 its 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 Itrsquos 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

Station meacuteteacuteo autonome 2012

33

XIV Conclusion

Ce projet sur la conception drsquoune station meacuteteacuteo autonome qui nous a eacuteteacute confieacute a eacuteteacute tregraves

enrichissant Il nous a permis de mettre en relations les connaissances acquises durant lrsquoanneacutee mais

aussi acqueacuterir de nouvelles connaissances comme le fonctionnement drsquoun microcontrocircleur En effet

nous nrsquoavions jamais programmeacute sur microcontrocircleur Il a fallu srsquoadapter et apprendre agrave utiliser des

nouveaux logiciels tels que Proteus MikroC ainsi que Labview

De cette expeacuterience nous avons aussi appris agrave ecirctre autonome Nous avons saisi que la

compreacutehension des documents techniques et des librairies eacutetait un point essentiel de notre projet

En programmation nous nrsquoavions pas le droit agrave lrsquoerreur car la moindre faute pouvait conduire le

systegraveme agrave un dysfonctionnement Ce projet nous a demandeacute beaucoup de rigueur de patience et de

temps

Toutefois nous nrsquoavons pas eu malheureusement le temps drsquoinstaller le capteur de

tempeacuterature inteacuterieure par manque de temps Plus encore nous aurions aimeacute approfondir certains

points Par exemple pouvoir installer les composants sur circuit imprimeacute et concevoir un support

viable pour en faire une vraie station meacuteteacuteo Lrsquoinstallation drsquoune girouette aurait eacuteteacute appreacuteciable

pour connaicirctre le sens du vent Aussi le programme aurait sans doute pu ecirctre encore ameacutelioreacute pour

de meilleures performances

Malgreacute ce manque de temps nous sommes tregraves satisfaits du fonctionnement de ce module

qui nous a permis de comprendre lrsquoutiliteacute des parties theacuteoriques pour lrsquoapplication et la mise en

œuvre drsquoun systegraveme Lrsquoapproche peacutedagogique de nous diriger vers les solutions sans jamais les

donner de nous laisser un grand degreacute de liberteacute et drsquoautonomie a eacuteteacute au deacutebut assez deacuteroutante

mais tregraves instructif

Enfin nous tenions agrave remercier Mme Leymarie qui nous a suivis et aiguilleacute tout au long de ce

projet

Station meacuteteacuteo autonome 2012

34

XV ANNEXES

Programme complet

Deacuteclaration 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()

deacuteclaration des variables

int cond=0Condition pour laffichage sur leacutecran LCD

int BP=0

Initialisation et affectation des ports

PORTA=0

PORTB=0 initialisation

PORTC=0

TRISB=0 Port B deacuteclarer en sortie

TRISA=0xFF Port A en entreacutee

ADCON1=0x84 Justifieacute agrave droite active RA0RA1RA3 analogique

ADCON0=0x85 Fosc32 sur PA0 en service

TRISB=0 Port B deacuteclarer en sortie

TRISC=0xFFPort C deacuteclarer en entreacutee

Configuration et initialisation de leacutecran LCD

Lcd_Config(ampPORTB 0 1 WR 5 4 3 2) Configure lecran

Lcd_Init(ampPORTB) initialisation du LCD

Lcd_Cmd(Lcd_CURSOR_OFF) Enleve le curseur

Lcd_Cmd(Lcd_CLEAR) Efface lecran

Initialisation du module I2C

I2C_Init(100000)initialisation de la communication I2C

I2C_Start()Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90)Mode de controcircle en mode eacutecriture

I2C_Wr(0xAC)Accegraves au registre de configuration

I2C_Wr(0x0A)Registre de configuration mesure en continu

I2C_Stop()Arrecirct du signal

I2C_Start()Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90)Mode de controcircle en mode eacutecriture

I2C_Wr(0xEE)Deacutebut de la conversion

I2C_Stop()Arrecirct du sigal

Station meacuteteacuteo autonome 2012

35

Configuration du mode capture

T1CON=0x31 Configuration du timer1

CCP1CON=0x05 Paramegravetrage du mode capture

PIE1TMR1IE=1 Autorise les deacutebordements du timer 1

Boucle infinie

while(1)

cond=cond+1Increacutemente la variable cond

switch(BP)

case 0

humidite(ampcond)Appel la fonction humiditeacute

if(PORTAF2==1)Ces if permet de changer la valeur de BP

BP=1

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)Temps quon relacircche bien le bouton

break

case 1

temperature(ampcond)Appel la fonction tempeacuterature

if(PORTAF2==1)

BP=2

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)

break

case 2

vent(ampcond)Appel la fonction vent

if(PORTAF2==1)

BP=0

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)

break

Fonction humiditeacute

void humidite(int cond)

long H U VLDeacuteclaration des variables

char HH hum[8] humtxt[]=Humidite

VL=Adc_read(0) Valeur lue sur RA0(humiditeacute)

U=(VL5000)1023 Convertit la valeur lue en tension x1000

H=(U-810)(0031) Convertit la tension en humiditeacute x1000

Station meacuteteacuteo autonome 2012

36

if(Hgt100000)Si H gt 100(impossible) alors = 100

H=100000

if(Hlt0)Si H lt 0(impossible) alors = 0

H=0

hum[0]=(H100000)+48Valeur des centaines affecteacute en ascii(48=0)

HH=(H10000)10

hum[1]=HH+48Valeur des dizaines affecteacute en ascii

HH=(H1000)10

hum[2]=HH+48Valeur des uniteacutes affecteacute en ascii

hum[3]=44Virgule affecteacute en ascii

HH=(H100)10

hum[4]=HH+48Valeur de la premiegravere deacutecimale affecteacute en ascii

HH=(H10)10

hum[5]=HH+48Valeur de la deuxiegraveme deacutecimale affecteacute en ascii

hum[6]=37Pourcentage affecteacute en ascii

if(cond==50)Appel la fonction LCD tous les 1000

lcd(1 1 8 humtxt)Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 7 hum)Affiche la chaine de caractegravere hum sur le LCD

cond=0Remise a 0 de la condition

Xbee(7 hum) Envoi la chaicircne de caractegravere hum dans la fonction xbee

Fonction tempeacuterature

void temperature(int cond)

char temp[7] temptxt[]=Temperature LSB

signed char MSB

I2C_Start()Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90)Mode de controcircle en mode eacutecriture

I2C_Wr(0xAA)Lecture de la tempeacuterature

I2C_Stop()Arrecirct du sigal

I2C_Start()Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x91)Mode de controcircle en mode lecture

MSB = I2C_Rd(1)Nombre signeacute donnant la tempeacuterature entre +125deg et -55degC

LSB = I2C_Rd(0)Si bit 7 = 1 tempeacuterature MSB +05degC

I2C_Stop()Arrecirct du sigal

if(MSBlt0)

MSB = abs(MSB) Si temperature neacutegative valeur absolue de MSB

Temp[0]=45 Signe - affecteacute en ascii

else

Station meacuteteacuteo autonome 2012

37

Temp[0]=43signe + affecteacute en ascii

Temp[1]=(MSB10)+48 Valeur des dizaines affecteacute en ascii

Temp[2]=(MSB10)+48 Valeur des uniteacutes affecteacute en ascii

Temp[3]=44 Virgule affecteacute en ascii

if (LSB==128) Si bit 7 agrave 1 alors +05deg

Temp[4]=5

else Si bit 7 agrave 0 alors +00deg

Temp[4]=0

Temp[5]=223 degreacute affecteacute en ascii

Temp[6]=67 C affecteacute en ascii

if(cond==50)Appel la fonction LCD tous les 1000

lcd(1 1 11 temptxt)Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 7 temp)Affiche la chaine de caractegravere hum sur le LCD

cond=0Remise a 0 de la condition

Xbee(7 temp) Envoi la chaicircne de caractegravere temp dans la fonction xbee

Fonction vent

void vent(int cond)

unsigned long tl th per

int vitfreq

char vent[13] txtvent[]=Vitesse du vent VV

if(PIR1CCP1IF==1) Test si front montant agrave lieu

TMR1H=0 Initialisation du timer1 bit de point fort

TMR1L=0 Initialisation du timer1 bit de point faible

th=CCPR1H Les valeurs sont copieacute dans des variables

tl=CCPR1L

th=thltlt8 Deacutecalage car th =gt bit de point fort

per = th|tl On concategravene les deux valeurs nous obtenons la peacuteriode

PIR1CCP1IF=0 Remise a 0 du drapeau

if(PIR1TMR1IF==1) Si deacutepassement du timer 1

per=65535+per On ajoute une retenue lorsquon a fait un tour (16bit)

PIR1TMR1IF=0 Remise a 0 du drapeau deacutepassement

Station meacuteteacuteo autonome 2012

38

freq=671310perCalacul de la freacutequence

vit=freq179 + 692Calcul de la vitesse que lon x100

if(vitlt200)En dessous 2ms la mesure est aleacuteatoire agrave cause du 2egraveme deacutebordement

vit=0

vent[0]=(vit10000)+48Valeur des centaines affecteacute en ascii(48=0)

VV=(vit1000)10

vent[1]=VV+48Valeur des dizaines affecteacute en ascii

VV=(vit100)10

vent[2]=VV+48Valeur des uniteacute affecteacute en ascii

VV=(vit10)10

vent[3]=44Virgule affecteacute en ascii

vent[4]=VV+48Valeur de la 1er deacutecimale affecteacute en ascii

VV=vit10

vent[5]=VV+48Valeur de la 2egraveme deacutecimale affecteacute en ascii

vent[6]=109m affecteacute en ascii

vent[7]=47 affecteacute en ascii

vent[8]=115s affecteacute en ascii

if(cond==50)Appel la fonction LCD tous les 1000

lcd(1 1 15 txtvent)Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 9 vent)Affiche la chaine de caractegravere hum sur le LCD

cond=0Remise a 0 de la condition

Xbee(9 vent) Envoi la chaicircne de caractegravere vent dans la fonction xbee

Fonction affichage

void lcd(int li int co int nb char receive[15])

int i

for(i=0 iltnb i++)Boucle for

Lcd_chr(li (co+i) receive[i])Affiche les caractegraveres jusquagrave i

Usart

void xbee(int nb char receive[15])

int i

Usart_Init(9600)Vitesse de transmission

for(i=0 iltnb i++)Boucle for

Usart_Write(receive[i])Envoi les caractegraveres sur lHyperTerminal jusquagrave i

Station meacuteteacuteo autonome 2012

13

VIII Le capteur de tempeacuterature

A preacutesent comme toute station meacuteteacuteo

nous avons installeacute un capteur de tempeacuterature le

DS1621 Ce capteur communique avec le

microcontrocircleur gracircce au protocole I2C

A Le protocole I2C

Le bus I2C (Inter Integrated Circuit) a eacuteteacute deacuteveloppeacute au deacutebut des anneacutees 80 par Philips

semiconductors pour permettre de relier facilement agrave un microprocesseur les diffeacuterents circuits dun

teacuteleacuteviseur moderne

Le bus I2C permet de faire communiquer entre eux des composants eacutelectroniques tregraves divers

gracircce agrave seulement trois fils Un signal de donneacutee (SDA) un signal dhorloge (SCL) et un signal de

reacutefeacuterence eacutelectrique (Masse)

Ceci permet de reacutealiser des eacutequipements ayant des fonctionnaliteacutes tregraves puissantes (En

apportant toute la puissance des systegravemes micro programmeacutes) et conservant un circuit imprimeacute tregraves

simple par rapport un scheacutema classique (8bits de donneacutees 16 bits dadresse + les bits de controcircle)

Les donneacutees sont transmises en seacuterie agrave 100Kbitss en mode standard et jusquagrave 400Kbitss en

mode rapide Ce qui ouvre la porte de cette technologie agrave toutes les applications ougrave la vitesse nest

pas primordiale

Voici un exemple de protocole qursquoutilise le bus I2C

1 Pour initier le dialogue le maicirctre creacutee une condition Start

2 Le maicirctre envoie ladresse de lesclave (1010100) suivi du bit 0 (bit Write)

3 Lesclave reacutepond (accuseacute de reacuteception bit Acknowledge)

4 Le maicirctre envoie ladresse du registre (0x04) agrave eacutecrire

5 Lesclave reacutepond (accuseacute de reacuteception bit Acknowledge)

6 Le maicirctre envoie la donneacutee (0x27) agrave eacutecrire

7 Lesclave eacutecrit la donneacutee puis envoie un accuseacute de reacuteception (bit Acknowledge)

8 Le maicirctre termine le dialogue avec une condition Stop

9 Le bus I2C est maintenant libre (SCL = 1 SDA = 1 niveaux de repos)

Figure 9 scheacutema du DS1621

Station meacuteteacuteo autonome 2012

14

B Caracteacuteristique du DS1621

Comme on peut voir sur la figure 9 le capteur est composeacute de 8 bornes

SDA =gt Liaison seacuterie entreacutee sortie

SCL =gt Signal drsquohorloge

Tout =gt Signal de sortie du thermostat (inutile dans notre cas)

GND =gt Masse

VDD =gt Alimentation +5V

A0 A1 A2 =gt Entreacutee drsquoadressage (dans notre cas les 3 agrave la masse car nous nrsquoavons qursquoun

module I2C)

Les circuits connecteacutes sur un bus I2C ont des sorties de type drain ouvert (ou collecteur

ouvert) Deux reacutesistances de pull-up sont bien sucircr placeacutees entre les lignes SDA SCL et lalimentation

(VDD)Quand le bus nest pas utiliseacute SDA et SCL sont au niveau haut (niveau de repos)

1 Speacutecificiteacute des commandes

Tous dialogue du maicirctre(PIC16F876) avec un DS1621 esclave doit deacutebuter par lrsquoenvoi drsquoun

mot de controcircle

Le maicirctre envoi ensuite une commande suivi ou non de donneacutees Voici la liste des

commandes avec leur description

Les commandes AC EE et 22 ne sont pas suivies de lenvoi de donneacutees Par contre la

commande AA qui nous inteacuteresse est suivie de lrsquoenvoi par le DS1621 de 2 octets repreacutesentant la

tempeacuterature

Station meacuteteacuteo autonome 2012

15

Voici le registre de configuration(AC) qursquoil nous faut deacuteterminer

DONE 1 = conversion finie 0 = conversion en cours En mode 1 SHOT uniquement

THF Flag seuil haut du thermostat Passe agrave 1 et y reste si tempeacuterature supeacuterieure agrave TH

TLF Flag seuil bas du thermostat Passe agrave 1 et y reste si tempeacuterature infeacuterieure agrave TL

NVB 1 = meacutemoire EEPROM en eacutecriture 0 = meacutemoire EEPROM eacutecriture termineacutee

Nous nrsquoactiverons pas lrsquoeacutecriture de la meacutemoire

POL Polariteacute de Tout (pin 3) 1 = actif sera un niveau HAUT 0 = actif sera un niveau BAS

Il faut activer la polariteacute donc nous le mettons agrave 1

ONE SHOT 0 = conversion en continu 1 = conversion 1 fois

Nous le mettons en mode continu

AC = brsquo00001010rsquo = hrsquo0Arsquo

La commande AA qui permet de lire la tempeacuterature renvoie 2 octets

MSB (Most Significant Bit) Nombre signeacute donnant la tempeacuterature entre +125deg et -55degC

LSB (Least Significant Bit ) Seul le bit 7 de cet octet est significatif Si 1 tempeacuterature

MSB +05degC

Pour bien comprendre comment est codeacute un nombre signeacute un tableau avec des exemples de

valeurs eacutetait agrave notre disposition dans la notice

Station meacuteteacuteo autonome 2012

16

2 Dialogue I2C pour avoir la tempeacuterature

Voici un scheacutema qui montre le dialogue agrave effectuer entre le microcontrocircleur et le capteur

pour avoir la tempeacuterature Crsquoest gracircce agrave ce mecircme scheacutema que nous avons pu programmer le PIC

Station meacuteteacuteo autonome 2012

17

C Le scheacutema du microcontrocircleur avec le capteur de tempeacuterature

Voici le scheacutema du capteur de tempeacuterature uniquement Le capteur est brancheacute sur les

borne SCL(RC3) et SDA(RC4) du PIC Qursquoelles soient deacuteclareacutees en entreacutee ou en sortie les bornes SCL et

SDA sont fonctionnelles Il ne faut pas oublier les reacutesistances de tirages (R1 et R3) Lrsquoadressage A0 A1

A2 toutes misent agrave la masse car nous nrsquoavons qursquoun seul capteur I2C relieacute au PIC et le Tout

(thermostat) inutile car nous faisons juste un releveacute de tempeacuterature

D Programme pour la mesure de la tempeacuterature

Deacuteclaration des fonctions

void temperature(int cond)

void lcd(int li int co int nb char receive[14])

void main()

deacuteclaration des variables

int cond=0Condition pour laffichage sur leacutecran LCD

Initialisation et affectation des ports

PORTB=0 initialisation

PORTC=0

TRISB=0 Port B deacuteclarer en sortie

TRISC = 0xFF Port C en entreacutee

Configuration et initialisation de leacutecran LCD

Lcd_Config(ampPORTB 0 1 WR 5 4 3 2) Configure leacutecran

Lcd_Init(ampPORTB) initialisation du LCD

Lcd_Cmd(Lcd_CURSOR_OFF) Enlegraveve le curseur

Lcd_Cmd(Lcd_CLEAR) Efface leacutecran

Initialisation du module I2C

I2C_Init(100000) initialisation de la communication I2C

I2C_Start() Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90) Mode de controcircle en mode eacutecriture

I2C_Wr(0xAC) Accegraves au registre de configuration

I2C_Wr(0x0A) Registre de configuration mesure en continu

I2C_Stop() Arrecirct du signal

I2C_Start() Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90) Mode de controcircle en mode eacutecriture

Figure 10 Scheacutema de cacircblage avec le capteur de tempeacuterature

Station meacuteteacuteo autonome 2012

18

I2C_Wr(0xEE) Deacutebut de la conversion

I2C_Stop()Arrecirct du sigal

Boucle infinie

while(1)

cond=cond+1 Increacutemente la variable cond

temperature(ampcond) Appel la fonction humiditeacute

Fonction tempeacuterature

void temperature(int cond)

char temp[7] temptxt[]=Temperature LSB

signed char MSB

I2C_Start() Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90) Mode de controcircle en mode eacutecriture

I2C_Wr(0xAA) Lecture de la tempeacuterature

I2C_Stop() Arrecirct du signal

I2C_Start() Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x91) Mode de controcircle en mode lecture

MSB = I2C_Rd(1) Nombre signeacute donnant la tempeacuterature entre +125deg et -55degC

LSB = I2C_Rd(0) Si bit 7 = 1 tempeacuterature MSB +05degC

I2C_Stop() Arrecirct du signal

if(MSBlt0)

MSB = abs(MSB) Si tempeacuterature neacutegative valeur absolue de MSB

Temp[0]=45 Signe - affecteacute en ascii

else

Temp[0]=43 signe + affecteacute en ascii

Temp[1]=(MSB10)+48 Valeur des dizaines affecteacute en ascii

Temp[2]=(MSB10)+48 Valeur des uniteacutes affecteacute en ascii

Temp[3]=44 Virgule affecteacute en ascii

if (LSB==128) Si bit 7 agrave 1 alors +05deg

Temp[4]=5

Else Si bit 7 agrave 0 alors +00deg

Temp[4]=0

Temp[5]=223 degreacute affecteacute en ascii

Temp[6]=67 C affecteacute en ascii

if(cond==10) Appel la fonction LCD tous les 1000

lcd(1 1 13 temptxt) Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 6 temp) Affiche la chaine de caractegravere hum sur le LCD

cond=0 Remise a 0 de la condition

Fonction affichage

void lcd(int li int co int nb char receive[14])

int i

for(i=0 ilt=nb i++)Boucle for

Lcd_chr(li (co+i) receive[i]) Affiche les caractegraveres jusquagrave i

Le scheacutema preacuteceacutedent est bien respecteacute comme on peut le voir crsquoest tregraves facile agrave programmer

gracircce aux librairies I2C du logiciel MikroC

Station meacuteteacuteo autonome 2012

19

IX Lrsquoaneacutemomegravetre

A Conception

Pour lrsquoaneacutemomegravetre lrsquoeacutequipe peacutedagogique

nous a juste fourni lrsquoheacutelice du capteur donc il a fallu

concevoir toute la partie eacutelectronique Lrsquoideacutee est

drsquoinstaller une diode et un transistor photonique par

de lagrave lrsquoheacutelice et lorsqursquoelle tourne elle vient couper le

faisceau Succinctement le transistor envoit soit 1 soit

0 sur le PIC Le but est de relever la freacutequence agrave

laquelle tourne lrsquoheacutelice puis la convertir en vitesse (cf

figure 11)

La photodiode choisie est de reacutefeacuterence SD5455-3 Ce choix a eacuteteacute fait car lrsquoangle du faisceau

est de 20deg pour que le flux infrarouge soit bien concentreacute sur le phototransistor pour un

fonctionnement optimal

Comme on le voit sur le scheacutema de principe (cf figure 11) il a fallu dimensionner la

reacutesistance qui sert agrave reacuteguler le courant qui circule dans la LED avec les informations donneacutees par la

documentation technique nous avons pu la calculer

Forward voltage VF = 17V et IF = 01A

Ualim = 5V

RD = (Ualim ndash UF)IF = (5 ndash 17)01

RD = 33Ω

Pour le phototransistor nous avons choisi celui qui allait avec la diode de reacutefeacuterence SE5455-3

Cette fois la valeur de la reacutesistance nous eacutetait donneacute par le constructeur

RL=1000Ω

Lors des seacuteances nous avons implanteacute la diode et le

transistor sur le support du capteur Pour des raisons

pratiques et estheacutetiques nous avons seacutepareacute la partie

aneacutemomegravetre et la partie platine par des borniers (cf figure

12)

Figure 11 scheacutema descriptif de laneacutemomegravetre

Figure 12 Notre aneacutemomegravetre

Station meacuteteacuteo autonome 2012

20

B Mesure de la peacuteriode sur le microcontrocircleur

Le but est de relever la peacuteriode du signal envoyer par lrsquoaneacutemomegravetre pour cela le PIC est

eacutequipeacute drsquoun mode capture Le principe est de recopier agrave un moment voulu la valeur du timer 1 La

capture peut avoir lieux agrave chaque front descendant agrave chaque front montant tous les 4 ou tous les 16

fronts montants Quand la capture a eu lieu un flag est mis agrave 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 constitueacute de 2 registres de 8 bits TMR1H et TMR1L que lon peut lire ou eacutecrire Le registre TMR1

(constitueacute de TMR1H et TMR1L) sincreacutemente de h0000 jusquagrave hFFFF et repasse ensuite agrave h0000

pour continuer le comptage Quand il y a deacutebordement une interruption peut ecirctre geacuteneacutereacutee si on lrsquoa

autoriseacutee par TMR1IE =1 (bit 0 de PIE1) et le Flag TMR1IF (bit 0 de PIR1) passe agrave 1 Le controcircle du

timer 1 ce fait par le registre T1CON

Bit 7 et bit 6 bits non impleacutementeacutes

Bit 5 et bit 4 T1CKPS = Seacutelection du preacute diviseur placeacute avant le TIMER

Vu qursquoon a un quartz eacuteleveacute nous avons deacutecideacute de choisir un preacute-diviseur de 8 donc

F=Fosc(48) Pour cela mettre les bit 4 et 5 agrave 1

Bit 3 T1OSCEN Bit dautorisation de loscillateur du Timer 1

1 = oscillateur autoriseacute

0 = oscillateur stoppeacute

Oscillateur interne inutile donc bit 3 agrave 0

Bit 2 T1SYNC Bit de controcircle de la synchronisation du CLK externe

1 = Pas de synchronisation de lhorloge externe

0 = Synchronisation de lhorloge externe

Nous nous mettrons en mode synchrone

Bit1 TMR1CS Bit de seacutelection de la source horloge

1 = Mode Compteur Clk externe sur la broche PC0 ou Quartz entre PC0 et PC1

0 = Mode Timer Clk interne = Fosc4

Station meacuteteacuteo autonome 2012

21

On mettra ce bit agrave 0 car on utilise le mode Timer

Bit 0 TMR1ON Bit dautorisation du Timer 1

1 = Timer 1 en service

0 = Timer 1 stoppeacute

Il faut eacutevidemment mettre la timer 1 en service

Nous avons aussi autoriseacute le deacutebordement du timer 1 pour avoir plus de preacutecisions pour cela il faut

mettre la commande PIE1TMR1 agrave 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 parameacutetrer le registre

CCP1CON

Bit 7 et Bit 6 bits non impleacutementeacutes

Bit 5 et Bit 4 CCP1X et CCP1Y

Bits non utiliseacutes 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 agrave Bit 0 CCP1M3 agrave CCP1M0 bits de seacutelection du mode

Nous avons seacutelectionneacute le mode capture sur chaque front montant Pour cela nous avons

mis les bits 1 et 3 agrave 0 et les bits 0 et 2 agrave 1

Pour savoir si un front montant agrave eu lieu le flag CCP1F est mis agrave 1 Ce flag doit ecirctre remis agrave 0 par

lrsquoutilisateur La valeur des 16 bits des registres du Timer 1 TMR1L (bit de poids faible) et TMR1H (bit

de poids fort) sont recopieacutees dans les registres CCPR1 CCPRIH (bit de poids faible) et CCPR1L (bit de

poids fort)

Nous avons programmeacute le mode capture de faccedilon agrave afficher sur lrsquoeacutecran LCD la valeur du registre

CCPR1 crsquoest-agrave-dire la peacuteriode du signal de lrsquoaneacutemomegravetre Il ne nous reste maintenant plus qursquoagrave

eacutetalonner notre aneacutemomegravetre

Station meacuteteacuteo autonome 2012

22

C Etalonnage de lrsquoaneacutemomegravetre

Pour eacutetalonner le capteur nous avons commenceacute par savoir agrave quelle freacutequence correspond la

valeur releveacutee par le mode capture Pour cela nous avons brancheacute un GBF agrave la place du capteur et

avec un oscilloscope nous avons compareacute leurs valeurs

Nous avons ensuite traceacute agrave lrsquoaide des valeurs du tableau la courbe F(Hz) en fonction du

compteur De cette courbe nous relevons lrsquoeacutequation

F = 671310compteur^(-101)

Soit environ F = 671310compteur

Puis nous avons brancheacute notre aneacutemomegravetre sur le microcontrocircleur Cela dans le but de

relever sa peacuteriode sur lrsquoeacutecran LCD agrave lrsquoaide drsquoune soufflerie variable et du manomegravetre GDH (reacutef

121552 200-13) nous avons compareacute leurs valeurs pour connaitre lrsquoeacutetalonnage de notre capteur

Nous avons noteacute plusieurs valeurs puis traceacute diffeacuterentes courbe pour trouver les eacutequations qui nous

permettrons de calculer la vitesse dans notre programme

Station meacuteteacuteo autonome 2012

23

Voici les valeurs que nous avons releveacutees puis la courbe traceacutee sur Excel

De cette courbe nous obtenons lrsquoeacutequation

Vitesse du vent = 0179F + 0629

Nous les multiplierons par 100 pour reacutecupeacuterer les deacutecimales et les implanter dans une chaine

de caractegravere

Vitesse du vent = 179F + 629

Nous avons agrave preacutesent agrave notre disposition toutes les eacutequations neacutecessaires pour pouvoir

convertir la valeur releveacutee par le mode capture en une vitesse

D Le scheacutema du microcontrocircleur avec lrsquoaneacutemomegravetre

On voit sur le scheacutema que le capteur est bien relieacute sur la borne RC2 Nous avons aussi

repreacutesenteacute les borniers J1 et J2 A droite tous ce qui est sur le support et agrave gauche tous ce qui est sur

la platine

Figure 13 Scheacutema avec laneacutemomegravetre

Station meacuteteacuteo autonome 2012

24

E Programme pour la mesure de la vitesse du vent

Voici le programme pour mesurer la vitesse du vent avec les affectations deacutecrites ci-dessus

ainsi que les eacutequations de conversions

Deacuteclaration des fonctions

void vent(int cond)

void lcd(int li int co int nb char receive[20])

void main()

deacuteclaration des variables

int cond=0

Initialisation et affectation des ports

PORTB=0 initialisation

PORTC=0 initialisation

TRISC=0x04 Port C deacuteclarer en sortie sauf RC2 en mode capture

TRISB=0 Port B deacuteclarer en sortie

Configuration du mode capture

T1CON=0x31 Configuration du timer1

CCP1CON=0x05 Parameacutetrage du mode capture

PIE1TMR1IE=1 Autorise les deacutebordements du timer 1

Configuration et initialisation de leacutecran LCD

Lcd_Config(ampPORTB 0 1 WR 5 4 3 2) Configure leacutecran

Lcd_Init(ampPORTB) Initialisation du LCD

Lcd_Cmd(Lcd_CURSOR_OFF) Enlegraveve le curseur

Lcd_Cmd(Lcd_CLEAR) Efface leacutecran

Boucle infinie

while(1)

cond=cond+1

vent(ampcond)

Fonction vent

void vent(int cond)

unsigned long tl th per

int vitfreq

char vent[13] txtvent[]=vitesse du vent VV

if(PIR1CCP1IF==1) Test si front montant agrave lieu

TMR1H=0 Initialisation du timer1 bit de point fort

TMR1L=0 Initialisation du timer1 bit de point faible

th=CCPR1H Les valeurs sont copieacute dans des variables

tl=CCPR1L

th=thltlt8 Deacutecalage car th =gt bit de point fort

per = th|tl On concategravene les deux valeurs nous obtenons la peacuteriode

PIR1CCP1IF=0 Remise a 0 du drapeau

if(PIR1TMR1IF==1) Si deacutepassement du timer 1

per=65535+per On ajoute une retenue lorsquon a fait un tour (16bit)

PIR1TMR1IF=0 Remise a 0 du drapeau deacutepassement

freq=671310per Calcul de la freacutequence

vit=freq179 + 692 Calcul de la vitesse que lon x100

Station meacuteteacuteo autonome 2012

25

if(vitlt200) En dessous 2ms la mesure est aleacuteatoire agrave cause du 2egraveme deacutebordement

vit=0

vent[0]=(vit10000)+48 Valeur des centaines affecteacute en ascii(48=0)

VV=(vit1000)10

vent[1]=VV+48 Valeur des dizaines affecteacute en ascii

VV=(vit100)10

vent[2]=VV+48 Valeur des uniteacute affecteacute en ascii

VV=(vit10)10

vent[3]=44 Virgule affecteacute en ascii

vent[4]=VV+48 Valeur de la 1er deacutecimale affecteacute en ascii

VV=vit10

vent[5]=VV+48 Valeur de la 2egraveme deacutecimale affecteacute en ascii

vent[6]=109 m affecteacute en ascii

vent[7]=47 affecteacute en ascii

vent[8]=115 s affecteacute en ascii

if(cond==1000) Appel la fonction LCD tous les 1000

lcd(1 1 16 txtvent) Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 8 vent) Affiche la chaine de caractegravere hum sur le LCD

cond=0 Remise a 0 de la condition

Fonction affichage

void lcd(int li int co int nb char receive[20])

int i

for(i=0 ilt=nb i++) Boucle for

Lcd_chr(li (co+i) receive[i]) Affiche les caractegraveres jusquagrave i

Station meacuteteacuteo autonome 2012

26

X Simulation une station meacuteteacuteo autonome

Maintenant que tous nos capteurs sont installeacutes nous allons mettre agrave profit le bouton

poussoir installeacute dans la partie LCD Crsquoest-agrave-dire que nous allons rassembler tous les programmes

preacuteceacutedents pour nrsquoen faire qursquoun Il suffira drsquoappuyer sur le bouton poussoir pour faire deacutefiler les

diffeacuterentes valeurs comme une vraie station meacuteteacuteo

A La structure du programme

Boucle infinie

while(1)

cond=cond+1 Increacutemente la variable cond

switch(BP)

case 0

humidite(ampcond) Appel la fonction humiditeacute

if(PORTAF2==1) Ces if permet de changer la valeur de BP

BP=1

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250) Temps quon relacircche bien le bouton

break

case 1

temperature(ampcond) Appel la fonction tempeacuterature

if(PORTAF2==1)

BP=2

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)

break

case 2

vent(ampcond) Appel la fonction vent

if(PORTAF2==1)

BP=0

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)

break

Nous avons choisi drsquoutiliser un Switch nous avons donc juste rajouteacute une variable BP

Lorsqursquoil y a appui sur le bouton poussoir la variable BP srsquoincreacutemente et le programme passe agrave une

autre case et donc utilise une nouvelle fonction La temporisation nous donne le temps de relacirccher le

bouton pour eacuteviter de faire deacutefiler le menu sans le vouloir

Station meacuteteacuteo autonome 2012

27

B La simulation

Etant donneacute que nous ne pouvions pas prendre le mateacuteriel avec nous il eacutetait impeacuteratif de

pouvoir faire des simulations Pour cela nous avons utiliseacute un logiciel tregraves utile Proteus ISIS Ce

logiciel possegravede une tregraves grande librairie et permet de rentrer nos programmes sur le PIC virtuel

geacuteneacutereacute par le logiciel Pour simuler le capteur drsquohumiditeacute nous avons utiliseacute un potentiomegravetre Pour

celui de lrsquoaneacutemomegravetre comme pour nos mesures nous avons brancheacute virtuellement un GBF sur la

borne associeacute et observeacute son signal agrave lrsquoaide drsquoun oscilloscope

Voilagrave un aperccedilu de la simulation effectueacute sur ISIS

Veacuterification theacuteorique du vent

Vitesse du vent = 0179 37 + 0629

Vitesse du vent = 7657ms

Veacuterification theacuteorique de lrsquohumiditeacute

H= (315-081)0031

H=7548

Veacuterification theacuteorique de la

tempeacuterature

La valeur afficheacutee correspond bien

aux 27degC seacutelectionneacute sur le capteur

Station meacuteteacuteo autonome 2012

28

XI Transmission des donneacutees par liaison ZigBee

ZigBee est un protocole de haut niveau permettant la communication de petites radios agrave

consommation reacuteduite baseacutee sur le standard IEEE 802154

Cette technologie a pour but la communication de courte distance telle que le propose deacutejagrave

la technologie Bluetooth tout en eacutetant moins chegravere plus simple et avec une fiabiliteacute assez eacuteleveacutee

Dans notre projet nous nous servirons de ZigBee pour permettre une transmission par ondes

de nos donneacutees de la station meacuteteacuteo vers un ordinateur Pour cela nous avons 2 modules Xbee pro 2

platines drsquointerfaces une avec des pattes (liaison platine) et lrsquoautre avec une sortie RS232 (liaison pc)

Caracteacuteristique eacutelectrique

Les signaux Xbee ont une amplitude de 33V mais sont alimenteacutes en 5V (tension de notre

source USB) cacircbleacutes sur la bornes VIN (laquo Power input from 6-12Vdc 300mA or higher raquo) Mais

notre source nrsquoeacutetant pas assez puissante pour alimenter toute notre installation Nous utiliserons

donc une source externe de 5V qui sera utiliseacutee pour alimenter les 2 systegravemes Xbee

Description des Bornes du Xbee qui nous inteacuteresse

Station meacuteteacuteo autonome 2012

29

A Scheacutema eacutelectrique du module Xbee

Nous avons cacircbleacute la sortie TX du microcontrocircleur qui eacutemet un signal jusqursquoagrave la borne RX du

Xbee qui reacuteceptionne ce signal Apregraves la transmission se fait par onde entre les 2 modules Xbee Pour

le module qui reccediloit le signal un cacircble RS232 suffit agrave faire la liaison entre celui-ci et le PC

B Envoi des donneacutees la liaison Usart

Un USART (Universal synchronous amp Asynchronous Receiver Transmitter) est un eacutemetteur-

reacutecepteur universel En langage courant cest le composant utiliseacute pour faire la liaison entre

lordinateur et le port seacuterie Lordinateur envoie les donneacutees en parallegravele (autant de fils que de bits

de donneacutees) Il faut donc transformer ces donneacutees pour les faire passer agrave travers une liaison seacuterie qui

utilise un mecircme fil pour faire passer tous les bits de donneacutees

Constitution dune trame USART

un bit de start toujours agrave 0 servant agrave la synchronisation du reacutecepteur

les donneacutees la taille peut varier (geacuteneacuteralement entre 5 et 9 bits)

eacuteventuellement un bit de pariteacute paire ou impaire

et un bit de stop toujours agrave 1 (la dureacutee peut varier entre 1 15 et 2 temps bit)

Le niveau logique de repos est le 1

Figure 14 Trame USART

Station meacuteteacuteo autonome 2012

30

Afin de faciliter les liaisons entre peacuteripheacuteriques (PC microcontrocircleur modem hellip) des vitesses

de transmission sont normaliseacutees luniteacute baud correspondant agrave un temps bit Dans notre cas nous

choisirons une vitesse de transmission de 9600bps

C Programme drsquoenvoi des donneacutees par liaison Usart

Gracircce agrave la librairie de MikroC il est tregraves facile drsquoenvoyer des donneacutees par liaison Usart Cela

fonctionne comme pour envoyer des caractegraveres sur lrsquoeacutecran LCD Il faut juste ensuite choisir la vitesse

de transmission qui sera 9600bps Voici la fonction et un morceau du programme qui sert agrave envoyer

les caractegraveres sur Xbee et de Xbee agrave un HyperTerminal

Fonction humiditeacute

void humidite(int cond)

long H U VL Deacuteclaration des variables

char HH hum[8] humtxt[]=Humidite

helliphellip

Xbee(8 hum) Envoi la chaicircne de caractegravere hum dans la fonction xbee

Usart

void xbee(int nb char receive[20])

int i

Usart_Init(9600) Vitesse de transmission

for(i=0 ilt=nb i++) Boucle for

Usart_Write(receive[i]) Envoi les caractegraveres sur lrsquoHyperTerminal jusquagrave i

Station meacuteteacuteo autonome 2012

31

XII Estimation du coucirct du projet

On peut voir sur ce tableau que le prix de reviens pour les eacuteleacutements que nous avons utiliseacute

est de 14506euro TTC Ce qui est plutocirct oneacutereux compareacute aux stations meacuteteacuteo du marcheacute qui oscille

entre 6euro et 400euro En sachant que la nocirctre est loin drsquoecirctre finaliseacute (finition estheacutetique ergonomie et

ajout de nouvelle fonction comme la date et lrsquoheure)

Composant Quantiteacute Prix (TVA inclus) Liens Quartz 20000MHz 1 111 euro Lien

Capaciteacute 22pF 2 010 euro lien

PIC 16F876 1 427 euro lien

LCD MODULE 1 1575 euro lien

Potentiomegravetre 10KΩ 1 618 euro lien

Reacutesistance 33 Ω 1 035 euro lien

Reacutesistance 10 K Ω 2 070 euro lien

Reacutesistance 1 KΩ 3 105 euro lien

LED rouge 1 013 euro lien

DS1621 1 650 euro lien

Bouton poussoir 1 060 euro lien

Module Xbee 2 4000 euro lien

Platine dinterface (XBEE) RS232 1 1890 euro lien

Platine dinterface (XBEE) 1 1364 euro lien

Capteur drsquohumiditeacute 1 2692 euro lien

Transistor 1 561 euro lien

Diode 1 325 euro lien

Totales 1 14506 euro

Station meacuteteacuteo autonome 2012

32

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

panelsbut 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 Itrsquos also possible to measure

humidity and wind speed Then itrsquos 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 its 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 Itrsquos 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

Station meacuteteacuteo autonome 2012

33

XIV Conclusion

Ce projet sur la conception drsquoune station meacuteteacuteo autonome qui nous a eacuteteacute confieacute a eacuteteacute tregraves

enrichissant Il nous a permis de mettre en relations les connaissances acquises durant lrsquoanneacutee mais

aussi acqueacuterir de nouvelles connaissances comme le fonctionnement drsquoun microcontrocircleur En effet

nous nrsquoavions jamais programmeacute sur microcontrocircleur Il a fallu srsquoadapter et apprendre agrave utiliser des

nouveaux logiciels tels que Proteus MikroC ainsi que Labview

De cette expeacuterience nous avons aussi appris agrave ecirctre autonome Nous avons saisi que la

compreacutehension des documents techniques et des librairies eacutetait un point essentiel de notre projet

En programmation nous nrsquoavions pas le droit agrave lrsquoerreur car la moindre faute pouvait conduire le

systegraveme agrave un dysfonctionnement Ce projet nous a demandeacute beaucoup de rigueur de patience et de

temps

Toutefois nous nrsquoavons pas eu malheureusement le temps drsquoinstaller le capteur de

tempeacuterature inteacuterieure par manque de temps Plus encore nous aurions aimeacute approfondir certains

points Par exemple pouvoir installer les composants sur circuit imprimeacute et concevoir un support

viable pour en faire une vraie station meacuteteacuteo Lrsquoinstallation drsquoune girouette aurait eacuteteacute appreacuteciable

pour connaicirctre le sens du vent Aussi le programme aurait sans doute pu ecirctre encore ameacutelioreacute pour

de meilleures performances

Malgreacute ce manque de temps nous sommes tregraves satisfaits du fonctionnement de ce module

qui nous a permis de comprendre lrsquoutiliteacute des parties theacuteoriques pour lrsquoapplication et la mise en

œuvre drsquoun systegraveme Lrsquoapproche peacutedagogique de nous diriger vers les solutions sans jamais les

donner de nous laisser un grand degreacute de liberteacute et drsquoautonomie a eacuteteacute au deacutebut assez deacuteroutante

mais tregraves instructif

Enfin nous tenions agrave remercier Mme Leymarie qui nous a suivis et aiguilleacute tout au long de ce

projet

Station meacuteteacuteo autonome 2012

34

XV ANNEXES

Programme complet

Deacuteclaration 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()

deacuteclaration des variables

int cond=0Condition pour laffichage sur leacutecran LCD

int BP=0

Initialisation et affectation des ports

PORTA=0

PORTB=0 initialisation

PORTC=0

TRISB=0 Port B deacuteclarer en sortie

TRISA=0xFF Port A en entreacutee

ADCON1=0x84 Justifieacute agrave droite active RA0RA1RA3 analogique

ADCON0=0x85 Fosc32 sur PA0 en service

TRISB=0 Port B deacuteclarer en sortie

TRISC=0xFFPort C deacuteclarer en entreacutee

Configuration et initialisation de leacutecran LCD

Lcd_Config(ampPORTB 0 1 WR 5 4 3 2) Configure lecran

Lcd_Init(ampPORTB) initialisation du LCD

Lcd_Cmd(Lcd_CURSOR_OFF) Enleve le curseur

Lcd_Cmd(Lcd_CLEAR) Efface lecran

Initialisation du module I2C

I2C_Init(100000)initialisation de la communication I2C

I2C_Start()Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90)Mode de controcircle en mode eacutecriture

I2C_Wr(0xAC)Accegraves au registre de configuration

I2C_Wr(0x0A)Registre de configuration mesure en continu

I2C_Stop()Arrecirct du signal

I2C_Start()Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90)Mode de controcircle en mode eacutecriture

I2C_Wr(0xEE)Deacutebut de la conversion

I2C_Stop()Arrecirct du sigal

Station meacuteteacuteo autonome 2012

35

Configuration du mode capture

T1CON=0x31 Configuration du timer1

CCP1CON=0x05 Paramegravetrage du mode capture

PIE1TMR1IE=1 Autorise les deacutebordements du timer 1

Boucle infinie

while(1)

cond=cond+1Increacutemente la variable cond

switch(BP)

case 0

humidite(ampcond)Appel la fonction humiditeacute

if(PORTAF2==1)Ces if permet de changer la valeur de BP

BP=1

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)Temps quon relacircche bien le bouton

break

case 1

temperature(ampcond)Appel la fonction tempeacuterature

if(PORTAF2==1)

BP=2

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)

break

case 2

vent(ampcond)Appel la fonction vent

if(PORTAF2==1)

BP=0

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)

break

Fonction humiditeacute

void humidite(int cond)

long H U VLDeacuteclaration des variables

char HH hum[8] humtxt[]=Humidite

VL=Adc_read(0) Valeur lue sur RA0(humiditeacute)

U=(VL5000)1023 Convertit la valeur lue en tension x1000

H=(U-810)(0031) Convertit la tension en humiditeacute x1000

Station meacuteteacuteo autonome 2012

36

if(Hgt100000)Si H gt 100(impossible) alors = 100

H=100000

if(Hlt0)Si H lt 0(impossible) alors = 0

H=0

hum[0]=(H100000)+48Valeur des centaines affecteacute en ascii(48=0)

HH=(H10000)10

hum[1]=HH+48Valeur des dizaines affecteacute en ascii

HH=(H1000)10

hum[2]=HH+48Valeur des uniteacutes affecteacute en ascii

hum[3]=44Virgule affecteacute en ascii

HH=(H100)10

hum[4]=HH+48Valeur de la premiegravere deacutecimale affecteacute en ascii

HH=(H10)10

hum[5]=HH+48Valeur de la deuxiegraveme deacutecimale affecteacute en ascii

hum[6]=37Pourcentage affecteacute en ascii

if(cond==50)Appel la fonction LCD tous les 1000

lcd(1 1 8 humtxt)Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 7 hum)Affiche la chaine de caractegravere hum sur le LCD

cond=0Remise a 0 de la condition

Xbee(7 hum) Envoi la chaicircne de caractegravere hum dans la fonction xbee

Fonction tempeacuterature

void temperature(int cond)

char temp[7] temptxt[]=Temperature LSB

signed char MSB

I2C_Start()Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90)Mode de controcircle en mode eacutecriture

I2C_Wr(0xAA)Lecture de la tempeacuterature

I2C_Stop()Arrecirct du sigal

I2C_Start()Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x91)Mode de controcircle en mode lecture

MSB = I2C_Rd(1)Nombre signeacute donnant la tempeacuterature entre +125deg et -55degC

LSB = I2C_Rd(0)Si bit 7 = 1 tempeacuterature MSB +05degC

I2C_Stop()Arrecirct du sigal

if(MSBlt0)

MSB = abs(MSB) Si temperature neacutegative valeur absolue de MSB

Temp[0]=45 Signe - affecteacute en ascii

else

Station meacuteteacuteo autonome 2012

37

Temp[0]=43signe + affecteacute en ascii

Temp[1]=(MSB10)+48 Valeur des dizaines affecteacute en ascii

Temp[2]=(MSB10)+48 Valeur des uniteacutes affecteacute en ascii

Temp[3]=44 Virgule affecteacute en ascii

if (LSB==128) Si bit 7 agrave 1 alors +05deg

Temp[4]=5

else Si bit 7 agrave 0 alors +00deg

Temp[4]=0

Temp[5]=223 degreacute affecteacute en ascii

Temp[6]=67 C affecteacute en ascii

if(cond==50)Appel la fonction LCD tous les 1000

lcd(1 1 11 temptxt)Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 7 temp)Affiche la chaine de caractegravere hum sur le LCD

cond=0Remise a 0 de la condition

Xbee(7 temp) Envoi la chaicircne de caractegravere temp dans la fonction xbee

Fonction vent

void vent(int cond)

unsigned long tl th per

int vitfreq

char vent[13] txtvent[]=Vitesse du vent VV

if(PIR1CCP1IF==1) Test si front montant agrave lieu

TMR1H=0 Initialisation du timer1 bit de point fort

TMR1L=0 Initialisation du timer1 bit de point faible

th=CCPR1H Les valeurs sont copieacute dans des variables

tl=CCPR1L

th=thltlt8 Deacutecalage car th =gt bit de point fort

per = th|tl On concategravene les deux valeurs nous obtenons la peacuteriode

PIR1CCP1IF=0 Remise a 0 du drapeau

if(PIR1TMR1IF==1) Si deacutepassement du timer 1

per=65535+per On ajoute une retenue lorsquon a fait un tour (16bit)

PIR1TMR1IF=0 Remise a 0 du drapeau deacutepassement

Station meacuteteacuteo autonome 2012

38

freq=671310perCalacul de la freacutequence

vit=freq179 + 692Calcul de la vitesse que lon x100

if(vitlt200)En dessous 2ms la mesure est aleacuteatoire agrave cause du 2egraveme deacutebordement

vit=0

vent[0]=(vit10000)+48Valeur des centaines affecteacute en ascii(48=0)

VV=(vit1000)10

vent[1]=VV+48Valeur des dizaines affecteacute en ascii

VV=(vit100)10

vent[2]=VV+48Valeur des uniteacute affecteacute en ascii

VV=(vit10)10

vent[3]=44Virgule affecteacute en ascii

vent[4]=VV+48Valeur de la 1er deacutecimale affecteacute en ascii

VV=vit10

vent[5]=VV+48Valeur de la 2egraveme deacutecimale affecteacute en ascii

vent[6]=109m affecteacute en ascii

vent[7]=47 affecteacute en ascii

vent[8]=115s affecteacute en ascii

if(cond==50)Appel la fonction LCD tous les 1000

lcd(1 1 15 txtvent)Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 9 vent)Affiche la chaine de caractegravere hum sur le LCD

cond=0Remise a 0 de la condition

Xbee(9 vent) Envoi la chaicircne de caractegravere vent dans la fonction xbee

Fonction affichage

void lcd(int li int co int nb char receive[15])

int i

for(i=0 iltnb i++)Boucle for

Lcd_chr(li (co+i) receive[i])Affiche les caractegraveres jusquagrave i

Usart

void xbee(int nb char receive[15])

int i

Usart_Init(9600)Vitesse de transmission

for(i=0 iltnb i++)Boucle for

Usart_Write(receive[i])Envoi les caractegraveres sur lHyperTerminal jusquagrave i

Station meacuteteacuteo autonome 2012

14

B Caracteacuteristique du DS1621

Comme on peut voir sur la figure 9 le capteur est composeacute de 8 bornes

SDA =gt Liaison seacuterie entreacutee sortie

SCL =gt Signal drsquohorloge

Tout =gt Signal de sortie du thermostat (inutile dans notre cas)

GND =gt Masse

VDD =gt Alimentation +5V

A0 A1 A2 =gt Entreacutee drsquoadressage (dans notre cas les 3 agrave la masse car nous nrsquoavons qursquoun

module I2C)

Les circuits connecteacutes sur un bus I2C ont des sorties de type drain ouvert (ou collecteur

ouvert) Deux reacutesistances de pull-up sont bien sucircr placeacutees entre les lignes SDA SCL et lalimentation

(VDD)Quand le bus nest pas utiliseacute SDA et SCL sont au niveau haut (niveau de repos)

1 Speacutecificiteacute des commandes

Tous dialogue du maicirctre(PIC16F876) avec un DS1621 esclave doit deacutebuter par lrsquoenvoi drsquoun

mot de controcircle

Le maicirctre envoi ensuite une commande suivi ou non de donneacutees Voici la liste des

commandes avec leur description

Les commandes AC EE et 22 ne sont pas suivies de lenvoi de donneacutees Par contre la

commande AA qui nous inteacuteresse est suivie de lrsquoenvoi par le DS1621 de 2 octets repreacutesentant la

tempeacuterature

Station meacuteteacuteo autonome 2012

15

Voici le registre de configuration(AC) qursquoil nous faut deacuteterminer

DONE 1 = conversion finie 0 = conversion en cours En mode 1 SHOT uniquement

THF Flag seuil haut du thermostat Passe agrave 1 et y reste si tempeacuterature supeacuterieure agrave TH

TLF Flag seuil bas du thermostat Passe agrave 1 et y reste si tempeacuterature infeacuterieure agrave TL

NVB 1 = meacutemoire EEPROM en eacutecriture 0 = meacutemoire EEPROM eacutecriture termineacutee

Nous nrsquoactiverons pas lrsquoeacutecriture de la meacutemoire

POL Polariteacute de Tout (pin 3) 1 = actif sera un niveau HAUT 0 = actif sera un niveau BAS

Il faut activer la polariteacute donc nous le mettons agrave 1

ONE SHOT 0 = conversion en continu 1 = conversion 1 fois

Nous le mettons en mode continu

AC = brsquo00001010rsquo = hrsquo0Arsquo

La commande AA qui permet de lire la tempeacuterature renvoie 2 octets

MSB (Most Significant Bit) Nombre signeacute donnant la tempeacuterature entre +125deg et -55degC

LSB (Least Significant Bit ) Seul le bit 7 de cet octet est significatif Si 1 tempeacuterature

MSB +05degC

Pour bien comprendre comment est codeacute un nombre signeacute un tableau avec des exemples de

valeurs eacutetait agrave notre disposition dans la notice

Station meacuteteacuteo autonome 2012

16

2 Dialogue I2C pour avoir la tempeacuterature

Voici un scheacutema qui montre le dialogue agrave effectuer entre le microcontrocircleur et le capteur

pour avoir la tempeacuterature Crsquoest gracircce agrave ce mecircme scheacutema que nous avons pu programmer le PIC

Station meacuteteacuteo autonome 2012

17

C Le scheacutema du microcontrocircleur avec le capteur de tempeacuterature

Voici le scheacutema du capteur de tempeacuterature uniquement Le capteur est brancheacute sur les

borne SCL(RC3) et SDA(RC4) du PIC Qursquoelles soient deacuteclareacutees en entreacutee ou en sortie les bornes SCL et

SDA sont fonctionnelles Il ne faut pas oublier les reacutesistances de tirages (R1 et R3) Lrsquoadressage A0 A1

A2 toutes misent agrave la masse car nous nrsquoavons qursquoun seul capteur I2C relieacute au PIC et le Tout

(thermostat) inutile car nous faisons juste un releveacute de tempeacuterature

D Programme pour la mesure de la tempeacuterature

Deacuteclaration des fonctions

void temperature(int cond)

void lcd(int li int co int nb char receive[14])

void main()

deacuteclaration des variables

int cond=0Condition pour laffichage sur leacutecran LCD

Initialisation et affectation des ports

PORTB=0 initialisation

PORTC=0

TRISB=0 Port B deacuteclarer en sortie

TRISC = 0xFF Port C en entreacutee

Configuration et initialisation de leacutecran LCD

Lcd_Config(ampPORTB 0 1 WR 5 4 3 2) Configure leacutecran

Lcd_Init(ampPORTB) initialisation du LCD

Lcd_Cmd(Lcd_CURSOR_OFF) Enlegraveve le curseur

Lcd_Cmd(Lcd_CLEAR) Efface leacutecran

Initialisation du module I2C

I2C_Init(100000) initialisation de la communication I2C

I2C_Start() Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90) Mode de controcircle en mode eacutecriture

I2C_Wr(0xAC) Accegraves au registre de configuration

I2C_Wr(0x0A) Registre de configuration mesure en continu

I2C_Stop() Arrecirct du signal

I2C_Start() Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90) Mode de controcircle en mode eacutecriture

Figure 10 Scheacutema de cacircblage avec le capteur de tempeacuterature

Station meacuteteacuteo autonome 2012

18

I2C_Wr(0xEE) Deacutebut de la conversion

I2C_Stop()Arrecirct du sigal

Boucle infinie

while(1)

cond=cond+1 Increacutemente la variable cond

temperature(ampcond) Appel la fonction humiditeacute

Fonction tempeacuterature

void temperature(int cond)

char temp[7] temptxt[]=Temperature LSB

signed char MSB

I2C_Start() Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90) Mode de controcircle en mode eacutecriture

I2C_Wr(0xAA) Lecture de la tempeacuterature

I2C_Stop() Arrecirct du signal

I2C_Start() Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x91) Mode de controcircle en mode lecture

MSB = I2C_Rd(1) Nombre signeacute donnant la tempeacuterature entre +125deg et -55degC

LSB = I2C_Rd(0) Si bit 7 = 1 tempeacuterature MSB +05degC

I2C_Stop() Arrecirct du signal

if(MSBlt0)

MSB = abs(MSB) Si tempeacuterature neacutegative valeur absolue de MSB

Temp[0]=45 Signe - affecteacute en ascii

else

Temp[0]=43 signe + affecteacute en ascii

Temp[1]=(MSB10)+48 Valeur des dizaines affecteacute en ascii

Temp[2]=(MSB10)+48 Valeur des uniteacutes affecteacute en ascii

Temp[3]=44 Virgule affecteacute en ascii

if (LSB==128) Si bit 7 agrave 1 alors +05deg

Temp[4]=5

Else Si bit 7 agrave 0 alors +00deg

Temp[4]=0

Temp[5]=223 degreacute affecteacute en ascii

Temp[6]=67 C affecteacute en ascii

if(cond==10) Appel la fonction LCD tous les 1000

lcd(1 1 13 temptxt) Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 6 temp) Affiche la chaine de caractegravere hum sur le LCD

cond=0 Remise a 0 de la condition

Fonction affichage

void lcd(int li int co int nb char receive[14])

int i

for(i=0 ilt=nb i++)Boucle for

Lcd_chr(li (co+i) receive[i]) Affiche les caractegraveres jusquagrave i

Le scheacutema preacuteceacutedent est bien respecteacute comme on peut le voir crsquoest tregraves facile agrave programmer

gracircce aux librairies I2C du logiciel MikroC

Station meacuteteacuteo autonome 2012

19

IX Lrsquoaneacutemomegravetre

A Conception

Pour lrsquoaneacutemomegravetre lrsquoeacutequipe peacutedagogique

nous a juste fourni lrsquoheacutelice du capteur donc il a fallu

concevoir toute la partie eacutelectronique Lrsquoideacutee est

drsquoinstaller une diode et un transistor photonique par

de lagrave lrsquoheacutelice et lorsqursquoelle tourne elle vient couper le

faisceau Succinctement le transistor envoit soit 1 soit

0 sur le PIC Le but est de relever la freacutequence agrave

laquelle tourne lrsquoheacutelice puis la convertir en vitesse (cf

figure 11)

La photodiode choisie est de reacutefeacuterence SD5455-3 Ce choix a eacuteteacute fait car lrsquoangle du faisceau

est de 20deg pour que le flux infrarouge soit bien concentreacute sur le phototransistor pour un

fonctionnement optimal

Comme on le voit sur le scheacutema de principe (cf figure 11) il a fallu dimensionner la

reacutesistance qui sert agrave reacuteguler le courant qui circule dans la LED avec les informations donneacutees par la

documentation technique nous avons pu la calculer

Forward voltage VF = 17V et IF = 01A

Ualim = 5V

RD = (Ualim ndash UF)IF = (5 ndash 17)01

RD = 33Ω

Pour le phototransistor nous avons choisi celui qui allait avec la diode de reacutefeacuterence SE5455-3

Cette fois la valeur de la reacutesistance nous eacutetait donneacute par le constructeur

RL=1000Ω

Lors des seacuteances nous avons implanteacute la diode et le

transistor sur le support du capteur Pour des raisons

pratiques et estheacutetiques nous avons seacutepareacute la partie

aneacutemomegravetre et la partie platine par des borniers (cf figure

12)

Figure 11 scheacutema descriptif de laneacutemomegravetre

Figure 12 Notre aneacutemomegravetre

Station meacuteteacuteo autonome 2012

20

B Mesure de la peacuteriode sur le microcontrocircleur

Le but est de relever la peacuteriode du signal envoyer par lrsquoaneacutemomegravetre pour cela le PIC est

eacutequipeacute drsquoun mode capture Le principe est de recopier agrave un moment voulu la valeur du timer 1 La

capture peut avoir lieux agrave chaque front descendant agrave chaque front montant tous les 4 ou tous les 16

fronts montants Quand la capture a eu lieu un flag est mis agrave 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 constitueacute de 2 registres de 8 bits TMR1H et TMR1L que lon peut lire ou eacutecrire Le registre TMR1

(constitueacute de TMR1H et TMR1L) sincreacutemente de h0000 jusquagrave hFFFF et repasse ensuite agrave h0000

pour continuer le comptage Quand il y a deacutebordement une interruption peut ecirctre geacuteneacutereacutee si on lrsquoa

autoriseacutee par TMR1IE =1 (bit 0 de PIE1) et le Flag TMR1IF (bit 0 de PIR1) passe agrave 1 Le controcircle du

timer 1 ce fait par le registre T1CON

Bit 7 et bit 6 bits non impleacutementeacutes

Bit 5 et bit 4 T1CKPS = Seacutelection du preacute diviseur placeacute avant le TIMER

Vu qursquoon a un quartz eacuteleveacute nous avons deacutecideacute de choisir un preacute-diviseur de 8 donc

F=Fosc(48) Pour cela mettre les bit 4 et 5 agrave 1

Bit 3 T1OSCEN Bit dautorisation de loscillateur du Timer 1

1 = oscillateur autoriseacute

0 = oscillateur stoppeacute

Oscillateur interne inutile donc bit 3 agrave 0

Bit 2 T1SYNC Bit de controcircle de la synchronisation du CLK externe

1 = Pas de synchronisation de lhorloge externe

0 = Synchronisation de lhorloge externe

Nous nous mettrons en mode synchrone

Bit1 TMR1CS Bit de seacutelection de la source horloge

1 = Mode Compteur Clk externe sur la broche PC0 ou Quartz entre PC0 et PC1

0 = Mode Timer Clk interne = Fosc4

Station meacuteteacuteo autonome 2012

21

On mettra ce bit agrave 0 car on utilise le mode Timer

Bit 0 TMR1ON Bit dautorisation du Timer 1

1 = Timer 1 en service

0 = Timer 1 stoppeacute

Il faut eacutevidemment mettre la timer 1 en service

Nous avons aussi autoriseacute le deacutebordement du timer 1 pour avoir plus de preacutecisions pour cela il faut

mettre la commande PIE1TMR1 agrave 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 parameacutetrer le registre

CCP1CON

Bit 7 et Bit 6 bits non impleacutementeacutes

Bit 5 et Bit 4 CCP1X et CCP1Y

Bits non utiliseacutes 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 agrave Bit 0 CCP1M3 agrave CCP1M0 bits de seacutelection du mode

Nous avons seacutelectionneacute le mode capture sur chaque front montant Pour cela nous avons

mis les bits 1 et 3 agrave 0 et les bits 0 et 2 agrave 1

Pour savoir si un front montant agrave eu lieu le flag CCP1F est mis agrave 1 Ce flag doit ecirctre remis agrave 0 par

lrsquoutilisateur La valeur des 16 bits des registres du Timer 1 TMR1L (bit de poids faible) et TMR1H (bit

de poids fort) sont recopieacutees dans les registres CCPR1 CCPRIH (bit de poids faible) et CCPR1L (bit de

poids fort)

Nous avons programmeacute le mode capture de faccedilon agrave afficher sur lrsquoeacutecran LCD la valeur du registre

CCPR1 crsquoest-agrave-dire la peacuteriode du signal de lrsquoaneacutemomegravetre Il ne nous reste maintenant plus qursquoagrave

eacutetalonner notre aneacutemomegravetre

Station meacuteteacuteo autonome 2012

22

C Etalonnage de lrsquoaneacutemomegravetre

Pour eacutetalonner le capteur nous avons commenceacute par savoir agrave quelle freacutequence correspond la

valeur releveacutee par le mode capture Pour cela nous avons brancheacute un GBF agrave la place du capteur et

avec un oscilloscope nous avons compareacute leurs valeurs

Nous avons ensuite traceacute agrave lrsquoaide des valeurs du tableau la courbe F(Hz) en fonction du

compteur De cette courbe nous relevons lrsquoeacutequation

F = 671310compteur^(-101)

Soit environ F = 671310compteur

Puis nous avons brancheacute notre aneacutemomegravetre sur le microcontrocircleur Cela dans le but de

relever sa peacuteriode sur lrsquoeacutecran LCD agrave lrsquoaide drsquoune soufflerie variable et du manomegravetre GDH (reacutef

121552 200-13) nous avons compareacute leurs valeurs pour connaitre lrsquoeacutetalonnage de notre capteur

Nous avons noteacute plusieurs valeurs puis traceacute diffeacuterentes courbe pour trouver les eacutequations qui nous

permettrons de calculer la vitesse dans notre programme

Station meacuteteacuteo autonome 2012

23

Voici les valeurs que nous avons releveacutees puis la courbe traceacutee sur Excel

De cette courbe nous obtenons lrsquoeacutequation

Vitesse du vent = 0179F + 0629

Nous les multiplierons par 100 pour reacutecupeacuterer les deacutecimales et les implanter dans une chaine

de caractegravere

Vitesse du vent = 179F + 629

Nous avons agrave preacutesent agrave notre disposition toutes les eacutequations neacutecessaires pour pouvoir

convertir la valeur releveacutee par le mode capture en une vitesse

D Le scheacutema du microcontrocircleur avec lrsquoaneacutemomegravetre

On voit sur le scheacutema que le capteur est bien relieacute sur la borne RC2 Nous avons aussi

repreacutesenteacute les borniers J1 et J2 A droite tous ce qui est sur le support et agrave gauche tous ce qui est sur

la platine

Figure 13 Scheacutema avec laneacutemomegravetre

Station meacuteteacuteo autonome 2012

24

E Programme pour la mesure de la vitesse du vent

Voici le programme pour mesurer la vitesse du vent avec les affectations deacutecrites ci-dessus

ainsi que les eacutequations de conversions

Deacuteclaration des fonctions

void vent(int cond)

void lcd(int li int co int nb char receive[20])

void main()

deacuteclaration des variables

int cond=0

Initialisation et affectation des ports

PORTB=0 initialisation

PORTC=0 initialisation

TRISC=0x04 Port C deacuteclarer en sortie sauf RC2 en mode capture

TRISB=0 Port B deacuteclarer en sortie

Configuration du mode capture

T1CON=0x31 Configuration du timer1

CCP1CON=0x05 Parameacutetrage du mode capture

PIE1TMR1IE=1 Autorise les deacutebordements du timer 1

Configuration et initialisation de leacutecran LCD

Lcd_Config(ampPORTB 0 1 WR 5 4 3 2) Configure leacutecran

Lcd_Init(ampPORTB) Initialisation du LCD

Lcd_Cmd(Lcd_CURSOR_OFF) Enlegraveve le curseur

Lcd_Cmd(Lcd_CLEAR) Efface leacutecran

Boucle infinie

while(1)

cond=cond+1

vent(ampcond)

Fonction vent

void vent(int cond)

unsigned long tl th per

int vitfreq

char vent[13] txtvent[]=vitesse du vent VV

if(PIR1CCP1IF==1) Test si front montant agrave lieu

TMR1H=0 Initialisation du timer1 bit de point fort

TMR1L=0 Initialisation du timer1 bit de point faible

th=CCPR1H Les valeurs sont copieacute dans des variables

tl=CCPR1L

th=thltlt8 Deacutecalage car th =gt bit de point fort

per = th|tl On concategravene les deux valeurs nous obtenons la peacuteriode

PIR1CCP1IF=0 Remise a 0 du drapeau

if(PIR1TMR1IF==1) Si deacutepassement du timer 1

per=65535+per On ajoute une retenue lorsquon a fait un tour (16bit)

PIR1TMR1IF=0 Remise a 0 du drapeau deacutepassement

freq=671310per Calcul de la freacutequence

vit=freq179 + 692 Calcul de la vitesse que lon x100

Station meacuteteacuteo autonome 2012

25

if(vitlt200) En dessous 2ms la mesure est aleacuteatoire agrave cause du 2egraveme deacutebordement

vit=0

vent[0]=(vit10000)+48 Valeur des centaines affecteacute en ascii(48=0)

VV=(vit1000)10

vent[1]=VV+48 Valeur des dizaines affecteacute en ascii

VV=(vit100)10

vent[2]=VV+48 Valeur des uniteacute affecteacute en ascii

VV=(vit10)10

vent[3]=44 Virgule affecteacute en ascii

vent[4]=VV+48 Valeur de la 1er deacutecimale affecteacute en ascii

VV=vit10

vent[5]=VV+48 Valeur de la 2egraveme deacutecimale affecteacute en ascii

vent[6]=109 m affecteacute en ascii

vent[7]=47 affecteacute en ascii

vent[8]=115 s affecteacute en ascii

if(cond==1000) Appel la fonction LCD tous les 1000

lcd(1 1 16 txtvent) Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 8 vent) Affiche la chaine de caractegravere hum sur le LCD

cond=0 Remise a 0 de la condition

Fonction affichage

void lcd(int li int co int nb char receive[20])

int i

for(i=0 ilt=nb i++) Boucle for

Lcd_chr(li (co+i) receive[i]) Affiche les caractegraveres jusquagrave i

Station meacuteteacuteo autonome 2012

26

X Simulation une station meacuteteacuteo autonome

Maintenant que tous nos capteurs sont installeacutes nous allons mettre agrave profit le bouton

poussoir installeacute dans la partie LCD Crsquoest-agrave-dire que nous allons rassembler tous les programmes

preacuteceacutedents pour nrsquoen faire qursquoun Il suffira drsquoappuyer sur le bouton poussoir pour faire deacutefiler les

diffeacuterentes valeurs comme une vraie station meacuteteacuteo

A La structure du programme

Boucle infinie

while(1)

cond=cond+1 Increacutemente la variable cond

switch(BP)

case 0

humidite(ampcond) Appel la fonction humiditeacute

if(PORTAF2==1) Ces if permet de changer la valeur de BP

BP=1

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250) Temps quon relacircche bien le bouton

break

case 1

temperature(ampcond) Appel la fonction tempeacuterature

if(PORTAF2==1)

BP=2

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)

break

case 2

vent(ampcond) Appel la fonction vent

if(PORTAF2==1)

BP=0

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)

break

Nous avons choisi drsquoutiliser un Switch nous avons donc juste rajouteacute une variable BP

Lorsqursquoil y a appui sur le bouton poussoir la variable BP srsquoincreacutemente et le programme passe agrave une

autre case et donc utilise une nouvelle fonction La temporisation nous donne le temps de relacirccher le

bouton pour eacuteviter de faire deacutefiler le menu sans le vouloir

Station meacuteteacuteo autonome 2012

27

B La simulation

Etant donneacute que nous ne pouvions pas prendre le mateacuteriel avec nous il eacutetait impeacuteratif de

pouvoir faire des simulations Pour cela nous avons utiliseacute un logiciel tregraves utile Proteus ISIS Ce

logiciel possegravede une tregraves grande librairie et permet de rentrer nos programmes sur le PIC virtuel

geacuteneacutereacute par le logiciel Pour simuler le capteur drsquohumiditeacute nous avons utiliseacute un potentiomegravetre Pour

celui de lrsquoaneacutemomegravetre comme pour nos mesures nous avons brancheacute virtuellement un GBF sur la

borne associeacute et observeacute son signal agrave lrsquoaide drsquoun oscilloscope

Voilagrave un aperccedilu de la simulation effectueacute sur ISIS

Veacuterification theacuteorique du vent

Vitesse du vent = 0179 37 + 0629

Vitesse du vent = 7657ms

Veacuterification theacuteorique de lrsquohumiditeacute

H= (315-081)0031

H=7548

Veacuterification theacuteorique de la

tempeacuterature

La valeur afficheacutee correspond bien

aux 27degC seacutelectionneacute sur le capteur

Station meacuteteacuteo autonome 2012

28

XI Transmission des donneacutees par liaison ZigBee

ZigBee est un protocole de haut niveau permettant la communication de petites radios agrave

consommation reacuteduite baseacutee sur le standard IEEE 802154

Cette technologie a pour but la communication de courte distance telle que le propose deacutejagrave

la technologie Bluetooth tout en eacutetant moins chegravere plus simple et avec une fiabiliteacute assez eacuteleveacutee

Dans notre projet nous nous servirons de ZigBee pour permettre une transmission par ondes

de nos donneacutees de la station meacuteteacuteo vers un ordinateur Pour cela nous avons 2 modules Xbee pro 2

platines drsquointerfaces une avec des pattes (liaison platine) et lrsquoautre avec une sortie RS232 (liaison pc)

Caracteacuteristique eacutelectrique

Les signaux Xbee ont une amplitude de 33V mais sont alimenteacutes en 5V (tension de notre

source USB) cacircbleacutes sur la bornes VIN (laquo Power input from 6-12Vdc 300mA or higher raquo) Mais

notre source nrsquoeacutetant pas assez puissante pour alimenter toute notre installation Nous utiliserons

donc une source externe de 5V qui sera utiliseacutee pour alimenter les 2 systegravemes Xbee

Description des Bornes du Xbee qui nous inteacuteresse

Station meacuteteacuteo autonome 2012

29

A Scheacutema eacutelectrique du module Xbee

Nous avons cacircbleacute la sortie TX du microcontrocircleur qui eacutemet un signal jusqursquoagrave la borne RX du

Xbee qui reacuteceptionne ce signal Apregraves la transmission se fait par onde entre les 2 modules Xbee Pour

le module qui reccediloit le signal un cacircble RS232 suffit agrave faire la liaison entre celui-ci et le PC

B Envoi des donneacutees la liaison Usart

Un USART (Universal synchronous amp Asynchronous Receiver Transmitter) est un eacutemetteur-

reacutecepteur universel En langage courant cest le composant utiliseacute pour faire la liaison entre

lordinateur et le port seacuterie Lordinateur envoie les donneacutees en parallegravele (autant de fils que de bits

de donneacutees) Il faut donc transformer ces donneacutees pour les faire passer agrave travers une liaison seacuterie qui

utilise un mecircme fil pour faire passer tous les bits de donneacutees

Constitution dune trame USART

un bit de start toujours agrave 0 servant agrave la synchronisation du reacutecepteur

les donneacutees la taille peut varier (geacuteneacuteralement entre 5 et 9 bits)

eacuteventuellement un bit de pariteacute paire ou impaire

et un bit de stop toujours agrave 1 (la dureacutee peut varier entre 1 15 et 2 temps bit)

Le niveau logique de repos est le 1

Figure 14 Trame USART

Station meacuteteacuteo autonome 2012

30

Afin de faciliter les liaisons entre peacuteripheacuteriques (PC microcontrocircleur modem hellip) des vitesses

de transmission sont normaliseacutees luniteacute baud correspondant agrave un temps bit Dans notre cas nous

choisirons une vitesse de transmission de 9600bps

C Programme drsquoenvoi des donneacutees par liaison Usart

Gracircce agrave la librairie de MikroC il est tregraves facile drsquoenvoyer des donneacutees par liaison Usart Cela

fonctionne comme pour envoyer des caractegraveres sur lrsquoeacutecran LCD Il faut juste ensuite choisir la vitesse

de transmission qui sera 9600bps Voici la fonction et un morceau du programme qui sert agrave envoyer

les caractegraveres sur Xbee et de Xbee agrave un HyperTerminal

Fonction humiditeacute

void humidite(int cond)

long H U VL Deacuteclaration des variables

char HH hum[8] humtxt[]=Humidite

helliphellip

Xbee(8 hum) Envoi la chaicircne de caractegravere hum dans la fonction xbee

Usart

void xbee(int nb char receive[20])

int i

Usart_Init(9600) Vitesse de transmission

for(i=0 ilt=nb i++) Boucle for

Usart_Write(receive[i]) Envoi les caractegraveres sur lrsquoHyperTerminal jusquagrave i

Station meacuteteacuteo autonome 2012

31

XII Estimation du coucirct du projet

On peut voir sur ce tableau que le prix de reviens pour les eacuteleacutements que nous avons utiliseacute

est de 14506euro TTC Ce qui est plutocirct oneacutereux compareacute aux stations meacuteteacuteo du marcheacute qui oscille

entre 6euro et 400euro En sachant que la nocirctre est loin drsquoecirctre finaliseacute (finition estheacutetique ergonomie et

ajout de nouvelle fonction comme la date et lrsquoheure)

Composant Quantiteacute Prix (TVA inclus) Liens Quartz 20000MHz 1 111 euro Lien

Capaciteacute 22pF 2 010 euro lien

PIC 16F876 1 427 euro lien

LCD MODULE 1 1575 euro lien

Potentiomegravetre 10KΩ 1 618 euro lien

Reacutesistance 33 Ω 1 035 euro lien

Reacutesistance 10 K Ω 2 070 euro lien

Reacutesistance 1 KΩ 3 105 euro lien

LED rouge 1 013 euro lien

DS1621 1 650 euro lien

Bouton poussoir 1 060 euro lien

Module Xbee 2 4000 euro lien

Platine dinterface (XBEE) RS232 1 1890 euro lien

Platine dinterface (XBEE) 1 1364 euro lien

Capteur drsquohumiditeacute 1 2692 euro lien

Transistor 1 561 euro lien

Diode 1 325 euro lien

Totales 1 14506 euro

Station meacuteteacuteo autonome 2012

32

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

panelsbut 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 Itrsquos also possible to measure

humidity and wind speed Then itrsquos 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 its 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 Itrsquos 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

Station meacuteteacuteo autonome 2012

33

XIV Conclusion

Ce projet sur la conception drsquoune station meacuteteacuteo autonome qui nous a eacuteteacute confieacute a eacuteteacute tregraves

enrichissant Il nous a permis de mettre en relations les connaissances acquises durant lrsquoanneacutee mais

aussi acqueacuterir de nouvelles connaissances comme le fonctionnement drsquoun microcontrocircleur En effet

nous nrsquoavions jamais programmeacute sur microcontrocircleur Il a fallu srsquoadapter et apprendre agrave utiliser des

nouveaux logiciels tels que Proteus MikroC ainsi que Labview

De cette expeacuterience nous avons aussi appris agrave ecirctre autonome Nous avons saisi que la

compreacutehension des documents techniques et des librairies eacutetait un point essentiel de notre projet

En programmation nous nrsquoavions pas le droit agrave lrsquoerreur car la moindre faute pouvait conduire le

systegraveme agrave un dysfonctionnement Ce projet nous a demandeacute beaucoup de rigueur de patience et de

temps

Toutefois nous nrsquoavons pas eu malheureusement le temps drsquoinstaller le capteur de

tempeacuterature inteacuterieure par manque de temps Plus encore nous aurions aimeacute approfondir certains

points Par exemple pouvoir installer les composants sur circuit imprimeacute et concevoir un support

viable pour en faire une vraie station meacuteteacuteo Lrsquoinstallation drsquoune girouette aurait eacuteteacute appreacuteciable

pour connaicirctre le sens du vent Aussi le programme aurait sans doute pu ecirctre encore ameacutelioreacute pour

de meilleures performances

Malgreacute ce manque de temps nous sommes tregraves satisfaits du fonctionnement de ce module

qui nous a permis de comprendre lrsquoutiliteacute des parties theacuteoriques pour lrsquoapplication et la mise en

œuvre drsquoun systegraveme Lrsquoapproche peacutedagogique de nous diriger vers les solutions sans jamais les

donner de nous laisser un grand degreacute de liberteacute et drsquoautonomie a eacuteteacute au deacutebut assez deacuteroutante

mais tregraves instructif

Enfin nous tenions agrave remercier Mme Leymarie qui nous a suivis et aiguilleacute tout au long de ce

projet

Station meacuteteacuteo autonome 2012

34

XV ANNEXES

Programme complet

Deacuteclaration 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()

deacuteclaration des variables

int cond=0Condition pour laffichage sur leacutecran LCD

int BP=0

Initialisation et affectation des ports

PORTA=0

PORTB=0 initialisation

PORTC=0

TRISB=0 Port B deacuteclarer en sortie

TRISA=0xFF Port A en entreacutee

ADCON1=0x84 Justifieacute agrave droite active RA0RA1RA3 analogique

ADCON0=0x85 Fosc32 sur PA0 en service

TRISB=0 Port B deacuteclarer en sortie

TRISC=0xFFPort C deacuteclarer en entreacutee

Configuration et initialisation de leacutecran LCD

Lcd_Config(ampPORTB 0 1 WR 5 4 3 2) Configure lecran

Lcd_Init(ampPORTB) initialisation du LCD

Lcd_Cmd(Lcd_CURSOR_OFF) Enleve le curseur

Lcd_Cmd(Lcd_CLEAR) Efface lecran

Initialisation du module I2C

I2C_Init(100000)initialisation de la communication I2C

I2C_Start()Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90)Mode de controcircle en mode eacutecriture

I2C_Wr(0xAC)Accegraves au registre de configuration

I2C_Wr(0x0A)Registre de configuration mesure en continu

I2C_Stop()Arrecirct du signal

I2C_Start()Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90)Mode de controcircle en mode eacutecriture

I2C_Wr(0xEE)Deacutebut de la conversion

I2C_Stop()Arrecirct du sigal

Station meacuteteacuteo autonome 2012

35

Configuration du mode capture

T1CON=0x31 Configuration du timer1

CCP1CON=0x05 Paramegravetrage du mode capture

PIE1TMR1IE=1 Autorise les deacutebordements du timer 1

Boucle infinie

while(1)

cond=cond+1Increacutemente la variable cond

switch(BP)

case 0

humidite(ampcond)Appel la fonction humiditeacute

if(PORTAF2==1)Ces if permet de changer la valeur de BP

BP=1

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)Temps quon relacircche bien le bouton

break

case 1

temperature(ampcond)Appel la fonction tempeacuterature

if(PORTAF2==1)

BP=2

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)

break

case 2

vent(ampcond)Appel la fonction vent

if(PORTAF2==1)

BP=0

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)

break

Fonction humiditeacute

void humidite(int cond)

long H U VLDeacuteclaration des variables

char HH hum[8] humtxt[]=Humidite

VL=Adc_read(0) Valeur lue sur RA0(humiditeacute)

U=(VL5000)1023 Convertit la valeur lue en tension x1000

H=(U-810)(0031) Convertit la tension en humiditeacute x1000

Station meacuteteacuteo autonome 2012

36

if(Hgt100000)Si H gt 100(impossible) alors = 100

H=100000

if(Hlt0)Si H lt 0(impossible) alors = 0

H=0

hum[0]=(H100000)+48Valeur des centaines affecteacute en ascii(48=0)

HH=(H10000)10

hum[1]=HH+48Valeur des dizaines affecteacute en ascii

HH=(H1000)10

hum[2]=HH+48Valeur des uniteacutes affecteacute en ascii

hum[3]=44Virgule affecteacute en ascii

HH=(H100)10

hum[4]=HH+48Valeur de la premiegravere deacutecimale affecteacute en ascii

HH=(H10)10

hum[5]=HH+48Valeur de la deuxiegraveme deacutecimale affecteacute en ascii

hum[6]=37Pourcentage affecteacute en ascii

if(cond==50)Appel la fonction LCD tous les 1000

lcd(1 1 8 humtxt)Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 7 hum)Affiche la chaine de caractegravere hum sur le LCD

cond=0Remise a 0 de la condition

Xbee(7 hum) Envoi la chaicircne de caractegravere hum dans la fonction xbee

Fonction tempeacuterature

void temperature(int cond)

char temp[7] temptxt[]=Temperature LSB

signed char MSB

I2C_Start()Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90)Mode de controcircle en mode eacutecriture

I2C_Wr(0xAA)Lecture de la tempeacuterature

I2C_Stop()Arrecirct du sigal

I2C_Start()Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x91)Mode de controcircle en mode lecture

MSB = I2C_Rd(1)Nombre signeacute donnant la tempeacuterature entre +125deg et -55degC

LSB = I2C_Rd(0)Si bit 7 = 1 tempeacuterature MSB +05degC

I2C_Stop()Arrecirct du sigal

if(MSBlt0)

MSB = abs(MSB) Si temperature neacutegative valeur absolue de MSB

Temp[0]=45 Signe - affecteacute en ascii

else

Station meacuteteacuteo autonome 2012

37

Temp[0]=43signe + affecteacute en ascii

Temp[1]=(MSB10)+48 Valeur des dizaines affecteacute en ascii

Temp[2]=(MSB10)+48 Valeur des uniteacutes affecteacute en ascii

Temp[3]=44 Virgule affecteacute en ascii

if (LSB==128) Si bit 7 agrave 1 alors +05deg

Temp[4]=5

else Si bit 7 agrave 0 alors +00deg

Temp[4]=0

Temp[5]=223 degreacute affecteacute en ascii

Temp[6]=67 C affecteacute en ascii

if(cond==50)Appel la fonction LCD tous les 1000

lcd(1 1 11 temptxt)Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 7 temp)Affiche la chaine de caractegravere hum sur le LCD

cond=0Remise a 0 de la condition

Xbee(7 temp) Envoi la chaicircne de caractegravere temp dans la fonction xbee

Fonction vent

void vent(int cond)

unsigned long tl th per

int vitfreq

char vent[13] txtvent[]=Vitesse du vent VV

if(PIR1CCP1IF==1) Test si front montant agrave lieu

TMR1H=0 Initialisation du timer1 bit de point fort

TMR1L=0 Initialisation du timer1 bit de point faible

th=CCPR1H Les valeurs sont copieacute dans des variables

tl=CCPR1L

th=thltlt8 Deacutecalage car th =gt bit de point fort

per = th|tl On concategravene les deux valeurs nous obtenons la peacuteriode

PIR1CCP1IF=0 Remise a 0 du drapeau

if(PIR1TMR1IF==1) Si deacutepassement du timer 1

per=65535+per On ajoute une retenue lorsquon a fait un tour (16bit)

PIR1TMR1IF=0 Remise a 0 du drapeau deacutepassement

Station meacuteteacuteo autonome 2012

38

freq=671310perCalacul de la freacutequence

vit=freq179 + 692Calcul de la vitesse que lon x100

if(vitlt200)En dessous 2ms la mesure est aleacuteatoire agrave cause du 2egraveme deacutebordement

vit=0

vent[0]=(vit10000)+48Valeur des centaines affecteacute en ascii(48=0)

VV=(vit1000)10

vent[1]=VV+48Valeur des dizaines affecteacute en ascii

VV=(vit100)10

vent[2]=VV+48Valeur des uniteacute affecteacute en ascii

VV=(vit10)10

vent[3]=44Virgule affecteacute en ascii

vent[4]=VV+48Valeur de la 1er deacutecimale affecteacute en ascii

VV=vit10

vent[5]=VV+48Valeur de la 2egraveme deacutecimale affecteacute en ascii

vent[6]=109m affecteacute en ascii

vent[7]=47 affecteacute en ascii

vent[8]=115s affecteacute en ascii

if(cond==50)Appel la fonction LCD tous les 1000

lcd(1 1 15 txtvent)Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 9 vent)Affiche la chaine de caractegravere hum sur le LCD

cond=0Remise a 0 de la condition

Xbee(9 vent) Envoi la chaicircne de caractegravere vent dans la fonction xbee

Fonction affichage

void lcd(int li int co int nb char receive[15])

int i

for(i=0 iltnb i++)Boucle for

Lcd_chr(li (co+i) receive[i])Affiche les caractegraveres jusquagrave i

Usart

void xbee(int nb char receive[15])

int i

Usart_Init(9600)Vitesse de transmission

for(i=0 iltnb i++)Boucle for

Usart_Write(receive[i])Envoi les caractegraveres sur lHyperTerminal jusquagrave i

Station meacuteteacuteo autonome 2012

15

Voici le registre de configuration(AC) qursquoil nous faut deacuteterminer

DONE 1 = conversion finie 0 = conversion en cours En mode 1 SHOT uniquement

THF Flag seuil haut du thermostat Passe agrave 1 et y reste si tempeacuterature supeacuterieure agrave TH

TLF Flag seuil bas du thermostat Passe agrave 1 et y reste si tempeacuterature infeacuterieure agrave TL

NVB 1 = meacutemoire EEPROM en eacutecriture 0 = meacutemoire EEPROM eacutecriture termineacutee

Nous nrsquoactiverons pas lrsquoeacutecriture de la meacutemoire

POL Polariteacute de Tout (pin 3) 1 = actif sera un niveau HAUT 0 = actif sera un niveau BAS

Il faut activer la polariteacute donc nous le mettons agrave 1

ONE SHOT 0 = conversion en continu 1 = conversion 1 fois

Nous le mettons en mode continu

AC = brsquo00001010rsquo = hrsquo0Arsquo

La commande AA qui permet de lire la tempeacuterature renvoie 2 octets

MSB (Most Significant Bit) Nombre signeacute donnant la tempeacuterature entre +125deg et -55degC

LSB (Least Significant Bit ) Seul le bit 7 de cet octet est significatif Si 1 tempeacuterature

MSB +05degC

Pour bien comprendre comment est codeacute un nombre signeacute un tableau avec des exemples de

valeurs eacutetait agrave notre disposition dans la notice

Station meacuteteacuteo autonome 2012

16

2 Dialogue I2C pour avoir la tempeacuterature

Voici un scheacutema qui montre le dialogue agrave effectuer entre le microcontrocircleur et le capteur

pour avoir la tempeacuterature Crsquoest gracircce agrave ce mecircme scheacutema que nous avons pu programmer le PIC

Station meacuteteacuteo autonome 2012

17

C Le scheacutema du microcontrocircleur avec le capteur de tempeacuterature

Voici le scheacutema du capteur de tempeacuterature uniquement Le capteur est brancheacute sur les

borne SCL(RC3) et SDA(RC4) du PIC Qursquoelles soient deacuteclareacutees en entreacutee ou en sortie les bornes SCL et

SDA sont fonctionnelles Il ne faut pas oublier les reacutesistances de tirages (R1 et R3) Lrsquoadressage A0 A1

A2 toutes misent agrave la masse car nous nrsquoavons qursquoun seul capteur I2C relieacute au PIC et le Tout

(thermostat) inutile car nous faisons juste un releveacute de tempeacuterature

D Programme pour la mesure de la tempeacuterature

Deacuteclaration des fonctions

void temperature(int cond)

void lcd(int li int co int nb char receive[14])

void main()

deacuteclaration des variables

int cond=0Condition pour laffichage sur leacutecran LCD

Initialisation et affectation des ports

PORTB=0 initialisation

PORTC=0

TRISB=0 Port B deacuteclarer en sortie

TRISC = 0xFF Port C en entreacutee

Configuration et initialisation de leacutecran LCD

Lcd_Config(ampPORTB 0 1 WR 5 4 3 2) Configure leacutecran

Lcd_Init(ampPORTB) initialisation du LCD

Lcd_Cmd(Lcd_CURSOR_OFF) Enlegraveve le curseur

Lcd_Cmd(Lcd_CLEAR) Efface leacutecran

Initialisation du module I2C

I2C_Init(100000) initialisation de la communication I2C

I2C_Start() Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90) Mode de controcircle en mode eacutecriture

I2C_Wr(0xAC) Accegraves au registre de configuration

I2C_Wr(0x0A) Registre de configuration mesure en continu

I2C_Stop() Arrecirct du signal

I2C_Start() Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90) Mode de controcircle en mode eacutecriture

Figure 10 Scheacutema de cacircblage avec le capteur de tempeacuterature

Station meacuteteacuteo autonome 2012

18

I2C_Wr(0xEE) Deacutebut de la conversion

I2C_Stop()Arrecirct du sigal

Boucle infinie

while(1)

cond=cond+1 Increacutemente la variable cond

temperature(ampcond) Appel la fonction humiditeacute

Fonction tempeacuterature

void temperature(int cond)

char temp[7] temptxt[]=Temperature LSB

signed char MSB

I2C_Start() Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90) Mode de controcircle en mode eacutecriture

I2C_Wr(0xAA) Lecture de la tempeacuterature

I2C_Stop() Arrecirct du signal

I2C_Start() Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x91) Mode de controcircle en mode lecture

MSB = I2C_Rd(1) Nombre signeacute donnant la tempeacuterature entre +125deg et -55degC

LSB = I2C_Rd(0) Si bit 7 = 1 tempeacuterature MSB +05degC

I2C_Stop() Arrecirct du signal

if(MSBlt0)

MSB = abs(MSB) Si tempeacuterature neacutegative valeur absolue de MSB

Temp[0]=45 Signe - affecteacute en ascii

else

Temp[0]=43 signe + affecteacute en ascii

Temp[1]=(MSB10)+48 Valeur des dizaines affecteacute en ascii

Temp[2]=(MSB10)+48 Valeur des uniteacutes affecteacute en ascii

Temp[3]=44 Virgule affecteacute en ascii

if (LSB==128) Si bit 7 agrave 1 alors +05deg

Temp[4]=5

Else Si bit 7 agrave 0 alors +00deg

Temp[4]=0

Temp[5]=223 degreacute affecteacute en ascii

Temp[6]=67 C affecteacute en ascii

if(cond==10) Appel la fonction LCD tous les 1000

lcd(1 1 13 temptxt) Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 6 temp) Affiche la chaine de caractegravere hum sur le LCD

cond=0 Remise a 0 de la condition

Fonction affichage

void lcd(int li int co int nb char receive[14])

int i

for(i=0 ilt=nb i++)Boucle for

Lcd_chr(li (co+i) receive[i]) Affiche les caractegraveres jusquagrave i

Le scheacutema preacuteceacutedent est bien respecteacute comme on peut le voir crsquoest tregraves facile agrave programmer

gracircce aux librairies I2C du logiciel MikroC

Station meacuteteacuteo autonome 2012

19

IX Lrsquoaneacutemomegravetre

A Conception

Pour lrsquoaneacutemomegravetre lrsquoeacutequipe peacutedagogique

nous a juste fourni lrsquoheacutelice du capteur donc il a fallu

concevoir toute la partie eacutelectronique Lrsquoideacutee est

drsquoinstaller une diode et un transistor photonique par

de lagrave lrsquoheacutelice et lorsqursquoelle tourne elle vient couper le

faisceau Succinctement le transistor envoit soit 1 soit

0 sur le PIC Le but est de relever la freacutequence agrave

laquelle tourne lrsquoheacutelice puis la convertir en vitesse (cf

figure 11)

La photodiode choisie est de reacutefeacuterence SD5455-3 Ce choix a eacuteteacute fait car lrsquoangle du faisceau

est de 20deg pour que le flux infrarouge soit bien concentreacute sur le phototransistor pour un

fonctionnement optimal

Comme on le voit sur le scheacutema de principe (cf figure 11) il a fallu dimensionner la

reacutesistance qui sert agrave reacuteguler le courant qui circule dans la LED avec les informations donneacutees par la

documentation technique nous avons pu la calculer

Forward voltage VF = 17V et IF = 01A

Ualim = 5V

RD = (Ualim ndash UF)IF = (5 ndash 17)01

RD = 33Ω

Pour le phototransistor nous avons choisi celui qui allait avec la diode de reacutefeacuterence SE5455-3

Cette fois la valeur de la reacutesistance nous eacutetait donneacute par le constructeur

RL=1000Ω

Lors des seacuteances nous avons implanteacute la diode et le

transistor sur le support du capteur Pour des raisons

pratiques et estheacutetiques nous avons seacutepareacute la partie

aneacutemomegravetre et la partie platine par des borniers (cf figure

12)

Figure 11 scheacutema descriptif de laneacutemomegravetre

Figure 12 Notre aneacutemomegravetre

Station meacuteteacuteo autonome 2012

20

B Mesure de la peacuteriode sur le microcontrocircleur

Le but est de relever la peacuteriode du signal envoyer par lrsquoaneacutemomegravetre pour cela le PIC est

eacutequipeacute drsquoun mode capture Le principe est de recopier agrave un moment voulu la valeur du timer 1 La

capture peut avoir lieux agrave chaque front descendant agrave chaque front montant tous les 4 ou tous les 16

fronts montants Quand la capture a eu lieu un flag est mis agrave 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 constitueacute de 2 registres de 8 bits TMR1H et TMR1L que lon peut lire ou eacutecrire Le registre TMR1

(constitueacute de TMR1H et TMR1L) sincreacutemente de h0000 jusquagrave hFFFF et repasse ensuite agrave h0000

pour continuer le comptage Quand il y a deacutebordement une interruption peut ecirctre geacuteneacutereacutee si on lrsquoa

autoriseacutee par TMR1IE =1 (bit 0 de PIE1) et le Flag TMR1IF (bit 0 de PIR1) passe agrave 1 Le controcircle du

timer 1 ce fait par le registre T1CON

Bit 7 et bit 6 bits non impleacutementeacutes

Bit 5 et bit 4 T1CKPS = Seacutelection du preacute diviseur placeacute avant le TIMER

Vu qursquoon a un quartz eacuteleveacute nous avons deacutecideacute de choisir un preacute-diviseur de 8 donc

F=Fosc(48) Pour cela mettre les bit 4 et 5 agrave 1

Bit 3 T1OSCEN Bit dautorisation de loscillateur du Timer 1

1 = oscillateur autoriseacute

0 = oscillateur stoppeacute

Oscillateur interne inutile donc bit 3 agrave 0

Bit 2 T1SYNC Bit de controcircle de la synchronisation du CLK externe

1 = Pas de synchronisation de lhorloge externe

0 = Synchronisation de lhorloge externe

Nous nous mettrons en mode synchrone

Bit1 TMR1CS Bit de seacutelection de la source horloge

1 = Mode Compteur Clk externe sur la broche PC0 ou Quartz entre PC0 et PC1

0 = Mode Timer Clk interne = Fosc4

Station meacuteteacuteo autonome 2012

21

On mettra ce bit agrave 0 car on utilise le mode Timer

Bit 0 TMR1ON Bit dautorisation du Timer 1

1 = Timer 1 en service

0 = Timer 1 stoppeacute

Il faut eacutevidemment mettre la timer 1 en service

Nous avons aussi autoriseacute le deacutebordement du timer 1 pour avoir plus de preacutecisions pour cela il faut

mettre la commande PIE1TMR1 agrave 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 parameacutetrer le registre

CCP1CON

Bit 7 et Bit 6 bits non impleacutementeacutes

Bit 5 et Bit 4 CCP1X et CCP1Y

Bits non utiliseacutes 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 agrave Bit 0 CCP1M3 agrave CCP1M0 bits de seacutelection du mode

Nous avons seacutelectionneacute le mode capture sur chaque front montant Pour cela nous avons

mis les bits 1 et 3 agrave 0 et les bits 0 et 2 agrave 1

Pour savoir si un front montant agrave eu lieu le flag CCP1F est mis agrave 1 Ce flag doit ecirctre remis agrave 0 par

lrsquoutilisateur La valeur des 16 bits des registres du Timer 1 TMR1L (bit de poids faible) et TMR1H (bit

de poids fort) sont recopieacutees dans les registres CCPR1 CCPRIH (bit de poids faible) et CCPR1L (bit de

poids fort)

Nous avons programmeacute le mode capture de faccedilon agrave afficher sur lrsquoeacutecran LCD la valeur du registre

CCPR1 crsquoest-agrave-dire la peacuteriode du signal de lrsquoaneacutemomegravetre Il ne nous reste maintenant plus qursquoagrave

eacutetalonner notre aneacutemomegravetre

Station meacuteteacuteo autonome 2012

22

C Etalonnage de lrsquoaneacutemomegravetre

Pour eacutetalonner le capteur nous avons commenceacute par savoir agrave quelle freacutequence correspond la

valeur releveacutee par le mode capture Pour cela nous avons brancheacute un GBF agrave la place du capteur et

avec un oscilloscope nous avons compareacute leurs valeurs

Nous avons ensuite traceacute agrave lrsquoaide des valeurs du tableau la courbe F(Hz) en fonction du

compteur De cette courbe nous relevons lrsquoeacutequation

F = 671310compteur^(-101)

Soit environ F = 671310compteur

Puis nous avons brancheacute notre aneacutemomegravetre sur le microcontrocircleur Cela dans le but de

relever sa peacuteriode sur lrsquoeacutecran LCD agrave lrsquoaide drsquoune soufflerie variable et du manomegravetre GDH (reacutef

121552 200-13) nous avons compareacute leurs valeurs pour connaitre lrsquoeacutetalonnage de notre capteur

Nous avons noteacute plusieurs valeurs puis traceacute diffeacuterentes courbe pour trouver les eacutequations qui nous

permettrons de calculer la vitesse dans notre programme

Station meacuteteacuteo autonome 2012

23

Voici les valeurs que nous avons releveacutees puis la courbe traceacutee sur Excel

De cette courbe nous obtenons lrsquoeacutequation

Vitesse du vent = 0179F + 0629

Nous les multiplierons par 100 pour reacutecupeacuterer les deacutecimales et les implanter dans une chaine

de caractegravere

Vitesse du vent = 179F + 629

Nous avons agrave preacutesent agrave notre disposition toutes les eacutequations neacutecessaires pour pouvoir

convertir la valeur releveacutee par le mode capture en une vitesse

D Le scheacutema du microcontrocircleur avec lrsquoaneacutemomegravetre

On voit sur le scheacutema que le capteur est bien relieacute sur la borne RC2 Nous avons aussi

repreacutesenteacute les borniers J1 et J2 A droite tous ce qui est sur le support et agrave gauche tous ce qui est sur

la platine

Figure 13 Scheacutema avec laneacutemomegravetre

Station meacuteteacuteo autonome 2012

24

E Programme pour la mesure de la vitesse du vent

Voici le programme pour mesurer la vitesse du vent avec les affectations deacutecrites ci-dessus

ainsi que les eacutequations de conversions

Deacuteclaration des fonctions

void vent(int cond)

void lcd(int li int co int nb char receive[20])

void main()

deacuteclaration des variables

int cond=0

Initialisation et affectation des ports

PORTB=0 initialisation

PORTC=0 initialisation

TRISC=0x04 Port C deacuteclarer en sortie sauf RC2 en mode capture

TRISB=0 Port B deacuteclarer en sortie

Configuration du mode capture

T1CON=0x31 Configuration du timer1

CCP1CON=0x05 Parameacutetrage du mode capture

PIE1TMR1IE=1 Autorise les deacutebordements du timer 1

Configuration et initialisation de leacutecran LCD

Lcd_Config(ampPORTB 0 1 WR 5 4 3 2) Configure leacutecran

Lcd_Init(ampPORTB) Initialisation du LCD

Lcd_Cmd(Lcd_CURSOR_OFF) Enlegraveve le curseur

Lcd_Cmd(Lcd_CLEAR) Efface leacutecran

Boucle infinie

while(1)

cond=cond+1

vent(ampcond)

Fonction vent

void vent(int cond)

unsigned long tl th per

int vitfreq

char vent[13] txtvent[]=vitesse du vent VV

if(PIR1CCP1IF==1) Test si front montant agrave lieu

TMR1H=0 Initialisation du timer1 bit de point fort

TMR1L=0 Initialisation du timer1 bit de point faible

th=CCPR1H Les valeurs sont copieacute dans des variables

tl=CCPR1L

th=thltlt8 Deacutecalage car th =gt bit de point fort

per = th|tl On concategravene les deux valeurs nous obtenons la peacuteriode

PIR1CCP1IF=0 Remise a 0 du drapeau

if(PIR1TMR1IF==1) Si deacutepassement du timer 1

per=65535+per On ajoute une retenue lorsquon a fait un tour (16bit)

PIR1TMR1IF=0 Remise a 0 du drapeau deacutepassement

freq=671310per Calcul de la freacutequence

vit=freq179 + 692 Calcul de la vitesse que lon x100

Station meacuteteacuteo autonome 2012

25

if(vitlt200) En dessous 2ms la mesure est aleacuteatoire agrave cause du 2egraveme deacutebordement

vit=0

vent[0]=(vit10000)+48 Valeur des centaines affecteacute en ascii(48=0)

VV=(vit1000)10

vent[1]=VV+48 Valeur des dizaines affecteacute en ascii

VV=(vit100)10

vent[2]=VV+48 Valeur des uniteacute affecteacute en ascii

VV=(vit10)10

vent[3]=44 Virgule affecteacute en ascii

vent[4]=VV+48 Valeur de la 1er deacutecimale affecteacute en ascii

VV=vit10

vent[5]=VV+48 Valeur de la 2egraveme deacutecimale affecteacute en ascii

vent[6]=109 m affecteacute en ascii

vent[7]=47 affecteacute en ascii

vent[8]=115 s affecteacute en ascii

if(cond==1000) Appel la fonction LCD tous les 1000

lcd(1 1 16 txtvent) Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 8 vent) Affiche la chaine de caractegravere hum sur le LCD

cond=0 Remise a 0 de la condition

Fonction affichage

void lcd(int li int co int nb char receive[20])

int i

for(i=0 ilt=nb i++) Boucle for

Lcd_chr(li (co+i) receive[i]) Affiche les caractegraveres jusquagrave i

Station meacuteteacuteo autonome 2012

26

X Simulation une station meacuteteacuteo autonome

Maintenant que tous nos capteurs sont installeacutes nous allons mettre agrave profit le bouton

poussoir installeacute dans la partie LCD Crsquoest-agrave-dire que nous allons rassembler tous les programmes

preacuteceacutedents pour nrsquoen faire qursquoun Il suffira drsquoappuyer sur le bouton poussoir pour faire deacutefiler les

diffeacuterentes valeurs comme une vraie station meacuteteacuteo

A La structure du programme

Boucle infinie

while(1)

cond=cond+1 Increacutemente la variable cond

switch(BP)

case 0

humidite(ampcond) Appel la fonction humiditeacute

if(PORTAF2==1) Ces if permet de changer la valeur de BP

BP=1

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250) Temps quon relacircche bien le bouton

break

case 1

temperature(ampcond) Appel la fonction tempeacuterature

if(PORTAF2==1)

BP=2

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)

break

case 2

vent(ampcond) Appel la fonction vent

if(PORTAF2==1)

BP=0

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)

break

Nous avons choisi drsquoutiliser un Switch nous avons donc juste rajouteacute une variable BP

Lorsqursquoil y a appui sur le bouton poussoir la variable BP srsquoincreacutemente et le programme passe agrave une

autre case et donc utilise une nouvelle fonction La temporisation nous donne le temps de relacirccher le

bouton pour eacuteviter de faire deacutefiler le menu sans le vouloir

Station meacuteteacuteo autonome 2012

27

B La simulation

Etant donneacute que nous ne pouvions pas prendre le mateacuteriel avec nous il eacutetait impeacuteratif de

pouvoir faire des simulations Pour cela nous avons utiliseacute un logiciel tregraves utile Proteus ISIS Ce

logiciel possegravede une tregraves grande librairie et permet de rentrer nos programmes sur le PIC virtuel

geacuteneacutereacute par le logiciel Pour simuler le capteur drsquohumiditeacute nous avons utiliseacute un potentiomegravetre Pour

celui de lrsquoaneacutemomegravetre comme pour nos mesures nous avons brancheacute virtuellement un GBF sur la

borne associeacute et observeacute son signal agrave lrsquoaide drsquoun oscilloscope

Voilagrave un aperccedilu de la simulation effectueacute sur ISIS

Veacuterification theacuteorique du vent

Vitesse du vent = 0179 37 + 0629

Vitesse du vent = 7657ms

Veacuterification theacuteorique de lrsquohumiditeacute

H= (315-081)0031

H=7548

Veacuterification theacuteorique de la

tempeacuterature

La valeur afficheacutee correspond bien

aux 27degC seacutelectionneacute sur le capteur

Station meacuteteacuteo autonome 2012

28

XI Transmission des donneacutees par liaison ZigBee

ZigBee est un protocole de haut niveau permettant la communication de petites radios agrave

consommation reacuteduite baseacutee sur le standard IEEE 802154

Cette technologie a pour but la communication de courte distance telle que le propose deacutejagrave

la technologie Bluetooth tout en eacutetant moins chegravere plus simple et avec une fiabiliteacute assez eacuteleveacutee

Dans notre projet nous nous servirons de ZigBee pour permettre une transmission par ondes

de nos donneacutees de la station meacuteteacuteo vers un ordinateur Pour cela nous avons 2 modules Xbee pro 2

platines drsquointerfaces une avec des pattes (liaison platine) et lrsquoautre avec une sortie RS232 (liaison pc)

Caracteacuteristique eacutelectrique

Les signaux Xbee ont une amplitude de 33V mais sont alimenteacutes en 5V (tension de notre

source USB) cacircbleacutes sur la bornes VIN (laquo Power input from 6-12Vdc 300mA or higher raquo) Mais

notre source nrsquoeacutetant pas assez puissante pour alimenter toute notre installation Nous utiliserons

donc une source externe de 5V qui sera utiliseacutee pour alimenter les 2 systegravemes Xbee

Description des Bornes du Xbee qui nous inteacuteresse

Station meacuteteacuteo autonome 2012

29

A Scheacutema eacutelectrique du module Xbee

Nous avons cacircbleacute la sortie TX du microcontrocircleur qui eacutemet un signal jusqursquoagrave la borne RX du

Xbee qui reacuteceptionne ce signal Apregraves la transmission se fait par onde entre les 2 modules Xbee Pour

le module qui reccediloit le signal un cacircble RS232 suffit agrave faire la liaison entre celui-ci et le PC

B Envoi des donneacutees la liaison Usart

Un USART (Universal synchronous amp Asynchronous Receiver Transmitter) est un eacutemetteur-

reacutecepteur universel En langage courant cest le composant utiliseacute pour faire la liaison entre

lordinateur et le port seacuterie Lordinateur envoie les donneacutees en parallegravele (autant de fils que de bits

de donneacutees) Il faut donc transformer ces donneacutees pour les faire passer agrave travers une liaison seacuterie qui

utilise un mecircme fil pour faire passer tous les bits de donneacutees

Constitution dune trame USART

un bit de start toujours agrave 0 servant agrave la synchronisation du reacutecepteur

les donneacutees la taille peut varier (geacuteneacuteralement entre 5 et 9 bits)

eacuteventuellement un bit de pariteacute paire ou impaire

et un bit de stop toujours agrave 1 (la dureacutee peut varier entre 1 15 et 2 temps bit)

Le niveau logique de repos est le 1

Figure 14 Trame USART

Station meacuteteacuteo autonome 2012

30

Afin de faciliter les liaisons entre peacuteripheacuteriques (PC microcontrocircleur modem hellip) des vitesses

de transmission sont normaliseacutees luniteacute baud correspondant agrave un temps bit Dans notre cas nous

choisirons une vitesse de transmission de 9600bps

C Programme drsquoenvoi des donneacutees par liaison Usart

Gracircce agrave la librairie de MikroC il est tregraves facile drsquoenvoyer des donneacutees par liaison Usart Cela

fonctionne comme pour envoyer des caractegraveres sur lrsquoeacutecran LCD Il faut juste ensuite choisir la vitesse

de transmission qui sera 9600bps Voici la fonction et un morceau du programme qui sert agrave envoyer

les caractegraveres sur Xbee et de Xbee agrave un HyperTerminal

Fonction humiditeacute

void humidite(int cond)

long H U VL Deacuteclaration des variables

char HH hum[8] humtxt[]=Humidite

helliphellip

Xbee(8 hum) Envoi la chaicircne de caractegravere hum dans la fonction xbee

Usart

void xbee(int nb char receive[20])

int i

Usart_Init(9600) Vitesse de transmission

for(i=0 ilt=nb i++) Boucle for

Usart_Write(receive[i]) Envoi les caractegraveres sur lrsquoHyperTerminal jusquagrave i

Station meacuteteacuteo autonome 2012

31

XII Estimation du coucirct du projet

On peut voir sur ce tableau que le prix de reviens pour les eacuteleacutements que nous avons utiliseacute

est de 14506euro TTC Ce qui est plutocirct oneacutereux compareacute aux stations meacuteteacuteo du marcheacute qui oscille

entre 6euro et 400euro En sachant que la nocirctre est loin drsquoecirctre finaliseacute (finition estheacutetique ergonomie et

ajout de nouvelle fonction comme la date et lrsquoheure)

Composant Quantiteacute Prix (TVA inclus) Liens Quartz 20000MHz 1 111 euro Lien

Capaciteacute 22pF 2 010 euro lien

PIC 16F876 1 427 euro lien

LCD MODULE 1 1575 euro lien

Potentiomegravetre 10KΩ 1 618 euro lien

Reacutesistance 33 Ω 1 035 euro lien

Reacutesistance 10 K Ω 2 070 euro lien

Reacutesistance 1 KΩ 3 105 euro lien

LED rouge 1 013 euro lien

DS1621 1 650 euro lien

Bouton poussoir 1 060 euro lien

Module Xbee 2 4000 euro lien

Platine dinterface (XBEE) RS232 1 1890 euro lien

Platine dinterface (XBEE) 1 1364 euro lien

Capteur drsquohumiditeacute 1 2692 euro lien

Transistor 1 561 euro lien

Diode 1 325 euro lien

Totales 1 14506 euro

Station meacuteteacuteo autonome 2012

32

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

panelsbut 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 Itrsquos also possible to measure

humidity and wind speed Then itrsquos 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 its 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 Itrsquos 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

Station meacuteteacuteo autonome 2012

33

XIV Conclusion

Ce projet sur la conception drsquoune station meacuteteacuteo autonome qui nous a eacuteteacute confieacute a eacuteteacute tregraves

enrichissant Il nous a permis de mettre en relations les connaissances acquises durant lrsquoanneacutee mais

aussi acqueacuterir de nouvelles connaissances comme le fonctionnement drsquoun microcontrocircleur En effet

nous nrsquoavions jamais programmeacute sur microcontrocircleur Il a fallu srsquoadapter et apprendre agrave utiliser des

nouveaux logiciels tels que Proteus MikroC ainsi que Labview

De cette expeacuterience nous avons aussi appris agrave ecirctre autonome Nous avons saisi que la

compreacutehension des documents techniques et des librairies eacutetait un point essentiel de notre projet

En programmation nous nrsquoavions pas le droit agrave lrsquoerreur car la moindre faute pouvait conduire le

systegraveme agrave un dysfonctionnement Ce projet nous a demandeacute beaucoup de rigueur de patience et de

temps

Toutefois nous nrsquoavons pas eu malheureusement le temps drsquoinstaller le capteur de

tempeacuterature inteacuterieure par manque de temps Plus encore nous aurions aimeacute approfondir certains

points Par exemple pouvoir installer les composants sur circuit imprimeacute et concevoir un support

viable pour en faire une vraie station meacuteteacuteo Lrsquoinstallation drsquoune girouette aurait eacuteteacute appreacuteciable

pour connaicirctre le sens du vent Aussi le programme aurait sans doute pu ecirctre encore ameacutelioreacute pour

de meilleures performances

Malgreacute ce manque de temps nous sommes tregraves satisfaits du fonctionnement de ce module

qui nous a permis de comprendre lrsquoutiliteacute des parties theacuteoriques pour lrsquoapplication et la mise en

œuvre drsquoun systegraveme Lrsquoapproche peacutedagogique de nous diriger vers les solutions sans jamais les

donner de nous laisser un grand degreacute de liberteacute et drsquoautonomie a eacuteteacute au deacutebut assez deacuteroutante

mais tregraves instructif

Enfin nous tenions agrave remercier Mme Leymarie qui nous a suivis et aiguilleacute tout au long de ce

projet

Station meacuteteacuteo autonome 2012

34

XV ANNEXES

Programme complet

Deacuteclaration 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()

deacuteclaration des variables

int cond=0Condition pour laffichage sur leacutecran LCD

int BP=0

Initialisation et affectation des ports

PORTA=0

PORTB=0 initialisation

PORTC=0

TRISB=0 Port B deacuteclarer en sortie

TRISA=0xFF Port A en entreacutee

ADCON1=0x84 Justifieacute agrave droite active RA0RA1RA3 analogique

ADCON0=0x85 Fosc32 sur PA0 en service

TRISB=0 Port B deacuteclarer en sortie

TRISC=0xFFPort C deacuteclarer en entreacutee

Configuration et initialisation de leacutecran LCD

Lcd_Config(ampPORTB 0 1 WR 5 4 3 2) Configure lecran

Lcd_Init(ampPORTB) initialisation du LCD

Lcd_Cmd(Lcd_CURSOR_OFF) Enleve le curseur

Lcd_Cmd(Lcd_CLEAR) Efface lecran

Initialisation du module I2C

I2C_Init(100000)initialisation de la communication I2C

I2C_Start()Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90)Mode de controcircle en mode eacutecriture

I2C_Wr(0xAC)Accegraves au registre de configuration

I2C_Wr(0x0A)Registre de configuration mesure en continu

I2C_Stop()Arrecirct du signal

I2C_Start()Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90)Mode de controcircle en mode eacutecriture

I2C_Wr(0xEE)Deacutebut de la conversion

I2C_Stop()Arrecirct du sigal

Station meacuteteacuteo autonome 2012

35

Configuration du mode capture

T1CON=0x31 Configuration du timer1

CCP1CON=0x05 Paramegravetrage du mode capture

PIE1TMR1IE=1 Autorise les deacutebordements du timer 1

Boucle infinie

while(1)

cond=cond+1Increacutemente la variable cond

switch(BP)

case 0

humidite(ampcond)Appel la fonction humiditeacute

if(PORTAF2==1)Ces if permet de changer la valeur de BP

BP=1

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)Temps quon relacircche bien le bouton

break

case 1

temperature(ampcond)Appel la fonction tempeacuterature

if(PORTAF2==1)

BP=2

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)

break

case 2

vent(ampcond)Appel la fonction vent

if(PORTAF2==1)

BP=0

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)

break

Fonction humiditeacute

void humidite(int cond)

long H U VLDeacuteclaration des variables

char HH hum[8] humtxt[]=Humidite

VL=Adc_read(0) Valeur lue sur RA0(humiditeacute)

U=(VL5000)1023 Convertit la valeur lue en tension x1000

H=(U-810)(0031) Convertit la tension en humiditeacute x1000

Station meacuteteacuteo autonome 2012

36

if(Hgt100000)Si H gt 100(impossible) alors = 100

H=100000

if(Hlt0)Si H lt 0(impossible) alors = 0

H=0

hum[0]=(H100000)+48Valeur des centaines affecteacute en ascii(48=0)

HH=(H10000)10

hum[1]=HH+48Valeur des dizaines affecteacute en ascii

HH=(H1000)10

hum[2]=HH+48Valeur des uniteacutes affecteacute en ascii

hum[3]=44Virgule affecteacute en ascii

HH=(H100)10

hum[4]=HH+48Valeur de la premiegravere deacutecimale affecteacute en ascii

HH=(H10)10

hum[5]=HH+48Valeur de la deuxiegraveme deacutecimale affecteacute en ascii

hum[6]=37Pourcentage affecteacute en ascii

if(cond==50)Appel la fonction LCD tous les 1000

lcd(1 1 8 humtxt)Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 7 hum)Affiche la chaine de caractegravere hum sur le LCD

cond=0Remise a 0 de la condition

Xbee(7 hum) Envoi la chaicircne de caractegravere hum dans la fonction xbee

Fonction tempeacuterature

void temperature(int cond)

char temp[7] temptxt[]=Temperature LSB

signed char MSB

I2C_Start()Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90)Mode de controcircle en mode eacutecriture

I2C_Wr(0xAA)Lecture de la tempeacuterature

I2C_Stop()Arrecirct du sigal

I2C_Start()Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x91)Mode de controcircle en mode lecture

MSB = I2C_Rd(1)Nombre signeacute donnant la tempeacuterature entre +125deg et -55degC

LSB = I2C_Rd(0)Si bit 7 = 1 tempeacuterature MSB +05degC

I2C_Stop()Arrecirct du sigal

if(MSBlt0)

MSB = abs(MSB) Si temperature neacutegative valeur absolue de MSB

Temp[0]=45 Signe - affecteacute en ascii

else

Station meacuteteacuteo autonome 2012

37

Temp[0]=43signe + affecteacute en ascii

Temp[1]=(MSB10)+48 Valeur des dizaines affecteacute en ascii

Temp[2]=(MSB10)+48 Valeur des uniteacutes affecteacute en ascii

Temp[3]=44 Virgule affecteacute en ascii

if (LSB==128) Si bit 7 agrave 1 alors +05deg

Temp[4]=5

else Si bit 7 agrave 0 alors +00deg

Temp[4]=0

Temp[5]=223 degreacute affecteacute en ascii

Temp[6]=67 C affecteacute en ascii

if(cond==50)Appel la fonction LCD tous les 1000

lcd(1 1 11 temptxt)Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 7 temp)Affiche la chaine de caractegravere hum sur le LCD

cond=0Remise a 0 de la condition

Xbee(7 temp) Envoi la chaicircne de caractegravere temp dans la fonction xbee

Fonction vent

void vent(int cond)

unsigned long tl th per

int vitfreq

char vent[13] txtvent[]=Vitesse du vent VV

if(PIR1CCP1IF==1) Test si front montant agrave lieu

TMR1H=0 Initialisation du timer1 bit de point fort

TMR1L=0 Initialisation du timer1 bit de point faible

th=CCPR1H Les valeurs sont copieacute dans des variables

tl=CCPR1L

th=thltlt8 Deacutecalage car th =gt bit de point fort

per = th|tl On concategravene les deux valeurs nous obtenons la peacuteriode

PIR1CCP1IF=0 Remise a 0 du drapeau

if(PIR1TMR1IF==1) Si deacutepassement du timer 1

per=65535+per On ajoute une retenue lorsquon a fait un tour (16bit)

PIR1TMR1IF=0 Remise a 0 du drapeau deacutepassement

Station meacuteteacuteo autonome 2012

38

freq=671310perCalacul de la freacutequence

vit=freq179 + 692Calcul de la vitesse que lon x100

if(vitlt200)En dessous 2ms la mesure est aleacuteatoire agrave cause du 2egraveme deacutebordement

vit=0

vent[0]=(vit10000)+48Valeur des centaines affecteacute en ascii(48=0)

VV=(vit1000)10

vent[1]=VV+48Valeur des dizaines affecteacute en ascii

VV=(vit100)10

vent[2]=VV+48Valeur des uniteacute affecteacute en ascii

VV=(vit10)10

vent[3]=44Virgule affecteacute en ascii

vent[4]=VV+48Valeur de la 1er deacutecimale affecteacute en ascii

VV=vit10

vent[5]=VV+48Valeur de la 2egraveme deacutecimale affecteacute en ascii

vent[6]=109m affecteacute en ascii

vent[7]=47 affecteacute en ascii

vent[8]=115s affecteacute en ascii

if(cond==50)Appel la fonction LCD tous les 1000

lcd(1 1 15 txtvent)Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 9 vent)Affiche la chaine de caractegravere hum sur le LCD

cond=0Remise a 0 de la condition

Xbee(9 vent) Envoi la chaicircne de caractegravere vent dans la fonction xbee

Fonction affichage

void lcd(int li int co int nb char receive[15])

int i

for(i=0 iltnb i++)Boucle for

Lcd_chr(li (co+i) receive[i])Affiche les caractegraveres jusquagrave i

Usart

void xbee(int nb char receive[15])

int i

Usart_Init(9600)Vitesse de transmission

for(i=0 iltnb i++)Boucle for

Usart_Write(receive[i])Envoi les caractegraveres sur lHyperTerminal jusquagrave i

Station meacuteteacuteo autonome 2012

16

2 Dialogue I2C pour avoir la tempeacuterature

Voici un scheacutema qui montre le dialogue agrave effectuer entre le microcontrocircleur et le capteur

pour avoir la tempeacuterature Crsquoest gracircce agrave ce mecircme scheacutema que nous avons pu programmer le PIC

Station meacuteteacuteo autonome 2012

17

C Le scheacutema du microcontrocircleur avec le capteur de tempeacuterature

Voici le scheacutema du capteur de tempeacuterature uniquement Le capteur est brancheacute sur les

borne SCL(RC3) et SDA(RC4) du PIC Qursquoelles soient deacuteclareacutees en entreacutee ou en sortie les bornes SCL et

SDA sont fonctionnelles Il ne faut pas oublier les reacutesistances de tirages (R1 et R3) Lrsquoadressage A0 A1

A2 toutes misent agrave la masse car nous nrsquoavons qursquoun seul capteur I2C relieacute au PIC et le Tout

(thermostat) inutile car nous faisons juste un releveacute de tempeacuterature

D Programme pour la mesure de la tempeacuterature

Deacuteclaration des fonctions

void temperature(int cond)

void lcd(int li int co int nb char receive[14])

void main()

deacuteclaration des variables

int cond=0Condition pour laffichage sur leacutecran LCD

Initialisation et affectation des ports

PORTB=0 initialisation

PORTC=0

TRISB=0 Port B deacuteclarer en sortie

TRISC = 0xFF Port C en entreacutee

Configuration et initialisation de leacutecran LCD

Lcd_Config(ampPORTB 0 1 WR 5 4 3 2) Configure leacutecran

Lcd_Init(ampPORTB) initialisation du LCD

Lcd_Cmd(Lcd_CURSOR_OFF) Enlegraveve le curseur

Lcd_Cmd(Lcd_CLEAR) Efface leacutecran

Initialisation du module I2C

I2C_Init(100000) initialisation de la communication I2C

I2C_Start() Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90) Mode de controcircle en mode eacutecriture

I2C_Wr(0xAC) Accegraves au registre de configuration

I2C_Wr(0x0A) Registre de configuration mesure en continu

I2C_Stop() Arrecirct du signal

I2C_Start() Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90) Mode de controcircle en mode eacutecriture

Figure 10 Scheacutema de cacircblage avec le capteur de tempeacuterature

Station meacuteteacuteo autonome 2012

18

I2C_Wr(0xEE) Deacutebut de la conversion

I2C_Stop()Arrecirct du sigal

Boucle infinie

while(1)

cond=cond+1 Increacutemente la variable cond

temperature(ampcond) Appel la fonction humiditeacute

Fonction tempeacuterature

void temperature(int cond)

char temp[7] temptxt[]=Temperature LSB

signed char MSB

I2C_Start() Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90) Mode de controcircle en mode eacutecriture

I2C_Wr(0xAA) Lecture de la tempeacuterature

I2C_Stop() Arrecirct du signal

I2C_Start() Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x91) Mode de controcircle en mode lecture

MSB = I2C_Rd(1) Nombre signeacute donnant la tempeacuterature entre +125deg et -55degC

LSB = I2C_Rd(0) Si bit 7 = 1 tempeacuterature MSB +05degC

I2C_Stop() Arrecirct du signal

if(MSBlt0)

MSB = abs(MSB) Si tempeacuterature neacutegative valeur absolue de MSB

Temp[0]=45 Signe - affecteacute en ascii

else

Temp[0]=43 signe + affecteacute en ascii

Temp[1]=(MSB10)+48 Valeur des dizaines affecteacute en ascii

Temp[2]=(MSB10)+48 Valeur des uniteacutes affecteacute en ascii

Temp[3]=44 Virgule affecteacute en ascii

if (LSB==128) Si bit 7 agrave 1 alors +05deg

Temp[4]=5

Else Si bit 7 agrave 0 alors +00deg

Temp[4]=0

Temp[5]=223 degreacute affecteacute en ascii

Temp[6]=67 C affecteacute en ascii

if(cond==10) Appel la fonction LCD tous les 1000

lcd(1 1 13 temptxt) Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 6 temp) Affiche la chaine de caractegravere hum sur le LCD

cond=0 Remise a 0 de la condition

Fonction affichage

void lcd(int li int co int nb char receive[14])

int i

for(i=0 ilt=nb i++)Boucle for

Lcd_chr(li (co+i) receive[i]) Affiche les caractegraveres jusquagrave i

Le scheacutema preacuteceacutedent est bien respecteacute comme on peut le voir crsquoest tregraves facile agrave programmer

gracircce aux librairies I2C du logiciel MikroC

Station meacuteteacuteo autonome 2012

19

IX Lrsquoaneacutemomegravetre

A Conception

Pour lrsquoaneacutemomegravetre lrsquoeacutequipe peacutedagogique

nous a juste fourni lrsquoheacutelice du capteur donc il a fallu

concevoir toute la partie eacutelectronique Lrsquoideacutee est

drsquoinstaller une diode et un transistor photonique par

de lagrave lrsquoheacutelice et lorsqursquoelle tourne elle vient couper le

faisceau Succinctement le transistor envoit soit 1 soit

0 sur le PIC Le but est de relever la freacutequence agrave

laquelle tourne lrsquoheacutelice puis la convertir en vitesse (cf

figure 11)

La photodiode choisie est de reacutefeacuterence SD5455-3 Ce choix a eacuteteacute fait car lrsquoangle du faisceau

est de 20deg pour que le flux infrarouge soit bien concentreacute sur le phototransistor pour un

fonctionnement optimal

Comme on le voit sur le scheacutema de principe (cf figure 11) il a fallu dimensionner la

reacutesistance qui sert agrave reacuteguler le courant qui circule dans la LED avec les informations donneacutees par la

documentation technique nous avons pu la calculer

Forward voltage VF = 17V et IF = 01A

Ualim = 5V

RD = (Ualim ndash UF)IF = (5 ndash 17)01

RD = 33Ω

Pour le phototransistor nous avons choisi celui qui allait avec la diode de reacutefeacuterence SE5455-3

Cette fois la valeur de la reacutesistance nous eacutetait donneacute par le constructeur

RL=1000Ω

Lors des seacuteances nous avons implanteacute la diode et le

transistor sur le support du capteur Pour des raisons

pratiques et estheacutetiques nous avons seacutepareacute la partie

aneacutemomegravetre et la partie platine par des borniers (cf figure

12)

Figure 11 scheacutema descriptif de laneacutemomegravetre

Figure 12 Notre aneacutemomegravetre

Station meacuteteacuteo autonome 2012

20

B Mesure de la peacuteriode sur le microcontrocircleur

Le but est de relever la peacuteriode du signal envoyer par lrsquoaneacutemomegravetre pour cela le PIC est

eacutequipeacute drsquoun mode capture Le principe est de recopier agrave un moment voulu la valeur du timer 1 La

capture peut avoir lieux agrave chaque front descendant agrave chaque front montant tous les 4 ou tous les 16

fronts montants Quand la capture a eu lieu un flag est mis agrave 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 constitueacute de 2 registres de 8 bits TMR1H et TMR1L que lon peut lire ou eacutecrire Le registre TMR1

(constitueacute de TMR1H et TMR1L) sincreacutemente de h0000 jusquagrave hFFFF et repasse ensuite agrave h0000

pour continuer le comptage Quand il y a deacutebordement une interruption peut ecirctre geacuteneacutereacutee si on lrsquoa

autoriseacutee par TMR1IE =1 (bit 0 de PIE1) et le Flag TMR1IF (bit 0 de PIR1) passe agrave 1 Le controcircle du

timer 1 ce fait par le registre T1CON

Bit 7 et bit 6 bits non impleacutementeacutes

Bit 5 et bit 4 T1CKPS = Seacutelection du preacute diviseur placeacute avant le TIMER

Vu qursquoon a un quartz eacuteleveacute nous avons deacutecideacute de choisir un preacute-diviseur de 8 donc

F=Fosc(48) Pour cela mettre les bit 4 et 5 agrave 1

Bit 3 T1OSCEN Bit dautorisation de loscillateur du Timer 1

1 = oscillateur autoriseacute

0 = oscillateur stoppeacute

Oscillateur interne inutile donc bit 3 agrave 0

Bit 2 T1SYNC Bit de controcircle de la synchronisation du CLK externe

1 = Pas de synchronisation de lhorloge externe

0 = Synchronisation de lhorloge externe

Nous nous mettrons en mode synchrone

Bit1 TMR1CS Bit de seacutelection de la source horloge

1 = Mode Compteur Clk externe sur la broche PC0 ou Quartz entre PC0 et PC1

0 = Mode Timer Clk interne = Fosc4

Station meacuteteacuteo autonome 2012

21

On mettra ce bit agrave 0 car on utilise le mode Timer

Bit 0 TMR1ON Bit dautorisation du Timer 1

1 = Timer 1 en service

0 = Timer 1 stoppeacute

Il faut eacutevidemment mettre la timer 1 en service

Nous avons aussi autoriseacute le deacutebordement du timer 1 pour avoir plus de preacutecisions pour cela il faut

mettre la commande PIE1TMR1 agrave 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 parameacutetrer le registre

CCP1CON

Bit 7 et Bit 6 bits non impleacutementeacutes

Bit 5 et Bit 4 CCP1X et CCP1Y

Bits non utiliseacutes 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 agrave Bit 0 CCP1M3 agrave CCP1M0 bits de seacutelection du mode

Nous avons seacutelectionneacute le mode capture sur chaque front montant Pour cela nous avons

mis les bits 1 et 3 agrave 0 et les bits 0 et 2 agrave 1

Pour savoir si un front montant agrave eu lieu le flag CCP1F est mis agrave 1 Ce flag doit ecirctre remis agrave 0 par

lrsquoutilisateur La valeur des 16 bits des registres du Timer 1 TMR1L (bit de poids faible) et TMR1H (bit

de poids fort) sont recopieacutees dans les registres CCPR1 CCPRIH (bit de poids faible) et CCPR1L (bit de

poids fort)

Nous avons programmeacute le mode capture de faccedilon agrave afficher sur lrsquoeacutecran LCD la valeur du registre

CCPR1 crsquoest-agrave-dire la peacuteriode du signal de lrsquoaneacutemomegravetre Il ne nous reste maintenant plus qursquoagrave

eacutetalonner notre aneacutemomegravetre

Station meacuteteacuteo autonome 2012

22

C Etalonnage de lrsquoaneacutemomegravetre

Pour eacutetalonner le capteur nous avons commenceacute par savoir agrave quelle freacutequence correspond la

valeur releveacutee par le mode capture Pour cela nous avons brancheacute un GBF agrave la place du capteur et

avec un oscilloscope nous avons compareacute leurs valeurs

Nous avons ensuite traceacute agrave lrsquoaide des valeurs du tableau la courbe F(Hz) en fonction du

compteur De cette courbe nous relevons lrsquoeacutequation

F = 671310compteur^(-101)

Soit environ F = 671310compteur

Puis nous avons brancheacute notre aneacutemomegravetre sur le microcontrocircleur Cela dans le but de

relever sa peacuteriode sur lrsquoeacutecran LCD agrave lrsquoaide drsquoune soufflerie variable et du manomegravetre GDH (reacutef

121552 200-13) nous avons compareacute leurs valeurs pour connaitre lrsquoeacutetalonnage de notre capteur

Nous avons noteacute plusieurs valeurs puis traceacute diffeacuterentes courbe pour trouver les eacutequations qui nous

permettrons de calculer la vitesse dans notre programme

Station meacuteteacuteo autonome 2012

23

Voici les valeurs que nous avons releveacutees puis la courbe traceacutee sur Excel

De cette courbe nous obtenons lrsquoeacutequation

Vitesse du vent = 0179F + 0629

Nous les multiplierons par 100 pour reacutecupeacuterer les deacutecimales et les implanter dans une chaine

de caractegravere

Vitesse du vent = 179F + 629

Nous avons agrave preacutesent agrave notre disposition toutes les eacutequations neacutecessaires pour pouvoir

convertir la valeur releveacutee par le mode capture en une vitesse

D Le scheacutema du microcontrocircleur avec lrsquoaneacutemomegravetre

On voit sur le scheacutema que le capteur est bien relieacute sur la borne RC2 Nous avons aussi

repreacutesenteacute les borniers J1 et J2 A droite tous ce qui est sur le support et agrave gauche tous ce qui est sur

la platine

Figure 13 Scheacutema avec laneacutemomegravetre

Station meacuteteacuteo autonome 2012

24

E Programme pour la mesure de la vitesse du vent

Voici le programme pour mesurer la vitesse du vent avec les affectations deacutecrites ci-dessus

ainsi que les eacutequations de conversions

Deacuteclaration des fonctions

void vent(int cond)

void lcd(int li int co int nb char receive[20])

void main()

deacuteclaration des variables

int cond=0

Initialisation et affectation des ports

PORTB=0 initialisation

PORTC=0 initialisation

TRISC=0x04 Port C deacuteclarer en sortie sauf RC2 en mode capture

TRISB=0 Port B deacuteclarer en sortie

Configuration du mode capture

T1CON=0x31 Configuration du timer1

CCP1CON=0x05 Parameacutetrage du mode capture

PIE1TMR1IE=1 Autorise les deacutebordements du timer 1

Configuration et initialisation de leacutecran LCD

Lcd_Config(ampPORTB 0 1 WR 5 4 3 2) Configure leacutecran

Lcd_Init(ampPORTB) Initialisation du LCD

Lcd_Cmd(Lcd_CURSOR_OFF) Enlegraveve le curseur

Lcd_Cmd(Lcd_CLEAR) Efface leacutecran

Boucle infinie

while(1)

cond=cond+1

vent(ampcond)

Fonction vent

void vent(int cond)

unsigned long tl th per

int vitfreq

char vent[13] txtvent[]=vitesse du vent VV

if(PIR1CCP1IF==1) Test si front montant agrave lieu

TMR1H=0 Initialisation du timer1 bit de point fort

TMR1L=0 Initialisation du timer1 bit de point faible

th=CCPR1H Les valeurs sont copieacute dans des variables

tl=CCPR1L

th=thltlt8 Deacutecalage car th =gt bit de point fort

per = th|tl On concategravene les deux valeurs nous obtenons la peacuteriode

PIR1CCP1IF=0 Remise a 0 du drapeau

if(PIR1TMR1IF==1) Si deacutepassement du timer 1

per=65535+per On ajoute une retenue lorsquon a fait un tour (16bit)

PIR1TMR1IF=0 Remise a 0 du drapeau deacutepassement

freq=671310per Calcul de la freacutequence

vit=freq179 + 692 Calcul de la vitesse que lon x100

Station meacuteteacuteo autonome 2012

25

if(vitlt200) En dessous 2ms la mesure est aleacuteatoire agrave cause du 2egraveme deacutebordement

vit=0

vent[0]=(vit10000)+48 Valeur des centaines affecteacute en ascii(48=0)

VV=(vit1000)10

vent[1]=VV+48 Valeur des dizaines affecteacute en ascii

VV=(vit100)10

vent[2]=VV+48 Valeur des uniteacute affecteacute en ascii

VV=(vit10)10

vent[3]=44 Virgule affecteacute en ascii

vent[4]=VV+48 Valeur de la 1er deacutecimale affecteacute en ascii

VV=vit10

vent[5]=VV+48 Valeur de la 2egraveme deacutecimale affecteacute en ascii

vent[6]=109 m affecteacute en ascii

vent[7]=47 affecteacute en ascii

vent[8]=115 s affecteacute en ascii

if(cond==1000) Appel la fonction LCD tous les 1000

lcd(1 1 16 txtvent) Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 8 vent) Affiche la chaine de caractegravere hum sur le LCD

cond=0 Remise a 0 de la condition

Fonction affichage

void lcd(int li int co int nb char receive[20])

int i

for(i=0 ilt=nb i++) Boucle for

Lcd_chr(li (co+i) receive[i]) Affiche les caractegraveres jusquagrave i

Station meacuteteacuteo autonome 2012

26

X Simulation une station meacuteteacuteo autonome

Maintenant que tous nos capteurs sont installeacutes nous allons mettre agrave profit le bouton

poussoir installeacute dans la partie LCD Crsquoest-agrave-dire que nous allons rassembler tous les programmes

preacuteceacutedents pour nrsquoen faire qursquoun Il suffira drsquoappuyer sur le bouton poussoir pour faire deacutefiler les

diffeacuterentes valeurs comme une vraie station meacuteteacuteo

A La structure du programme

Boucle infinie

while(1)

cond=cond+1 Increacutemente la variable cond

switch(BP)

case 0

humidite(ampcond) Appel la fonction humiditeacute

if(PORTAF2==1) Ces if permet de changer la valeur de BP

BP=1

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250) Temps quon relacircche bien le bouton

break

case 1

temperature(ampcond) Appel la fonction tempeacuterature

if(PORTAF2==1)

BP=2

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)

break

case 2

vent(ampcond) Appel la fonction vent

if(PORTAF2==1)

BP=0

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)

break

Nous avons choisi drsquoutiliser un Switch nous avons donc juste rajouteacute une variable BP

Lorsqursquoil y a appui sur le bouton poussoir la variable BP srsquoincreacutemente et le programme passe agrave une

autre case et donc utilise une nouvelle fonction La temporisation nous donne le temps de relacirccher le

bouton pour eacuteviter de faire deacutefiler le menu sans le vouloir

Station meacuteteacuteo autonome 2012

27

B La simulation

Etant donneacute que nous ne pouvions pas prendre le mateacuteriel avec nous il eacutetait impeacuteratif de

pouvoir faire des simulations Pour cela nous avons utiliseacute un logiciel tregraves utile Proteus ISIS Ce

logiciel possegravede une tregraves grande librairie et permet de rentrer nos programmes sur le PIC virtuel

geacuteneacutereacute par le logiciel Pour simuler le capteur drsquohumiditeacute nous avons utiliseacute un potentiomegravetre Pour

celui de lrsquoaneacutemomegravetre comme pour nos mesures nous avons brancheacute virtuellement un GBF sur la

borne associeacute et observeacute son signal agrave lrsquoaide drsquoun oscilloscope

Voilagrave un aperccedilu de la simulation effectueacute sur ISIS

Veacuterification theacuteorique du vent

Vitesse du vent = 0179 37 + 0629

Vitesse du vent = 7657ms

Veacuterification theacuteorique de lrsquohumiditeacute

H= (315-081)0031

H=7548

Veacuterification theacuteorique de la

tempeacuterature

La valeur afficheacutee correspond bien

aux 27degC seacutelectionneacute sur le capteur

Station meacuteteacuteo autonome 2012

28

XI Transmission des donneacutees par liaison ZigBee

ZigBee est un protocole de haut niveau permettant la communication de petites radios agrave

consommation reacuteduite baseacutee sur le standard IEEE 802154

Cette technologie a pour but la communication de courte distance telle que le propose deacutejagrave

la technologie Bluetooth tout en eacutetant moins chegravere plus simple et avec une fiabiliteacute assez eacuteleveacutee

Dans notre projet nous nous servirons de ZigBee pour permettre une transmission par ondes

de nos donneacutees de la station meacuteteacuteo vers un ordinateur Pour cela nous avons 2 modules Xbee pro 2

platines drsquointerfaces une avec des pattes (liaison platine) et lrsquoautre avec une sortie RS232 (liaison pc)

Caracteacuteristique eacutelectrique

Les signaux Xbee ont une amplitude de 33V mais sont alimenteacutes en 5V (tension de notre

source USB) cacircbleacutes sur la bornes VIN (laquo Power input from 6-12Vdc 300mA or higher raquo) Mais

notre source nrsquoeacutetant pas assez puissante pour alimenter toute notre installation Nous utiliserons

donc une source externe de 5V qui sera utiliseacutee pour alimenter les 2 systegravemes Xbee

Description des Bornes du Xbee qui nous inteacuteresse

Station meacuteteacuteo autonome 2012

29

A Scheacutema eacutelectrique du module Xbee

Nous avons cacircbleacute la sortie TX du microcontrocircleur qui eacutemet un signal jusqursquoagrave la borne RX du

Xbee qui reacuteceptionne ce signal Apregraves la transmission se fait par onde entre les 2 modules Xbee Pour

le module qui reccediloit le signal un cacircble RS232 suffit agrave faire la liaison entre celui-ci et le PC

B Envoi des donneacutees la liaison Usart

Un USART (Universal synchronous amp Asynchronous Receiver Transmitter) est un eacutemetteur-

reacutecepteur universel En langage courant cest le composant utiliseacute pour faire la liaison entre

lordinateur et le port seacuterie Lordinateur envoie les donneacutees en parallegravele (autant de fils que de bits

de donneacutees) Il faut donc transformer ces donneacutees pour les faire passer agrave travers une liaison seacuterie qui

utilise un mecircme fil pour faire passer tous les bits de donneacutees

Constitution dune trame USART

un bit de start toujours agrave 0 servant agrave la synchronisation du reacutecepteur

les donneacutees la taille peut varier (geacuteneacuteralement entre 5 et 9 bits)

eacuteventuellement un bit de pariteacute paire ou impaire

et un bit de stop toujours agrave 1 (la dureacutee peut varier entre 1 15 et 2 temps bit)

Le niveau logique de repos est le 1

Figure 14 Trame USART

Station meacuteteacuteo autonome 2012

30

Afin de faciliter les liaisons entre peacuteripheacuteriques (PC microcontrocircleur modem hellip) des vitesses

de transmission sont normaliseacutees luniteacute baud correspondant agrave un temps bit Dans notre cas nous

choisirons une vitesse de transmission de 9600bps

C Programme drsquoenvoi des donneacutees par liaison Usart

Gracircce agrave la librairie de MikroC il est tregraves facile drsquoenvoyer des donneacutees par liaison Usart Cela

fonctionne comme pour envoyer des caractegraveres sur lrsquoeacutecran LCD Il faut juste ensuite choisir la vitesse

de transmission qui sera 9600bps Voici la fonction et un morceau du programme qui sert agrave envoyer

les caractegraveres sur Xbee et de Xbee agrave un HyperTerminal

Fonction humiditeacute

void humidite(int cond)

long H U VL Deacuteclaration des variables

char HH hum[8] humtxt[]=Humidite

helliphellip

Xbee(8 hum) Envoi la chaicircne de caractegravere hum dans la fonction xbee

Usart

void xbee(int nb char receive[20])

int i

Usart_Init(9600) Vitesse de transmission

for(i=0 ilt=nb i++) Boucle for

Usart_Write(receive[i]) Envoi les caractegraveres sur lrsquoHyperTerminal jusquagrave i

Station meacuteteacuteo autonome 2012

31

XII Estimation du coucirct du projet

On peut voir sur ce tableau que le prix de reviens pour les eacuteleacutements que nous avons utiliseacute

est de 14506euro TTC Ce qui est plutocirct oneacutereux compareacute aux stations meacuteteacuteo du marcheacute qui oscille

entre 6euro et 400euro En sachant que la nocirctre est loin drsquoecirctre finaliseacute (finition estheacutetique ergonomie et

ajout de nouvelle fonction comme la date et lrsquoheure)

Composant Quantiteacute Prix (TVA inclus) Liens Quartz 20000MHz 1 111 euro Lien

Capaciteacute 22pF 2 010 euro lien

PIC 16F876 1 427 euro lien

LCD MODULE 1 1575 euro lien

Potentiomegravetre 10KΩ 1 618 euro lien

Reacutesistance 33 Ω 1 035 euro lien

Reacutesistance 10 K Ω 2 070 euro lien

Reacutesistance 1 KΩ 3 105 euro lien

LED rouge 1 013 euro lien

DS1621 1 650 euro lien

Bouton poussoir 1 060 euro lien

Module Xbee 2 4000 euro lien

Platine dinterface (XBEE) RS232 1 1890 euro lien

Platine dinterface (XBEE) 1 1364 euro lien

Capteur drsquohumiditeacute 1 2692 euro lien

Transistor 1 561 euro lien

Diode 1 325 euro lien

Totales 1 14506 euro

Station meacuteteacuteo autonome 2012

32

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

panelsbut 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 Itrsquos also possible to measure

humidity and wind speed Then itrsquos 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 its 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 Itrsquos 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

Station meacuteteacuteo autonome 2012

33

XIV Conclusion

Ce projet sur la conception drsquoune station meacuteteacuteo autonome qui nous a eacuteteacute confieacute a eacuteteacute tregraves

enrichissant Il nous a permis de mettre en relations les connaissances acquises durant lrsquoanneacutee mais

aussi acqueacuterir de nouvelles connaissances comme le fonctionnement drsquoun microcontrocircleur En effet

nous nrsquoavions jamais programmeacute sur microcontrocircleur Il a fallu srsquoadapter et apprendre agrave utiliser des

nouveaux logiciels tels que Proteus MikroC ainsi que Labview

De cette expeacuterience nous avons aussi appris agrave ecirctre autonome Nous avons saisi que la

compreacutehension des documents techniques et des librairies eacutetait un point essentiel de notre projet

En programmation nous nrsquoavions pas le droit agrave lrsquoerreur car la moindre faute pouvait conduire le

systegraveme agrave un dysfonctionnement Ce projet nous a demandeacute beaucoup de rigueur de patience et de

temps

Toutefois nous nrsquoavons pas eu malheureusement le temps drsquoinstaller le capteur de

tempeacuterature inteacuterieure par manque de temps Plus encore nous aurions aimeacute approfondir certains

points Par exemple pouvoir installer les composants sur circuit imprimeacute et concevoir un support

viable pour en faire une vraie station meacuteteacuteo Lrsquoinstallation drsquoune girouette aurait eacuteteacute appreacuteciable

pour connaicirctre le sens du vent Aussi le programme aurait sans doute pu ecirctre encore ameacutelioreacute pour

de meilleures performances

Malgreacute ce manque de temps nous sommes tregraves satisfaits du fonctionnement de ce module

qui nous a permis de comprendre lrsquoutiliteacute des parties theacuteoriques pour lrsquoapplication et la mise en

œuvre drsquoun systegraveme Lrsquoapproche peacutedagogique de nous diriger vers les solutions sans jamais les

donner de nous laisser un grand degreacute de liberteacute et drsquoautonomie a eacuteteacute au deacutebut assez deacuteroutante

mais tregraves instructif

Enfin nous tenions agrave remercier Mme Leymarie qui nous a suivis et aiguilleacute tout au long de ce

projet

Station meacuteteacuteo autonome 2012

34

XV ANNEXES

Programme complet

Deacuteclaration 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()

deacuteclaration des variables

int cond=0Condition pour laffichage sur leacutecran LCD

int BP=0

Initialisation et affectation des ports

PORTA=0

PORTB=0 initialisation

PORTC=0

TRISB=0 Port B deacuteclarer en sortie

TRISA=0xFF Port A en entreacutee

ADCON1=0x84 Justifieacute agrave droite active RA0RA1RA3 analogique

ADCON0=0x85 Fosc32 sur PA0 en service

TRISB=0 Port B deacuteclarer en sortie

TRISC=0xFFPort C deacuteclarer en entreacutee

Configuration et initialisation de leacutecran LCD

Lcd_Config(ampPORTB 0 1 WR 5 4 3 2) Configure lecran

Lcd_Init(ampPORTB) initialisation du LCD

Lcd_Cmd(Lcd_CURSOR_OFF) Enleve le curseur

Lcd_Cmd(Lcd_CLEAR) Efface lecran

Initialisation du module I2C

I2C_Init(100000)initialisation de la communication I2C

I2C_Start()Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90)Mode de controcircle en mode eacutecriture

I2C_Wr(0xAC)Accegraves au registre de configuration

I2C_Wr(0x0A)Registre de configuration mesure en continu

I2C_Stop()Arrecirct du signal

I2C_Start()Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90)Mode de controcircle en mode eacutecriture

I2C_Wr(0xEE)Deacutebut de la conversion

I2C_Stop()Arrecirct du sigal

Station meacuteteacuteo autonome 2012

35

Configuration du mode capture

T1CON=0x31 Configuration du timer1

CCP1CON=0x05 Paramegravetrage du mode capture

PIE1TMR1IE=1 Autorise les deacutebordements du timer 1

Boucle infinie

while(1)

cond=cond+1Increacutemente la variable cond

switch(BP)

case 0

humidite(ampcond)Appel la fonction humiditeacute

if(PORTAF2==1)Ces if permet de changer la valeur de BP

BP=1

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)Temps quon relacircche bien le bouton

break

case 1

temperature(ampcond)Appel la fonction tempeacuterature

if(PORTAF2==1)

BP=2

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)

break

case 2

vent(ampcond)Appel la fonction vent

if(PORTAF2==1)

BP=0

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)

break

Fonction humiditeacute

void humidite(int cond)

long H U VLDeacuteclaration des variables

char HH hum[8] humtxt[]=Humidite

VL=Adc_read(0) Valeur lue sur RA0(humiditeacute)

U=(VL5000)1023 Convertit la valeur lue en tension x1000

H=(U-810)(0031) Convertit la tension en humiditeacute x1000

Station meacuteteacuteo autonome 2012

36

if(Hgt100000)Si H gt 100(impossible) alors = 100

H=100000

if(Hlt0)Si H lt 0(impossible) alors = 0

H=0

hum[0]=(H100000)+48Valeur des centaines affecteacute en ascii(48=0)

HH=(H10000)10

hum[1]=HH+48Valeur des dizaines affecteacute en ascii

HH=(H1000)10

hum[2]=HH+48Valeur des uniteacutes affecteacute en ascii

hum[3]=44Virgule affecteacute en ascii

HH=(H100)10

hum[4]=HH+48Valeur de la premiegravere deacutecimale affecteacute en ascii

HH=(H10)10

hum[5]=HH+48Valeur de la deuxiegraveme deacutecimale affecteacute en ascii

hum[6]=37Pourcentage affecteacute en ascii

if(cond==50)Appel la fonction LCD tous les 1000

lcd(1 1 8 humtxt)Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 7 hum)Affiche la chaine de caractegravere hum sur le LCD

cond=0Remise a 0 de la condition

Xbee(7 hum) Envoi la chaicircne de caractegravere hum dans la fonction xbee

Fonction tempeacuterature

void temperature(int cond)

char temp[7] temptxt[]=Temperature LSB

signed char MSB

I2C_Start()Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90)Mode de controcircle en mode eacutecriture

I2C_Wr(0xAA)Lecture de la tempeacuterature

I2C_Stop()Arrecirct du sigal

I2C_Start()Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x91)Mode de controcircle en mode lecture

MSB = I2C_Rd(1)Nombre signeacute donnant la tempeacuterature entre +125deg et -55degC

LSB = I2C_Rd(0)Si bit 7 = 1 tempeacuterature MSB +05degC

I2C_Stop()Arrecirct du sigal

if(MSBlt0)

MSB = abs(MSB) Si temperature neacutegative valeur absolue de MSB

Temp[0]=45 Signe - affecteacute en ascii

else

Station meacuteteacuteo autonome 2012

37

Temp[0]=43signe + affecteacute en ascii

Temp[1]=(MSB10)+48 Valeur des dizaines affecteacute en ascii

Temp[2]=(MSB10)+48 Valeur des uniteacutes affecteacute en ascii

Temp[3]=44 Virgule affecteacute en ascii

if (LSB==128) Si bit 7 agrave 1 alors +05deg

Temp[4]=5

else Si bit 7 agrave 0 alors +00deg

Temp[4]=0

Temp[5]=223 degreacute affecteacute en ascii

Temp[6]=67 C affecteacute en ascii

if(cond==50)Appel la fonction LCD tous les 1000

lcd(1 1 11 temptxt)Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 7 temp)Affiche la chaine de caractegravere hum sur le LCD

cond=0Remise a 0 de la condition

Xbee(7 temp) Envoi la chaicircne de caractegravere temp dans la fonction xbee

Fonction vent

void vent(int cond)

unsigned long tl th per

int vitfreq

char vent[13] txtvent[]=Vitesse du vent VV

if(PIR1CCP1IF==1) Test si front montant agrave lieu

TMR1H=0 Initialisation du timer1 bit de point fort

TMR1L=0 Initialisation du timer1 bit de point faible

th=CCPR1H Les valeurs sont copieacute dans des variables

tl=CCPR1L

th=thltlt8 Deacutecalage car th =gt bit de point fort

per = th|tl On concategravene les deux valeurs nous obtenons la peacuteriode

PIR1CCP1IF=0 Remise a 0 du drapeau

if(PIR1TMR1IF==1) Si deacutepassement du timer 1

per=65535+per On ajoute une retenue lorsquon a fait un tour (16bit)

PIR1TMR1IF=0 Remise a 0 du drapeau deacutepassement

Station meacuteteacuteo autonome 2012

38

freq=671310perCalacul de la freacutequence

vit=freq179 + 692Calcul de la vitesse que lon x100

if(vitlt200)En dessous 2ms la mesure est aleacuteatoire agrave cause du 2egraveme deacutebordement

vit=0

vent[0]=(vit10000)+48Valeur des centaines affecteacute en ascii(48=0)

VV=(vit1000)10

vent[1]=VV+48Valeur des dizaines affecteacute en ascii

VV=(vit100)10

vent[2]=VV+48Valeur des uniteacute affecteacute en ascii

VV=(vit10)10

vent[3]=44Virgule affecteacute en ascii

vent[4]=VV+48Valeur de la 1er deacutecimale affecteacute en ascii

VV=vit10

vent[5]=VV+48Valeur de la 2egraveme deacutecimale affecteacute en ascii

vent[6]=109m affecteacute en ascii

vent[7]=47 affecteacute en ascii

vent[8]=115s affecteacute en ascii

if(cond==50)Appel la fonction LCD tous les 1000

lcd(1 1 15 txtvent)Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 9 vent)Affiche la chaine de caractegravere hum sur le LCD

cond=0Remise a 0 de la condition

Xbee(9 vent) Envoi la chaicircne de caractegravere vent dans la fonction xbee

Fonction affichage

void lcd(int li int co int nb char receive[15])

int i

for(i=0 iltnb i++)Boucle for

Lcd_chr(li (co+i) receive[i])Affiche les caractegraveres jusquagrave i

Usart

void xbee(int nb char receive[15])

int i

Usart_Init(9600)Vitesse de transmission

for(i=0 iltnb i++)Boucle for

Usart_Write(receive[i])Envoi les caractegraveres sur lHyperTerminal jusquagrave i

Station meacuteteacuteo autonome 2012

17

C Le scheacutema du microcontrocircleur avec le capteur de tempeacuterature

Voici le scheacutema du capteur de tempeacuterature uniquement Le capteur est brancheacute sur les

borne SCL(RC3) et SDA(RC4) du PIC Qursquoelles soient deacuteclareacutees en entreacutee ou en sortie les bornes SCL et

SDA sont fonctionnelles Il ne faut pas oublier les reacutesistances de tirages (R1 et R3) Lrsquoadressage A0 A1

A2 toutes misent agrave la masse car nous nrsquoavons qursquoun seul capteur I2C relieacute au PIC et le Tout

(thermostat) inutile car nous faisons juste un releveacute de tempeacuterature

D Programme pour la mesure de la tempeacuterature

Deacuteclaration des fonctions

void temperature(int cond)

void lcd(int li int co int nb char receive[14])

void main()

deacuteclaration des variables

int cond=0Condition pour laffichage sur leacutecran LCD

Initialisation et affectation des ports

PORTB=0 initialisation

PORTC=0

TRISB=0 Port B deacuteclarer en sortie

TRISC = 0xFF Port C en entreacutee

Configuration et initialisation de leacutecran LCD

Lcd_Config(ampPORTB 0 1 WR 5 4 3 2) Configure leacutecran

Lcd_Init(ampPORTB) initialisation du LCD

Lcd_Cmd(Lcd_CURSOR_OFF) Enlegraveve le curseur

Lcd_Cmd(Lcd_CLEAR) Efface leacutecran

Initialisation du module I2C

I2C_Init(100000) initialisation de la communication I2C

I2C_Start() Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90) Mode de controcircle en mode eacutecriture

I2C_Wr(0xAC) Accegraves au registre de configuration

I2C_Wr(0x0A) Registre de configuration mesure en continu

I2C_Stop() Arrecirct du signal

I2C_Start() Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90) Mode de controcircle en mode eacutecriture

Figure 10 Scheacutema de cacircblage avec le capteur de tempeacuterature

Station meacuteteacuteo autonome 2012

18

I2C_Wr(0xEE) Deacutebut de la conversion

I2C_Stop()Arrecirct du sigal

Boucle infinie

while(1)

cond=cond+1 Increacutemente la variable cond

temperature(ampcond) Appel la fonction humiditeacute

Fonction tempeacuterature

void temperature(int cond)

char temp[7] temptxt[]=Temperature LSB

signed char MSB

I2C_Start() Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90) Mode de controcircle en mode eacutecriture

I2C_Wr(0xAA) Lecture de la tempeacuterature

I2C_Stop() Arrecirct du signal

I2C_Start() Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x91) Mode de controcircle en mode lecture

MSB = I2C_Rd(1) Nombre signeacute donnant la tempeacuterature entre +125deg et -55degC

LSB = I2C_Rd(0) Si bit 7 = 1 tempeacuterature MSB +05degC

I2C_Stop() Arrecirct du signal

if(MSBlt0)

MSB = abs(MSB) Si tempeacuterature neacutegative valeur absolue de MSB

Temp[0]=45 Signe - affecteacute en ascii

else

Temp[0]=43 signe + affecteacute en ascii

Temp[1]=(MSB10)+48 Valeur des dizaines affecteacute en ascii

Temp[2]=(MSB10)+48 Valeur des uniteacutes affecteacute en ascii

Temp[3]=44 Virgule affecteacute en ascii

if (LSB==128) Si bit 7 agrave 1 alors +05deg

Temp[4]=5

Else Si bit 7 agrave 0 alors +00deg

Temp[4]=0

Temp[5]=223 degreacute affecteacute en ascii

Temp[6]=67 C affecteacute en ascii

if(cond==10) Appel la fonction LCD tous les 1000

lcd(1 1 13 temptxt) Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 6 temp) Affiche la chaine de caractegravere hum sur le LCD

cond=0 Remise a 0 de la condition

Fonction affichage

void lcd(int li int co int nb char receive[14])

int i

for(i=0 ilt=nb i++)Boucle for

Lcd_chr(li (co+i) receive[i]) Affiche les caractegraveres jusquagrave i

Le scheacutema preacuteceacutedent est bien respecteacute comme on peut le voir crsquoest tregraves facile agrave programmer

gracircce aux librairies I2C du logiciel MikroC

Station meacuteteacuteo autonome 2012

19

IX Lrsquoaneacutemomegravetre

A Conception

Pour lrsquoaneacutemomegravetre lrsquoeacutequipe peacutedagogique

nous a juste fourni lrsquoheacutelice du capteur donc il a fallu

concevoir toute la partie eacutelectronique Lrsquoideacutee est

drsquoinstaller une diode et un transistor photonique par

de lagrave lrsquoheacutelice et lorsqursquoelle tourne elle vient couper le

faisceau Succinctement le transistor envoit soit 1 soit

0 sur le PIC Le but est de relever la freacutequence agrave

laquelle tourne lrsquoheacutelice puis la convertir en vitesse (cf

figure 11)

La photodiode choisie est de reacutefeacuterence SD5455-3 Ce choix a eacuteteacute fait car lrsquoangle du faisceau

est de 20deg pour que le flux infrarouge soit bien concentreacute sur le phototransistor pour un

fonctionnement optimal

Comme on le voit sur le scheacutema de principe (cf figure 11) il a fallu dimensionner la

reacutesistance qui sert agrave reacuteguler le courant qui circule dans la LED avec les informations donneacutees par la

documentation technique nous avons pu la calculer

Forward voltage VF = 17V et IF = 01A

Ualim = 5V

RD = (Ualim ndash UF)IF = (5 ndash 17)01

RD = 33Ω

Pour le phototransistor nous avons choisi celui qui allait avec la diode de reacutefeacuterence SE5455-3

Cette fois la valeur de la reacutesistance nous eacutetait donneacute par le constructeur

RL=1000Ω

Lors des seacuteances nous avons implanteacute la diode et le

transistor sur le support du capteur Pour des raisons

pratiques et estheacutetiques nous avons seacutepareacute la partie

aneacutemomegravetre et la partie platine par des borniers (cf figure

12)

Figure 11 scheacutema descriptif de laneacutemomegravetre

Figure 12 Notre aneacutemomegravetre

Station meacuteteacuteo autonome 2012

20

B Mesure de la peacuteriode sur le microcontrocircleur

Le but est de relever la peacuteriode du signal envoyer par lrsquoaneacutemomegravetre pour cela le PIC est

eacutequipeacute drsquoun mode capture Le principe est de recopier agrave un moment voulu la valeur du timer 1 La

capture peut avoir lieux agrave chaque front descendant agrave chaque front montant tous les 4 ou tous les 16

fronts montants Quand la capture a eu lieu un flag est mis agrave 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 constitueacute de 2 registres de 8 bits TMR1H et TMR1L que lon peut lire ou eacutecrire Le registre TMR1

(constitueacute de TMR1H et TMR1L) sincreacutemente de h0000 jusquagrave hFFFF et repasse ensuite agrave h0000

pour continuer le comptage Quand il y a deacutebordement une interruption peut ecirctre geacuteneacutereacutee si on lrsquoa

autoriseacutee par TMR1IE =1 (bit 0 de PIE1) et le Flag TMR1IF (bit 0 de PIR1) passe agrave 1 Le controcircle du

timer 1 ce fait par le registre T1CON

Bit 7 et bit 6 bits non impleacutementeacutes

Bit 5 et bit 4 T1CKPS = Seacutelection du preacute diviseur placeacute avant le TIMER

Vu qursquoon a un quartz eacuteleveacute nous avons deacutecideacute de choisir un preacute-diviseur de 8 donc

F=Fosc(48) Pour cela mettre les bit 4 et 5 agrave 1

Bit 3 T1OSCEN Bit dautorisation de loscillateur du Timer 1

1 = oscillateur autoriseacute

0 = oscillateur stoppeacute

Oscillateur interne inutile donc bit 3 agrave 0

Bit 2 T1SYNC Bit de controcircle de la synchronisation du CLK externe

1 = Pas de synchronisation de lhorloge externe

0 = Synchronisation de lhorloge externe

Nous nous mettrons en mode synchrone

Bit1 TMR1CS Bit de seacutelection de la source horloge

1 = Mode Compteur Clk externe sur la broche PC0 ou Quartz entre PC0 et PC1

0 = Mode Timer Clk interne = Fosc4

Station meacuteteacuteo autonome 2012

21

On mettra ce bit agrave 0 car on utilise le mode Timer

Bit 0 TMR1ON Bit dautorisation du Timer 1

1 = Timer 1 en service

0 = Timer 1 stoppeacute

Il faut eacutevidemment mettre la timer 1 en service

Nous avons aussi autoriseacute le deacutebordement du timer 1 pour avoir plus de preacutecisions pour cela il faut

mettre la commande PIE1TMR1 agrave 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 parameacutetrer le registre

CCP1CON

Bit 7 et Bit 6 bits non impleacutementeacutes

Bit 5 et Bit 4 CCP1X et CCP1Y

Bits non utiliseacutes 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 agrave Bit 0 CCP1M3 agrave CCP1M0 bits de seacutelection du mode

Nous avons seacutelectionneacute le mode capture sur chaque front montant Pour cela nous avons

mis les bits 1 et 3 agrave 0 et les bits 0 et 2 agrave 1

Pour savoir si un front montant agrave eu lieu le flag CCP1F est mis agrave 1 Ce flag doit ecirctre remis agrave 0 par

lrsquoutilisateur La valeur des 16 bits des registres du Timer 1 TMR1L (bit de poids faible) et TMR1H (bit

de poids fort) sont recopieacutees dans les registres CCPR1 CCPRIH (bit de poids faible) et CCPR1L (bit de

poids fort)

Nous avons programmeacute le mode capture de faccedilon agrave afficher sur lrsquoeacutecran LCD la valeur du registre

CCPR1 crsquoest-agrave-dire la peacuteriode du signal de lrsquoaneacutemomegravetre Il ne nous reste maintenant plus qursquoagrave

eacutetalonner notre aneacutemomegravetre

Station meacuteteacuteo autonome 2012

22

C Etalonnage de lrsquoaneacutemomegravetre

Pour eacutetalonner le capteur nous avons commenceacute par savoir agrave quelle freacutequence correspond la

valeur releveacutee par le mode capture Pour cela nous avons brancheacute un GBF agrave la place du capteur et

avec un oscilloscope nous avons compareacute leurs valeurs

Nous avons ensuite traceacute agrave lrsquoaide des valeurs du tableau la courbe F(Hz) en fonction du

compteur De cette courbe nous relevons lrsquoeacutequation

F = 671310compteur^(-101)

Soit environ F = 671310compteur

Puis nous avons brancheacute notre aneacutemomegravetre sur le microcontrocircleur Cela dans le but de

relever sa peacuteriode sur lrsquoeacutecran LCD agrave lrsquoaide drsquoune soufflerie variable et du manomegravetre GDH (reacutef

121552 200-13) nous avons compareacute leurs valeurs pour connaitre lrsquoeacutetalonnage de notre capteur

Nous avons noteacute plusieurs valeurs puis traceacute diffeacuterentes courbe pour trouver les eacutequations qui nous

permettrons de calculer la vitesse dans notre programme

Station meacuteteacuteo autonome 2012

23

Voici les valeurs que nous avons releveacutees puis la courbe traceacutee sur Excel

De cette courbe nous obtenons lrsquoeacutequation

Vitesse du vent = 0179F + 0629

Nous les multiplierons par 100 pour reacutecupeacuterer les deacutecimales et les implanter dans une chaine

de caractegravere

Vitesse du vent = 179F + 629

Nous avons agrave preacutesent agrave notre disposition toutes les eacutequations neacutecessaires pour pouvoir

convertir la valeur releveacutee par le mode capture en une vitesse

D Le scheacutema du microcontrocircleur avec lrsquoaneacutemomegravetre

On voit sur le scheacutema que le capteur est bien relieacute sur la borne RC2 Nous avons aussi

repreacutesenteacute les borniers J1 et J2 A droite tous ce qui est sur le support et agrave gauche tous ce qui est sur

la platine

Figure 13 Scheacutema avec laneacutemomegravetre

Station meacuteteacuteo autonome 2012

24

E Programme pour la mesure de la vitesse du vent

Voici le programme pour mesurer la vitesse du vent avec les affectations deacutecrites ci-dessus

ainsi que les eacutequations de conversions

Deacuteclaration des fonctions

void vent(int cond)

void lcd(int li int co int nb char receive[20])

void main()

deacuteclaration des variables

int cond=0

Initialisation et affectation des ports

PORTB=0 initialisation

PORTC=0 initialisation

TRISC=0x04 Port C deacuteclarer en sortie sauf RC2 en mode capture

TRISB=0 Port B deacuteclarer en sortie

Configuration du mode capture

T1CON=0x31 Configuration du timer1

CCP1CON=0x05 Parameacutetrage du mode capture

PIE1TMR1IE=1 Autorise les deacutebordements du timer 1

Configuration et initialisation de leacutecran LCD

Lcd_Config(ampPORTB 0 1 WR 5 4 3 2) Configure leacutecran

Lcd_Init(ampPORTB) Initialisation du LCD

Lcd_Cmd(Lcd_CURSOR_OFF) Enlegraveve le curseur

Lcd_Cmd(Lcd_CLEAR) Efface leacutecran

Boucle infinie

while(1)

cond=cond+1

vent(ampcond)

Fonction vent

void vent(int cond)

unsigned long tl th per

int vitfreq

char vent[13] txtvent[]=vitesse du vent VV

if(PIR1CCP1IF==1) Test si front montant agrave lieu

TMR1H=0 Initialisation du timer1 bit de point fort

TMR1L=0 Initialisation du timer1 bit de point faible

th=CCPR1H Les valeurs sont copieacute dans des variables

tl=CCPR1L

th=thltlt8 Deacutecalage car th =gt bit de point fort

per = th|tl On concategravene les deux valeurs nous obtenons la peacuteriode

PIR1CCP1IF=0 Remise a 0 du drapeau

if(PIR1TMR1IF==1) Si deacutepassement du timer 1

per=65535+per On ajoute une retenue lorsquon a fait un tour (16bit)

PIR1TMR1IF=0 Remise a 0 du drapeau deacutepassement

freq=671310per Calcul de la freacutequence

vit=freq179 + 692 Calcul de la vitesse que lon x100

Station meacuteteacuteo autonome 2012

25

if(vitlt200) En dessous 2ms la mesure est aleacuteatoire agrave cause du 2egraveme deacutebordement

vit=0

vent[0]=(vit10000)+48 Valeur des centaines affecteacute en ascii(48=0)

VV=(vit1000)10

vent[1]=VV+48 Valeur des dizaines affecteacute en ascii

VV=(vit100)10

vent[2]=VV+48 Valeur des uniteacute affecteacute en ascii

VV=(vit10)10

vent[3]=44 Virgule affecteacute en ascii

vent[4]=VV+48 Valeur de la 1er deacutecimale affecteacute en ascii

VV=vit10

vent[5]=VV+48 Valeur de la 2egraveme deacutecimale affecteacute en ascii

vent[6]=109 m affecteacute en ascii

vent[7]=47 affecteacute en ascii

vent[8]=115 s affecteacute en ascii

if(cond==1000) Appel la fonction LCD tous les 1000

lcd(1 1 16 txtvent) Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 8 vent) Affiche la chaine de caractegravere hum sur le LCD

cond=0 Remise a 0 de la condition

Fonction affichage

void lcd(int li int co int nb char receive[20])

int i

for(i=0 ilt=nb i++) Boucle for

Lcd_chr(li (co+i) receive[i]) Affiche les caractegraveres jusquagrave i

Station meacuteteacuteo autonome 2012

26

X Simulation une station meacuteteacuteo autonome

Maintenant que tous nos capteurs sont installeacutes nous allons mettre agrave profit le bouton

poussoir installeacute dans la partie LCD Crsquoest-agrave-dire que nous allons rassembler tous les programmes

preacuteceacutedents pour nrsquoen faire qursquoun Il suffira drsquoappuyer sur le bouton poussoir pour faire deacutefiler les

diffeacuterentes valeurs comme une vraie station meacuteteacuteo

A La structure du programme

Boucle infinie

while(1)

cond=cond+1 Increacutemente la variable cond

switch(BP)

case 0

humidite(ampcond) Appel la fonction humiditeacute

if(PORTAF2==1) Ces if permet de changer la valeur de BP

BP=1

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250) Temps quon relacircche bien le bouton

break

case 1

temperature(ampcond) Appel la fonction tempeacuterature

if(PORTAF2==1)

BP=2

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)

break

case 2

vent(ampcond) Appel la fonction vent

if(PORTAF2==1)

BP=0

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)

break

Nous avons choisi drsquoutiliser un Switch nous avons donc juste rajouteacute une variable BP

Lorsqursquoil y a appui sur le bouton poussoir la variable BP srsquoincreacutemente et le programme passe agrave une

autre case et donc utilise une nouvelle fonction La temporisation nous donne le temps de relacirccher le

bouton pour eacuteviter de faire deacutefiler le menu sans le vouloir

Station meacuteteacuteo autonome 2012

27

B La simulation

Etant donneacute que nous ne pouvions pas prendre le mateacuteriel avec nous il eacutetait impeacuteratif de

pouvoir faire des simulations Pour cela nous avons utiliseacute un logiciel tregraves utile Proteus ISIS Ce

logiciel possegravede une tregraves grande librairie et permet de rentrer nos programmes sur le PIC virtuel

geacuteneacutereacute par le logiciel Pour simuler le capteur drsquohumiditeacute nous avons utiliseacute un potentiomegravetre Pour

celui de lrsquoaneacutemomegravetre comme pour nos mesures nous avons brancheacute virtuellement un GBF sur la

borne associeacute et observeacute son signal agrave lrsquoaide drsquoun oscilloscope

Voilagrave un aperccedilu de la simulation effectueacute sur ISIS

Veacuterification theacuteorique du vent

Vitesse du vent = 0179 37 + 0629

Vitesse du vent = 7657ms

Veacuterification theacuteorique de lrsquohumiditeacute

H= (315-081)0031

H=7548

Veacuterification theacuteorique de la

tempeacuterature

La valeur afficheacutee correspond bien

aux 27degC seacutelectionneacute sur le capteur

Station meacuteteacuteo autonome 2012

28

XI Transmission des donneacutees par liaison ZigBee

ZigBee est un protocole de haut niveau permettant la communication de petites radios agrave

consommation reacuteduite baseacutee sur le standard IEEE 802154

Cette technologie a pour but la communication de courte distance telle que le propose deacutejagrave

la technologie Bluetooth tout en eacutetant moins chegravere plus simple et avec une fiabiliteacute assez eacuteleveacutee

Dans notre projet nous nous servirons de ZigBee pour permettre une transmission par ondes

de nos donneacutees de la station meacuteteacuteo vers un ordinateur Pour cela nous avons 2 modules Xbee pro 2

platines drsquointerfaces une avec des pattes (liaison platine) et lrsquoautre avec une sortie RS232 (liaison pc)

Caracteacuteristique eacutelectrique

Les signaux Xbee ont une amplitude de 33V mais sont alimenteacutes en 5V (tension de notre

source USB) cacircbleacutes sur la bornes VIN (laquo Power input from 6-12Vdc 300mA or higher raquo) Mais

notre source nrsquoeacutetant pas assez puissante pour alimenter toute notre installation Nous utiliserons

donc une source externe de 5V qui sera utiliseacutee pour alimenter les 2 systegravemes Xbee

Description des Bornes du Xbee qui nous inteacuteresse

Station meacuteteacuteo autonome 2012

29

A Scheacutema eacutelectrique du module Xbee

Nous avons cacircbleacute la sortie TX du microcontrocircleur qui eacutemet un signal jusqursquoagrave la borne RX du

Xbee qui reacuteceptionne ce signal Apregraves la transmission se fait par onde entre les 2 modules Xbee Pour

le module qui reccediloit le signal un cacircble RS232 suffit agrave faire la liaison entre celui-ci et le PC

B Envoi des donneacutees la liaison Usart

Un USART (Universal synchronous amp Asynchronous Receiver Transmitter) est un eacutemetteur-

reacutecepteur universel En langage courant cest le composant utiliseacute pour faire la liaison entre

lordinateur et le port seacuterie Lordinateur envoie les donneacutees en parallegravele (autant de fils que de bits

de donneacutees) Il faut donc transformer ces donneacutees pour les faire passer agrave travers une liaison seacuterie qui

utilise un mecircme fil pour faire passer tous les bits de donneacutees

Constitution dune trame USART

un bit de start toujours agrave 0 servant agrave la synchronisation du reacutecepteur

les donneacutees la taille peut varier (geacuteneacuteralement entre 5 et 9 bits)

eacuteventuellement un bit de pariteacute paire ou impaire

et un bit de stop toujours agrave 1 (la dureacutee peut varier entre 1 15 et 2 temps bit)

Le niveau logique de repos est le 1

Figure 14 Trame USART

Station meacuteteacuteo autonome 2012

30

Afin de faciliter les liaisons entre peacuteripheacuteriques (PC microcontrocircleur modem hellip) des vitesses

de transmission sont normaliseacutees luniteacute baud correspondant agrave un temps bit Dans notre cas nous

choisirons une vitesse de transmission de 9600bps

C Programme drsquoenvoi des donneacutees par liaison Usart

Gracircce agrave la librairie de MikroC il est tregraves facile drsquoenvoyer des donneacutees par liaison Usart Cela

fonctionne comme pour envoyer des caractegraveres sur lrsquoeacutecran LCD Il faut juste ensuite choisir la vitesse

de transmission qui sera 9600bps Voici la fonction et un morceau du programme qui sert agrave envoyer

les caractegraveres sur Xbee et de Xbee agrave un HyperTerminal

Fonction humiditeacute

void humidite(int cond)

long H U VL Deacuteclaration des variables

char HH hum[8] humtxt[]=Humidite

helliphellip

Xbee(8 hum) Envoi la chaicircne de caractegravere hum dans la fonction xbee

Usart

void xbee(int nb char receive[20])

int i

Usart_Init(9600) Vitesse de transmission

for(i=0 ilt=nb i++) Boucle for

Usart_Write(receive[i]) Envoi les caractegraveres sur lrsquoHyperTerminal jusquagrave i

Station meacuteteacuteo autonome 2012

31

XII Estimation du coucirct du projet

On peut voir sur ce tableau que le prix de reviens pour les eacuteleacutements que nous avons utiliseacute

est de 14506euro TTC Ce qui est plutocirct oneacutereux compareacute aux stations meacuteteacuteo du marcheacute qui oscille

entre 6euro et 400euro En sachant que la nocirctre est loin drsquoecirctre finaliseacute (finition estheacutetique ergonomie et

ajout de nouvelle fonction comme la date et lrsquoheure)

Composant Quantiteacute Prix (TVA inclus) Liens Quartz 20000MHz 1 111 euro Lien

Capaciteacute 22pF 2 010 euro lien

PIC 16F876 1 427 euro lien

LCD MODULE 1 1575 euro lien

Potentiomegravetre 10KΩ 1 618 euro lien

Reacutesistance 33 Ω 1 035 euro lien

Reacutesistance 10 K Ω 2 070 euro lien

Reacutesistance 1 KΩ 3 105 euro lien

LED rouge 1 013 euro lien

DS1621 1 650 euro lien

Bouton poussoir 1 060 euro lien

Module Xbee 2 4000 euro lien

Platine dinterface (XBEE) RS232 1 1890 euro lien

Platine dinterface (XBEE) 1 1364 euro lien

Capteur drsquohumiditeacute 1 2692 euro lien

Transistor 1 561 euro lien

Diode 1 325 euro lien

Totales 1 14506 euro

Station meacuteteacuteo autonome 2012

32

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

panelsbut 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 Itrsquos also possible to measure

humidity and wind speed Then itrsquos 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 its 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 Itrsquos 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

Station meacuteteacuteo autonome 2012

33

XIV Conclusion

Ce projet sur la conception drsquoune station meacuteteacuteo autonome qui nous a eacuteteacute confieacute a eacuteteacute tregraves

enrichissant Il nous a permis de mettre en relations les connaissances acquises durant lrsquoanneacutee mais

aussi acqueacuterir de nouvelles connaissances comme le fonctionnement drsquoun microcontrocircleur En effet

nous nrsquoavions jamais programmeacute sur microcontrocircleur Il a fallu srsquoadapter et apprendre agrave utiliser des

nouveaux logiciels tels que Proteus MikroC ainsi que Labview

De cette expeacuterience nous avons aussi appris agrave ecirctre autonome Nous avons saisi que la

compreacutehension des documents techniques et des librairies eacutetait un point essentiel de notre projet

En programmation nous nrsquoavions pas le droit agrave lrsquoerreur car la moindre faute pouvait conduire le

systegraveme agrave un dysfonctionnement Ce projet nous a demandeacute beaucoup de rigueur de patience et de

temps

Toutefois nous nrsquoavons pas eu malheureusement le temps drsquoinstaller le capteur de

tempeacuterature inteacuterieure par manque de temps Plus encore nous aurions aimeacute approfondir certains

points Par exemple pouvoir installer les composants sur circuit imprimeacute et concevoir un support

viable pour en faire une vraie station meacuteteacuteo Lrsquoinstallation drsquoune girouette aurait eacuteteacute appreacuteciable

pour connaicirctre le sens du vent Aussi le programme aurait sans doute pu ecirctre encore ameacutelioreacute pour

de meilleures performances

Malgreacute ce manque de temps nous sommes tregraves satisfaits du fonctionnement de ce module

qui nous a permis de comprendre lrsquoutiliteacute des parties theacuteoriques pour lrsquoapplication et la mise en

œuvre drsquoun systegraveme Lrsquoapproche peacutedagogique de nous diriger vers les solutions sans jamais les

donner de nous laisser un grand degreacute de liberteacute et drsquoautonomie a eacuteteacute au deacutebut assez deacuteroutante

mais tregraves instructif

Enfin nous tenions agrave remercier Mme Leymarie qui nous a suivis et aiguilleacute tout au long de ce

projet

Station meacuteteacuteo autonome 2012

34

XV ANNEXES

Programme complet

Deacuteclaration 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()

deacuteclaration des variables

int cond=0Condition pour laffichage sur leacutecran LCD

int BP=0

Initialisation et affectation des ports

PORTA=0

PORTB=0 initialisation

PORTC=0

TRISB=0 Port B deacuteclarer en sortie

TRISA=0xFF Port A en entreacutee

ADCON1=0x84 Justifieacute agrave droite active RA0RA1RA3 analogique

ADCON0=0x85 Fosc32 sur PA0 en service

TRISB=0 Port B deacuteclarer en sortie

TRISC=0xFFPort C deacuteclarer en entreacutee

Configuration et initialisation de leacutecran LCD

Lcd_Config(ampPORTB 0 1 WR 5 4 3 2) Configure lecran

Lcd_Init(ampPORTB) initialisation du LCD

Lcd_Cmd(Lcd_CURSOR_OFF) Enleve le curseur

Lcd_Cmd(Lcd_CLEAR) Efface lecran

Initialisation du module I2C

I2C_Init(100000)initialisation de la communication I2C

I2C_Start()Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90)Mode de controcircle en mode eacutecriture

I2C_Wr(0xAC)Accegraves au registre de configuration

I2C_Wr(0x0A)Registre de configuration mesure en continu

I2C_Stop()Arrecirct du signal

I2C_Start()Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90)Mode de controcircle en mode eacutecriture

I2C_Wr(0xEE)Deacutebut de la conversion

I2C_Stop()Arrecirct du sigal

Station meacuteteacuteo autonome 2012

35

Configuration du mode capture

T1CON=0x31 Configuration du timer1

CCP1CON=0x05 Paramegravetrage du mode capture

PIE1TMR1IE=1 Autorise les deacutebordements du timer 1

Boucle infinie

while(1)

cond=cond+1Increacutemente la variable cond

switch(BP)

case 0

humidite(ampcond)Appel la fonction humiditeacute

if(PORTAF2==1)Ces if permet de changer la valeur de BP

BP=1

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)Temps quon relacircche bien le bouton

break

case 1

temperature(ampcond)Appel la fonction tempeacuterature

if(PORTAF2==1)

BP=2

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)

break

case 2

vent(ampcond)Appel la fonction vent

if(PORTAF2==1)

BP=0

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)

break

Fonction humiditeacute

void humidite(int cond)

long H U VLDeacuteclaration des variables

char HH hum[8] humtxt[]=Humidite

VL=Adc_read(0) Valeur lue sur RA0(humiditeacute)

U=(VL5000)1023 Convertit la valeur lue en tension x1000

H=(U-810)(0031) Convertit la tension en humiditeacute x1000

Station meacuteteacuteo autonome 2012

36

if(Hgt100000)Si H gt 100(impossible) alors = 100

H=100000

if(Hlt0)Si H lt 0(impossible) alors = 0

H=0

hum[0]=(H100000)+48Valeur des centaines affecteacute en ascii(48=0)

HH=(H10000)10

hum[1]=HH+48Valeur des dizaines affecteacute en ascii

HH=(H1000)10

hum[2]=HH+48Valeur des uniteacutes affecteacute en ascii

hum[3]=44Virgule affecteacute en ascii

HH=(H100)10

hum[4]=HH+48Valeur de la premiegravere deacutecimale affecteacute en ascii

HH=(H10)10

hum[5]=HH+48Valeur de la deuxiegraveme deacutecimale affecteacute en ascii

hum[6]=37Pourcentage affecteacute en ascii

if(cond==50)Appel la fonction LCD tous les 1000

lcd(1 1 8 humtxt)Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 7 hum)Affiche la chaine de caractegravere hum sur le LCD

cond=0Remise a 0 de la condition

Xbee(7 hum) Envoi la chaicircne de caractegravere hum dans la fonction xbee

Fonction tempeacuterature

void temperature(int cond)

char temp[7] temptxt[]=Temperature LSB

signed char MSB

I2C_Start()Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90)Mode de controcircle en mode eacutecriture

I2C_Wr(0xAA)Lecture de la tempeacuterature

I2C_Stop()Arrecirct du sigal

I2C_Start()Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x91)Mode de controcircle en mode lecture

MSB = I2C_Rd(1)Nombre signeacute donnant la tempeacuterature entre +125deg et -55degC

LSB = I2C_Rd(0)Si bit 7 = 1 tempeacuterature MSB +05degC

I2C_Stop()Arrecirct du sigal

if(MSBlt0)

MSB = abs(MSB) Si temperature neacutegative valeur absolue de MSB

Temp[0]=45 Signe - affecteacute en ascii

else

Station meacuteteacuteo autonome 2012

37

Temp[0]=43signe + affecteacute en ascii

Temp[1]=(MSB10)+48 Valeur des dizaines affecteacute en ascii

Temp[2]=(MSB10)+48 Valeur des uniteacutes affecteacute en ascii

Temp[3]=44 Virgule affecteacute en ascii

if (LSB==128) Si bit 7 agrave 1 alors +05deg

Temp[4]=5

else Si bit 7 agrave 0 alors +00deg

Temp[4]=0

Temp[5]=223 degreacute affecteacute en ascii

Temp[6]=67 C affecteacute en ascii

if(cond==50)Appel la fonction LCD tous les 1000

lcd(1 1 11 temptxt)Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 7 temp)Affiche la chaine de caractegravere hum sur le LCD

cond=0Remise a 0 de la condition

Xbee(7 temp) Envoi la chaicircne de caractegravere temp dans la fonction xbee

Fonction vent

void vent(int cond)

unsigned long tl th per

int vitfreq

char vent[13] txtvent[]=Vitesse du vent VV

if(PIR1CCP1IF==1) Test si front montant agrave lieu

TMR1H=0 Initialisation du timer1 bit de point fort

TMR1L=0 Initialisation du timer1 bit de point faible

th=CCPR1H Les valeurs sont copieacute dans des variables

tl=CCPR1L

th=thltlt8 Deacutecalage car th =gt bit de point fort

per = th|tl On concategravene les deux valeurs nous obtenons la peacuteriode

PIR1CCP1IF=0 Remise a 0 du drapeau

if(PIR1TMR1IF==1) Si deacutepassement du timer 1

per=65535+per On ajoute une retenue lorsquon a fait un tour (16bit)

PIR1TMR1IF=0 Remise a 0 du drapeau deacutepassement

Station meacuteteacuteo autonome 2012

38

freq=671310perCalacul de la freacutequence

vit=freq179 + 692Calcul de la vitesse que lon x100

if(vitlt200)En dessous 2ms la mesure est aleacuteatoire agrave cause du 2egraveme deacutebordement

vit=0

vent[0]=(vit10000)+48Valeur des centaines affecteacute en ascii(48=0)

VV=(vit1000)10

vent[1]=VV+48Valeur des dizaines affecteacute en ascii

VV=(vit100)10

vent[2]=VV+48Valeur des uniteacute affecteacute en ascii

VV=(vit10)10

vent[3]=44Virgule affecteacute en ascii

vent[4]=VV+48Valeur de la 1er deacutecimale affecteacute en ascii

VV=vit10

vent[5]=VV+48Valeur de la 2egraveme deacutecimale affecteacute en ascii

vent[6]=109m affecteacute en ascii

vent[7]=47 affecteacute en ascii

vent[8]=115s affecteacute en ascii

if(cond==50)Appel la fonction LCD tous les 1000

lcd(1 1 15 txtvent)Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 9 vent)Affiche la chaine de caractegravere hum sur le LCD

cond=0Remise a 0 de la condition

Xbee(9 vent) Envoi la chaicircne de caractegravere vent dans la fonction xbee

Fonction affichage

void lcd(int li int co int nb char receive[15])

int i

for(i=0 iltnb i++)Boucle for

Lcd_chr(li (co+i) receive[i])Affiche les caractegraveres jusquagrave i

Usart

void xbee(int nb char receive[15])

int i

Usart_Init(9600)Vitesse de transmission

for(i=0 iltnb i++)Boucle for

Usart_Write(receive[i])Envoi les caractegraveres sur lHyperTerminal jusquagrave i

Station meacuteteacuteo autonome 2012

18

I2C_Wr(0xEE) Deacutebut de la conversion

I2C_Stop()Arrecirct du sigal

Boucle infinie

while(1)

cond=cond+1 Increacutemente la variable cond

temperature(ampcond) Appel la fonction humiditeacute

Fonction tempeacuterature

void temperature(int cond)

char temp[7] temptxt[]=Temperature LSB

signed char MSB

I2C_Start() Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90) Mode de controcircle en mode eacutecriture

I2C_Wr(0xAA) Lecture de la tempeacuterature

I2C_Stop() Arrecirct du signal

I2C_Start() Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x91) Mode de controcircle en mode lecture

MSB = I2C_Rd(1) Nombre signeacute donnant la tempeacuterature entre +125deg et -55degC

LSB = I2C_Rd(0) Si bit 7 = 1 tempeacuterature MSB +05degC

I2C_Stop() Arrecirct du signal

if(MSBlt0)

MSB = abs(MSB) Si tempeacuterature neacutegative valeur absolue de MSB

Temp[0]=45 Signe - affecteacute en ascii

else

Temp[0]=43 signe + affecteacute en ascii

Temp[1]=(MSB10)+48 Valeur des dizaines affecteacute en ascii

Temp[2]=(MSB10)+48 Valeur des uniteacutes affecteacute en ascii

Temp[3]=44 Virgule affecteacute en ascii

if (LSB==128) Si bit 7 agrave 1 alors +05deg

Temp[4]=5

Else Si bit 7 agrave 0 alors +00deg

Temp[4]=0

Temp[5]=223 degreacute affecteacute en ascii

Temp[6]=67 C affecteacute en ascii

if(cond==10) Appel la fonction LCD tous les 1000

lcd(1 1 13 temptxt) Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 6 temp) Affiche la chaine de caractegravere hum sur le LCD

cond=0 Remise a 0 de la condition

Fonction affichage

void lcd(int li int co int nb char receive[14])

int i

for(i=0 ilt=nb i++)Boucle for

Lcd_chr(li (co+i) receive[i]) Affiche les caractegraveres jusquagrave i

Le scheacutema preacuteceacutedent est bien respecteacute comme on peut le voir crsquoest tregraves facile agrave programmer

gracircce aux librairies I2C du logiciel MikroC

Station meacuteteacuteo autonome 2012

19

IX Lrsquoaneacutemomegravetre

A Conception

Pour lrsquoaneacutemomegravetre lrsquoeacutequipe peacutedagogique

nous a juste fourni lrsquoheacutelice du capteur donc il a fallu

concevoir toute la partie eacutelectronique Lrsquoideacutee est

drsquoinstaller une diode et un transistor photonique par

de lagrave lrsquoheacutelice et lorsqursquoelle tourne elle vient couper le

faisceau Succinctement le transistor envoit soit 1 soit

0 sur le PIC Le but est de relever la freacutequence agrave

laquelle tourne lrsquoheacutelice puis la convertir en vitesse (cf

figure 11)

La photodiode choisie est de reacutefeacuterence SD5455-3 Ce choix a eacuteteacute fait car lrsquoangle du faisceau

est de 20deg pour que le flux infrarouge soit bien concentreacute sur le phototransistor pour un

fonctionnement optimal

Comme on le voit sur le scheacutema de principe (cf figure 11) il a fallu dimensionner la

reacutesistance qui sert agrave reacuteguler le courant qui circule dans la LED avec les informations donneacutees par la

documentation technique nous avons pu la calculer

Forward voltage VF = 17V et IF = 01A

Ualim = 5V

RD = (Ualim ndash UF)IF = (5 ndash 17)01

RD = 33Ω

Pour le phototransistor nous avons choisi celui qui allait avec la diode de reacutefeacuterence SE5455-3

Cette fois la valeur de la reacutesistance nous eacutetait donneacute par le constructeur

RL=1000Ω

Lors des seacuteances nous avons implanteacute la diode et le

transistor sur le support du capteur Pour des raisons

pratiques et estheacutetiques nous avons seacutepareacute la partie

aneacutemomegravetre et la partie platine par des borniers (cf figure

12)

Figure 11 scheacutema descriptif de laneacutemomegravetre

Figure 12 Notre aneacutemomegravetre

Station meacuteteacuteo autonome 2012

20

B Mesure de la peacuteriode sur le microcontrocircleur

Le but est de relever la peacuteriode du signal envoyer par lrsquoaneacutemomegravetre pour cela le PIC est

eacutequipeacute drsquoun mode capture Le principe est de recopier agrave un moment voulu la valeur du timer 1 La

capture peut avoir lieux agrave chaque front descendant agrave chaque front montant tous les 4 ou tous les 16

fronts montants Quand la capture a eu lieu un flag est mis agrave 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 constitueacute de 2 registres de 8 bits TMR1H et TMR1L que lon peut lire ou eacutecrire Le registre TMR1

(constitueacute de TMR1H et TMR1L) sincreacutemente de h0000 jusquagrave hFFFF et repasse ensuite agrave h0000

pour continuer le comptage Quand il y a deacutebordement une interruption peut ecirctre geacuteneacutereacutee si on lrsquoa

autoriseacutee par TMR1IE =1 (bit 0 de PIE1) et le Flag TMR1IF (bit 0 de PIR1) passe agrave 1 Le controcircle du

timer 1 ce fait par le registre T1CON

Bit 7 et bit 6 bits non impleacutementeacutes

Bit 5 et bit 4 T1CKPS = Seacutelection du preacute diviseur placeacute avant le TIMER

Vu qursquoon a un quartz eacuteleveacute nous avons deacutecideacute de choisir un preacute-diviseur de 8 donc

F=Fosc(48) Pour cela mettre les bit 4 et 5 agrave 1

Bit 3 T1OSCEN Bit dautorisation de loscillateur du Timer 1

1 = oscillateur autoriseacute

0 = oscillateur stoppeacute

Oscillateur interne inutile donc bit 3 agrave 0

Bit 2 T1SYNC Bit de controcircle de la synchronisation du CLK externe

1 = Pas de synchronisation de lhorloge externe

0 = Synchronisation de lhorloge externe

Nous nous mettrons en mode synchrone

Bit1 TMR1CS Bit de seacutelection de la source horloge

1 = Mode Compteur Clk externe sur la broche PC0 ou Quartz entre PC0 et PC1

0 = Mode Timer Clk interne = Fosc4

Station meacuteteacuteo autonome 2012

21

On mettra ce bit agrave 0 car on utilise le mode Timer

Bit 0 TMR1ON Bit dautorisation du Timer 1

1 = Timer 1 en service

0 = Timer 1 stoppeacute

Il faut eacutevidemment mettre la timer 1 en service

Nous avons aussi autoriseacute le deacutebordement du timer 1 pour avoir plus de preacutecisions pour cela il faut

mettre la commande PIE1TMR1 agrave 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 parameacutetrer le registre

CCP1CON

Bit 7 et Bit 6 bits non impleacutementeacutes

Bit 5 et Bit 4 CCP1X et CCP1Y

Bits non utiliseacutes 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 agrave Bit 0 CCP1M3 agrave CCP1M0 bits de seacutelection du mode

Nous avons seacutelectionneacute le mode capture sur chaque front montant Pour cela nous avons

mis les bits 1 et 3 agrave 0 et les bits 0 et 2 agrave 1

Pour savoir si un front montant agrave eu lieu le flag CCP1F est mis agrave 1 Ce flag doit ecirctre remis agrave 0 par

lrsquoutilisateur La valeur des 16 bits des registres du Timer 1 TMR1L (bit de poids faible) et TMR1H (bit

de poids fort) sont recopieacutees dans les registres CCPR1 CCPRIH (bit de poids faible) et CCPR1L (bit de

poids fort)

Nous avons programmeacute le mode capture de faccedilon agrave afficher sur lrsquoeacutecran LCD la valeur du registre

CCPR1 crsquoest-agrave-dire la peacuteriode du signal de lrsquoaneacutemomegravetre Il ne nous reste maintenant plus qursquoagrave

eacutetalonner notre aneacutemomegravetre

Station meacuteteacuteo autonome 2012

22

C Etalonnage de lrsquoaneacutemomegravetre

Pour eacutetalonner le capteur nous avons commenceacute par savoir agrave quelle freacutequence correspond la

valeur releveacutee par le mode capture Pour cela nous avons brancheacute un GBF agrave la place du capteur et

avec un oscilloscope nous avons compareacute leurs valeurs

Nous avons ensuite traceacute agrave lrsquoaide des valeurs du tableau la courbe F(Hz) en fonction du

compteur De cette courbe nous relevons lrsquoeacutequation

F = 671310compteur^(-101)

Soit environ F = 671310compteur

Puis nous avons brancheacute notre aneacutemomegravetre sur le microcontrocircleur Cela dans le but de

relever sa peacuteriode sur lrsquoeacutecran LCD agrave lrsquoaide drsquoune soufflerie variable et du manomegravetre GDH (reacutef

121552 200-13) nous avons compareacute leurs valeurs pour connaitre lrsquoeacutetalonnage de notre capteur

Nous avons noteacute plusieurs valeurs puis traceacute diffeacuterentes courbe pour trouver les eacutequations qui nous

permettrons de calculer la vitesse dans notre programme

Station meacuteteacuteo autonome 2012

23

Voici les valeurs que nous avons releveacutees puis la courbe traceacutee sur Excel

De cette courbe nous obtenons lrsquoeacutequation

Vitesse du vent = 0179F + 0629

Nous les multiplierons par 100 pour reacutecupeacuterer les deacutecimales et les implanter dans une chaine

de caractegravere

Vitesse du vent = 179F + 629

Nous avons agrave preacutesent agrave notre disposition toutes les eacutequations neacutecessaires pour pouvoir

convertir la valeur releveacutee par le mode capture en une vitesse

D Le scheacutema du microcontrocircleur avec lrsquoaneacutemomegravetre

On voit sur le scheacutema que le capteur est bien relieacute sur la borne RC2 Nous avons aussi

repreacutesenteacute les borniers J1 et J2 A droite tous ce qui est sur le support et agrave gauche tous ce qui est sur

la platine

Figure 13 Scheacutema avec laneacutemomegravetre

Station meacuteteacuteo autonome 2012

24

E Programme pour la mesure de la vitesse du vent

Voici le programme pour mesurer la vitesse du vent avec les affectations deacutecrites ci-dessus

ainsi que les eacutequations de conversions

Deacuteclaration des fonctions

void vent(int cond)

void lcd(int li int co int nb char receive[20])

void main()

deacuteclaration des variables

int cond=0

Initialisation et affectation des ports

PORTB=0 initialisation

PORTC=0 initialisation

TRISC=0x04 Port C deacuteclarer en sortie sauf RC2 en mode capture

TRISB=0 Port B deacuteclarer en sortie

Configuration du mode capture

T1CON=0x31 Configuration du timer1

CCP1CON=0x05 Parameacutetrage du mode capture

PIE1TMR1IE=1 Autorise les deacutebordements du timer 1

Configuration et initialisation de leacutecran LCD

Lcd_Config(ampPORTB 0 1 WR 5 4 3 2) Configure leacutecran

Lcd_Init(ampPORTB) Initialisation du LCD

Lcd_Cmd(Lcd_CURSOR_OFF) Enlegraveve le curseur

Lcd_Cmd(Lcd_CLEAR) Efface leacutecran

Boucle infinie

while(1)

cond=cond+1

vent(ampcond)

Fonction vent

void vent(int cond)

unsigned long tl th per

int vitfreq

char vent[13] txtvent[]=vitesse du vent VV

if(PIR1CCP1IF==1) Test si front montant agrave lieu

TMR1H=0 Initialisation du timer1 bit de point fort

TMR1L=0 Initialisation du timer1 bit de point faible

th=CCPR1H Les valeurs sont copieacute dans des variables

tl=CCPR1L

th=thltlt8 Deacutecalage car th =gt bit de point fort

per = th|tl On concategravene les deux valeurs nous obtenons la peacuteriode

PIR1CCP1IF=0 Remise a 0 du drapeau

if(PIR1TMR1IF==1) Si deacutepassement du timer 1

per=65535+per On ajoute une retenue lorsquon a fait un tour (16bit)

PIR1TMR1IF=0 Remise a 0 du drapeau deacutepassement

freq=671310per Calcul de la freacutequence

vit=freq179 + 692 Calcul de la vitesse que lon x100

Station meacuteteacuteo autonome 2012

25

if(vitlt200) En dessous 2ms la mesure est aleacuteatoire agrave cause du 2egraveme deacutebordement

vit=0

vent[0]=(vit10000)+48 Valeur des centaines affecteacute en ascii(48=0)

VV=(vit1000)10

vent[1]=VV+48 Valeur des dizaines affecteacute en ascii

VV=(vit100)10

vent[2]=VV+48 Valeur des uniteacute affecteacute en ascii

VV=(vit10)10

vent[3]=44 Virgule affecteacute en ascii

vent[4]=VV+48 Valeur de la 1er deacutecimale affecteacute en ascii

VV=vit10

vent[5]=VV+48 Valeur de la 2egraveme deacutecimale affecteacute en ascii

vent[6]=109 m affecteacute en ascii

vent[7]=47 affecteacute en ascii

vent[8]=115 s affecteacute en ascii

if(cond==1000) Appel la fonction LCD tous les 1000

lcd(1 1 16 txtvent) Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 8 vent) Affiche la chaine de caractegravere hum sur le LCD

cond=0 Remise a 0 de la condition

Fonction affichage

void lcd(int li int co int nb char receive[20])

int i

for(i=0 ilt=nb i++) Boucle for

Lcd_chr(li (co+i) receive[i]) Affiche les caractegraveres jusquagrave i

Station meacuteteacuteo autonome 2012

26

X Simulation une station meacuteteacuteo autonome

Maintenant que tous nos capteurs sont installeacutes nous allons mettre agrave profit le bouton

poussoir installeacute dans la partie LCD Crsquoest-agrave-dire que nous allons rassembler tous les programmes

preacuteceacutedents pour nrsquoen faire qursquoun Il suffira drsquoappuyer sur le bouton poussoir pour faire deacutefiler les

diffeacuterentes valeurs comme une vraie station meacuteteacuteo

A La structure du programme

Boucle infinie

while(1)

cond=cond+1 Increacutemente la variable cond

switch(BP)

case 0

humidite(ampcond) Appel la fonction humiditeacute

if(PORTAF2==1) Ces if permet de changer la valeur de BP

BP=1

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250) Temps quon relacircche bien le bouton

break

case 1

temperature(ampcond) Appel la fonction tempeacuterature

if(PORTAF2==1)

BP=2

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)

break

case 2

vent(ampcond) Appel la fonction vent

if(PORTAF2==1)

BP=0

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)

break

Nous avons choisi drsquoutiliser un Switch nous avons donc juste rajouteacute une variable BP

Lorsqursquoil y a appui sur le bouton poussoir la variable BP srsquoincreacutemente et le programme passe agrave une

autre case et donc utilise une nouvelle fonction La temporisation nous donne le temps de relacirccher le

bouton pour eacuteviter de faire deacutefiler le menu sans le vouloir

Station meacuteteacuteo autonome 2012

27

B La simulation

Etant donneacute que nous ne pouvions pas prendre le mateacuteriel avec nous il eacutetait impeacuteratif de

pouvoir faire des simulations Pour cela nous avons utiliseacute un logiciel tregraves utile Proteus ISIS Ce

logiciel possegravede une tregraves grande librairie et permet de rentrer nos programmes sur le PIC virtuel

geacuteneacutereacute par le logiciel Pour simuler le capteur drsquohumiditeacute nous avons utiliseacute un potentiomegravetre Pour

celui de lrsquoaneacutemomegravetre comme pour nos mesures nous avons brancheacute virtuellement un GBF sur la

borne associeacute et observeacute son signal agrave lrsquoaide drsquoun oscilloscope

Voilagrave un aperccedilu de la simulation effectueacute sur ISIS

Veacuterification theacuteorique du vent

Vitesse du vent = 0179 37 + 0629

Vitesse du vent = 7657ms

Veacuterification theacuteorique de lrsquohumiditeacute

H= (315-081)0031

H=7548

Veacuterification theacuteorique de la

tempeacuterature

La valeur afficheacutee correspond bien

aux 27degC seacutelectionneacute sur le capteur

Station meacuteteacuteo autonome 2012

28

XI Transmission des donneacutees par liaison ZigBee

ZigBee est un protocole de haut niveau permettant la communication de petites radios agrave

consommation reacuteduite baseacutee sur le standard IEEE 802154

Cette technologie a pour but la communication de courte distance telle que le propose deacutejagrave

la technologie Bluetooth tout en eacutetant moins chegravere plus simple et avec une fiabiliteacute assez eacuteleveacutee

Dans notre projet nous nous servirons de ZigBee pour permettre une transmission par ondes

de nos donneacutees de la station meacuteteacuteo vers un ordinateur Pour cela nous avons 2 modules Xbee pro 2

platines drsquointerfaces une avec des pattes (liaison platine) et lrsquoautre avec une sortie RS232 (liaison pc)

Caracteacuteristique eacutelectrique

Les signaux Xbee ont une amplitude de 33V mais sont alimenteacutes en 5V (tension de notre

source USB) cacircbleacutes sur la bornes VIN (laquo Power input from 6-12Vdc 300mA or higher raquo) Mais

notre source nrsquoeacutetant pas assez puissante pour alimenter toute notre installation Nous utiliserons

donc une source externe de 5V qui sera utiliseacutee pour alimenter les 2 systegravemes Xbee

Description des Bornes du Xbee qui nous inteacuteresse

Station meacuteteacuteo autonome 2012

29

A Scheacutema eacutelectrique du module Xbee

Nous avons cacircbleacute la sortie TX du microcontrocircleur qui eacutemet un signal jusqursquoagrave la borne RX du

Xbee qui reacuteceptionne ce signal Apregraves la transmission se fait par onde entre les 2 modules Xbee Pour

le module qui reccediloit le signal un cacircble RS232 suffit agrave faire la liaison entre celui-ci et le PC

B Envoi des donneacutees la liaison Usart

Un USART (Universal synchronous amp Asynchronous Receiver Transmitter) est un eacutemetteur-

reacutecepteur universel En langage courant cest le composant utiliseacute pour faire la liaison entre

lordinateur et le port seacuterie Lordinateur envoie les donneacutees en parallegravele (autant de fils que de bits

de donneacutees) Il faut donc transformer ces donneacutees pour les faire passer agrave travers une liaison seacuterie qui

utilise un mecircme fil pour faire passer tous les bits de donneacutees

Constitution dune trame USART

un bit de start toujours agrave 0 servant agrave la synchronisation du reacutecepteur

les donneacutees la taille peut varier (geacuteneacuteralement entre 5 et 9 bits)

eacuteventuellement un bit de pariteacute paire ou impaire

et un bit de stop toujours agrave 1 (la dureacutee peut varier entre 1 15 et 2 temps bit)

Le niveau logique de repos est le 1

Figure 14 Trame USART

Station meacuteteacuteo autonome 2012

30

Afin de faciliter les liaisons entre peacuteripheacuteriques (PC microcontrocircleur modem hellip) des vitesses

de transmission sont normaliseacutees luniteacute baud correspondant agrave un temps bit Dans notre cas nous

choisirons une vitesse de transmission de 9600bps

C Programme drsquoenvoi des donneacutees par liaison Usart

Gracircce agrave la librairie de MikroC il est tregraves facile drsquoenvoyer des donneacutees par liaison Usart Cela

fonctionne comme pour envoyer des caractegraveres sur lrsquoeacutecran LCD Il faut juste ensuite choisir la vitesse

de transmission qui sera 9600bps Voici la fonction et un morceau du programme qui sert agrave envoyer

les caractegraveres sur Xbee et de Xbee agrave un HyperTerminal

Fonction humiditeacute

void humidite(int cond)

long H U VL Deacuteclaration des variables

char HH hum[8] humtxt[]=Humidite

helliphellip

Xbee(8 hum) Envoi la chaicircne de caractegravere hum dans la fonction xbee

Usart

void xbee(int nb char receive[20])

int i

Usart_Init(9600) Vitesse de transmission

for(i=0 ilt=nb i++) Boucle for

Usart_Write(receive[i]) Envoi les caractegraveres sur lrsquoHyperTerminal jusquagrave i

Station meacuteteacuteo autonome 2012

31

XII Estimation du coucirct du projet

On peut voir sur ce tableau que le prix de reviens pour les eacuteleacutements que nous avons utiliseacute

est de 14506euro TTC Ce qui est plutocirct oneacutereux compareacute aux stations meacuteteacuteo du marcheacute qui oscille

entre 6euro et 400euro En sachant que la nocirctre est loin drsquoecirctre finaliseacute (finition estheacutetique ergonomie et

ajout de nouvelle fonction comme la date et lrsquoheure)

Composant Quantiteacute Prix (TVA inclus) Liens Quartz 20000MHz 1 111 euro Lien

Capaciteacute 22pF 2 010 euro lien

PIC 16F876 1 427 euro lien

LCD MODULE 1 1575 euro lien

Potentiomegravetre 10KΩ 1 618 euro lien

Reacutesistance 33 Ω 1 035 euro lien

Reacutesistance 10 K Ω 2 070 euro lien

Reacutesistance 1 KΩ 3 105 euro lien

LED rouge 1 013 euro lien

DS1621 1 650 euro lien

Bouton poussoir 1 060 euro lien

Module Xbee 2 4000 euro lien

Platine dinterface (XBEE) RS232 1 1890 euro lien

Platine dinterface (XBEE) 1 1364 euro lien

Capteur drsquohumiditeacute 1 2692 euro lien

Transistor 1 561 euro lien

Diode 1 325 euro lien

Totales 1 14506 euro

Station meacuteteacuteo autonome 2012

32

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

panelsbut 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 Itrsquos also possible to measure

humidity and wind speed Then itrsquos 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 its 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 Itrsquos 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

Station meacuteteacuteo autonome 2012

33

XIV Conclusion

Ce projet sur la conception drsquoune station meacuteteacuteo autonome qui nous a eacuteteacute confieacute a eacuteteacute tregraves

enrichissant Il nous a permis de mettre en relations les connaissances acquises durant lrsquoanneacutee mais

aussi acqueacuterir de nouvelles connaissances comme le fonctionnement drsquoun microcontrocircleur En effet

nous nrsquoavions jamais programmeacute sur microcontrocircleur Il a fallu srsquoadapter et apprendre agrave utiliser des

nouveaux logiciels tels que Proteus MikroC ainsi que Labview

De cette expeacuterience nous avons aussi appris agrave ecirctre autonome Nous avons saisi que la

compreacutehension des documents techniques et des librairies eacutetait un point essentiel de notre projet

En programmation nous nrsquoavions pas le droit agrave lrsquoerreur car la moindre faute pouvait conduire le

systegraveme agrave un dysfonctionnement Ce projet nous a demandeacute beaucoup de rigueur de patience et de

temps

Toutefois nous nrsquoavons pas eu malheureusement le temps drsquoinstaller le capteur de

tempeacuterature inteacuterieure par manque de temps Plus encore nous aurions aimeacute approfondir certains

points Par exemple pouvoir installer les composants sur circuit imprimeacute et concevoir un support

viable pour en faire une vraie station meacuteteacuteo Lrsquoinstallation drsquoune girouette aurait eacuteteacute appreacuteciable

pour connaicirctre le sens du vent Aussi le programme aurait sans doute pu ecirctre encore ameacutelioreacute pour

de meilleures performances

Malgreacute ce manque de temps nous sommes tregraves satisfaits du fonctionnement de ce module

qui nous a permis de comprendre lrsquoutiliteacute des parties theacuteoriques pour lrsquoapplication et la mise en

œuvre drsquoun systegraveme Lrsquoapproche peacutedagogique de nous diriger vers les solutions sans jamais les

donner de nous laisser un grand degreacute de liberteacute et drsquoautonomie a eacuteteacute au deacutebut assez deacuteroutante

mais tregraves instructif

Enfin nous tenions agrave remercier Mme Leymarie qui nous a suivis et aiguilleacute tout au long de ce

projet

Station meacuteteacuteo autonome 2012

34

XV ANNEXES

Programme complet

Deacuteclaration 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()

deacuteclaration des variables

int cond=0Condition pour laffichage sur leacutecran LCD

int BP=0

Initialisation et affectation des ports

PORTA=0

PORTB=0 initialisation

PORTC=0

TRISB=0 Port B deacuteclarer en sortie

TRISA=0xFF Port A en entreacutee

ADCON1=0x84 Justifieacute agrave droite active RA0RA1RA3 analogique

ADCON0=0x85 Fosc32 sur PA0 en service

TRISB=0 Port B deacuteclarer en sortie

TRISC=0xFFPort C deacuteclarer en entreacutee

Configuration et initialisation de leacutecran LCD

Lcd_Config(ampPORTB 0 1 WR 5 4 3 2) Configure lecran

Lcd_Init(ampPORTB) initialisation du LCD

Lcd_Cmd(Lcd_CURSOR_OFF) Enleve le curseur

Lcd_Cmd(Lcd_CLEAR) Efface lecran

Initialisation du module I2C

I2C_Init(100000)initialisation de la communication I2C

I2C_Start()Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90)Mode de controcircle en mode eacutecriture

I2C_Wr(0xAC)Accegraves au registre de configuration

I2C_Wr(0x0A)Registre de configuration mesure en continu

I2C_Stop()Arrecirct du signal

I2C_Start()Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90)Mode de controcircle en mode eacutecriture

I2C_Wr(0xEE)Deacutebut de la conversion

I2C_Stop()Arrecirct du sigal

Station meacuteteacuteo autonome 2012

35

Configuration du mode capture

T1CON=0x31 Configuration du timer1

CCP1CON=0x05 Paramegravetrage du mode capture

PIE1TMR1IE=1 Autorise les deacutebordements du timer 1

Boucle infinie

while(1)

cond=cond+1Increacutemente la variable cond

switch(BP)

case 0

humidite(ampcond)Appel la fonction humiditeacute

if(PORTAF2==1)Ces if permet de changer la valeur de BP

BP=1

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)Temps quon relacircche bien le bouton

break

case 1

temperature(ampcond)Appel la fonction tempeacuterature

if(PORTAF2==1)

BP=2

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)

break

case 2

vent(ampcond)Appel la fonction vent

if(PORTAF2==1)

BP=0

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)

break

Fonction humiditeacute

void humidite(int cond)

long H U VLDeacuteclaration des variables

char HH hum[8] humtxt[]=Humidite

VL=Adc_read(0) Valeur lue sur RA0(humiditeacute)

U=(VL5000)1023 Convertit la valeur lue en tension x1000

H=(U-810)(0031) Convertit la tension en humiditeacute x1000

Station meacuteteacuteo autonome 2012

36

if(Hgt100000)Si H gt 100(impossible) alors = 100

H=100000

if(Hlt0)Si H lt 0(impossible) alors = 0

H=0

hum[0]=(H100000)+48Valeur des centaines affecteacute en ascii(48=0)

HH=(H10000)10

hum[1]=HH+48Valeur des dizaines affecteacute en ascii

HH=(H1000)10

hum[2]=HH+48Valeur des uniteacutes affecteacute en ascii

hum[3]=44Virgule affecteacute en ascii

HH=(H100)10

hum[4]=HH+48Valeur de la premiegravere deacutecimale affecteacute en ascii

HH=(H10)10

hum[5]=HH+48Valeur de la deuxiegraveme deacutecimale affecteacute en ascii

hum[6]=37Pourcentage affecteacute en ascii

if(cond==50)Appel la fonction LCD tous les 1000

lcd(1 1 8 humtxt)Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 7 hum)Affiche la chaine de caractegravere hum sur le LCD

cond=0Remise a 0 de la condition

Xbee(7 hum) Envoi la chaicircne de caractegravere hum dans la fonction xbee

Fonction tempeacuterature

void temperature(int cond)

char temp[7] temptxt[]=Temperature LSB

signed char MSB

I2C_Start()Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90)Mode de controcircle en mode eacutecriture

I2C_Wr(0xAA)Lecture de la tempeacuterature

I2C_Stop()Arrecirct du sigal

I2C_Start()Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x91)Mode de controcircle en mode lecture

MSB = I2C_Rd(1)Nombre signeacute donnant la tempeacuterature entre +125deg et -55degC

LSB = I2C_Rd(0)Si bit 7 = 1 tempeacuterature MSB +05degC

I2C_Stop()Arrecirct du sigal

if(MSBlt0)

MSB = abs(MSB) Si temperature neacutegative valeur absolue de MSB

Temp[0]=45 Signe - affecteacute en ascii

else

Station meacuteteacuteo autonome 2012

37

Temp[0]=43signe + affecteacute en ascii

Temp[1]=(MSB10)+48 Valeur des dizaines affecteacute en ascii

Temp[2]=(MSB10)+48 Valeur des uniteacutes affecteacute en ascii

Temp[3]=44 Virgule affecteacute en ascii

if (LSB==128) Si bit 7 agrave 1 alors +05deg

Temp[4]=5

else Si bit 7 agrave 0 alors +00deg

Temp[4]=0

Temp[5]=223 degreacute affecteacute en ascii

Temp[6]=67 C affecteacute en ascii

if(cond==50)Appel la fonction LCD tous les 1000

lcd(1 1 11 temptxt)Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 7 temp)Affiche la chaine de caractegravere hum sur le LCD

cond=0Remise a 0 de la condition

Xbee(7 temp) Envoi la chaicircne de caractegravere temp dans la fonction xbee

Fonction vent

void vent(int cond)

unsigned long tl th per

int vitfreq

char vent[13] txtvent[]=Vitesse du vent VV

if(PIR1CCP1IF==1) Test si front montant agrave lieu

TMR1H=0 Initialisation du timer1 bit de point fort

TMR1L=0 Initialisation du timer1 bit de point faible

th=CCPR1H Les valeurs sont copieacute dans des variables

tl=CCPR1L

th=thltlt8 Deacutecalage car th =gt bit de point fort

per = th|tl On concategravene les deux valeurs nous obtenons la peacuteriode

PIR1CCP1IF=0 Remise a 0 du drapeau

if(PIR1TMR1IF==1) Si deacutepassement du timer 1

per=65535+per On ajoute une retenue lorsquon a fait un tour (16bit)

PIR1TMR1IF=0 Remise a 0 du drapeau deacutepassement

Station meacuteteacuteo autonome 2012

38

freq=671310perCalacul de la freacutequence

vit=freq179 + 692Calcul de la vitesse que lon x100

if(vitlt200)En dessous 2ms la mesure est aleacuteatoire agrave cause du 2egraveme deacutebordement

vit=0

vent[0]=(vit10000)+48Valeur des centaines affecteacute en ascii(48=0)

VV=(vit1000)10

vent[1]=VV+48Valeur des dizaines affecteacute en ascii

VV=(vit100)10

vent[2]=VV+48Valeur des uniteacute affecteacute en ascii

VV=(vit10)10

vent[3]=44Virgule affecteacute en ascii

vent[4]=VV+48Valeur de la 1er deacutecimale affecteacute en ascii

VV=vit10

vent[5]=VV+48Valeur de la 2egraveme deacutecimale affecteacute en ascii

vent[6]=109m affecteacute en ascii

vent[7]=47 affecteacute en ascii

vent[8]=115s affecteacute en ascii

if(cond==50)Appel la fonction LCD tous les 1000

lcd(1 1 15 txtvent)Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 9 vent)Affiche la chaine de caractegravere hum sur le LCD

cond=0Remise a 0 de la condition

Xbee(9 vent) Envoi la chaicircne de caractegravere vent dans la fonction xbee

Fonction affichage

void lcd(int li int co int nb char receive[15])

int i

for(i=0 iltnb i++)Boucle for

Lcd_chr(li (co+i) receive[i])Affiche les caractegraveres jusquagrave i

Usart

void xbee(int nb char receive[15])

int i

Usart_Init(9600)Vitesse de transmission

for(i=0 iltnb i++)Boucle for

Usart_Write(receive[i])Envoi les caractegraveres sur lHyperTerminal jusquagrave i

Station meacuteteacuteo autonome 2012

19

IX Lrsquoaneacutemomegravetre

A Conception

Pour lrsquoaneacutemomegravetre lrsquoeacutequipe peacutedagogique

nous a juste fourni lrsquoheacutelice du capteur donc il a fallu

concevoir toute la partie eacutelectronique Lrsquoideacutee est

drsquoinstaller une diode et un transistor photonique par

de lagrave lrsquoheacutelice et lorsqursquoelle tourne elle vient couper le

faisceau Succinctement le transistor envoit soit 1 soit

0 sur le PIC Le but est de relever la freacutequence agrave

laquelle tourne lrsquoheacutelice puis la convertir en vitesse (cf

figure 11)

La photodiode choisie est de reacutefeacuterence SD5455-3 Ce choix a eacuteteacute fait car lrsquoangle du faisceau

est de 20deg pour que le flux infrarouge soit bien concentreacute sur le phototransistor pour un

fonctionnement optimal

Comme on le voit sur le scheacutema de principe (cf figure 11) il a fallu dimensionner la

reacutesistance qui sert agrave reacuteguler le courant qui circule dans la LED avec les informations donneacutees par la

documentation technique nous avons pu la calculer

Forward voltage VF = 17V et IF = 01A

Ualim = 5V

RD = (Ualim ndash UF)IF = (5 ndash 17)01

RD = 33Ω

Pour le phototransistor nous avons choisi celui qui allait avec la diode de reacutefeacuterence SE5455-3

Cette fois la valeur de la reacutesistance nous eacutetait donneacute par le constructeur

RL=1000Ω

Lors des seacuteances nous avons implanteacute la diode et le

transistor sur le support du capteur Pour des raisons

pratiques et estheacutetiques nous avons seacutepareacute la partie

aneacutemomegravetre et la partie platine par des borniers (cf figure

12)

Figure 11 scheacutema descriptif de laneacutemomegravetre

Figure 12 Notre aneacutemomegravetre

Station meacuteteacuteo autonome 2012

20

B Mesure de la peacuteriode sur le microcontrocircleur

Le but est de relever la peacuteriode du signal envoyer par lrsquoaneacutemomegravetre pour cela le PIC est

eacutequipeacute drsquoun mode capture Le principe est de recopier agrave un moment voulu la valeur du timer 1 La

capture peut avoir lieux agrave chaque front descendant agrave chaque front montant tous les 4 ou tous les 16

fronts montants Quand la capture a eu lieu un flag est mis agrave 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 constitueacute de 2 registres de 8 bits TMR1H et TMR1L que lon peut lire ou eacutecrire Le registre TMR1

(constitueacute de TMR1H et TMR1L) sincreacutemente de h0000 jusquagrave hFFFF et repasse ensuite agrave h0000

pour continuer le comptage Quand il y a deacutebordement une interruption peut ecirctre geacuteneacutereacutee si on lrsquoa

autoriseacutee par TMR1IE =1 (bit 0 de PIE1) et le Flag TMR1IF (bit 0 de PIR1) passe agrave 1 Le controcircle du

timer 1 ce fait par le registre T1CON

Bit 7 et bit 6 bits non impleacutementeacutes

Bit 5 et bit 4 T1CKPS = Seacutelection du preacute diviseur placeacute avant le TIMER

Vu qursquoon a un quartz eacuteleveacute nous avons deacutecideacute de choisir un preacute-diviseur de 8 donc

F=Fosc(48) Pour cela mettre les bit 4 et 5 agrave 1

Bit 3 T1OSCEN Bit dautorisation de loscillateur du Timer 1

1 = oscillateur autoriseacute

0 = oscillateur stoppeacute

Oscillateur interne inutile donc bit 3 agrave 0

Bit 2 T1SYNC Bit de controcircle de la synchronisation du CLK externe

1 = Pas de synchronisation de lhorloge externe

0 = Synchronisation de lhorloge externe

Nous nous mettrons en mode synchrone

Bit1 TMR1CS Bit de seacutelection de la source horloge

1 = Mode Compteur Clk externe sur la broche PC0 ou Quartz entre PC0 et PC1

0 = Mode Timer Clk interne = Fosc4

Station meacuteteacuteo autonome 2012

21

On mettra ce bit agrave 0 car on utilise le mode Timer

Bit 0 TMR1ON Bit dautorisation du Timer 1

1 = Timer 1 en service

0 = Timer 1 stoppeacute

Il faut eacutevidemment mettre la timer 1 en service

Nous avons aussi autoriseacute le deacutebordement du timer 1 pour avoir plus de preacutecisions pour cela il faut

mettre la commande PIE1TMR1 agrave 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 parameacutetrer le registre

CCP1CON

Bit 7 et Bit 6 bits non impleacutementeacutes

Bit 5 et Bit 4 CCP1X et CCP1Y

Bits non utiliseacutes 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 agrave Bit 0 CCP1M3 agrave CCP1M0 bits de seacutelection du mode

Nous avons seacutelectionneacute le mode capture sur chaque front montant Pour cela nous avons

mis les bits 1 et 3 agrave 0 et les bits 0 et 2 agrave 1

Pour savoir si un front montant agrave eu lieu le flag CCP1F est mis agrave 1 Ce flag doit ecirctre remis agrave 0 par

lrsquoutilisateur La valeur des 16 bits des registres du Timer 1 TMR1L (bit de poids faible) et TMR1H (bit

de poids fort) sont recopieacutees dans les registres CCPR1 CCPRIH (bit de poids faible) et CCPR1L (bit de

poids fort)

Nous avons programmeacute le mode capture de faccedilon agrave afficher sur lrsquoeacutecran LCD la valeur du registre

CCPR1 crsquoest-agrave-dire la peacuteriode du signal de lrsquoaneacutemomegravetre Il ne nous reste maintenant plus qursquoagrave

eacutetalonner notre aneacutemomegravetre

Station meacuteteacuteo autonome 2012

22

C Etalonnage de lrsquoaneacutemomegravetre

Pour eacutetalonner le capteur nous avons commenceacute par savoir agrave quelle freacutequence correspond la

valeur releveacutee par le mode capture Pour cela nous avons brancheacute un GBF agrave la place du capteur et

avec un oscilloscope nous avons compareacute leurs valeurs

Nous avons ensuite traceacute agrave lrsquoaide des valeurs du tableau la courbe F(Hz) en fonction du

compteur De cette courbe nous relevons lrsquoeacutequation

F = 671310compteur^(-101)

Soit environ F = 671310compteur

Puis nous avons brancheacute notre aneacutemomegravetre sur le microcontrocircleur Cela dans le but de

relever sa peacuteriode sur lrsquoeacutecran LCD agrave lrsquoaide drsquoune soufflerie variable et du manomegravetre GDH (reacutef

121552 200-13) nous avons compareacute leurs valeurs pour connaitre lrsquoeacutetalonnage de notre capteur

Nous avons noteacute plusieurs valeurs puis traceacute diffeacuterentes courbe pour trouver les eacutequations qui nous

permettrons de calculer la vitesse dans notre programme

Station meacuteteacuteo autonome 2012

23

Voici les valeurs que nous avons releveacutees puis la courbe traceacutee sur Excel

De cette courbe nous obtenons lrsquoeacutequation

Vitesse du vent = 0179F + 0629

Nous les multiplierons par 100 pour reacutecupeacuterer les deacutecimales et les implanter dans une chaine

de caractegravere

Vitesse du vent = 179F + 629

Nous avons agrave preacutesent agrave notre disposition toutes les eacutequations neacutecessaires pour pouvoir

convertir la valeur releveacutee par le mode capture en une vitesse

D Le scheacutema du microcontrocircleur avec lrsquoaneacutemomegravetre

On voit sur le scheacutema que le capteur est bien relieacute sur la borne RC2 Nous avons aussi

repreacutesenteacute les borniers J1 et J2 A droite tous ce qui est sur le support et agrave gauche tous ce qui est sur

la platine

Figure 13 Scheacutema avec laneacutemomegravetre

Station meacuteteacuteo autonome 2012

24

E Programme pour la mesure de la vitesse du vent

Voici le programme pour mesurer la vitesse du vent avec les affectations deacutecrites ci-dessus

ainsi que les eacutequations de conversions

Deacuteclaration des fonctions

void vent(int cond)

void lcd(int li int co int nb char receive[20])

void main()

deacuteclaration des variables

int cond=0

Initialisation et affectation des ports

PORTB=0 initialisation

PORTC=0 initialisation

TRISC=0x04 Port C deacuteclarer en sortie sauf RC2 en mode capture

TRISB=0 Port B deacuteclarer en sortie

Configuration du mode capture

T1CON=0x31 Configuration du timer1

CCP1CON=0x05 Parameacutetrage du mode capture

PIE1TMR1IE=1 Autorise les deacutebordements du timer 1

Configuration et initialisation de leacutecran LCD

Lcd_Config(ampPORTB 0 1 WR 5 4 3 2) Configure leacutecran

Lcd_Init(ampPORTB) Initialisation du LCD

Lcd_Cmd(Lcd_CURSOR_OFF) Enlegraveve le curseur

Lcd_Cmd(Lcd_CLEAR) Efface leacutecran

Boucle infinie

while(1)

cond=cond+1

vent(ampcond)

Fonction vent

void vent(int cond)

unsigned long tl th per

int vitfreq

char vent[13] txtvent[]=vitesse du vent VV

if(PIR1CCP1IF==1) Test si front montant agrave lieu

TMR1H=0 Initialisation du timer1 bit de point fort

TMR1L=0 Initialisation du timer1 bit de point faible

th=CCPR1H Les valeurs sont copieacute dans des variables

tl=CCPR1L

th=thltlt8 Deacutecalage car th =gt bit de point fort

per = th|tl On concategravene les deux valeurs nous obtenons la peacuteriode

PIR1CCP1IF=0 Remise a 0 du drapeau

if(PIR1TMR1IF==1) Si deacutepassement du timer 1

per=65535+per On ajoute une retenue lorsquon a fait un tour (16bit)

PIR1TMR1IF=0 Remise a 0 du drapeau deacutepassement

freq=671310per Calcul de la freacutequence

vit=freq179 + 692 Calcul de la vitesse que lon x100

Station meacuteteacuteo autonome 2012

25

if(vitlt200) En dessous 2ms la mesure est aleacuteatoire agrave cause du 2egraveme deacutebordement

vit=0

vent[0]=(vit10000)+48 Valeur des centaines affecteacute en ascii(48=0)

VV=(vit1000)10

vent[1]=VV+48 Valeur des dizaines affecteacute en ascii

VV=(vit100)10

vent[2]=VV+48 Valeur des uniteacute affecteacute en ascii

VV=(vit10)10

vent[3]=44 Virgule affecteacute en ascii

vent[4]=VV+48 Valeur de la 1er deacutecimale affecteacute en ascii

VV=vit10

vent[5]=VV+48 Valeur de la 2egraveme deacutecimale affecteacute en ascii

vent[6]=109 m affecteacute en ascii

vent[7]=47 affecteacute en ascii

vent[8]=115 s affecteacute en ascii

if(cond==1000) Appel la fonction LCD tous les 1000

lcd(1 1 16 txtvent) Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 8 vent) Affiche la chaine de caractegravere hum sur le LCD

cond=0 Remise a 0 de la condition

Fonction affichage

void lcd(int li int co int nb char receive[20])

int i

for(i=0 ilt=nb i++) Boucle for

Lcd_chr(li (co+i) receive[i]) Affiche les caractegraveres jusquagrave i

Station meacuteteacuteo autonome 2012

26

X Simulation une station meacuteteacuteo autonome

Maintenant que tous nos capteurs sont installeacutes nous allons mettre agrave profit le bouton

poussoir installeacute dans la partie LCD Crsquoest-agrave-dire que nous allons rassembler tous les programmes

preacuteceacutedents pour nrsquoen faire qursquoun Il suffira drsquoappuyer sur le bouton poussoir pour faire deacutefiler les

diffeacuterentes valeurs comme une vraie station meacuteteacuteo

A La structure du programme

Boucle infinie

while(1)

cond=cond+1 Increacutemente la variable cond

switch(BP)

case 0

humidite(ampcond) Appel la fonction humiditeacute

if(PORTAF2==1) Ces if permet de changer la valeur de BP

BP=1

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250) Temps quon relacircche bien le bouton

break

case 1

temperature(ampcond) Appel la fonction tempeacuterature

if(PORTAF2==1)

BP=2

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)

break

case 2

vent(ampcond) Appel la fonction vent

if(PORTAF2==1)

BP=0

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)

break

Nous avons choisi drsquoutiliser un Switch nous avons donc juste rajouteacute une variable BP

Lorsqursquoil y a appui sur le bouton poussoir la variable BP srsquoincreacutemente et le programme passe agrave une

autre case et donc utilise une nouvelle fonction La temporisation nous donne le temps de relacirccher le

bouton pour eacuteviter de faire deacutefiler le menu sans le vouloir

Station meacuteteacuteo autonome 2012

27

B La simulation

Etant donneacute que nous ne pouvions pas prendre le mateacuteriel avec nous il eacutetait impeacuteratif de

pouvoir faire des simulations Pour cela nous avons utiliseacute un logiciel tregraves utile Proteus ISIS Ce

logiciel possegravede une tregraves grande librairie et permet de rentrer nos programmes sur le PIC virtuel

geacuteneacutereacute par le logiciel Pour simuler le capteur drsquohumiditeacute nous avons utiliseacute un potentiomegravetre Pour

celui de lrsquoaneacutemomegravetre comme pour nos mesures nous avons brancheacute virtuellement un GBF sur la

borne associeacute et observeacute son signal agrave lrsquoaide drsquoun oscilloscope

Voilagrave un aperccedilu de la simulation effectueacute sur ISIS

Veacuterification theacuteorique du vent

Vitesse du vent = 0179 37 + 0629

Vitesse du vent = 7657ms

Veacuterification theacuteorique de lrsquohumiditeacute

H= (315-081)0031

H=7548

Veacuterification theacuteorique de la

tempeacuterature

La valeur afficheacutee correspond bien

aux 27degC seacutelectionneacute sur le capteur

Station meacuteteacuteo autonome 2012

28

XI Transmission des donneacutees par liaison ZigBee

ZigBee est un protocole de haut niveau permettant la communication de petites radios agrave

consommation reacuteduite baseacutee sur le standard IEEE 802154

Cette technologie a pour but la communication de courte distance telle que le propose deacutejagrave

la technologie Bluetooth tout en eacutetant moins chegravere plus simple et avec une fiabiliteacute assez eacuteleveacutee

Dans notre projet nous nous servirons de ZigBee pour permettre une transmission par ondes

de nos donneacutees de la station meacuteteacuteo vers un ordinateur Pour cela nous avons 2 modules Xbee pro 2

platines drsquointerfaces une avec des pattes (liaison platine) et lrsquoautre avec une sortie RS232 (liaison pc)

Caracteacuteristique eacutelectrique

Les signaux Xbee ont une amplitude de 33V mais sont alimenteacutes en 5V (tension de notre

source USB) cacircbleacutes sur la bornes VIN (laquo Power input from 6-12Vdc 300mA or higher raquo) Mais

notre source nrsquoeacutetant pas assez puissante pour alimenter toute notre installation Nous utiliserons

donc une source externe de 5V qui sera utiliseacutee pour alimenter les 2 systegravemes Xbee

Description des Bornes du Xbee qui nous inteacuteresse

Station meacuteteacuteo autonome 2012

29

A Scheacutema eacutelectrique du module Xbee

Nous avons cacircbleacute la sortie TX du microcontrocircleur qui eacutemet un signal jusqursquoagrave la borne RX du

Xbee qui reacuteceptionne ce signal Apregraves la transmission se fait par onde entre les 2 modules Xbee Pour

le module qui reccediloit le signal un cacircble RS232 suffit agrave faire la liaison entre celui-ci et le PC

B Envoi des donneacutees la liaison Usart

Un USART (Universal synchronous amp Asynchronous Receiver Transmitter) est un eacutemetteur-

reacutecepteur universel En langage courant cest le composant utiliseacute pour faire la liaison entre

lordinateur et le port seacuterie Lordinateur envoie les donneacutees en parallegravele (autant de fils que de bits

de donneacutees) Il faut donc transformer ces donneacutees pour les faire passer agrave travers une liaison seacuterie qui

utilise un mecircme fil pour faire passer tous les bits de donneacutees

Constitution dune trame USART

un bit de start toujours agrave 0 servant agrave la synchronisation du reacutecepteur

les donneacutees la taille peut varier (geacuteneacuteralement entre 5 et 9 bits)

eacuteventuellement un bit de pariteacute paire ou impaire

et un bit de stop toujours agrave 1 (la dureacutee peut varier entre 1 15 et 2 temps bit)

Le niveau logique de repos est le 1

Figure 14 Trame USART

Station meacuteteacuteo autonome 2012

30

Afin de faciliter les liaisons entre peacuteripheacuteriques (PC microcontrocircleur modem hellip) des vitesses

de transmission sont normaliseacutees luniteacute baud correspondant agrave un temps bit Dans notre cas nous

choisirons une vitesse de transmission de 9600bps

C Programme drsquoenvoi des donneacutees par liaison Usart

Gracircce agrave la librairie de MikroC il est tregraves facile drsquoenvoyer des donneacutees par liaison Usart Cela

fonctionne comme pour envoyer des caractegraveres sur lrsquoeacutecran LCD Il faut juste ensuite choisir la vitesse

de transmission qui sera 9600bps Voici la fonction et un morceau du programme qui sert agrave envoyer

les caractegraveres sur Xbee et de Xbee agrave un HyperTerminal

Fonction humiditeacute

void humidite(int cond)

long H U VL Deacuteclaration des variables

char HH hum[8] humtxt[]=Humidite

helliphellip

Xbee(8 hum) Envoi la chaicircne de caractegravere hum dans la fonction xbee

Usart

void xbee(int nb char receive[20])

int i

Usart_Init(9600) Vitesse de transmission

for(i=0 ilt=nb i++) Boucle for

Usart_Write(receive[i]) Envoi les caractegraveres sur lrsquoHyperTerminal jusquagrave i

Station meacuteteacuteo autonome 2012

31

XII Estimation du coucirct du projet

On peut voir sur ce tableau que le prix de reviens pour les eacuteleacutements que nous avons utiliseacute

est de 14506euro TTC Ce qui est plutocirct oneacutereux compareacute aux stations meacuteteacuteo du marcheacute qui oscille

entre 6euro et 400euro En sachant que la nocirctre est loin drsquoecirctre finaliseacute (finition estheacutetique ergonomie et

ajout de nouvelle fonction comme la date et lrsquoheure)

Composant Quantiteacute Prix (TVA inclus) Liens Quartz 20000MHz 1 111 euro Lien

Capaciteacute 22pF 2 010 euro lien

PIC 16F876 1 427 euro lien

LCD MODULE 1 1575 euro lien

Potentiomegravetre 10KΩ 1 618 euro lien

Reacutesistance 33 Ω 1 035 euro lien

Reacutesistance 10 K Ω 2 070 euro lien

Reacutesistance 1 KΩ 3 105 euro lien

LED rouge 1 013 euro lien

DS1621 1 650 euro lien

Bouton poussoir 1 060 euro lien

Module Xbee 2 4000 euro lien

Platine dinterface (XBEE) RS232 1 1890 euro lien

Platine dinterface (XBEE) 1 1364 euro lien

Capteur drsquohumiditeacute 1 2692 euro lien

Transistor 1 561 euro lien

Diode 1 325 euro lien

Totales 1 14506 euro

Station meacuteteacuteo autonome 2012

32

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

panelsbut 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 Itrsquos also possible to measure

humidity and wind speed Then itrsquos 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 its 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 Itrsquos 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

Station meacuteteacuteo autonome 2012

33

XIV Conclusion

Ce projet sur la conception drsquoune station meacuteteacuteo autonome qui nous a eacuteteacute confieacute a eacuteteacute tregraves

enrichissant Il nous a permis de mettre en relations les connaissances acquises durant lrsquoanneacutee mais

aussi acqueacuterir de nouvelles connaissances comme le fonctionnement drsquoun microcontrocircleur En effet

nous nrsquoavions jamais programmeacute sur microcontrocircleur Il a fallu srsquoadapter et apprendre agrave utiliser des

nouveaux logiciels tels que Proteus MikroC ainsi que Labview

De cette expeacuterience nous avons aussi appris agrave ecirctre autonome Nous avons saisi que la

compreacutehension des documents techniques et des librairies eacutetait un point essentiel de notre projet

En programmation nous nrsquoavions pas le droit agrave lrsquoerreur car la moindre faute pouvait conduire le

systegraveme agrave un dysfonctionnement Ce projet nous a demandeacute beaucoup de rigueur de patience et de

temps

Toutefois nous nrsquoavons pas eu malheureusement le temps drsquoinstaller le capteur de

tempeacuterature inteacuterieure par manque de temps Plus encore nous aurions aimeacute approfondir certains

points Par exemple pouvoir installer les composants sur circuit imprimeacute et concevoir un support

viable pour en faire une vraie station meacuteteacuteo Lrsquoinstallation drsquoune girouette aurait eacuteteacute appreacuteciable

pour connaicirctre le sens du vent Aussi le programme aurait sans doute pu ecirctre encore ameacutelioreacute pour

de meilleures performances

Malgreacute ce manque de temps nous sommes tregraves satisfaits du fonctionnement de ce module

qui nous a permis de comprendre lrsquoutiliteacute des parties theacuteoriques pour lrsquoapplication et la mise en

œuvre drsquoun systegraveme Lrsquoapproche peacutedagogique de nous diriger vers les solutions sans jamais les

donner de nous laisser un grand degreacute de liberteacute et drsquoautonomie a eacuteteacute au deacutebut assez deacuteroutante

mais tregraves instructif

Enfin nous tenions agrave remercier Mme Leymarie qui nous a suivis et aiguilleacute tout au long de ce

projet

Station meacuteteacuteo autonome 2012

34

XV ANNEXES

Programme complet

Deacuteclaration 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()

deacuteclaration des variables

int cond=0Condition pour laffichage sur leacutecran LCD

int BP=0

Initialisation et affectation des ports

PORTA=0

PORTB=0 initialisation

PORTC=0

TRISB=0 Port B deacuteclarer en sortie

TRISA=0xFF Port A en entreacutee

ADCON1=0x84 Justifieacute agrave droite active RA0RA1RA3 analogique

ADCON0=0x85 Fosc32 sur PA0 en service

TRISB=0 Port B deacuteclarer en sortie

TRISC=0xFFPort C deacuteclarer en entreacutee

Configuration et initialisation de leacutecran LCD

Lcd_Config(ampPORTB 0 1 WR 5 4 3 2) Configure lecran

Lcd_Init(ampPORTB) initialisation du LCD

Lcd_Cmd(Lcd_CURSOR_OFF) Enleve le curseur

Lcd_Cmd(Lcd_CLEAR) Efface lecran

Initialisation du module I2C

I2C_Init(100000)initialisation de la communication I2C

I2C_Start()Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90)Mode de controcircle en mode eacutecriture

I2C_Wr(0xAC)Accegraves au registre de configuration

I2C_Wr(0x0A)Registre de configuration mesure en continu

I2C_Stop()Arrecirct du signal

I2C_Start()Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90)Mode de controcircle en mode eacutecriture

I2C_Wr(0xEE)Deacutebut de la conversion

I2C_Stop()Arrecirct du sigal

Station meacuteteacuteo autonome 2012

35

Configuration du mode capture

T1CON=0x31 Configuration du timer1

CCP1CON=0x05 Paramegravetrage du mode capture

PIE1TMR1IE=1 Autorise les deacutebordements du timer 1

Boucle infinie

while(1)

cond=cond+1Increacutemente la variable cond

switch(BP)

case 0

humidite(ampcond)Appel la fonction humiditeacute

if(PORTAF2==1)Ces if permet de changer la valeur de BP

BP=1

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)Temps quon relacircche bien le bouton

break

case 1

temperature(ampcond)Appel la fonction tempeacuterature

if(PORTAF2==1)

BP=2

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)

break

case 2

vent(ampcond)Appel la fonction vent

if(PORTAF2==1)

BP=0

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)

break

Fonction humiditeacute

void humidite(int cond)

long H U VLDeacuteclaration des variables

char HH hum[8] humtxt[]=Humidite

VL=Adc_read(0) Valeur lue sur RA0(humiditeacute)

U=(VL5000)1023 Convertit la valeur lue en tension x1000

H=(U-810)(0031) Convertit la tension en humiditeacute x1000

Station meacuteteacuteo autonome 2012

36

if(Hgt100000)Si H gt 100(impossible) alors = 100

H=100000

if(Hlt0)Si H lt 0(impossible) alors = 0

H=0

hum[0]=(H100000)+48Valeur des centaines affecteacute en ascii(48=0)

HH=(H10000)10

hum[1]=HH+48Valeur des dizaines affecteacute en ascii

HH=(H1000)10

hum[2]=HH+48Valeur des uniteacutes affecteacute en ascii

hum[3]=44Virgule affecteacute en ascii

HH=(H100)10

hum[4]=HH+48Valeur de la premiegravere deacutecimale affecteacute en ascii

HH=(H10)10

hum[5]=HH+48Valeur de la deuxiegraveme deacutecimale affecteacute en ascii

hum[6]=37Pourcentage affecteacute en ascii

if(cond==50)Appel la fonction LCD tous les 1000

lcd(1 1 8 humtxt)Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 7 hum)Affiche la chaine de caractegravere hum sur le LCD

cond=0Remise a 0 de la condition

Xbee(7 hum) Envoi la chaicircne de caractegravere hum dans la fonction xbee

Fonction tempeacuterature

void temperature(int cond)

char temp[7] temptxt[]=Temperature LSB

signed char MSB

I2C_Start()Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90)Mode de controcircle en mode eacutecriture

I2C_Wr(0xAA)Lecture de la tempeacuterature

I2C_Stop()Arrecirct du sigal

I2C_Start()Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x91)Mode de controcircle en mode lecture

MSB = I2C_Rd(1)Nombre signeacute donnant la tempeacuterature entre +125deg et -55degC

LSB = I2C_Rd(0)Si bit 7 = 1 tempeacuterature MSB +05degC

I2C_Stop()Arrecirct du sigal

if(MSBlt0)

MSB = abs(MSB) Si temperature neacutegative valeur absolue de MSB

Temp[0]=45 Signe - affecteacute en ascii

else

Station meacuteteacuteo autonome 2012

37

Temp[0]=43signe + affecteacute en ascii

Temp[1]=(MSB10)+48 Valeur des dizaines affecteacute en ascii

Temp[2]=(MSB10)+48 Valeur des uniteacutes affecteacute en ascii

Temp[3]=44 Virgule affecteacute en ascii

if (LSB==128) Si bit 7 agrave 1 alors +05deg

Temp[4]=5

else Si bit 7 agrave 0 alors +00deg

Temp[4]=0

Temp[5]=223 degreacute affecteacute en ascii

Temp[6]=67 C affecteacute en ascii

if(cond==50)Appel la fonction LCD tous les 1000

lcd(1 1 11 temptxt)Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 7 temp)Affiche la chaine de caractegravere hum sur le LCD

cond=0Remise a 0 de la condition

Xbee(7 temp) Envoi la chaicircne de caractegravere temp dans la fonction xbee

Fonction vent

void vent(int cond)

unsigned long tl th per

int vitfreq

char vent[13] txtvent[]=Vitesse du vent VV

if(PIR1CCP1IF==1) Test si front montant agrave lieu

TMR1H=0 Initialisation du timer1 bit de point fort

TMR1L=0 Initialisation du timer1 bit de point faible

th=CCPR1H Les valeurs sont copieacute dans des variables

tl=CCPR1L

th=thltlt8 Deacutecalage car th =gt bit de point fort

per = th|tl On concategravene les deux valeurs nous obtenons la peacuteriode

PIR1CCP1IF=0 Remise a 0 du drapeau

if(PIR1TMR1IF==1) Si deacutepassement du timer 1

per=65535+per On ajoute une retenue lorsquon a fait un tour (16bit)

PIR1TMR1IF=0 Remise a 0 du drapeau deacutepassement

Station meacuteteacuteo autonome 2012

38

freq=671310perCalacul de la freacutequence

vit=freq179 + 692Calcul de la vitesse que lon x100

if(vitlt200)En dessous 2ms la mesure est aleacuteatoire agrave cause du 2egraveme deacutebordement

vit=0

vent[0]=(vit10000)+48Valeur des centaines affecteacute en ascii(48=0)

VV=(vit1000)10

vent[1]=VV+48Valeur des dizaines affecteacute en ascii

VV=(vit100)10

vent[2]=VV+48Valeur des uniteacute affecteacute en ascii

VV=(vit10)10

vent[3]=44Virgule affecteacute en ascii

vent[4]=VV+48Valeur de la 1er deacutecimale affecteacute en ascii

VV=vit10

vent[5]=VV+48Valeur de la 2egraveme deacutecimale affecteacute en ascii

vent[6]=109m affecteacute en ascii

vent[7]=47 affecteacute en ascii

vent[8]=115s affecteacute en ascii

if(cond==50)Appel la fonction LCD tous les 1000

lcd(1 1 15 txtvent)Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 9 vent)Affiche la chaine de caractegravere hum sur le LCD

cond=0Remise a 0 de la condition

Xbee(9 vent) Envoi la chaicircne de caractegravere vent dans la fonction xbee

Fonction affichage

void lcd(int li int co int nb char receive[15])

int i

for(i=0 iltnb i++)Boucle for

Lcd_chr(li (co+i) receive[i])Affiche les caractegraveres jusquagrave i

Usart

void xbee(int nb char receive[15])

int i

Usart_Init(9600)Vitesse de transmission

for(i=0 iltnb i++)Boucle for

Usart_Write(receive[i])Envoi les caractegraveres sur lHyperTerminal jusquagrave i

Station meacuteteacuteo autonome 2012

20

B Mesure de la peacuteriode sur le microcontrocircleur

Le but est de relever la peacuteriode du signal envoyer par lrsquoaneacutemomegravetre pour cela le PIC est

eacutequipeacute drsquoun mode capture Le principe est de recopier agrave un moment voulu la valeur du timer 1 La

capture peut avoir lieux agrave chaque front descendant agrave chaque front montant tous les 4 ou tous les 16

fronts montants Quand la capture a eu lieu un flag est mis agrave 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 constitueacute de 2 registres de 8 bits TMR1H et TMR1L que lon peut lire ou eacutecrire Le registre TMR1

(constitueacute de TMR1H et TMR1L) sincreacutemente de h0000 jusquagrave hFFFF et repasse ensuite agrave h0000

pour continuer le comptage Quand il y a deacutebordement une interruption peut ecirctre geacuteneacutereacutee si on lrsquoa

autoriseacutee par TMR1IE =1 (bit 0 de PIE1) et le Flag TMR1IF (bit 0 de PIR1) passe agrave 1 Le controcircle du

timer 1 ce fait par le registre T1CON

Bit 7 et bit 6 bits non impleacutementeacutes

Bit 5 et bit 4 T1CKPS = Seacutelection du preacute diviseur placeacute avant le TIMER

Vu qursquoon a un quartz eacuteleveacute nous avons deacutecideacute de choisir un preacute-diviseur de 8 donc

F=Fosc(48) Pour cela mettre les bit 4 et 5 agrave 1

Bit 3 T1OSCEN Bit dautorisation de loscillateur du Timer 1

1 = oscillateur autoriseacute

0 = oscillateur stoppeacute

Oscillateur interne inutile donc bit 3 agrave 0

Bit 2 T1SYNC Bit de controcircle de la synchronisation du CLK externe

1 = Pas de synchronisation de lhorloge externe

0 = Synchronisation de lhorloge externe

Nous nous mettrons en mode synchrone

Bit1 TMR1CS Bit de seacutelection de la source horloge

1 = Mode Compteur Clk externe sur la broche PC0 ou Quartz entre PC0 et PC1

0 = Mode Timer Clk interne = Fosc4

Station meacuteteacuteo autonome 2012

21

On mettra ce bit agrave 0 car on utilise le mode Timer

Bit 0 TMR1ON Bit dautorisation du Timer 1

1 = Timer 1 en service

0 = Timer 1 stoppeacute

Il faut eacutevidemment mettre la timer 1 en service

Nous avons aussi autoriseacute le deacutebordement du timer 1 pour avoir plus de preacutecisions pour cela il faut

mettre la commande PIE1TMR1 agrave 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 parameacutetrer le registre

CCP1CON

Bit 7 et Bit 6 bits non impleacutementeacutes

Bit 5 et Bit 4 CCP1X et CCP1Y

Bits non utiliseacutes 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 agrave Bit 0 CCP1M3 agrave CCP1M0 bits de seacutelection du mode

Nous avons seacutelectionneacute le mode capture sur chaque front montant Pour cela nous avons

mis les bits 1 et 3 agrave 0 et les bits 0 et 2 agrave 1

Pour savoir si un front montant agrave eu lieu le flag CCP1F est mis agrave 1 Ce flag doit ecirctre remis agrave 0 par

lrsquoutilisateur La valeur des 16 bits des registres du Timer 1 TMR1L (bit de poids faible) et TMR1H (bit

de poids fort) sont recopieacutees dans les registres CCPR1 CCPRIH (bit de poids faible) et CCPR1L (bit de

poids fort)

Nous avons programmeacute le mode capture de faccedilon agrave afficher sur lrsquoeacutecran LCD la valeur du registre

CCPR1 crsquoest-agrave-dire la peacuteriode du signal de lrsquoaneacutemomegravetre Il ne nous reste maintenant plus qursquoagrave

eacutetalonner notre aneacutemomegravetre

Station meacuteteacuteo autonome 2012

22

C Etalonnage de lrsquoaneacutemomegravetre

Pour eacutetalonner le capteur nous avons commenceacute par savoir agrave quelle freacutequence correspond la

valeur releveacutee par le mode capture Pour cela nous avons brancheacute un GBF agrave la place du capteur et

avec un oscilloscope nous avons compareacute leurs valeurs

Nous avons ensuite traceacute agrave lrsquoaide des valeurs du tableau la courbe F(Hz) en fonction du

compteur De cette courbe nous relevons lrsquoeacutequation

F = 671310compteur^(-101)

Soit environ F = 671310compteur

Puis nous avons brancheacute notre aneacutemomegravetre sur le microcontrocircleur Cela dans le but de

relever sa peacuteriode sur lrsquoeacutecran LCD agrave lrsquoaide drsquoune soufflerie variable et du manomegravetre GDH (reacutef

121552 200-13) nous avons compareacute leurs valeurs pour connaitre lrsquoeacutetalonnage de notre capteur

Nous avons noteacute plusieurs valeurs puis traceacute diffeacuterentes courbe pour trouver les eacutequations qui nous

permettrons de calculer la vitesse dans notre programme

Station meacuteteacuteo autonome 2012

23

Voici les valeurs que nous avons releveacutees puis la courbe traceacutee sur Excel

De cette courbe nous obtenons lrsquoeacutequation

Vitesse du vent = 0179F + 0629

Nous les multiplierons par 100 pour reacutecupeacuterer les deacutecimales et les implanter dans une chaine

de caractegravere

Vitesse du vent = 179F + 629

Nous avons agrave preacutesent agrave notre disposition toutes les eacutequations neacutecessaires pour pouvoir

convertir la valeur releveacutee par le mode capture en une vitesse

D Le scheacutema du microcontrocircleur avec lrsquoaneacutemomegravetre

On voit sur le scheacutema que le capteur est bien relieacute sur la borne RC2 Nous avons aussi

repreacutesenteacute les borniers J1 et J2 A droite tous ce qui est sur le support et agrave gauche tous ce qui est sur

la platine

Figure 13 Scheacutema avec laneacutemomegravetre

Station meacuteteacuteo autonome 2012

24

E Programme pour la mesure de la vitesse du vent

Voici le programme pour mesurer la vitesse du vent avec les affectations deacutecrites ci-dessus

ainsi que les eacutequations de conversions

Deacuteclaration des fonctions

void vent(int cond)

void lcd(int li int co int nb char receive[20])

void main()

deacuteclaration des variables

int cond=0

Initialisation et affectation des ports

PORTB=0 initialisation

PORTC=0 initialisation

TRISC=0x04 Port C deacuteclarer en sortie sauf RC2 en mode capture

TRISB=0 Port B deacuteclarer en sortie

Configuration du mode capture

T1CON=0x31 Configuration du timer1

CCP1CON=0x05 Parameacutetrage du mode capture

PIE1TMR1IE=1 Autorise les deacutebordements du timer 1

Configuration et initialisation de leacutecran LCD

Lcd_Config(ampPORTB 0 1 WR 5 4 3 2) Configure leacutecran

Lcd_Init(ampPORTB) Initialisation du LCD

Lcd_Cmd(Lcd_CURSOR_OFF) Enlegraveve le curseur

Lcd_Cmd(Lcd_CLEAR) Efface leacutecran

Boucle infinie

while(1)

cond=cond+1

vent(ampcond)

Fonction vent

void vent(int cond)

unsigned long tl th per

int vitfreq

char vent[13] txtvent[]=vitesse du vent VV

if(PIR1CCP1IF==1) Test si front montant agrave lieu

TMR1H=0 Initialisation du timer1 bit de point fort

TMR1L=0 Initialisation du timer1 bit de point faible

th=CCPR1H Les valeurs sont copieacute dans des variables

tl=CCPR1L

th=thltlt8 Deacutecalage car th =gt bit de point fort

per = th|tl On concategravene les deux valeurs nous obtenons la peacuteriode

PIR1CCP1IF=0 Remise a 0 du drapeau

if(PIR1TMR1IF==1) Si deacutepassement du timer 1

per=65535+per On ajoute une retenue lorsquon a fait un tour (16bit)

PIR1TMR1IF=0 Remise a 0 du drapeau deacutepassement

freq=671310per Calcul de la freacutequence

vit=freq179 + 692 Calcul de la vitesse que lon x100

Station meacuteteacuteo autonome 2012

25

if(vitlt200) En dessous 2ms la mesure est aleacuteatoire agrave cause du 2egraveme deacutebordement

vit=0

vent[0]=(vit10000)+48 Valeur des centaines affecteacute en ascii(48=0)

VV=(vit1000)10

vent[1]=VV+48 Valeur des dizaines affecteacute en ascii

VV=(vit100)10

vent[2]=VV+48 Valeur des uniteacute affecteacute en ascii

VV=(vit10)10

vent[3]=44 Virgule affecteacute en ascii

vent[4]=VV+48 Valeur de la 1er deacutecimale affecteacute en ascii

VV=vit10

vent[5]=VV+48 Valeur de la 2egraveme deacutecimale affecteacute en ascii

vent[6]=109 m affecteacute en ascii

vent[7]=47 affecteacute en ascii

vent[8]=115 s affecteacute en ascii

if(cond==1000) Appel la fonction LCD tous les 1000

lcd(1 1 16 txtvent) Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 8 vent) Affiche la chaine de caractegravere hum sur le LCD

cond=0 Remise a 0 de la condition

Fonction affichage

void lcd(int li int co int nb char receive[20])

int i

for(i=0 ilt=nb i++) Boucle for

Lcd_chr(li (co+i) receive[i]) Affiche les caractegraveres jusquagrave i

Station meacuteteacuteo autonome 2012

26

X Simulation une station meacuteteacuteo autonome

Maintenant que tous nos capteurs sont installeacutes nous allons mettre agrave profit le bouton

poussoir installeacute dans la partie LCD Crsquoest-agrave-dire que nous allons rassembler tous les programmes

preacuteceacutedents pour nrsquoen faire qursquoun Il suffira drsquoappuyer sur le bouton poussoir pour faire deacutefiler les

diffeacuterentes valeurs comme une vraie station meacuteteacuteo

A La structure du programme

Boucle infinie

while(1)

cond=cond+1 Increacutemente la variable cond

switch(BP)

case 0

humidite(ampcond) Appel la fonction humiditeacute

if(PORTAF2==1) Ces if permet de changer la valeur de BP

BP=1

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250) Temps quon relacircche bien le bouton

break

case 1

temperature(ampcond) Appel la fonction tempeacuterature

if(PORTAF2==1)

BP=2

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)

break

case 2

vent(ampcond) Appel la fonction vent

if(PORTAF2==1)

BP=0

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)

break

Nous avons choisi drsquoutiliser un Switch nous avons donc juste rajouteacute une variable BP

Lorsqursquoil y a appui sur le bouton poussoir la variable BP srsquoincreacutemente et le programme passe agrave une

autre case et donc utilise une nouvelle fonction La temporisation nous donne le temps de relacirccher le

bouton pour eacuteviter de faire deacutefiler le menu sans le vouloir

Station meacuteteacuteo autonome 2012

27

B La simulation

Etant donneacute que nous ne pouvions pas prendre le mateacuteriel avec nous il eacutetait impeacuteratif de

pouvoir faire des simulations Pour cela nous avons utiliseacute un logiciel tregraves utile Proteus ISIS Ce

logiciel possegravede une tregraves grande librairie et permet de rentrer nos programmes sur le PIC virtuel

geacuteneacutereacute par le logiciel Pour simuler le capteur drsquohumiditeacute nous avons utiliseacute un potentiomegravetre Pour

celui de lrsquoaneacutemomegravetre comme pour nos mesures nous avons brancheacute virtuellement un GBF sur la

borne associeacute et observeacute son signal agrave lrsquoaide drsquoun oscilloscope

Voilagrave un aperccedilu de la simulation effectueacute sur ISIS

Veacuterification theacuteorique du vent

Vitesse du vent = 0179 37 + 0629

Vitesse du vent = 7657ms

Veacuterification theacuteorique de lrsquohumiditeacute

H= (315-081)0031

H=7548

Veacuterification theacuteorique de la

tempeacuterature

La valeur afficheacutee correspond bien

aux 27degC seacutelectionneacute sur le capteur

Station meacuteteacuteo autonome 2012

28

XI Transmission des donneacutees par liaison ZigBee

ZigBee est un protocole de haut niveau permettant la communication de petites radios agrave

consommation reacuteduite baseacutee sur le standard IEEE 802154

Cette technologie a pour but la communication de courte distance telle que le propose deacutejagrave

la technologie Bluetooth tout en eacutetant moins chegravere plus simple et avec une fiabiliteacute assez eacuteleveacutee

Dans notre projet nous nous servirons de ZigBee pour permettre une transmission par ondes

de nos donneacutees de la station meacuteteacuteo vers un ordinateur Pour cela nous avons 2 modules Xbee pro 2

platines drsquointerfaces une avec des pattes (liaison platine) et lrsquoautre avec une sortie RS232 (liaison pc)

Caracteacuteristique eacutelectrique

Les signaux Xbee ont une amplitude de 33V mais sont alimenteacutes en 5V (tension de notre

source USB) cacircbleacutes sur la bornes VIN (laquo Power input from 6-12Vdc 300mA or higher raquo) Mais

notre source nrsquoeacutetant pas assez puissante pour alimenter toute notre installation Nous utiliserons

donc une source externe de 5V qui sera utiliseacutee pour alimenter les 2 systegravemes Xbee

Description des Bornes du Xbee qui nous inteacuteresse

Station meacuteteacuteo autonome 2012

29

A Scheacutema eacutelectrique du module Xbee

Nous avons cacircbleacute la sortie TX du microcontrocircleur qui eacutemet un signal jusqursquoagrave la borne RX du

Xbee qui reacuteceptionne ce signal Apregraves la transmission se fait par onde entre les 2 modules Xbee Pour

le module qui reccediloit le signal un cacircble RS232 suffit agrave faire la liaison entre celui-ci et le PC

B Envoi des donneacutees la liaison Usart

Un USART (Universal synchronous amp Asynchronous Receiver Transmitter) est un eacutemetteur-

reacutecepteur universel En langage courant cest le composant utiliseacute pour faire la liaison entre

lordinateur et le port seacuterie Lordinateur envoie les donneacutees en parallegravele (autant de fils que de bits

de donneacutees) Il faut donc transformer ces donneacutees pour les faire passer agrave travers une liaison seacuterie qui

utilise un mecircme fil pour faire passer tous les bits de donneacutees

Constitution dune trame USART

un bit de start toujours agrave 0 servant agrave la synchronisation du reacutecepteur

les donneacutees la taille peut varier (geacuteneacuteralement entre 5 et 9 bits)

eacuteventuellement un bit de pariteacute paire ou impaire

et un bit de stop toujours agrave 1 (la dureacutee peut varier entre 1 15 et 2 temps bit)

Le niveau logique de repos est le 1

Figure 14 Trame USART

Station meacuteteacuteo autonome 2012

30

Afin de faciliter les liaisons entre peacuteripheacuteriques (PC microcontrocircleur modem hellip) des vitesses

de transmission sont normaliseacutees luniteacute baud correspondant agrave un temps bit Dans notre cas nous

choisirons une vitesse de transmission de 9600bps

C Programme drsquoenvoi des donneacutees par liaison Usart

Gracircce agrave la librairie de MikroC il est tregraves facile drsquoenvoyer des donneacutees par liaison Usart Cela

fonctionne comme pour envoyer des caractegraveres sur lrsquoeacutecran LCD Il faut juste ensuite choisir la vitesse

de transmission qui sera 9600bps Voici la fonction et un morceau du programme qui sert agrave envoyer

les caractegraveres sur Xbee et de Xbee agrave un HyperTerminal

Fonction humiditeacute

void humidite(int cond)

long H U VL Deacuteclaration des variables

char HH hum[8] humtxt[]=Humidite

helliphellip

Xbee(8 hum) Envoi la chaicircne de caractegravere hum dans la fonction xbee

Usart

void xbee(int nb char receive[20])

int i

Usart_Init(9600) Vitesse de transmission

for(i=0 ilt=nb i++) Boucle for

Usart_Write(receive[i]) Envoi les caractegraveres sur lrsquoHyperTerminal jusquagrave i

Station meacuteteacuteo autonome 2012

31

XII Estimation du coucirct du projet

On peut voir sur ce tableau que le prix de reviens pour les eacuteleacutements que nous avons utiliseacute

est de 14506euro TTC Ce qui est plutocirct oneacutereux compareacute aux stations meacuteteacuteo du marcheacute qui oscille

entre 6euro et 400euro En sachant que la nocirctre est loin drsquoecirctre finaliseacute (finition estheacutetique ergonomie et

ajout de nouvelle fonction comme la date et lrsquoheure)

Composant Quantiteacute Prix (TVA inclus) Liens Quartz 20000MHz 1 111 euro Lien

Capaciteacute 22pF 2 010 euro lien

PIC 16F876 1 427 euro lien

LCD MODULE 1 1575 euro lien

Potentiomegravetre 10KΩ 1 618 euro lien

Reacutesistance 33 Ω 1 035 euro lien

Reacutesistance 10 K Ω 2 070 euro lien

Reacutesistance 1 KΩ 3 105 euro lien

LED rouge 1 013 euro lien

DS1621 1 650 euro lien

Bouton poussoir 1 060 euro lien

Module Xbee 2 4000 euro lien

Platine dinterface (XBEE) RS232 1 1890 euro lien

Platine dinterface (XBEE) 1 1364 euro lien

Capteur drsquohumiditeacute 1 2692 euro lien

Transistor 1 561 euro lien

Diode 1 325 euro lien

Totales 1 14506 euro

Station meacuteteacuteo autonome 2012

32

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

panelsbut 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 Itrsquos also possible to measure

humidity and wind speed Then itrsquos 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 its 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 Itrsquos 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

Station meacuteteacuteo autonome 2012

33

XIV Conclusion

Ce projet sur la conception drsquoune station meacuteteacuteo autonome qui nous a eacuteteacute confieacute a eacuteteacute tregraves

enrichissant Il nous a permis de mettre en relations les connaissances acquises durant lrsquoanneacutee mais

aussi acqueacuterir de nouvelles connaissances comme le fonctionnement drsquoun microcontrocircleur En effet

nous nrsquoavions jamais programmeacute sur microcontrocircleur Il a fallu srsquoadapter et apprendre agrave utiliser des

nouveaux logiciels tels que Proteus MikroC ainsi que Labview

De cette expeacuterience nous avons aussi appris agrave ecirctre autonome Nous avons saisi que la

compreacutehension des documents techniques et des librairies eacutetait un point essentiel de notre projet

En programmation nous nrsquoavions pas le droit agrave lrsquoerreur car la moindre faute pouvait conduire le

systegraveme agrave un dysfonctionnement Ce projet nous a demandeacute beaucoup de rigueur de patience et de

temps

Toutefois nous nrsquoavons pas eu malheureusement le temps drsquoinstaller le capteur de

tempeacuterature inteacuterieure par manque de temps Plus encore nous aurions aimeacute approfondir certains

points Par exemple pouvoir installer les composants sur circuit imprimeacute et concevoir un support

viable pour en faire une vraie station meacuteteacuteo Lrsquoinstallation drsquoune girouette aurait eacuteteacute appreacuteciable

pour connaicirctre le sens du vent Aussi le programme aurait sans doute pu ecirctre encore ameacutelioreacute pour

de meilleures performances

Malgreacute ce manque de temps nous sommes tregraves satisfaits du fonctionnement de ce module

qui nous a permis de comprendre lrsquoutiliteacute des parties theacuteoriques pour lrsquoapplication et la mise en

œuvre drsquoun systegraveme Lrsquoapproche peacutedagogique de nous diriger vers les solutions sans jamais les

donner de nous laisser un grand degreacute de liberteacute et drsquoautonomie a eacuteteacute au deacutebut assez deacuteroutante

mais tregraves instructif

Enfin nous tenions agrave remercier Mme Leymarie qui nous a suivis et aiguilleacute tout au long de ce

projet

Station meacuteteacuteo autonome 2012

34

XV ANNEXES

Programme complet

Deacuteclaration 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()

deacuteclaration des variables

int cond=0Condition pour laffichage sur leacutecran LCD

int BP=0

Initialisation et affectation des ports

PORTA=0

PORTB=0 initialisation

PORTC=0

TRISB=0 Port B deacuteclarer en sortie

TRISA=0xFF Port A en entreacutee

ADCON1=0x84 Justifieacute agrave droite active RA0RA1RA3 analogique

ADCON0=0x85 Fosc32 sur PA0 en service

TRISB=0 Port B deacuteclarer en sortie

TRISC=0xFFPort C deacuteclarer en entreacutee

Configuration et initialisation de leacutecran LCD

Lcd_Config(ampPORTB 0 1 WR 5 4 3 2) Configure lecran

Lcd_Init(ampPORTB) initialisation du LCD

Lcd_Cmd(Lcd_CURSOR_OFF) Enleve le curseur

Lcd_Cmd(Lcd_CLEAR) Efface lecran

Initialisation du module I2C

I2C_Init(100000)initialisation de la communication I2C

I2C_Start()Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90)Mode de controcircle en mode eacutecriture

I2C_Wr(0xAC)Accegraves au registre de configuration

I2C_Wr(0x0A)Registre de configuration mesure en continu

I2C_Stop()Arrecirct du signal

I2C_Start()Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90)Mode de controcircle en mode eacutecriture

I2C_Wr(0xEE)Deacutebut de la conversion

I2C_Stop()Arrecirct du sigal

Station meacuteteacuteo autonome 2012

35

Configuration du mode capture

T1CON=0x31 Configuration du timer1

CCP1CON=0x05 Paramegravetrage du mode capture

PIE1TMR1IE=1 Autorise les deacutebordements du timer 1

Boucle infinie

while(1)

cond=cond+1Increacutemente la variable cond

switch(BP)

case 0

humidite(ampcond)Appel la fonction humiditeacute

if(PORTAF2==1)Ces if permet de changer la valeur de BP

BP=1

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)Temps quon relacircche bien le bouton

break

case 1

temperature(ampcond)Appel la fonction tempeacuterature

if(PORTAF2==1)

BP=2

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)

break

case 2

vent(ampcond)Appel la fonction vent

if(PORTAF2==1)

BP=0

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)

break

Fonction humiditeacute

void humidite(int cond)

long H U VLDeacuteclaration des variables

char HH hum[8] humtxt[]=Humidite

VL=Adc_read(0) Valeur lue sur RA0(humiditeacute)

U=(VL5000)1023 Convertit la valeur lue en tension x1000

H=(U-810)(0031) Convertit la tension en humiditeacute x1000

Station meacuteteacuteo autonome 2012

36

if(Hgt100000)Si H gt 100(impossible) alors = 100

H=100000

if(Hlt0)Si H lt 0(impossible) alors = 0

H=0

hum[0]=(H100000)+48Valeur des centaines affecteacute en ascii(48=0)

HH=(H10000)10

hum[1]=HH+48Valeur des dizaines affecteacute en ascii

HH=(H1000)10

hum[2]=HH+48Valeur des uniteacutes affecteacute en ascii

hum[3]=44Virgule affecteacute en ascii

HH=(H100)10

hum[4]=HH+48Valeur de la premiegravere deacutecimale affecteacute en ascii

HH=(H10)10

hum[5]=HH+48Valeur de la deuxiegraveme deacutecimale affecteacute en ascii

hum[6]=37Pourcentage affecteacute en ascii

if(cond==50)Appel la fonction LCD tous les 1000

lcd(1 1 8 humtxt)Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 7 hum)Affiche la chaine de caractegravere hum sur le LCD

cond=0Remise a 0 de la condition

Xbee(7 hum) Envoi la chaicircne de caractegravere hum dans la fonction xbee

Fonction tempeacuterature

void temperature(int cond)

char temp[7] temptxt[]=Temperature LSB

signed char MSB

I2C_Start()Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90)Mode de controcircle en mode eacutecriture

I2C_Wr(0xAA)Lecture de la tempeacuterature

I2C_Stop()Arrecirct du sigal

I2C_Start()Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x91)Mode de controcircle en mode lecture

MSB = I2C_Rd(1)Nombre signeacute donnant la tempeacuterature entre +125deg et -55degC

LSB = I2C_Rd(0)Si bit 7 = 1 tempeacuterature MSB +05degC

I2C_Stop()Arrecirct du sigal

if(MSBlt0)

MSB = abs(MSB) Si temperature neacutegative valeur absolue de MSB

Temp[0]=45 Signe - affecteacute en ascii

else

Station meacuteteacuteo autonome 2012

37

Temp[0]=43signe + affecteacute en ascii

Temp[1]=(MSB10)+48 Valeur des dizaines affecteacute en ascii

Temp[2]=(MSB10)+48 Valeur des uniteacutes affecteacute en ascii

Temp[3]=44 Virgule affecteacute en ascii

if (LSB==128) Si bit 7 agrave 1 alors +05deg

Temp[4]=5

else Si bit 7 agrave 0 alors +00deg

Temp[4]=0

Temp[5]=223 degreacute affecteacute en ascii

Temp[6]=67 C affecteacute en ascii

if(cond==50)Appel la fonction LCD tous les 1000

lcd(1 1 11 temptxt)Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 7 temp)Affiche la chaine de caractegravere hum sur le LCD

cond=0Remise a 0 de la condition

Xbee(7 temp) Envoi la chaicircne de caractegravere temp dans la fonction xbee

Fonction vent

void vent(int cond)

unsigned long tl th per

int vitfreq

char vent[13] txtvent[]=Vitesse du vent VV

if(PIR1CCP1IF==1) Test si front montant agrave lieu

TMR1H=0 Initialisation du timer1 bit de point fort

TMR1L=0 Initialisation du timer1 bit de point faible

th=CCPR1H Les valeurs sont copieacute dans des variables

tl=CCPR1L

th=thltlt8 Deacutecalage car th =gt bit de point fort

per = th|tl On concategravene les deux valeurs nous obtenons la peacuteriode

PIR1CCP1IF=0 Remise a 0 du drapeau

if(PIR1TMR1IF==1) Si deacutepassement du timer 1

per=65535+per On ajoute une retenue lorsquon a fait un tour (16bit)

PIR1TMR1IF=0 Remise a 0 du drapeau deacutepassement

Station meacuteteacuteo autonome 2012

38

freq=671310perCalacul de la freacutequence

vit=freq179 + 692Calcul de la vitesse que lon x100

if(vitlt200)En dessous 2ms la mesure est aleacuteatoire agrave cause du 2egraveme deacutebordement

vit=0

vent[0]=(vit10000)+48Valeur des centaines affecteacute en ascii(48=0)

VV=(vit1000)10

vent[1]=VV+48Valeur des dizaines affecteacute en ascii

VV=(vit100)10

vent[2]=VV+48Valeur des uniteacute affecteacute en ascii

VV=(vit10)10

vent[3]=44Virgule affecteacute en ascii

vent[4]=VV+48Valeur de la 1er deacutecimale affecteacute en ascii

VV=vit10

vent[5]=VV+48Valeur de la 2egraveme deacutecimale affecteacute en ascii

vent[6]=109m affecteacute en ascii

vent[7]=47 affecteacute en ascii

vent[8]=115s affecteacute en ascii

if(cond==50)Appel la fonction LCD tous les 1000

lcd(1 1 15 txtvent)Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 9 vent)Affiche la chaine de caractegravere hum sur le LCD

cond=0Remise a 0 de la condition

Xbee(9 vent) Envoi la chaicircne de caractegravere vent dans la fonction xbee

Fonction affichage

void lcd(int li int co int nb char receive[15])

int i

for(i=0 iltnb i++)Boucle for

Lcd_chr(li (co+i) receive[i])Affiche les caractegraveres jusquagrave i

Usart

void xbee(int nb char receive[15])

int i

Usart_Init(9600)Vitesse de transmission

for(i=0 iltnb i++)Boucle for

Usart_Write(receive[i])Envoi les caractegraveres sur lHyperTerminal jusquagrave i

Station meacuteteacuteo autonome 2012

21

On mettra ce bit agrave 0 car on utilise le mode Timer

Bit 0 TMR1ON Bit dautorisation du Timer 1

1 = Timer 1 en service

0 = Timer 1 stoppeacute

Il faut eacutevidemment mettre la timer 1 en service

Nous avons aussi autoriseacute le deacutebordement du timer 1 pour avoir plus de preacutecisions pour cela il faut

mettre la commande PIE1TMR1 agrave 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 parameacutetrer le registre

CCP1CON

Bit 7 et Bit 6 bits non impleacutementeacutes

Bit 5 et Bit 4 CCP1X et CCP1Y

Bits non utiliseacutes 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 agrave Bit 0 CCP1M3 agrave CCP1M0 bits de seacutelection du mode

Nous avons seacutelectionneacute le mode capture sur chaque front montant Pour cela nous avons

mis les bits 1 et 3 agrave 0 et les bits 0 et 2 agrave 1

Pour savoir si un front montant agrave eu lieu le flag CCP1F est mis agrave 1 Ce flag doit ecirctre remis agrave 0 par

lrsquoutilisateur La valeur des 16 bits des registres du Timer 1 TMR1L (bit de poids faible) et TMR1H (bit

de poids fort) sont recopieacutees dans les registres CCPR1 CCPRIH (bit de poids faible) et CCPR1L (bit de

poids fort)

Nous avons programmeacute le mode capture de faccedilon agrave afficher sur lrsquoeacutecran LCD la valeur du registre

CCPR1 crsquoest-agrave-dire la peacuteriode du signal de lrsquoaneacutemomegravetre Il ne nous reste maintenant plus qursquoagrave

eacutetalonner notre aneacutemomegravetre

Station meacuteteacuteo autonome 2012

22

C Etalonnage de lrsquoaneacutemomegravetre

Pour eacutetalonner le capteur nous avons commenceacute par savoir agrave quelle freacutequence correspond la

valeur releveacutee par le mode capture Pour cela nous avons brancheacute un GBF agrave la place du capteur et

avec un oscilloscope nous avons compareacute leurs valeurs

Nous avons ensuite traceacute agrave lrsquoaide des valeurs du tableau la courbe F(Hz) en fonction du

compteur De cette courbe nous relevons lrsquoeacutequation

F = 671310compteur^(-101)

Soit environ F = 671310compteur

Puis nous avons brancheacute notre aneacutemomegravetre sur le microcontrocircleur Cela dans le but de

relever sa peacuteriode sur lrsquoeacutecran LCD agrave lrsquoaide drsquoune soufflerie variable et du manomegravetre GDH (reacutef

121552 200-13) nous avons compareacute leurs valeurs pour connaitre lrsquoeacutetalonnage de notre capteur

Nous avons noteacute plusieurs valeurs puis traceacute diffeacuterentes courbe pour trouver les eacutequations qui nous

permettrons de calculer la vitesse dans notre programme

Station meacuteteacuteo autonome 2012

23

Voici les valeurs que nous avons releveacutees puis la courbe traceacutee sur Excel

De cette courbe nous obtenons lrsquoeacutequation

Vitesse du vent = 0179F + 0629

Nous les multiplierons par 100 pour reacutecupeacuterer les deacutecimales et les implanter dans une chaine

de caractegravere

Vitesse du vent = 179F + 629

Nous avons agrave preacutesent agrave notre disposition toutes les eacutequations neacutecessaires pour pouvoir

convertir la valeur releveacutee par le mode capture en une vitesse

D Le scheacutema du microcontrocircleur avec lrsquoaneacutemomegravetre

On voit sur le scheacutema que le capteur est bien relieacute sur la borne RC2 Nous avons aussi

repreacutesenteacute les borniers J1 et J2 A droite tous ce qui est sur le support et agrave gauche tous ce qui est sur

la platine

Figure 13 Scheacutema avec laneacutemomegravetre

Station meacuteteacuteo autonome 2012

24

E Programme pour la mesure de la vitesse du vent

Voici le programme pour mesurer la vitesse du vent avec les affectations deacutecrites ci-dessus

ainsi que les eacutequations de conversions

Deacuteclaration des fonctions

void vent(int cond)

void lcd(int li int co int nb char receive[20])

void main()

deacuteclaration des variables

int cond=0

Initialisation et affectation des ports

PORTB=0 initialisation

PORTC=0 initialisation

TRISC=0x04 Port C deacuteclarer en sortie sauf RC2 en mode capture

TRISB=0 Port B deacuteclarer en sortie

Configuration du mode capture

T1CON=0x31 Configuration du timer1

CCP1CON=0x05 Parameacutetrage du mode capture

PIE1TMR1IE=1 Autorise les deacutebordements du timer 1

Configuration et initialisation de leacutecran LCD

Lcd_Config(ampPORTB 0 1 WR 5 4 3 2) Configure leacutecran

Lcd_Init(ampPORTB) Initialisation du LCD

Lcd_Cmd(Lcd_CURSOR_OFF) Enlegraveve le curseur

Lcd_Cmd(Lcd_CLEAR) Efface leacutecran

Boucle infinie

while(1)

cond=cond+1

vent(ampcond)

Fonction vent

void vent(int cond)

unsigned long tl th per

int vitfreq

char vent[13] txtvent[]=vitesse du vent VV

if(PIR1CCP1IF==1) Test si front montant agrave lieu

TMR1H=0 Initialisation du timer1 bit de point fort

TMR1L=0 Initialisation du timer1 bit de point faible

th=CCPR1H Les valeurs sont copieacute dans des variables

tl=CCPR1L

th=thltlt8 Deacutecalage car th =gt bit de point fort

per = th|tl On concategravene les deux valeurs nous obtenons la peacuteriode

PIR1CCP1IF=0 Remise a 0 du drapeau

if(PIR1TMR1IF==1) Si deacutepassement du timer 1

per=65535+per On ajoute une retenue lorsquon a fait un tour (16bit)

PIR1TMR1IF=0 Remise a 0 du drapeau deacutepassement

freq=671310per Calcul de la freacutequence

vit=freq179 + 692 Calcul de la vitesse que lon x100

Station meacuteteacuteo autonome 2012

25

if(vitlt200) En dessous 2ms la mesure est aleacuteatoire agrave cause du 2egraveme deacutebordement

vit=0

vent[0]=(vit10000)+48 Valeur des centaines affecteacute en ascii(48=0)

VV=(vit1000)10

vent[1]=VV+48 Valeur des dizaines affecteacute en ascii

VV=(vit100)10

vent[2]=VV+48 Valeur des uniteacute affecteacute en ascii

VV=(vit10)10

vent[3]=44 Virgule affecteacute en ascii

vent[4]=VV+48 Valeur de la 1er deacutecimale affecteacute en ascii

VV=vit10

vent[5]=VV+48 Valeur de la 2egraveme deacutecimale affecteacute en ascii

vent[6]=109 m affecteacute en ascii

vent[7]=47 affecteacute en ascii

vent[8]=115 s affecteacute en ascii

if(cond==1000) Appel la fonction LCD tous les 1000

lcd(1 1 16 txtvent) Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 8 vent) Affiche la chaine de caractegravere hum sur le LCD

cond=0 Remise a 0 de la condition

Fonction affichage

void lcd(int li int co int nb char receive[20])

int i

for(i=0 ilt=nb i++) Boucle for

Lcd_chr(li (co+i) receive[i]) Affiche les caractegraveres jusquagrave i

Station meacuteteacuteo autonome 2012

26

X Simulation une station meacuteteacuteo autonome

Maintenant que tous nos capteurs sont installeacutes nous allons mettre agrave profit le bouton

poussoir installeacute dans la partie LCD Crsquoest-agrave-dire que nous allons rassembler tous les programmes

preacuteceacutedents pour nrsquoen faire qursquoun Il suffira drsquoappuyer sur le bouton poussoir pour faire deacutefiler les

diffeacuterentes valeurs comme une vraie station meacuteteacuteo

A La structure du programme

Boucle infinie

while(1)

cond=cond+1 Increacutemente la variable cond

switch(BP)

case 0

humidite(ampcond) Appel la fonction humiditeacute

if(PORTAF2==1) Ces if permet de changer la valeur de BP

BP=1

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250) Temps quon relacircche bien le bouton

break

case 1

temperature(ampcond) Appel la fonction tempeacuterature

if(PORTAF2==1)

BP=2

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)

break

case 2

vent(ampcond) Appel la fonction vent

if(PORTAF2==1)

BP=0

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)

break

Nous avons choisi drsquoutiliser un Switch nous avons donc juste rajouteacute une variable BP

Lorsqursquoil y a appui sur le bouton poussoir la variable BP srsquoincreacutemente et le programme passe agrave une

autre case et donc utilise une nouvelle fonction La temporisation nous donne le temps de relacirccher le

bouton pour eacuteviter de faire deacutefiler le menu sans le vouloir

Station meacuteteacuteo autonome 2012

27

B La simulation

Etant donneacute que nous ne pouvions pas prendre le mateacuteriel avec nous il eacutetait impeacuteratif de

pouvoir faire des simulations Pour cela nous avons utiliseacute un logiciel tregraves utile Proteus ISIS Ce

logiciel possegravede une tregraves grande librairie et permet de rentrer nos programmes sur le PIC virtuel

geacuteneacutereacute par le logiciel Pour simuler le capteur drsquohumiditeacute nous avons utiliseacute un potentiomegravetre Pour

celui de lrsquoaneacutemomegravetre comme pour nos mesures nous avons brancheacute virtuellement un GBF sur la

borne associeacute et observeacute son signal agrave lrsquoaide drsquoun oscilloscope

Voilagrave un aperccedilu de la simulation effectueacute sur ISIS

Veacuterification theacuteorique du vent

Vitesse du vent = 0179 37 + 0629

Vitesse du vent = 7657ms

Veacuterification theacuteorique de lrsquohumiditeacute

H= (315-081)0031

H=7548

Veacuterification theacuteorique de la

tempeacuterature

La valeur afficheacutee correspond bien

aux 27degC seacutelectionneacute sur le capteur

Station meacuteteacuteo autonome 2012

28

XI Transmission des donneacutees par liaison ZigBee

ZigBee est un protocole de haut niveau permettant la communication de petites radios agrave

consommation reacuteduite baseacutee sur le standard IEEE 802154

Cette technologie a pour but la communication de courte distance telle que le propose deacutejagrave

la technologie Bluetooth tout en eacutetant moins chegravere plus simple et avec une fiabiliteacute assez eacuteleveacutee

Dans notre projet nous nous servirons de ZigBee pour permettre une transmission par ondes

de nos donneacutees de la station meacuteteacuteo vers un ordinateur Pour cela nous avons 2 modules Xbee pro 2

platines drsquointerfaces une avec des pattes (liaison platine) et lrsquoautre avec une sortie RS232 (liaison pc)

Caracteacuteristique eacutelectrique

Les signaux Xbee ont une amplitude de 33V mais sont alimenteacutes en 5V (tension de notre

source USB) cacircbleacutes sur la bornes VIN (laquo Power input from 6-12Vdc 300mA or higher raquo) Mais

notre source nrsquoeacutetant pas assez puissante pour alimenter toute notre installation Nous utiliserons

donc une source externe de 5V qui sera utiliseacutee pour alimenter les 2 systegravemes Xbee

Description des Bornes du Xbee qui nous inteacuteresse

Station meacuteteacuteo autonome 2012

29

A Scheacutema eacutelectrique du module Xbee

Nous avons cacircbleacute la sortie TX du microcontrocircleur qui eacutemet un signal jusqursquoagrave la borne RX du

Xbee qui reacuteceptionne ce signal Apregraves la transmission se fait par onde entre les 2 modules Xbee Pour

le module qui reccediloit le signal un cacircble RS232 suffit agrave faire la liaison entre celui-ci et le PC

B Envoi des donneacutees la liaison Usart

Un USART (Universal synchronous amp Asynchronous Receiver Transmitter) est un eacutemetteur-

reacutecepteur universel En langage courant cest le composant utiliseacute pour faire la liaison entre

lordinateur et le port seacuterie Lordinateur envoie les donneacutees en parallegravele (autant de fils que de bits

de donneacutees) Il faut donc transformer ces donneacutees pour les faire passer agrave travers une liaison seacuterie qui

utilise un mecircme fil pour faire passer tous les bits de donneacutees

Constitution dune trame USART

un bit de start toujours agrave 0 servant agrave la synchronisation du reacutecepteur

les donneacutees la taille peut varier (geacuteneacuteralement entre 5 et 9 bits)

eacuteventuellement un bit de pariteacute paire ou impaire

et un bit de stop toujours agrave 1 (la dureacutee peut varier entre 1 15 et 2 temps bit)

Le niveau logique de repos est le 1

Figure 14 Trame USART

Station meacuteteacuteo autonome 2012

30

Afin de faciliter les liaisons entre peacuteripheacuteriques (PC microcontrocircleur modem hellip) des vitesses

de transmission sont normaliseacutees luniteacute baud correspondant agrave un temps bit Dans notre cas nous

choisirons une vitesse de transmission de 9600bps

C Programme drsquoenvoi des donneacutees par liaison Usart

Gracircce agrave la librairie de MikroC il est tregraves facile drsquoenvoyer des donneacutees par liaison Usart Cela

fonctionne comme pour envoyer des caractegraveres sur lrsquoeacutecran LCD Il faut juste ensuite choisir la vitesse

de transmission qui sera 9600bps Voici la fonction et un morceau du programme qui sert agrave envoyer

les caractegraveres sur Xbee et de Xbee agrave un HyperTerminal

Fonction humiditeacute

void humidite(int cond)

long H U VL Deacuteclaration des variables

char HH hum[8] humtxt[]=Humidite

helliphellip

Xbee(8 hum) Envoi la chaicircne de caractegravere hum dans la fonction xbee

Usart

void xbee(int nb char receive[20])

int i

Usart_Init(9600) Vitesse de transmission

for(i=0 ilt=nb i++) Boucle for

Usart_Write(receive[i]) Envoi les caractegraveres sur lrsquoHyperTerminal jusquagrave i

Station meacuteteacuteo autonome 2012

31

XII Estimation du coucirct du projet

On peut voir sur ce tableau que le prix de reviens pour les eacuteleacutements que nous avons utiliseacute

est de 14506euro TTC Ce qui est plutocirct oneacutereux compareacute aux stations meacuteteacuteo du marcheacute qui oscille

entre 6euro et 400euro En sachant que la nocirctre est loin drsquoecirctre finaliseacute (finition estheacutetique ergonomie et

ajout de nouvelle fonction comme la date et lrsquoheure)

Composant Quantiteacute Prix (TVA inclus) Liens Quartz 20000MHz 1 111 euro Lien

Capaciteacute 22pF 2 010 euro lien

PIC 16F876 1 427 euro lien

LCD MODULE 1 1575 euro lien

Potentiomegravetre 10KΩ 1 618 euro lien

Reacutesistance 33 Ω 1 035 euro lien

Reacutesistance 10 K Ω 2 070 euro lien

Reacutesistance 1 KΩ 3 105 euro lien

LED rouge 1 013 euro lien

DS1621 1 650 euro lien

Bouton poussoir 1 060 euro lien

Module Xbee 2 4000 euro lien

Platine dinterface (XBEE) RS232 1 1890 euro lien

Platine dinterface (XBEE) 1 1364 euro lien

Capteur drsquohumiditeacute 1 2692 euro lien

Transistor 1 561 euro lien

Diode 1 325 euro lien

Totales 1 14506 euro

Station meacuteteacuteo autonome 2012

32

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

panelsbut 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 Itrsquos also possible to measure

humidity and wind speed Then itrsquos 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 its 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 Itrsquos 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

Station meacuteteacuteo autonome 2012

33

XIV Conclusion

Ce projet sur la conception drsquoune station meacuteteacuteo autonome qui nous a eacuteteacute confieacute a eacuteteacute tregraves

enrichissant Il nous a permis de mettre en relations les connaissances acquises durant lrsquoanneacutee mais

aussi acqueacuterir de nouvelles connaissances comme le fonctionnement drsquoun microcontrocircleur En effet

nous nrsquoavions jamais programmeacute sur microcontrocircleur Il a fallu srsquoadapter et apprendre agrave utiliser des

nouveaux logiciels tels que Proteus MikroC ainsi que Labview

De cette expeacuterience nous avons aussi appris agrave ecirctre autonome Nous avons saisi que la

compreacutehension des documents techniques et des librairies eacutetait un point essentiel de notre projet

En programmation nous nrsquoavions pas le droit agrave lrsquoerreur car la moindre faute pouvait conduire le

systegraveme agrave un dysfonctionnement Ce projet nous a demandeacute beaucoup de rigueur de patience et de

temps

Toutefois nous nrsquoavons pas eu malheureusement le temps drsquoinstaller le capteur de

tempeacuterature inteacuterieure par manque de temps Plus encore nous aurions aimeacute approfondir certains

points Par exemple pouvoir installer les composants sur circuit imprimeacute et concevoir un support

viable pour en faire une vraie station meacuteteacuteo Lrsquoinstallation drsquoune girouette aurait eacuteteacute appreacuteciable

pour connaicirctre le sens du vent Aussi le programme aurait sans doute pu ecirctre encore ameacutelioreacute pour

de meilleures performances

Malgreacute ce manque de temps nous sommes tregraves satisfaits du fonctionnement de ce module

qui nous a permis de comprendre lrsquoutiliteacute des parties theacuteoriques pour lrsquoapplication et la mise en

œuvre drsquoun systegraveme Lrsquoapproche peacutedagogique de nous diriger vers les solutions sans jamais les

donner de nous laisser un grand degreacute de liberteacute et drsquoautonomie a eacuteteacute au deacutebut assez deacuteroutante

mais tregraves instructif

Enfin nous tenions agrave remercier Mme Leymarie qui nous a suivis et aiguilleacute tout au long de ce

projet

Station meacuteteacuteo autonome 2012

34

XV ANNEXES

Programme complet

Deacuteclaration 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()

deacuteclaration des variables

int cond=0Condition pour laffichage sur leacutecran LCD

int BP=0

Initialisation et affectation des ports

PORTA=0

PORTB=0 initialisation

PORTC=0

TRISB=0 Port B deacuteclarer en sortie

TRISA=0xFF Port A en entreacutee

ADCON1=0x84 Justifieacute agrave droite active RA0RA1RA3 analogique

ADCON0=0x85 Fosc32 sur PA0 en service

TRISB=0 Port B deacuteclarer en sortie

TRISC=0xFFPort C deacuteclarer en entreacutee

Configuration et initialisation de leacutecran LCD

Lcd_Config(ampPORTB 0 1 WR 5 4 3 2) Configure lecran

Lcd_Init(ampPORTB) initialisation du LCD

Lcd_Cmd(Lcd_CURSOR_OFF) Enleve le curseur

Lcd_Cmd(Lcd_CLEAR) Efface lecran

Initialisation du module I2C

I2C_Init(100000)initialisation de la communication I2C

I2C_Start()Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90)Mode de controcircle en mode eacutecriture

I2C_Wr(0xAC)Accegraves au registre de configuration

I2C_Wr(0x0A)Registre de configuration mesure en continu

I2C_Stop()Arrecirct du signal

I2C_Start()Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90)Mode de controcircle en mode eacutecriture

I2C_Wr(0xEE)Deacutebut de la conversion

I2C_Stop()Arrecirct du sigal

Station meacuteteacuteo autonome 2012

35

Configuration du mode capture

T1CON=0x31 Configuration du timer1

CCP1CON=0x05 Paramegravetrage du mode capture

PIE1TMR1IE=1 Autorise les deacutebordements du timer 1

Boucle infinie

while(1)

cond=cond+1Increacutemente la variable cond

switch(BP)

case 0

humidite(ampcond)Appel la fonction humiditeacute

if(PORTAF2==1)Ces if permet de changer la valeur de BP

BP=1

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)Temps quon relacircche bien le bouton

break

case 1

temperature(ampcond)Appel la fonction tempeacuterature

if(PORTAF2==1)

BP=2

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)

break

case 2

vent(ampcond)Appel la fonction vent

if(PORTAF2==1)

BP=0

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)

break

Fonction humiditeacute

void humidite(int cond)

long H U VLDeacuteclaration des variables

char HH hum[8] humtxt[]=Humidite

VL=Adc_read(0) Valeur lue sur RA0(humiditeacute)

U=(VL5000)1023 Convertit la valeur lue en tension x1000

H=(U-810)(0031) Convertit la tension en humiditeacute x1000

Station meacuteteacuteo autonome 2012

36

if(Hgt100000)Si H gt 100(impossible) alors = 100

H=100000

if(Hlt0)Si H lt 0(impossible) alors = 0

H=0

hum[0]=(H100000)+48Valeur des centaines affecteacute en ascii(48=0)

HH=(H10000)10

hum[1]=HH+48Valeur des dizaines affecteacute en ascii

HH=(H1000)10

hum[2]=HH+48Valeur des uniteacutes affecteacute en ascii

hum[3]=44Virgule affecteacute en ascii

HH=(H100)10

hum[4]=HH+48Valeur de la premiegravere deacutecimale affecteacute en ascii

HH=(H10)10

hum[5]=HH+48Valeur de la deuxiegraveme deacutecimale affecteacute en ascii

hum[6]=37Pourcentage affecteacute en ascii

if(cond==50)Appel la fonction LCD tous les 1000

lcd(1 1 8 humtxt)Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 7 hum)Affiche la chaine de caractegravere hum sur le LCD

cond=0Remise a 0 de la condition

Xbee(7 hum) Envoi la chaicircne de caractegravere hum dans la fonction xbee

Fonction tempeacuterature

void temperature(int cond)

char temp[7] temptxt[]=Temperature LSB

signed char MSB

I2C_Start()Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90)Mode de controcircle en mode eacutecriture

I2C_Wr(0xAA)Lecture de la tempeacuterature

I2C_Stop()Arrecirct du sigal

I2C_Start()Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x91)Mode de controcircle en mode lecture

MSB = I2C_Rd(1)Nombre signeacute donnant la tempeacuterature entre +125deg et -55degC

LSB = I2C_Rd(0)Si bit 7 = 1 tempeacuterature MSB +05degC

I2C_Stop()Arrecirct du sigal

if(MSBlt0)

MSB = abs(MSB) Si temperature neacutegative valeur absolue de MSB

Temp[0]=45 Signe - affecteacute en ascii

else

Station meacuteteacuteo autonome 2012

37

Temp[0]=43signe + affecteacute en ascii

Temp[1]=(MSB10)+48 Valeur des dizaines affecteacute en ascii

Temp[2]=(MSB10)+48 Valeur des uniteacutes affecteacute en ascii

Temp[3]=44 Virgule affecteacute en ascii

if (LSB==128) Si bit 7 agrave 1 alors +05deg

Temp[4]=5

else Si bit 7 agrave 0 alors +00deg

Temp[4]=0

Temp[5]=223 degreacute affecteacute en ascii

Temp[6]=67 C affecteacute en ascii

if(cond==50)Appel la fonction LCD tous les 1000

lcd(1 1 11 temptxt)Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 7 temp)Affiche la chaine de caractegravere hum sur le LCD

cond=0Remise a 0 de la condition

Xbee(7 temp) Envoi la chaicircne de caractegravere temp dans la fonction xbee

Fonction vent

void vent(int cond)

unsigned long tl th per

int vitfreq

char vent[13] txtvent[]=Vitesse du vent VV

if(PIR1CCP1IF==1) Test si front montant agrave lieu

TMR1H=0 Initialisation du timer1 bit de point fort

TMR1L=0 Initialisation du timer1 bit de point faible

th=CCPR1H Les valeurs sont copieacute dans des variables

tl=CCPR1L

th=thltlt8 Deacutecalage car th =gt bit de point fort

per = th|tl On concategravene les deux valeurs nous obtenons la peacuteriode

PIR1CCP1IF=0 Remise a 0 du drapeau

if(PIR1TMR1IF==1) Si deacutepassement du timer 1

per=65535+per On ajoute une retenue lorsquon a fait un tour (16bit)

PIR1TMR1IF=0 Remise a 0 du drapeau deacutepassement

Station meacuteteacuteo autonome 2012

38

freq=671310perCalacul de la freacutequence

vit=freq179 + 692Calcul de la vitesse que lon x100

if(vitlt200)En dessous 2ms la mesure est aleacuteatoire agrave cause du 2egraveme deacutebordement

vit=0

vent[0]=(vit10000)+48Valeur des centaines affecteacute en ascii(48=0)

VV=(vit1000)10

vent[1]=VV+48Valeur des dizaines affecteacute en ascii

VV=(vit100)10

vent[2]=VV+48Valeur des uniteacute affecteacute en ascii

VV=(vit10)10

vent[3]=44Virgule affecteacute en ascii

vent[4]=VV+48Valeur de la 1er deacutecimale affecteacute en ascii

VV=vit10

vent[5]=VV+48Valeur de la 2egraveme deacutecimale affecteacute en ascii

vent[6]=109m affecteacute en ascii

vent[7]=47 affecteacute en ascii

vent[8]=115s affecteacute en ascii

if(cond==50)Appel la fonction LCD tous les 1000

lcd(1 1 15 txtvent)Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 9 vent)Affiche la chaine de caractegravere hum sur le LCD

cond=0Remise a 0 de la condition

Xbee(9 vent) Envoi la chaicircne de caractegravere vent dans la fonction xbee

Fonction affichage

void lcd(int li int co int nb char receive[15])

int i

for(i=0 iltnb i++)Boucle for

Lcd_chr(li (co+i) receive[i])Affiche les caractegraveres jusquagrave i

Usart

void xbee(int nb char receive[15])

int i

Usart_Init(9600)Vitesse de transmission

for(i=0 iltnb i++)Boucle for

Usart_Write(receive[i])Envoi les caractegraveres sur lHyperTerminal jusquagrave i

Station meacuteteacuteo autonome 2012

22

C Etalonnage de lrsquoaneacutemomegravetre

Pour eacutetalonner le capteur nous avons commenceacute par savoir agrave quelle freacutequence correspond la

valeur releveacutee par le mode capture Pour cela nous avons brancheacute un GBF agrave la place du capteur et

avec un oscilloscope nous avons compareacute leurs valeurs

Nous avons ensuite traceacute agrave lrsquoaide des valeurs du tableau la courbe F(Hz) en fonction du

compteur De cette courbe nous relevons lrsquoeacutequation

F = 671310compteur^(-101)

Soit environ F = 671310compteur

Puis nous avons brancheacute notre aneacutemomegravetre sur le microcontrocircleur Cela dans le but de

relever sa peacuteriode sur lrsquoeacutecran LCD agrave lrsquoaide drsquoune soufflerie variable et du manomegravetre GDH (reacutef

121552 200-13) nous avons compareacute leurs valeurs pour connaitre lrsquoeacutetalonnage de notre capteur

Nous avons noteacute plusieurs valeurs puis traceacute diffeacuterentes courbe pour trouver les eacutequations qui nous

permettrons de calculer la vitesse dans notre programme

Station meacuteteacuteo autonome 2012

23

Voici les valeurs que nous avons releveacutees puis la courbe traceacutee sur Excel

De cette courbe nous obtenons lrsquoeacutequation

Vitesse du vent = 0179F + 0629

Nous les multiplierons par 100 pour reacutecupeacuterer les deacutecimales et les implanter dans une chaine

de caractegravere

Vitesse du vent = 179F + 629

Nous avons agrave preacutesent agrave notre disposition toutes les eacutequations neacutecessaires pour pouvoir

convertir la valeur releveacutee par le mode capture en une vitesse

D Le scheacutema du microcontrocircleur avec lrsquoaneacutemomegravetre

On voit sur le scheacutema que le capteur est bien relieacute sur la borne RC2 Nous avons aussi

repreacutesenteacute les borniers J1 et J2 A droite tous ce qui est sur le support et agrave gauche tous ce qui est sur

la platine

Figure 13 Scheacutema avec laneacutemomegravetre

Station meacuteteacuteo autonome 2012

24

E Programme pour la mesure de la vitesse du vent

Voici le programme pour mesurer la vitesse du vent avec les affectations deacutecrites ci-dessus

ainsi que les eacutequations de conversions

Deacuteclaration des fonctions

void vent(int cond)

void lcd(int li int co int nb char receive[20])

void main()

deacuteclaration des variables

int cond=0

Initialisation et affectation des ports

PORTB=0 initialisation

PORTC=0 initialisation

TRISC=0x04 Port C deacuteclarer en sortie sauf RC2 en mode capture

TRISB=0 Port B deacuteclarer en sortie

Configuration du mode capture

T1CON=0x31 Configuration du timer1

CCP1CON=0x05 Parameacutetrage du mode capture

PIE1TMR1IE=1 Autorise les deacutebordements du timer 1

Configuration et initialisation de leacutecran LCD

Lcd_Config(ampPORTB 0 1 WR 5 4 3 2) Configure leacutecran

Lcd_Init(ampPORTB) Initialisation du LCD

Lcd_Cmd(Lcd_CURSOR_OFF) Enlegraveve le curseur

Lcd_Cmd(Lcd_CLEAR) Efface leacutecran

Boucle infinie

while(1)

cond=cond+1

vent(ampcond)

Fonction vent

void vent(int cond)

unsigned long tl th per

int vitfreq

char vent[13] txtvent[]=vitesse du vent VV

if(PIR1CCP1IF==1) Test si front montant agrave lieu

TMR1H=0 Initialisation du timer1 bit de point fort

TMR1L=0 Initialisation du timer1 bit de point faible

th=CCPR1H Les valeurs sont copieacute dans des variables

tl=CCPR1L

th=thltlt8 Deacutecalage car th =gt bit de point fort

per = th|tl On concategravene les deux valeurs nous obtenons la peacuteriode

PIR1CCP1IF=0 Remise a 0 du drapeau

if(PIR1TMR1IF==1) Si deacutepassement du timer 1

per=65535+per On ajoute une retenue lorsquon a fait un tour (16bit)

PIR1TMR1IF=0 Remise a 0 du drapeau deacutepassement

freq=671310per Calcul de la freacutequence

vit=freq179 + 692 Calcul de la vitesse que lon x100

Station meacuteteacuteo autonome 2012

25

if(vitlt200) En dessous 2ms la mesure est aleacuteatoire agrave cause du 2egraveme deacutebordement

vit=0

vent[0]=(vit10000)+48 Valeur des centaines affecteacute en ascii(48=0)

VV=(vit1000)10

vent[1]=VV+48 Valeur des dizaines affecteacute en ascii

VV=(vit100)10

vent[2]=VV+48 Valeur des uniteacute affecteacute en ascii

VV=(vit10)10

vent[3]=44 Virgule affecteacute en ascii

vent[4]=VV+48 Valeur de la 1er deacutecimale affecteacute en ascii

VV=vit10

vent[5]=VV+48 Valeur de la 2egraveme deacutecimale affecteacute en ascii

vent[6]=109 m affecteacute en ascii

vent[7]=47 affecteacute en ascii

vent[8]=115 s affecteacute en ascii

if(cond==1000) Appel la fonction LCD tous les 1000

lcd(1 1 16 txtvent) Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 8 vent) Affiche la chaine de caractegravere hum sur le LCD

cond=0 Remise a 0 de la condition

Fonction affichage

void lcd(int li int co int nb char receive[20])

int i

for(i=0 ilt=nb i++) Boucle for

Lcd_chr(li (co+i) receive[i]) Affiche les caractegraveres jusquagrave i

Station meacuteteacuteo autonome 2012

26

X Simulation une station meacuteteacuteo autonome

Maintenant que tous nos capteurs sont installeacutes nous allons mettre agrave profit le bouton

poussoir installeacute dans la partie LCD Crsquoest-agrave-dire que nous allons rassembler tous les programmes

preacuteceacutedents pour nrsquoen faire qursquoun Il suffira drsquoappuyer sur le bouton poussoir pour faire deacutefiler les

diffeacuterentes valeurs comme une vraie station meacuteteacuteo

A La structure du programme

Boucle infinie

while(1)

cond=cond+1 Increacutemente la variable cond

switch(BP)

case 0

humidite(ampcond) Appel la fonction humiditeacute

if(PORTAF2==1) Ces if permet de changer la valeur de BP

BP=1

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250) Temps quon relacircche bien le bouton

break

case 1

temperature(ampcond) Appel la fonction tempeacuterature

if(PORTAF2==1)

BP=2

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)

break

case 2

vent(ampcond) Appel la fonction vent

if(PORTAF2==1)

BP=0

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)

break

Nous avons choisi drsquoutiliser un Switch nous avons donc juste rajouteacute une variable BP

Lorsqursquoil y a appui sur le bouton poussoir la variable BP srsquoincreacutemente et le programme passe agrave une

autre case et donc utilise une nouvelle fonction La temporisation nous donne le temps de relacirccher le

bouton pour eacuteviter de faire deacutefiler le menu sans le vouloir

Station meacuteteacuteo autonome 2012

27

B La simulation

Etant donneacute que nous ne pouvions pas prendre le mateacuteriel avec nous il eacutetait impeacuteratif de

pouvoir faire des simulations Pour cela nous avons utiliseacute un logiciel tregraves utile Proteus ISIS Ce

logiciel possegravede une tregraves grande librairie et permet de rentrer nos programmes sur le PIC virtuel

geacuteneacutereacute par le logiciel Pour simuler le capteur drsquohumiditeacute nous avons utiliseacute un potentiomegravetre Pour

celui de lrsquoaneacutemomegravetre comme pour nos mesures nous avons brancheacute virtuellement un GBF sur la

borne associeacute et observeacute son signal agrave lrsquoaide drsquoun oscilloscope

Voilagrave un aperccedilu de la simulation effectueacute sur ISIS

Veacuterification theacuteorique du vent

Vitesse du vent = 0179 37 + 0629

Vitesse du vent = 7657ms

Veacuterification theacuteorique de lrsquohumiditeacute

H= (315-081)0031

H=7548

Veacuterification theacuteorique de la

tempeacuterature

La valeur afficheacutee correspond bien

aux 27degC seacutelectionneacute sur le capteur

Station meacuteteacuteo autonome 2012

28

XI Transmission des donneacutees par liaison ZigBee

ZigBee est un protocole de haut niveau permettant la communication de petites radios agrave

consommation reacuteduite baseacutee sur le standard IEEE 802154

Cette technologie a pour but la communication de courte distance telle que le propose deacutejagrave

la technologie Bluetooth tout en eacutetant moins chegravere plus simple et avec une fiabiliteacute assez eacuteleveacutee

Dans notre projet nous nous servirons de ZigBee pour permettre une transmission par ondes

de nos donneacutees de la station meacuteteacuteo vers un ordinateur Pour cela nous avons 2 modules Xbee pro 2

platines drsquointerfaces une avec des pattes (liaison platine) et lrsquoautre avec une sortie RS232 (liaison pc)

Caracteacuteristique eacutelectrique

Les signaux Xbee ont une amplitude de 33V mais sont alimenteacutes en 5V (tension de notre

source USB) cacircbleacutes sur la bornes VIN (laquo Power input from 6-12Vdc 300mA or higher raquo) Mais

notre source nrsquoeacutetant pas assez puissante pour alimenter toute notre installation Nous utiliserons

donc une source externe de 5V qui sera utiliseacutee pour alimenter les 2 systegravemes Xbee

Description des Bornes du Xbee qui nous inteacuteresse

Station meacuteteacuteo autonome 2012

29

A Scheacutema eacutelectrique du module Xbee

Nous avons cacircbleacute la sortie TX du microcontrocircleur qui eacutemet un signal jusqursquoagrave la borne RX du

Xbee qui reacuteceptionne ce signal Apregraves la transmission se fait par onde entre les 2 modules Xbee Pour

le module qui reccediloit le signal un cacircble RS232 suffit agrave faire la liaison entre celui-ci et le PC

B Envoi des donneacutees la liaison Usart

Un USART (Universal synchronous amp Asynchronous Receiver Transmitter) est un eacutemetteur-

reacutecepteur universel En langage courant cest le composant utiliseacute pour faire la liaison entre

lordinateur et le port seacuterie Lordinateur envoie les donneacutees en parallegravele (autant de fils que de bits

de donneacutees) Il faut donc transformer ces donneacutees pour les faire passer agrave travers une liaison seacuterie qui

utilise un mecircme fil pour faire passer tous les bits de donneacutees

Constitution dune trame USART

un bit de start toujours agrave 0 servant agrave la synchronisation du reacutecepteur

les donneacutees la taille peut varier (geacuteneacuteralement entre 5 et 9 bits)

eacuteventuellement un bit de pariteacute paire ou impaire

et un bit de stop toujours agrave 1 (la dureacutee peut varier entre 1 15 et 2 temps bit)

Le niveau logique de repos est le 1

Figure 14 Trame USART

Station meacuteteacuteo autonome 2012

30

Afin de faciliter les liaisons entre peacuteripheacuteriques (PC microcontrocircleur modem hellip) des vitesses

de transmission sont normaliseacutees luniteacute baud correspondant agrave un temps bit Dans notre cas nous

choisirons une vitesse de transmission de 9600bps

C Programme drsquoenvoi des donneacutees par liaison Usart

Gracircce agrave la librairie de MikroC il est tregraves facile drsquoenvoyer des donneacutees par liaison Usart Cela

fonctionne comme pour envoyer des caractegraveres sur lrsquoeacutecran LCD Il faut juste ensuite choisir la vitesse

de transmission qui sera 9600bps Voici la fonction et un morceau du programme qui sert agrave envoyer

les caractegraveres sur Xbee et de Xbee agrave un HyperTerminal

Fonction humiditeacute

void humidite(int cond)

long H U VL Deacuteclaration des variables

char HH hum[8] humtxt[]=Humidite

helliphellip

Xbee(8 hum) Envoi la chaicircne de caractegravere hum dans la fonction xbee

Usart

void xbee(int nb char receive[20])

int i

Usart_Init(9600) Vitesse de transmission

for(i=0 ilt=nb i++) Boucle for

Usart_Write(receive[i]) Envoi les caractegraveres sur lrsquoHyperTerminal jusquagrave i

Station meacuteteacuteo autonome 2012

31

XII Estimation du coucirct du projet

On peut voir sur ce tableau que le prix de reviens pour les eacuteleacutements que nous avons utiliseacute

est de 14506euro TTC Ce qui est plutocirct oneacutereux compareacute aux stations meacuteteacuteo du marcheacute qui oscille

entre 6euro et 400euro En sachant que la nocirctre est loin drsquoecirctre finaliseacute (finition estheacutetique ergonomie et

ajout de nouvelle fonction comme la date et lrsquoheure)

Composant Quantiteacute Prix (TVA inclus) Liens Quartz 20000MHz 1 111 euro Lien

Capaciteacute 22pF 2 010 euro lien

PIC 16F876 1 427 euro lien

LCD MODULE 1 1575 euro lien

Potentiomegravetre 10KΩ 1 618 euro lien

Reacutesistance 33 Ω 1 035 euro lien

Reacutesistance 10 K Ω 2 070 euro lien

Reacutesistance 1 KΩ 3 105 euro lien

LED rouge 1 013 euro lien

DS1621 1 650 euro lien

Bouton poussoir 1 060 euro lien

Module Xbee 2 4000 euro lien

Platine dinterface (XBEE) RS232 1 1890 euro lien

Platine dinterface (XBEE) 1 1364 euro lien

Capteur drsquohumiditeacute 1 2692 euro lien

Transistor 1 561 euro lien

Diode 1 325 euro lien

Totales 1 14506 euro

Station meacuteteacuteo autonome 2012

32

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

panelsbut 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 Itrsquos also possible to measure

humidity and wind speed Then itrsquos 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 its 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 Itrsquos 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

Station meacuteteacuteo autonome 2012

33

XIV Conclusion

Ce projet sur la conception drsquoune station meacuteteacuteo autonome qui nous a eacuteteacute confieacute a eacuteteacute tregraves

enrichissant Il nous a permis de mettre en relations les connaissances acquises durant lrsquoanneacutee mais

aussi acqueacuterir de nouvelles connaissances comme le fonctionnement drsquoun microcontrocircleur En effet

nous nrsquoavions jamais programmeacute sur microcontrocircleur Il a fallu srsquoadapter et apprendre agrave utiliser des

nouveaux logiciels tels que Proteus MikroC ainsi que Labview

De cette expeacuterience nous avons aussi appris agrave ecirctre autonome Nous avons saisi que la

compreacutehension des documents techniques et des librairies eacutetait un point essentiel de notre projet

En programmation nous nrsquoavions pas le droit agrave lrsquoerreur car la moindre faute pouvait conduire le

systegraveme agrave un dysfonctionnement Ce projet nous a demandeacute beaucoup de rigueur de patience et de

temps

Toutefois nous nrsquoavons pas eu malheureusement le temps drsquoinstaller le capteur de

tempeacuterature inteacuterieure par manque de temps Plus encore nous aurions aimeacute approfondir certains

points Par exemple pouvoir installer les composants sur circuit imprimeacute et concevoir un support

viable pour en faire une vraie station meacuteteacuteo Lrsquoinstallation drsquoune girouette aurait eacuteteacute appreacuteciable

pour connaicirctre le sens du vent Aussi le programme aurait sans doute pu ecirctre encore ameacutelioreacute pour

de meilleures performances

Malgreacute ce manque de temps nous sommes tregraves satisfaits du fonctionnement de ce module

qui nous a permis de comprendre lrsquoutiliteacute des parties theacuteoriques pour lrsquoapplication et la mise en

œuvre drsquoun systegraveme Lrsquoapproche peacutedagogique de nous diriger vers les solutions sans jamais les

donner de nous laisser un grand degreacute de liberteacute et drsquoautonomie a eacuteteacute au deacutebut assez deacuteroutante

mais tregraves instructif

Enfin nous tenions agrave remercier Mme Leymarie qui nous a suivis et aiguilleacute tout au long de ce

projet

Station meacuteteacuteo autonome 2012

34

XV ANNEXES

Programme complet

Deacuteclaration 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()

deacuteclaration des variables

int cond=0Condition pour laffichage sur leacutecran LCD

int BP=0

Initialisation et affectation des ports

PORTA=0

PORTB=0 initialisation

PORTC=0

TRISB=0 Port B deacuteclarer en sortie

TRISA=0xFF Port A en entreacutee

ADCON1=0x84 Justifieacute agrave droite active RA0RA1RA3 analogique

ADCON0=0x85 Fosc32 sur PA0 en service

TRISB=0 Port B deacuteclarer en sortie

TRISC=0xFFPort C deacuteclarer en entreacutee

Configuration et initialisation de leacutecran LCD

Lcd_Config(ampPORTB 0 1 WR 5 4 3 2) Configure lecran

Lcd_Init(ampPORTB) initialisation du LCD

Lcd_Cmd(Lcd_CURSOR_OFF) Enleve le curseur

Lcd_Cmd(Lcd_CLEAR) Efface lecran

Initialisation du module I2C

I2C_Init(100000)initialisation de la communication I2C

I2C_Start()Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90)Mode de controcircle en mode eacutecriture

I2C_Wr(0xAC)Accegraves au registre de configuration

I2C_Wr(0x0A)Registre de configuration mesure en continu

I2C_Stop()Arrecirct du signal

I2C_Start()Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90)Mode de controcircle en mode eacutecriture

I2C_Wr(0xEE)Deacutebut de la conversion

I2C_Stop()Arrecirct du sigal

Station meacuteteacuteo autonome 2012

35

Configuration du mode capture

T1CON=0x31 Configuration du timer1

CCP1CON=0x05 Paramegravetrage du mode capture

PIE1TMR1IE=1 Autorise les deacutebordements du timer 1

Boucle infinie

while(1)

cond=cond+1Increacutemente la variable cond

switch(BP)

case 0

humidite(ampcond)Appel la fonction humiditeacute

if(PORTAF2==1)Ces if permet de changer la valeur de BP

BP=1

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)Temps quon relacircche bien le bouton

break

case 1

temperature(ampcond)Appel la fonction tempeacuterature

if(PORTAF2==1)

BP=2

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)

break

case 2

vent(ampcond)Appel la fonction vent

if(PORTAF2==1)

BP=0

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)

break

Fonction humiditeacute

void humidite(int cond)

long H U VLDeacuteclaration des variables

char HH hum[8] humtxt[]=Humidite

VL=Adc_read(0) Valeur lue sur RA0(humiditeacute)

U=(VL5000)1023 Convertit la valeur lue en tension x1000

H=(U-810)(0031) Convertit la tension en humiditeacute x1000

Station meacuteteacuteo autonome 2012

36

if(Hgt100000)Si H gt 100(impossible) alors = 100

H=100000

if(Hlt0)Si H lt 0(impossible) alors = 0

H=0

hum[0]=(H100000)+48Valeur des centaines affecteacute en ascii(48=0)

HH=(H10000)10

hum[1]=HH+48Valeur des dizaines affecteacute en ascii

HH=(H1000)10

hum[2]=HH+48Valeur des uniteacutes affecteacute en ascii

hum[3]=44Virgule affecteacute en ascii

HH=(H100)10

hum[4]=HH+48Valeur de la premiegravere deacutecimale affecteacute en ascii

HH=(H10)10

hum[5]=HH+48Valeur de la deuxiegraveme deacutecimale affecteacute en ascii

hum[6]=37Pourcentage affecteacute en ascii

if(cond==50)Appel la fonction LCD tous les 1000

lcd(1 1 8 humtxt)Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 7 hum)Affiche la chaine de caractegravere hum sur le LCD

cond=0Remise a 0 de la condition

Xbee(7 hum) Envoi la chaicircne de caractegravere hum dans la fonction xbee

Fonction tempeacuterature

void temperature(int cond)

char temp[7] temptxt[]=Temperature LSB

signed char MSB

I2C_Start()Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90)Mode de controcircle en mode eacutecriture

I2C_Wr(0xAA)Lecture de la tempeacuterature

I2C_Stop()Arrecirct du sigal

I2C_Start()Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x91)Mode de controcircle en mode lecture

MSB = I2C_Rd(1)Nombre signeacute donnant la tempeacuterature entre +125deg et -55degC

LSB = I2C_Rd(0)Si bit 7 = 1 tempeacuterature MSB +05degC

I2C_Stop()Arrecirct du sigal

if(MSBlt0)

MSB = abs(MSB) Si temperature neacutegative valeur absolue de MSB

Temp[0]=45 Signe - affecteacute en ascii

else

Station meacuteteacuteo autonome 2012

37

Temp[0]=43signe + affecteacute en ascii

Temp[1]=(MSB10)+48 Valeur des dizaines affecteacute en ascii

Temp[2]=(MSB10)+48 Valeur des uniteacutes affecteacute en ascii

Temp[3]=44 Virgule affecteacute en ascii

if (LSB==128) Si bit 7 agrave 1 alors +05deg

Temp[4]=5

else Si bit 7 agrave 0 alors +00deg

Temp[4]=0

Temp[5]=223 degreacute affecteacute en ascii

Temp[6]=67 C affecteacute en ascii

if(cond==50)Appel la fonction LCD tous les 1000

lcd(1 1 11 temptxt)Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 7 temp)Affiche la chaine de caractegravere hum sur le LCD

cond=0Remise a 0 de la condition

Xbee(7 temp) Envoi la chaicircne de caractegravere temp dans la fonction xbee

Fonction vent

void vent(int cond)

unsigned long tl th per

int vitfreq

char vent[13] txtvent[]=Vitesse du vent VV

if(PIR1CCP1IF==1) Test si front montant agrave lieu

TMR1H=0 Initialisation du timer1 bit de point fort

TMR1L=0 Initialisation du timer1 bit de point faible

th=CCPR1H Les valeurs sont copieacute dans des variables

tl=CCPR1L

th=thltlt8 Deacutecalage car th =gt bit de point fort

per = th|tl On concategravene les deux valeurs nous obtenons la peacuteriode

PIR1CCP1IF=0 Remise a 0 du drapeau

if(PIR1TMR1IF==1) Si deacutepassement du timer 1

per=65535+per On ajoute une retenue lorsquon a fait un tour (16bit)

PIR1TMR1IF=0 Remise a 0 du drapeau deacutepassement

Station meacuteteacuteo autonome 2012

38

freq=671310perCalacul de la freacutequence

vit=freq179 + 692Calcul de la vitesse que lon x100

if(vitlt200)En dessous 2ms la mesure est aleacuteatoire agrave cause du 2egraveme deacutebordement

vit=0

vent[0]=(vit10000)+48Valeur des centaines affecteacute en ascii(48=0)

VV=(vit1000)10

vent[1]=VV+48Valeur des dizaines affecteacute en ascii

VV=(vit100)10

vent[2]=VV+48Valeur des uniteacute affecteacute en ascii

VV=(vit10)10

vent[3]=44Virgule affecteacute en ascii

vent[4]=VV+48Valeur de la 1er deacutecimale affecteacute en ascii

VV=vit10

vent[5]=VV+48Valeur de la 2egraveme deacutecimale affecteacute en ascii

vent[6]=109m affecteacute en ascii

vent[7]=47 affecteacute en ascii

vent[8]=115s affecteacute en ascii

if(cond==50)Appel la fonction LCD tous les 1000

lcd(1 1 15 txtvent)Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 9 vent)Affiche la chaine de caractegravere hum sur le LCD

cond=0Remise a 0 de la condition

Xbee(9 vent) Envoi la chaicircne de caractegravere vent dans la fonction xbee

Fonction affichage

void lcd(int li int co int nb char receive[15])

int i

for(i=0 iltnb i++)Boucle for

Lcd_chr(li (co+i) receive[i])Affiche les caractegraveres jusquagrave i

Usart

void xbee(int nb char receive[15])

int i

Usart_Init(9600)Vitesse de transmission

for(i=0 iltnb i++)Boucle for

Usart_Write(receive[i])Envoi les caractegraveres sur lHyperTerminal jusquagrave i

Station meacuteteacuteo autonome 2012

23

Voici les valeurs que nous avons releveacutees puis la courbe traceacutee sur Excel

De cette courbe nous obtenons lrsquoeacutequation

Vitesse du vent = 0179F + 0629

Nous les multiplierons par 100 pour reacutecupeacuterer les deacutecimales et les implanter dans une chaine

de caractegravere

Vitesse du vent = 179F + 629

Nous avons agrave preacutesent agrave notre disposition toutes les eacutequations neacutecessaires pour pouvoir

convertir la valeur releveacutee par le mode capture en une vitesse

D Le scheacutema du microcontrocircleur avec lrsquoaneacutemomegravetre

On voit sur le scheacutema que le capteur est bien relieacute sur la borne RC2 Nous avons aussi

repreacutesenteacute les borniers J1 et J2 A droite tous ce qui est sur le support et agrave gauche tous ce qui est sur

la platine

Figure 13 Scheacutema avec laneacutemomegravetre

Station meacuteteacuteo autonome 2012

24

E Programme pour la mesure de la vitesse du vent

Voici le programme pour mesurer la vitesse du vent avec les affectations deacutecrites ci-dessus

ainsi que les eacutequations de conversions

Deacuteclaration des fonctions

void vent(int cond)

void lcd(int li int co int nb char receive[20])

void main()

deacuteclaration des variables

int cond=0

Initialisation et affectation des ports

PORTB=0 initialisation

PORTC=0 initialisation

TRISC=0x04 Port C deacuteclarer en sortie sauf RC2 en mode capture

TRISB=0 Port B deacuteclarer en sortie

Configuration du mode capture

T1CON=0x31 Configuration du timer1

CCP1CON=0x05 Parameacutetrage du mode capture

PIE1TMR1IE=1 Autorise les deacutebordements du timer 1

Configuration et initialisation de leacutecran LCD

Lcd_Config(ampPORTB 0 1 WR 5 4 3 2) Configure leacutecran

Lcd_Init(ampPORTB) Initialisation du LCD

Lcd_Cmd(Lcd_CURSOR_OFF) Enlegraveve le curseur

Lcd_Cmd(Lcd_CLEAR) Efface leacutecran

Boucle infinie

while(1)

cond=cond+1

vent(ampcond)

Fonction vent

void vent(int cond)

unsigned long tl th per

int vitfreq

char vent[13] txtvent[]=vitesse du vent VV

if(PIR1CCP1IF==1) Test si front montant agrave lieu

TMR1H=0 Initialisation du timer1 bit de point fort

TMR1L=0 Initialisation du timer1 bit de point faible

th=CCPR1H Les valeurs sont copieacute dans des variables

tl=CCPR1L

th=thltlt8 Deacutecalage car th =gt bit de point fort

per = th|tl On concategravene les deux valeurs nous obtenons la peacuteriode

PIR1CCP1IF=0 Remise a 0 du drapeau

if(PIR1TMR1IF==1) Si deacutepassement du timer 1

per=65535+per On ajoute une retenue lorsquon a fait un tour (16bit)

PIR1TMR1IF=0 Remise a 0 du drapeau deacutepassement

freq=671310per Calcul de la freacutequence

vit=freq179 + 692 Calcul de la vitesse que lon x100

Station meacuteteacuteo autonome 2012

25

if(vitlt200) En dessous 2ms la mesure est aleacuteatoire agrave cause du 2egraveme deacutebordement

vit=0

vent[0]=(vit10000)+48 Valeur des centaines affecteacute en ascii(48=0)

VV=(vit1000)10

vent[1]=VV+48 Valeur des dizaines affecteacute en ascii

VV=(vit100)10

vent[2]=VV+48 Valeur des uniteacute affecteacute en ascii

VV=(vit10)10

vent[3]=44 Virgule affecteacute en ascii

vent[4]=VV+48 Valeur de la 1er deacutecimale affecteacute en ascii

VV=vit10

vent[5]=VV+48 Valeur de la 2egraveme deacutecimale affecteacute en ascii

vent[6]=109 m affecteacute en ascii

vent[7]=47 affecteacute en ascii

vent[8]=115 s affecteacute en ascii

if(cond==1000) Appel la fonction LCD tous les 1000

lcd(1 1 16 txtvent) Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 8 vent) Affiche la chaine de caractegravere hum sur le LCD

cond=0 Remise a 0 de la condition

Fonction affichage

void lcd(int li int co int nb char receive[20])

int i

for(i=0 ilt=nb i++) Boucle for

Lcd_chr(li (co+i) receive[i]) Affiche les caractegraveres jusquagrave i

Station meacuteteacuteo autonome 2012

26

X Simulation une station meacuteteacuteo autonome

Maintenant que tous nos capteurs sont installeacutes nous allons mettre agrave profit le bouton

poussoir installeacute dans la partie LCD Crsquoest-agrave-dire que nous allons rassembler tous les programmes

preacuteceacutedents pour nrsquoen faire qursquoun Il suffira drsquoappuyer sur le bouton poussoir pour faire deacutefiler les

diffeacuterentes valeurs comme une vraie station meacuteteacuteo

A La structure du programme

Boucle infinie

while(1)

cond=cond+1 Increacutemente la variable cond

switch(BP)

case 0

humidite(ampcond) Appel la fonction humiditeacute

if(PORTAF2==1) Ces if permet de changer la valeur de BP

BP=1

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250) Temps quon relacircche bien le bouton

break

case 1

temperature(ampcond) Appel la fonction tempeacuterature

if(PORTAF2==1)

BP=2

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)

break

case 2

vent(ampcond) Appel la fonction vent

if(PORTAF2==1)

BP=0

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)

break

Nous avons choisi drsquoutiliser un Switch nous avons donc juste rajouteacute une variable BP

Lorsqursquoil y a appui sur le bouton poussoir la variable BP srsquoincreacutemente et le programme passe agrave une

autre case et donc utilise une nouvelle fonction La temporisation nous donne le temps de relacirccher le

bouton pour eacuteviter de faire deacutefiler le menu sans le vouloir

Station meacuteteacuteo autonome 2012

27

B La simulation

Etant donneacute que nous ne pouvions pas prendre le mateacuteriel avec nous il eacutetait impeacuteratif de

pouvoir faire des simulations Pour cela nous avons utiliseacute un logiciel tregraves utile Proteus ISIS Ce

logiciel possegravede une tregraves grande librairie et permet de rentrer nos programmes sur le PIC virtuel

geacuteneacutereacute par le logiciel Pour simuler le capteur drsquohumiditeacute nous avons utiliseacute un potentiomegravetre Pour

celui de lrsquoaneacutemomegravetre comme pour nos mesures nous avons brancheacute virtuellement un GBF sur la

borne associeacute et observeacute son signal agrave lrsquoaide drsquoun oscilloscope

Voilagrave un aperccedilu de la simulation effectueacute sur ISIS

Veacuterification theacuteorique du vent

Vitesse du vent = 0179 37 + 0629

Vitesse du vent = 7657ms

Veacuterification theacuteorique de lrsquohumiditeacute

H= (315-081)0031

H=7548

Veacuterification theacuteorique de la

tempeacuterature

La valeur afficheacutee correspond bien

aux 27degC seacutelectionneacute sur le capteur

Station meacuteteacuteo autonome 2012

28

XI Transmission des donneacutees par liaison ZigBee

ZigBee est un protocole de haut niveau permettant la communication de petites radios agrave

consommation reacuteduite baseacutee sur le standard IEEE 802154

Cette technologie a pour but la communication de courte distance telle que le propose deacutejagrave

la technologie Bluetooth tout en eacutetant moins chegravere plus simple et avec une fiabiliteacute assez eacuteleveacutee

Dans notre projet nous nous servirons de ZigBee pour permettre une transmission par ondes

de nos donneacutees de la station meacuteteacuteo vers un ordinateur Pour cela nous avons 2 modules Xbee pro 2

platines drsquointerfaces une avec des pattes (liaison platine) et lrsquoautre avec une sortie RS232 (liaison pc)

Caracteacuteristique eacutelectrique

Les signaux Xbee ont une amplitude de 33V mais sont alimenteacutes en 5V (tension de notre

source USB) cacircbleacutes sur la bornes VIN (laquo Power input from 6-12Vdc 300mA or higher raquo) Mais

notre source nrsquoeacutetant pas assez puissante pour alimenter toute notre installation Nous utiliserons

donc une source externe de 5V qui sera utiliseacutee pour alimenter les 2 systegravemes Xbee

Description des Bornes du Xbee qui nous inteacuteresse

Station meacuteteacuteo autonome 2012

29

A Scheacutema eacutelectrique du module Xbee

Nous avons cacircbleacute la sortie TX du microcontrocircleur qui eacutemet un signal jusqursquoagrave la borne RX du

Xbee qui reacuteceptionne ce signal Apregraves la transmission se fait par onde entre les 2 modules Xbee Pour

le module qui reccediloit le signal un cacircble RS232 suffit agrave faire la liaison entre celui-ci et le PC

B Envoi des donneacutees la liaison Usart

Un USART (Universal synchronous amp Asynchronous Receiver Transmitter) est un eacutemetteur-

reacutecepteur universel En langage courant cest le composant utiliseacute pour faire la liaison entre

lordinateur et le port seacuterie Lordinateur envoie les donneacutees en parallegravele (autant de fils que de bits

de donneacutees) Il faut donc transformer ces donneacutees pour les faire passer agrave travers une liaison seacuterie qui

utilise un mecircme fil pour faire passer tous les bits de donneacutees

Constitution dune trame USART

un bit de start toujours agrave 0 servant agrave la synchronisation du reacutecepteur

les donneacutees la taille peut varier (geacuteneacuteralement entre 5 et 9 bits)

eacuteventuellement un bit de pariteacute paire ou impaire

et un bit de stop toujours agrave 1 (la dureacutee peut varier entre 1 15 et 2 temps bit)

Le niveau logique de repos est le 1

Figure 14 Trame USART

Station meacuteteacuteo autonome 2012

30

Afin de faciliter les liaisons entre peacuteripheacuteriques (PC microcontrocircleur modem hellip) des vitesses

de transmission sont normaliseacutees luniteacute baud correspondant agrave un temps bit Dans notre cas nous

choisirons une vitesse de transmission de 9600bps

C Programme drsquoenvoi des donneacutees par liaison Usart

Gracircce agrave la librairie de MikroC il est tregraves facile drsquoenvoyer des donneacutees par liaison Usart Cela

fonctionne comme pour envoyer des caractegraveres sur lrsquoeacutecran LCD Il faut juste ensuite choisir la vitesse

de transmission qui sera 9600bps Voici la fonction et un morceau du programme qui sert agrave envoyer

les caractegraveres sur Xbee et de Xbee agrave un HyperTerminal

Fonction humiditeacute

void humidite(int cond)

long H U VL Deacuteclaration des variables

char HH hum[8] humtxt[]=Humidite

helliphellip

Xbee(8 hum) Envoi la chaicircne de caractegravere hum dans la fonction xbee

Usart

void xbee(int nb char receive[20])

int i

Usart_Init(9600) Vitesse de transmission

for(i=0 ilt=nb i++) Boucle for

Usart_Write(receive[i]) Envoi les caractegraveres sur lrsquoHyperTerminal jusquagrave i

Station meacuteteacuteo autonome 2012

31

XII Estimation du coucirct du projet

On peut voir sur ce tableau que le prix de reviens pour les eacuteleacutements que nous avons utiliseacute

est de 14506euro TTC Ce qui est plutocirct oneacutereux compareacute aux stations meacuteteacuteo du marcheacute qui oscille

entre 6euro et 400euro En sachant que la nocirctre est loin drsquoecirctre finaliseacute (finition estheacutetique ergonomie et

ajout de nouvelle fonction comme la date et lrsquoheure)

Composant Quantiteacute Prix (TVA inclus) Liens Quartz 20000MHz 1 111 euro Lien

Capaciteacute 22pF 2 010 euro lien

PIC 16F876 1 427 euro lien

LCD MODULE 1 1575 euro lien

Potentiomegravetre 10KΩ 1 618 euro lien

Reacutesistance 33 Ω 1 035 euro lien

Reacutesistance 10 K Ω 2 070 euro lien

Reacutesistance 1 KΩ 3 105 euro lien

LED rouge 1 013 euro lien

DS1621 1 650 euro lien

Bouton poussoir 1 060 euro lien

Module Xbee 2 4000 euro lien

Platine dinterface (XBEE) RS232 1 1890 euro lien

Platine dinterface (XBEE) 1 1364 euro lien

Capteur drsquohumiditeacute 1 2692 euro lien

Transistor 1 561 euro lien

Diode 1 325 euro lien

Totales 1 14506 euro

Station meacuteteacuteo autonome 2012

32

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

panelsbut 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 Itrsquos also possible to measure

humidity and wind speed Then itrsquos 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 its 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 Itrsquos 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

Station meacuteteacuteo autonome 2012

33

XIV Conclusion

Ce projet sur la conception drsquoune station meacuteteacuteo autonome qui nous a eacuteteacute confieacute a eacuteteacute tregraves

enrichissant Il nous a permis de mettre en relations les connaissances acquises durant lrsquoanneacutee mais

aussi acqueacuterir de nouvelles connaissances comme le fonctionnement drsquoun microcontrocircleur En effet

nous nrsquoavions jamais programmeacute sur microcontrocircleur Il a fallu srsquoadapter et apprendre agrave utiliser des

nouveaux logiciels tels que Proteus MikroC ainsi que Labview

De cette expeacuterience nous avons aussi appris agrave ecirctre autonome Nous avons saisi que la

compreacutehension des documents techniques et des librairies eacutetait un point essentiel de notre projet

En programmation nous nrsquoavions pas le droit agrave lrsquoerreur car la moindre faute pouvait conduire le

systegraveme agrave un dysfonctionnement Ce projet nous a demandeacute beaucoup de rigueur de patience et de

temps

Toutefois nous nrsquoavons pas eu malheureusement le temps drsquoinstaller le capteur de

tempeacuterature inteacuterieure par manque de temps Plus encore nous aurions aimeacute approfondir certains

points Par exemple pouvoir installer les composants sur circuit imprimeacute et concevoir un support

viable pour en faire une vraie station meacuteteacuteo Lrsquoinstallation drsquoune girouette aurait eacuteteacute appreacuteciable

pour connaicirctre le sens du vent Aussi le programme aurait sans doute pu ecirctre encore ameacutelioreacute pour

de meilleures performances

Malgreacute ce manque de temps nous sommes tregraves satisfaits du fonctionnement de ce module

qui nous a permis de comprendre lrsquoutiliteacute des parties theacuteoriques pour lrsquoapplication et la mise en

œuvre drsquoun systegraveme Lrsquoapproche peacutedagogique de nous diriger vers les solutions sans jamais les

donner de nous laisser un grand degreacute de liberteacute et drsquoautonomie a eacuteteacute au deacutebut assez deacuteroutante

mais tregraves instructif

Enfin nous tenions agrave remercier Mme Leymarie qui nous a suivis et aiguilleacute tout au long de ce

projet

Station meacuteteacuteo autonome 2012

34

XV ANNEXES

Programme complet

Deacuteclaration 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()

deacuteclaration des variables

int cond=0Condition pour laffichage sur leacutecran LCD

int BP=0

Initialisation et affectation des ports

PORTA=0

PORTB=0 initialisation

PORTC=0

TRISB=0 Port B deacuteclarer en sortie

TRISA=0xFF Port A en entreacutee

ADCON1=0x84 Justifieacute agrave droite active RA0RA1RA3 analogique

ADCON0=0x85 Fosc32 sur PA0 en service

TRISB=0 Port B deacuteclarer en sortie

TRISC=0xFFPort C deacuteclarer en entreacutee

Configuration et initialisation de leacutecran LCD

Lcd_Config(ampPORTB 0 1 WR 5 4 3 2) Configure lecran

Lcd_Init(ampPORTB) initialisation du LCD

Lcd_Cmd(Lcd_CURSOR_OFF) Enleve le curseur

Lcd_Cmd(Lcd_CLEAR) Efface lecran

Initialisation du module I2C

I2C_Init(100000)initialisation de la communication I2C

I2C_Start()Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90)Mode de controcircle en mode eacutecriture

I2C_Wr(0xAC)Accegraves au registre de configuration

I2C_Wr(0x0A)Registre de configuration mesure en continu

I2C_Stop()Arrecirct du signal

I2C_Start()Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90)Mode de controcircle en mode eacutecriture

I2C_Wr(0xEE)Deacutebut de la conversion

I2C_Stop()Arrecirct du sigal

Station meacuteteacuteo autonome 2012

35

Configuration du mode capture

T1CON=0x31 Configuration du timer1

CCP1CON=0x05 Paramegravetrage du mode capture

PIE1TMR1IE=1 Autorise les deacutebordements du timer 1

Boucle infinie

while(1)

cond=cond+1Increacutemente la variable cond

switch(BP)

case 0

humidite(ampcond)Appel la fonction humiditeacute

if(PORTAF2==1)Ces if permet de changer la valeur de BP

BP=1

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)Temps quon relacircche bien le bouton

break

case 1

temperature(ampcond)Appel la fonction tempeacuterature

if(PORTAF2==1)

BP=2

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)

break

case 2

vent(ampcond)Appel la fonction vent

if(PORTAF2==1)

BP=0

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)

break

Fonction humiditeacute

void humidite(int cond)

long H U VLDeacuteclaration des variables

char HH hum[8] humtxt[]=Humidite

VL=Adc_read(0) Valeur lue sur RA0(humiditeacute)

U=(VL5000)1023 Convertit la valeur lue en tension x1000

H=(U-810)(0031) Convertit la tension en humiditeacute x1000

Station meacuteteacuteo autonome 2012

36

if(Hgt100000)Si H gt 100(impossible) alors = 100

H=100000

if(Hlt0)Si H lt 0(impossible) alors = 0

H=0

hum[0]=(H100000)+48Valeur des centaines affecteacute en ascii(48=0)

HH=(H10000)10

hum[1]=HH+48Valeur des dizaines affecteacute en ascii

HH=(H1000)10

hum[2]=HH+48Valeur des uniteacutes affecteacute en ascii

hum[3]=44Virgule affecteacute en ascii

HH=(H100)10

hum[4]=HH+48Valeur de la premiegravere deacutecimale affecteacute en ascii

HH=(H10)10

hum[5]=HH+48Valeur de la deuxiegraveme deacutecimale affecteacute en ascii

hum[6]=37Pourcentage affecteacute en ascii

if(cond==50)Appel la fonction LCD tous les 1000

lcd(1 1 8 humtxt)Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 7 hum)Affiche la chaine de caractegravere hum sur le LCD

cond=0Remise a 0 de la condition

Xbee(7 hum) Envoi la chaicircne de caractegravere hum dans la fonction xbee

Fonction tempeacuterature

void temperature(int cond)

char temp[7] temptxt[]=Temperature LSB

signed char MSB

I2C_Start()Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90)Mode de controcircle en mode eacutecriture

I2C_Wr(0xAA)Lecture de la tempeacuterature

I2C_Stop()Arrecirct du sigal

I2C_Start()Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x91)Mode de controcircle en mode lecture

MSB = I2C_Rd(1)Nombre signeacute donnant la tempeacuterature entre +125deg et -55degC

LSB = I2C_Rd(0)Si bit 7 = 1 tempeacuterature MSB +05degC

I2C_Stop()Arrecirct du sigal

if(MSBlt0)

MSB = abs(MSB) Si temperature neacutegative valeur absolue de MSB

Temp[0]=45 Signe - affecteacute en ascii

else

Station meacuteteacuteo autonome 2012

37

Temp[0]=43signe + affecteacute en ascii

Temp[1]=(MSB10)+48 Valeur des dizaines affecteacute en ascii

Temp[2]=(MSB10)+48 Valeur des uniteacutes affecteacute en ascii

Temp[3]=44 Virgule affecteacute en ascii

if (LSB==128) Si bit 7 agrave 1 alors +05deg

Temp[4]=5

else Si bit 7 agrave 0 alors +00deg

Temp[4]=0

Temp[5]=223 degreacute affecteacute en ascii

Temp[6]=67 C affecteacute en ascii

if(cond==50)Appel la fonction LCD tous les 1000

lcd(1 1 11 temptxt)Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 7 temp)Affiche la chaine de caractegravere hum sur le LCD

cond=0Remise a 0 de la condition

Xbee(7 temp) Envoi la chaicircne de caractegravere temp dans la fonction xbee

Fonction vent

void vent(int cond)

unsigned long tl th per

int vitfreq

char vent[13] txtvent[]=Vitesse du vent VV

if(PIR1CCP1IF==1) Test si front montant agrave lieu

TMR1H=0 Initialisation du timer1 bit de point fort

TMR1L=0 Initialisation du timer1 bit de point faible

th=CCPR1H Les valeurs sont copieacute dans des variables

tl=CCPR1L

th=thltlt8 Deacutecalage car th =gt bit de point fort

per = th|tl On concategravene les deux valeurs nous obtenons la peacuteriode

PIR1CCP1IF=0 Remise a 0 du drapeau

if(PIR1TMR1IF==1) Si deacutepassement du timer 1

per=65535+per On ajoute une retenue lorsquon a fait un tour (16bit)

PIR1TMR1IF=0 Remise a 0 du drapeau deacutepassement

Station meacuteteacuteo autonome 2012

38

freq=671310perCalacul de la freacutequence

vit=freq179 + 692Calcul de la vitesse que lon x100

if(vitlt200)En dessous 2ms la mesure est aleacuteatoire agrave cause du 2egraveme deacutebordement

vit=0

vent[0]=(vit10000)+48Valeur des centaines affecteacute en ascii(48=0)

VV=(vit1000)10

vent[1]=VV+48Valeur des dizaines affecteacute en ascii

VV=(vit100)10

vent[2]=VV+48Valeur des uniteacute affecteacute en ascii

VV=(vit10)10

vent[3]=44Virgule affecteacute en ascii

vent[4]=VV+48Valeur de la 1er deacutecimale affecteacute en ascii

VV=vit10

vent[5]=VV+48Valeur de la 2egraveme deacutecimale affecteacute en ascii

vent[6]=109m affecteacute en ascii

vent[7]=47 affecteacute en ascii

vent[8]=115s affecteacute en ascii

if(cond==50)Appel la fonction LCD tous les 1000

lcd(1 1 15 txtvent)Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 9 vent)Affiche la chaine de caractegravere hum sur le LCD

cond=0Remise a 0 de la condition

Xbee(9 vent) Envoi la chaicircne de caractegravere vent dans la fonction xbee

Fonction affichage

void lcd(int li int co int nb char receive[15])

int i

for(i=0 iltnb i++)Boucle for

Lcd_chr(li (co+i) receive[i])Affiche les caractegraveres jusquagrave i

Usart

void xbee(int nb char receive[15])

int i

Usart_Init(9600)Vitesse de transmission

for(i=0 iltnb i++)Boucle for

Usart_Write(receive[i])Envoi les caractegraveres sur lHyperTerminal jusquagrave i

Station meacuteteacuteo autonome 2012

24

E Programme pour la mesure de la vitesse du vent

Voici le programme pour mesurer la vitesse du vent avec les affectations deacutecrites ci-dessus

ainsi que les eacutequations de conversions

Deacuteclaration des fonctions

void vent(int cond)

void lcd(int li int co int nb char receive[20])

void main()

deacuteclaration des variables

int cond=0

Initialisation et affectation des ports

PORTB=0 initialisation

PORTC=0 initialisation

TRISC=0x04 Port C deacuteclarer en sortie sauf RC2 en mode capture

TRISB=0 Port B deacuteclarer en sortie

Configuration du mode capture

T1CON=0x31 Configuration du timer1

CCP1CON=0x05 Parameacutetrage du mode capture

PIE1TMR1IE=1 Autorise les deacutebordements du timer 1

Configuration et initialisation de leacutecran LCD

Lcd_Config(ampPORTB 0 1 WR 5 4 3 2) Configure leacutecran

Lcd_Init(ampPORTB) Initialisation du LCD

Lcd_Cmd(Lcd_CURSOR_OFF) Enlegraveve le curseur

Lcd_Cmd(Lcd_CLEAR) Efface leacutecran

Boucle infinie

while(1)

cond=cond+1

vent(ampcond)

Fonction vent

void vent(int cond)

unsigned long tl th per

int vitfreq

char vent[13] txtvent[]=vitesse du vent VV

if(PIR1CCP1IF==1) Test si front montant agrave lieu

TMR1H=0 Initialisation du timer1 bit de point fort

TMR1L=0 Initialisation du timer1 bit de point faible

th=CCPR1H Les valeurs sont copieacute dans des variables

tl=CCPR1L

th=thltlt8 Deacutecalage car th =gt bit de point fort

per = th|tl On concategravene les deux valeurs nous obtenons la peacuteriode

PIR1CCP1IF=0 Remise a 0 du drapeau

if(PIR1TMR1IF==1) Si deacutepassement du timer 1

per=65535+per On ajoute une retenue lorsquon a fait un tour (16bit)

PIR1TMR1IF=0 Remise a 0 du drapeau deacutepassement

freq=671310per Calcul de la freacutequence

vit=freq179 + 692 Calcul de la vitesse que lon x100

Station meacuteteacuteo autonome 2012

25

if(vitlt200) En dessous 2ms la mesure est aleacuteatoire agrave cause du 2egraveme deacutebordement

vit=0

vent[0]=(vit10000)+48 Valeur des centaines affecteacute en ascii(48=0)

VV=(vit1000)10

vent[1]=VV+48 Valeur des dizaines affecteacute en ascii

VV=(vit100)10

vent[2]=VV+48 Valeur des uniteacute affecteacute en ascii

VV=(vit10)10

vent[3]=44 Virgule affecteacute en ascii

vent[4]=VV+48 Valeur de la 1er deacutecimale affecteacute en ascii

VV=vit10

vent[5]=VV+48 Valeur de la 2egraveme deacutecimale affecteacute en ascii

vent[6]=109 m affecteacute en ascii

vent[7]=47 affecteacute en ascii

vent[8]=115 s affecteacute en ascii

if(cond==1000) Appel la fonction LCD tous les 1000

lcd(1 1 16 txtvent) Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 8 vent) Affiche la chaine de caractegravere hum sur le LCD

cond=0 Remise a 0 de la condition

Fonction affichage

void lcd(int li int co int nb char receive[20])

int i

for(i=0 ilt=nb i++) Boucle for

Lcd_chr(li (co+i) receive[i]) Affiche les caractegraveres jusquagrave i

Station meacuteteacuteo autonome 2012

26

X Simulation une station meacuteteacuteo autonome

Maintenant que tous nos capteurs sont installeacutes nous allons mettre agrave profit le bouton

poussoir installeacute dans la partie LCD Crsquoest-agrave-dire que nous allons rassembler tous les programmes

preacuteceacutedents pour nrsquoen faire qursquoun Il suffira drsquoappuyer sur le bouton poussoir pour faire deacutefiler les

diffeacuterentes valeurs comme une vraie station meacuteteacuteo

A La structure du programme

Boucle infinie

while(1)

cond=cond+1 Increacutemente la variable cond

switch(BP)

case 0

humidite(ampcond) Appel la fonction humiditeacute

if(PORTAF2==1) Ces if permet de changer la valeur de BP

BP=1

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250) Temps quon relacircche bien le bouton

break

case 1

temperature(ampcond) Appel la fonction tempeacuterature

if(PORTAF2==1)

BP=2

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)

break

case 2

vent(ampcond) Appel la fonction vent

if(PORTAF2==1)

BP=0

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)

break

Nous avons choisi drsquoutiliser un Switch nous avons donc juste rajouteacute une variable BP

Lorsqursquoil y a appui sur le bouton poussoir la variable BP srsquoincreacutemente et le programme passe agrave une

autre case et donc utilise une nouvelle fonction La temporisation nous donne le temps de relacirccher le

bouton pour eacuteviter de faire deacutefiler le menu sans le vouloir

Station meacuteteacuteo autonome 2012

27

B La simulation

Etant donneacute que nous ne pouvions pas prendre le mateacuteriel avec nous il eacutetait impeacuteratif de

pouvoir faire des simulations Pour cela nous avons utiliseacute un logiciel tregraves utile Proteus ISIS Ce

logiciel possegravede une tregraves grande librairie et permet de rentrer nos programmes sur le PIC virtuel

geacuteneacutereacute par le logiciel Pour simuler le capteur drsquohumiditeacute nous avons utiliseacute un potentiomegravetre Pour

celui de lrsquoaneacutemomegravetre comme pour nos mesures nous avons brancheacute virtuellement un GBF sur la

borne associeacute et observeacute son signal agrave lrsquoaide drsquoun oscilloscope

Voilagrave un aperccedilu de la simulation effectueacute sur ISIS

Veacuterification theacuteorique du vent

Vitesse du vent = 0179 37 + 0629

Vitesse du vent = 7657ms

Veacuterification theacuteorique de lrsquohumiditeacute

H= (315-081)0031

H=7548

Veacuterification theacuteorique de la

tempeacuterature

La valeur afficheacutee correspond bien

aux 27degC seacutelectionneacute sur le capteur

Station meacuteteacuteo autonome 2012

28

XI Transmission des donneacutees par liaison ZigBee

ZigBee est un protocole de haut niveau permettant la communication de petites radios agrave

consommation reacuteduite baseacutee sur le standard IEEE 802154

Cette technologie a pour but la communication de courte distance telle que le propose deacutejagrave

la technologie Bluetooth tout en eacutetant moins chegravere plus simple et avec une fiabiliteacute assez eacuteleveacutee

Dans notre projet nous nous servirons de ZigBee pour permettre une transmission par ondes

de nos donneacutees de la station meacuteteacuteo vers un ordinateur Pour cela nous avons 2 modules Xbee pro 2

platines drsquointerfaces une avec des pattes (liaison platine) et lrsquoautre avec une sortie RS232 (liaison pc)

Caracteacuteristique eacutelectrique

Les signaux Xbee ont une amplitude de 33V mais sont alimenteacutes en 5V (tension de notre

source USB) cacircbleacutes sur la bornes VIN (laquo Power input from 6-12Vdc 300mA or higher raquo) Mais

notre source nrsquoeacutetant pas assez puissante pour alimenter toute notre installation Nous utiliserons

donc une source externe de 5V qui sera utiliseacutee pour alimenter les 2 systegravemes Xbee

Description des Bornes du Xbee qui nous inteacuteresse

Station meacuteteacuteo autonome 2012

29

A Scheacutema eacutelectrique du module Xbee

Nous avons cacircbleacute la sortie TX du microcontrocircleur qui eacutemet un signal jusqursquoagrave la borne RX du

Xbee qui reacuteceptionne ce signal Apregraves la transmission se fait par onde entre les 2 modules Xbee Pour

le module qui reccediloit le signal un cacircble RS232 suffit agrave faire la liaison entre celui-ci et le PC

B Envoi des donneacutees la liaison Usart

Un USART (Universal synchronous amp Asynchronous Receiver Transmitter) est un eacutemetteur-

reacutecepteur universel En langage courant cest le composant utiliseacute pour faire la liaison entre

lordinateur et le port seacuterie Lordinateur envoie les donneacutees en parallegravele (autant de fils que de bits

de donneacutees) Il faut donc transformer ces donneacutees pour les faire passer agrave travers une liaison seacuterie qui

utilise un mecircme fil pour faire passer tous les bits de donneacutees

Constitution dune trame USART

un bit de start toujours agrave 0 servant agrave la synchronisation du reacutecepteur

les donneacutees la taille peut varier (geacuteneacuteralement entre 5 et 9 bits)

eacuteventuellement un bit de pariteacute paire ou impaire

et un bit de stop toujours agrave 1 (la dureacutee peut varier entre 1 15 et 2 temps bit)

Le niveau logique de repos est le 1

Figure 14 Trame USART

Station meacuteteacuteo autonome 2012

30

Afin de faciliter les liaisons entre peacuteripheacuteriques (PC microcontrocircleur modem hellip) des vitesses

de transmission sont normaliseacutees luniteacute baud correspondant agrave un temps bit Dans notre cas nous

choisirons une vitesse de transmission de 9600bps

C Programme drsquoenvoi des donneacutees par liaison Usart

Gracircce agrave la librairie de MikroC il est tregraves facile drsquoenvoyer des donneacutees par liaison Usart Cela

fonctionne comme pour envoyer des caractegraveres sur lrsquoeacutecran LCD Il faut juste ensuite choisir la vitesse

de transmission qui sera 9600bps Voici la fonction et un morceau du programme qui sert agrave envoyer

les caractegraveres sur Xbee et de Xbee agrave un HyperTerminal

Fonction humiditeacute

void humidite(int cond)

long H U VL Deacuteclaration des variables

char HH hum[8] humtxt[]=Humidite

helliphellip

Xbee(8 hum) Envoi la chaicircne de caractegravere hum dans la fonction xbee

Usart

void xbee(int nb char receive[20])

int i

Usart_Init(9600) Vitesse de transmission

for(i=0 ilt=nb i++) Boucle for

Usart_Write(receive[i]) Envoi les caractegraveres sur lrsquoHyperTerminal jusquagrave i

Station meacuteteacuteo autonome 2012

31

XII Estimation du coucirct du projet

On peut voir sur ce tableau que le prix de reviens pour les eacuteleacutements que nous avons utiliseacute

est de 14506euro TTC Ce qui est plutocirct oneacutereux compareacute aux stations meacuteteacuteo du marcheacute qui oscille

entre 6euro et 400euro En sachant que la nocirctre est loin drsquoecirctre finaliseacute (finition estheacutetique ergonomie et

ajout de nouvelle fonction comme la date et lrsquoheure)

Composant Quantiteacute Prix (TVA inclus) Liens Quartz 20000MHz 1 111 euro Lien

Capaciteacute 22pF 2 010 euro lien

PIC 16F876 1 427 euro lien

LCD MODULE 1 1575 euro lien

Potentiomegravetre 10KΩ 1 618 euro lien

Reacutesistance 33 Ω 1 035 euro lien

Reacutesistance 10 K Ω 2 070 euro lien

Reacutesistance 1 KΩ 3 105 euro lien

LED rouge 1 013 euro lien

DS1621 1 650 euro lien

Bouton poussoir 1 060 euro lien

Module Xbee 2 4000 euro lien

Platine dinterface (XBEE) RS232 1 1890 euro lien

Platine dinterface (XBEE) 1 1364 euro lien

Capteur drsquohumiditeacute 1 2692 euro lien

Transistor 1 561 euro lien

Diode 1 325 euro lien

Totales 1 14506 euro

Station meacuteteacuteo autonome 2012

32

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

panelsbut 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 Itrsquos also possible to measure

humidity and wind speed Then itrsquos 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 its 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 Itrsquos 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

Station meacuteteacuteo autonome 2012

33

XIV Conclusion

Ce projet sur la conception drsquoune station meacuteteacuteo autonome qui nous a eacuteteacute confieacute a eacuteteacute tregraves

enrichissant Il nous a permis de mettre en relations les connaissances acquises durant lrsquoanneacutee mais

aussi acqueacuterir de nouvelles connaissances comme le fonctionnement drsquoun microcontrocircleur En effet

nous nrsquoavions jamais programmeacute sur microcontrocircleur Il a fallu srsquoadapter et apprendre agrave utiliser des

nouveaux logiciels tels que Proteus MikroC ainsi que Labview

De cette expeacuterience nous avons aussi appris agrave ecirctre autonome Nous avons saisi que la

compreacutehension des documents techniques et des librairies eacutetait un point essentiel de notre projet

En programmation nous nrsquoavions pas le droit agrave lrsquoerreur car la moindre faute pouvait conduire le

systegraveme agrave un dysfonctionnement Ce projet nous a demandeacute beaucoup de rigueur de patience et de

temps

Toutefois nous nrsquoavons pas eu malheureusement le temps drsquoinstaller le capteur de

tempeacuterature inteacuterieure par manque de temps Plus encore nous aurions aimeacute approfondir certains

points Par exemple pouvoir installer les composants sur circuit imprimeacute et concevoir un support

viable pour en faire une vraie station meacuteteacuteo Lrsquoinstallation drsquoune girouette aurait eacuteteacute appreacuteciable

pour connaicirctre le sens du vent Aussi le programme aurait sans doute pu ecirctre encore ameacutelioreacute pour

de meilleures performances

Malgreacute ce manque de temps nous sommes tregraves satisfaits du fonctionnement de ce module

qui nous a permis de comprendre lrsquoutiliteacute des parties theacuteoriques pour lrsquoapplication et la mise en

œuvre drsquoun systegraveme Lrsquoapproche peacutedagogique de nous diriger vers les solutions sans jamais les

donner de nous laisser un grand degreacute de liberteacute et drsquoautonomie a eacuteteacute au deacutebut assez deacuteroutante

mais tregraves instructif

Enfin nous tenions agrave remercier Mme Leymarie qui nous a suivis et aiguilleacute tout au long de ce

projet

Station meacuteteacuteo autonome 2012

34

XV ANNEXES

Programme complet

Deacuteclaration 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()

deacuteclaration des variables

int cond=0Condition pour laffichage sur leacutecran LCD

int BP=0

Initialisation et affectation des ports

PORTA=0

PORTB=0 initialisation

PORTC=0

TRISB=0 Port B deacuteclarer en sortie

TRISA=0xFF Port A en entreacutee

ADCON1=0x84 Justifieacute agrave droite active RA0RA1RA3 analogique

ADCON0=0x85 Fosc32 sur PA0 en service

TRISB=0 Port B deacuteclarer en sortie

TRISC=0xFFPort C deacuteclarer en entreacutee

Configuration et initialisation de leacutecran LCD

Lcd_Config(ampPORTB 0 1 WR 5 4 3 2) Configure lecran

Lcd_Init(ampPORTB) initialisation du LCD

Lcd_Cmd(Lcd_CURSOR_OFF) Enleve le curseur

Lcd_Cmd(Lcd_CLEAR) Efface lecran

Initialisation du module I2C

I2C_Init(100000)initialisation de la communication I2C

I2C_Start()Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90)Mode de controcircle en mode eacutecriture

I2C_Wr(0xAC)Accegraves au registre de configuration

I2C_Wr(0x0A)Registre de configuration mesure en continu

I2C_Stop()Arrecirct du signal

I2C_Start()Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90)Mode de controcircle en mode eacutecriture

I2C_Wr(0xEE)Deacutebut de la conversion

I2C_Stop()Arrecirct du sigal

Station meacuteteacuteo autonome 2012

35

Configuration du mode capture

T1CON=0x31 Configuration du timer1

CCP1CON=0x05 Paramegravetrage du mode capture

PIE1TMR1IE=1 Autorise les deacutebordements du timer 1

Boucle infinie

while(1)

cond=cond+1Increacutemente la variable cond

switch(BP)

case 0

humidite(ampcond)Appel la fonction humiditeacute

if(PORTAF2==1)Ces if permet de changer la valeur de BP

BP=1

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)Temps quon relacircche bien le bouton

break

case 1

temperature(ampcond)Appel la fonction tempeacuterature

if(PORTAF2==1)

BP=2

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)

break

case 2

vent(ampcond)Appel la fonction vent

if(PORTAF2==1)

BP=0

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)

break

Fonction humiditeacute

void humidite(int cond)

long H U VLDeacuteclaration des variables

char HH hum[8] humtxt[]=Humidite

VL=Adc_read(0) Valeur lue sur RA0(humiditeacute)

U=(VL5000)1023 Convertit la valeur lue en tension x1000

H=(U-810)(0031) Convertit la tension en humiditeacute x1000

Station meacuteteacuteo autonome 2012

36

if(Hgt100000)Si H gt 100(impossible) alors = 100

H=100000

if(Hlt0)Si H lt 0(impossible) alors = 0

H=0

hum[0]=(H100000)+48Valeur des centaines affecteacute en ascii(48=0)

HH=(H10000)10

hum[1]=HH+48Valeur des dizaines affecteacute en ascii

HH=(H1000)10

hum[2]=HH+48Valeur des uniteacutes affecteacute en ascii

hum[3]=44Virgule affecteacute en ascii

HH=(H100)10

hum[4]=HH+48Valeur de la premiegravere deacutecimale affecteacute en ascii

HH=(H10)10

hum[5]=HH+48Valeur de la deuxiegraveme deacutecimale affecteacute en ascii

hum[6]=37Pourcentage affecteacute en ascii

if(cond==50)Appel la fonction LCD tous les 1000

lcd(1 1 8 humtxt)Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 7 hum)Affiche la chaine de caractegravere hum sur le LCD

cond=0Remise a 0 de la condition

Xbee(7 hum) Envoi la chaicircne de caractegravere hum dans la fonction xbee

Fonction tempeacuterature

void temperature(int cond)

char temp[7] temptxt[]=Temperature LSB

signed char MSB

I2C_Start()Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90)Mode de controcircle en mode eacutecriture

I2C_Wr(0xAA)Lecture de la tempeacuterature

I2C_Stop()Arrecirct du sigal

I2C_Start()Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x91)Mode de controcircle en mode lecture

MSB = I2C_Rd(1)Nombre signeacute donnant la tempeacuterature entre +125deg et -55degC

LSB = I2C_Rd(0)Si bit 7 = 1 tempeacuterature MSB +05degC

I2C_Stop()Arrecirct du sigal

if(MSBlt0)

MSB = abs(MSB) Si temperature neacutegative valeur absolue de MSB

Temp[0]=45 Signe - affecteacute en ascii

else

Station meacuteteacuteo autonome 2012

37

Temp[0]=43signe + affecteacute en ascii

Temp[1]=(MSB10)+48 Valeur des dizaines affecteacute en ascii

Temp[2]=(MSB10)+48 Valeur des uniteacutes affecteacute en ascii

Temp[3]=44 Virgule affecteacute en ascii

if (LSB==128) Si bit 7 agrave 1 alors +05deg

Temp[4]=5

else Si bit 7 agrave 0 alors +00deg

Temp[4]=0

Temp[5]=223 degreacute affecteacute en ascii

Temp[6]=67 C affecteacute en ascii

if(cond==50)Appel la fonction LCD tous les 1000

lcd(1 1 11 temptxt)Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 7 temp)Affiche la chaine de caractegravere hum sur le LCD

cond=0Remise a 0 de la condition

Xbee(7 temp) Envoi la chaicircne de caractegravere temp dans la fonction xbee

Fonction vent

void vent(int cond)

unsigned long tl th per

int vitfreq

char vent[13] txtvent[]=Vitesse du vent VV

if(PIR1CCP1IF==1) Test si front montant agrave lieu

TMR1H=0 Initialisation du timer1 bit de point fort

TMR1L=0 Initialisation du timer1 bit de point faible

th=CCPR1H Les valeurs sont copieacute dans des variables

tl=CCPR1L

th=thltlt8 Deacutecalage car th =gt bit de point fort

per = th|tl On concategravene les deux valeurs nous obtenons la peacuteriode

PIR1CCP1IF=0 Remise a 0 du drapeau

if(PIR1TMR1IF==1) Si deacutepassement du timer 1

per=65535+per On ajoute une retenue lorsquon a fait un tour (16bit)

PIR1TMR1IF=0 Remise a 0 du drapeau deacutepassement

Station meacuteteacuteo autonome 2012

38

freq=671310perCalacul de la freacutequence

vit=freq179 + 692Calcul de la vitesse que lon x100

if(vitlt200)En dessous 2ms la mesure est aleacuteatoire agrave cause du 2egraveme deacutebordement

vit=0

vent[0]=(vit10000)+48Valeur des centaines affecteacute en ascii(48=0)

VV=(vit1000)10

vent[1]=VV+48Valeur des dizaines affecteacute en ascii

VV=(vit100)10

vent[2]=VV+48Valeur des uniteacute affecteacute en ascii

VV=(vit10)10

vent[3]=44Virgule affecteacute en ascii

vent[4]=VV+48Valeur de la 1er deacutecimale affecteacute en ascii

VV=vit10

vent[5]=VV+48Valeur de la 2egraveme deacutecimale affecteacute en ascii

vent[6]=109m affecteacute en ascii

vent[7]=47 affecteacute en ascii

vent[8]=115s affecteacute en ascii

if(cond==50)Appel la fonction LCD tous les 1000

lcd(1 1 15 txtvent)Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 9 vent)Affiche la chaine de caractegravere hum sur le LCD

cond=0Remise a 0 de la condition

Xbee(9 vent) Envoi la chaicircne de caractegravere vent dans la fonction xbee

Fonction affichage

void lcd(int li int co int nb char receive[15])

int i

for(i=0 iltnb i++)Boucle for

Lcd_chr(li (co+i) receive[i])Affiche les caractegraveres jusquagrave i

Usart

void xbee(int nb char receive[15])

int i

Usart_Init(9600)Vitesse de transmission

for(i=0 iltnb i++)Boucle for

Usart_Write(receive[i])Envoi les caractegraveres sur lHyperTerminal jusquagrave i

Station meacuteteacuteo autonome 2012

25

if(vitlt200) En dessous 2ms la mesure est aleacuteatoire agrave cause du 2egraveme deacutebordement

vit=0

vent[0]=(vit10000)+48 Valeur des centaines affecteacute en ascii(48=0)

VV=(vit1000)10

vent[1]=VV+48 Valeur des dizaines affecteacute en ascii

VV=(vit100)10

vent[2]=VV+48 Valeur des uniteacute affecteacute en ascii

VV=(vit10)10

vent[3]=44 Virgule affecteacute en ascii

vent[4]=VV+48 Valeur de la 1er deacutecimale affecteacute en ascii

VV=vit10

vent[5]=VV+48 Valeur de la 2egraveme deacutecimale affecteacute en ascii

vent[6]=109 m affecteacute en ascii

vent[7]=47 affecteacute en ascii

vent[8]=115 s affecteacute en ascii

if(cond==1000) Appel la fonction LCD tous les 1000

lcd(1 1 16 txtvent) Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 8 vent) Affiche la chaine de caractegravere hum sur le LCD

cond=0 Remise a 0 de la condition

Fonction affichage

void lcd(int li int co int nb char receive[20])

int i

for(i=0 ilt=nb i++) Boucle for

Lcd_chr(li (co+i) receive[i]) Affiche les caractegraveres jusquagrave i

Station meacuteteacuteo autonome 2012

26

X Simulation une station meacuteteacuteo autonome

Maintenant que tous nos capteurs sont installeacutes nous allons mettre agrave profit le bouton

poussoir installeacute dans la partie LCD Crsquoest-agrave-dire que nous allons rassembler tous les programmes

preacuteceacutedents pour nrsquoen faire qursquoun Il suffira drsquoappuyer sur le bouton poussoir pour faire deacutefiler les

diffeacuterentes valeurs comme une vraie station meacuteteacuteo

A La structure du programme

Boucle infinie

while(1)

cond=cond+1 Increacutemente la variable cond

switch(BP)

case 0

humidite(ampcond) Appel la fonction humiditeacute

if(PORTAF2==1) Ces if permet de changer la valeur de BP

BP=1

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250) Temps quon relacircche bien le bouton

break

case 1

temperature(ampcond) Appel la fonction tempeacuterature

if(PORTAF2==1)

BP=2

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)

break

case 2

vent(ampcond) Appel la fonction vent

if(PORTAF2==1)

BP=0

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)

break

Nous avons choisi drsquoutiliser un Switch nous avons donc juste rajouteacute une variable BP

Lorsqursquoil y a appui sur le bouton poussoir la variable BP srsquoincreacutemente et le programme passe agrave une

autre case et donc utilise une nouvelle fonction La temporisation nous donne le temps de relacirccher le

bouton pour eacuteviter de faire deacutefiler le menu sans le vouloir

Station meacuteteacuteo autonome 2012

27

B La simulation

Etant donneacute que nous ne pouvions pas prendre le mateacuteriel avec nous il eacutetait impeacuteratif de

pouvoir faire des simulations Pour cela nous avons utiliseacute un logiciel tregraves utile Proteus ISIS Ce

logiciel possegravede une tregraves grande librairie et permet de rentrer nos programmes sur le PIC virtuel

geacuteneacutereacute par le logiciel Pour simuler le capteur drsquohumiditeacute nous avons utiliseacute un potentiomegravetre Pour

celui de lrsquoaneacutemomegravetre comme pour nos mesures nous avons brancheacute virtuellement un GBF sur la

borne associeacute et observeacute son signal agrave lrsquoaide drsquoun oscilloscope

Voilagrave un aperccedilu de la simulation effectueacute sur ISIS

Veacuterification theacuteorique du vent

Vitesse du vent = 0179 37 + 0629

Vitesse du vent = 7657ms

Veacuterification theacuteorique de lrsquohumiditeacute

H= (315-081)0031

H=7548

Veacuterification theacuteorique de la

tempeacuterature

La valeur afficheacutee correspond bien

aux 27degC seacutelectionneacute sur le capteur

Station meacuteteacuteo autonome 2012

28

XI Transmission des donneacutees par liaison ZigBee

ZigBee est un protocole de haut niveau permettant la communication de petites radios agrave

consommation reacuteduite baseacutee sur le standard IEEE 802154

Cette technologie a pour but la communication de courte distance telle que le propose deacutejagrave

la technologie Bluetooth tout en eacutetant moins chegravere plus simple et avec une fiabiliteacute assez eacuteleveacutee

Dans notre projet nous nous servirons de ZigBee pour permettre une transmission par ondes

de nos donneacutees de la station meacuteteacuteo vers un ordinateur Pour cela nous avons 2 modules Xbee pro 2

platines drsquointerfaces une avec des pattes (liaison platine) et lrsquoautre avec une sortie RS232 (liaison pc)

Caracteacuteristique eacutelectrique

Les signaux Xbee ont une amplitude de 33V mais sont alimenteacutes en 5V (tension de notre

source USB) cacircbleacutes sur la bornes VIN (laquo Power input from 6-12Vdc 300mA or higher raquo) Mais

notre source nrsquoeacutetant pas assez puissante pour alimenter toute notre installation Nous utiliserons

donc une source externe de 5V qui sera utiliseacutee pour alimenter les 2 systegravemes Xbee

Description des Bornes du Xbee qui nous inteacuteresse

Station meacuteteacuteo autonome 2012

29

A Scheacutema eacutelectrique du module Xbee

Nous avons cacircbleacute la sortie TX du microcontrocircleur qui eacutemet un signal jusqursquoagrave la borne RX du

Xbee qui reacuteceptionne ce signal Apregraves la transmission se fait par onde entre les 2 modules Xbee Pour

le module qui reccediloit le signal un cacircble RS232 suffit agrave faire la liaison entre celui-ci et le PC

B Envoi des donneacutees la liaison Usart

Un USART (Universal synchronous amp Asynchronous Receiver Transmitter) est un eacutemetteur-

reacutecepteur universel En langage courant cest le composant utiliseacute pour faire la liaison entre

lordinateur et le port seacuterie Lordinateur envoie les donneacutees en parallegravele (autant de fils que de bits

de donneacutees) Il faut donc transformer ces donneacutees pour les faire passer agrave travers une liaison seacuterie qui

utilise un mecircme fil pour faire passer tous les bits de donneacutees

Constitution dune trame USART

un bit de start toujours agrave 0 servant agrave la synchronisation du reacutecepteur

les donneacutees la taille peut varier (geacuteneacuteralement entre 5 et 9 bits)

eacuteventuellement un bit de pariteacute paire ou impaire

et un bit de stop toujours agrave 1 (la dureacutee peut varier entre 1 15 et 2 temps bit)

Le niveau logique de repos est le 1

Figure 14 Trame USART

Station meacuteteacuteo autonome 2012

30

Afin de faciliter les liaisons entre peacuteripheacuteriques (PC microcontrocircleur modem hellip) des vitesses

de transmission sont normaliseacutees luniteacute baud correspondant agrave un temps bit Dans notre cas nous

choisirons une vitesse de transmission de 9600bps

C Programme drsquoenvoi des donneacutees par liaison Usart

Gracircce agrave la librairie de MikroC il est tregraves facile drsquoenvoyer des donneacutees par liaison Usart Cela

fonctionne comme pour envoyer des caractegraveres sur lrsquoeacutecran LCD Il faut juste ensuite choisir la vitesse

de transmission qui sera 9600bps Voici la fonction et un morceau du programme qui sert agrave envoyer

les caractegraveres sur Xbee et de Xbee agrave un HyperTerminal

Fonction humiditeacute

void humidite(int cond)

long H U VL Deacuteclaration des variables

char HH hum[8] humtxt[]=Humidite

helliphellip

Xbee(8 hum) Envoi la chaicircne de caractegravere hum dans la fonction xbee

Usart

void xbee(int nb char receive[20])

int i

Usart_Init(9600) Vitesse de transmission

for(i=0 ilt=nb i++) Boucle for

Usart_Write(receive[i]) Envoi les caractegraveres sur lrsquoHyperTerminal jusquagrave i

Station meacuteteacuteo autonome 2012

31

XII Estimation du coucirct du projet

On peut voir sur ce tableau que le prix de reviens pour les eacuteleacutements que nous avons utiliseacute

est de 14506euro TTC Ce qui est plutocirct oneacutereux compareacute aux stations meacuteteacuteo du marcheacute qui oscille

entre 6euro et 400euro En sachant que la nocirctre est loin drsquoecirctre finaliseacute (finition estheacutetique ergonomie et

ajout de nouvelle fonction comme la date et lrsquoheure)

Composant Quantiteacute Prix (TVA inclus) Liens Quartz 20000MHz 1 111 euro Lien

Capaciteacute 22pF 2 010 euro lien

PIC 16F876 1 427 euro lien

LCD MODULE 1 1575 euro lien

Potentiomegravetre 10KΩ 1 618 euro lien

Reacutesistance 33 Ω 1 035 euro lien

Reacutesistance 10 K Ω 2 070 euro lien

Reacutesistance 1 KΩ 3 105 euro lien

LED rouge 1 013 euro lien

DS1621 1 650 euro lien

Bouton poussoir 1 060 euro lien

Module Xbee 2 4000 euro lien

Platine dinterface (XBEE) RS232 1 1890 euro lien

Platine dinterface (XBEE) 1 1364 euro lien

Capteur drsquohumiditeacute 1 2692 euro lien

Transistor 1 561 euro lien

Diode 1 325 euro lien

Totales 1 14506 euro

Station meacuteteacuteo autonome 2012

32

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

panelsbut 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 Itrsquos also possible to measure

humidity and wind speed Then itrsquos 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 its 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 Itrsquos 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

Station meacuteteacuteo autonome 2012

33

XIV Conclusion

Ce projet sur la conception drsquoune station meacuteteacuteo autonome qui nous a eacuteteacute confieacute a eacuteteacute tregraves

enrichissant Il nous a permis de mettre en relations les connaissances acquises durant lrsquoanneacutee mais

aussi acqueacuterir de nouvelles connaissances comme le fonctionnement drsquoun microcontrocircleur En effet

nous nrsquoavions jamais programmeacute sur microcontrocircleur Il a fallu srsquoadapter et apprendre agrave utiliser des

nouveaux logiciels tels que Proteus MikroC ainsi que Labview

De cette expeacuterience nous avons aussi appris agrave ecirctre autonome Nous avons saisi que la

compreacutehension des documents techniques et des librairies eacutetait un point essentiel de notre projet

En programmation nous nrsquoavions pas le droit agrave lrsquoerreur car la moindre faute pouvait conduire le

systegraveme agrave un dysfonctionnement Ce projet nous a demandeacute beaucoup de rigueur de patience et de

temps

Toutefois nous nrsquoavons pas eu malheureusement le temps drsquoinstaller le capteur de

tempeacuterature inteacuterieure par manque de temps Plus encore nous aurions aimeacute approfondir certains

points Par exemple pouvoir installer les composants sur circuit imprimeacute et concevoir un support

viable pour en faire une vraie station meacuteteacuteo Lrsquoinstallation drsquoune girouette aurait eacuteteacute appreacuteciable

pour connaicirctre le sens du vent Aussi le programme aurait sans doute pu ecirctre encore ameacutelioreacute pour

de meilleures performances

Malgreacute ce manque de temps nous sommes tregraves satisfaits du fonctionnement de ce module

qui nous a permis de comprendre lrsquoutiliteacute des parties theacuteoriques pour lrsquoapplication et la mise en

œuvre drsquoun systegraveme Lrsquoapproche peacutedagogique de nous diriger vers les solutions sans jamais les

donner de nous laisser un grand degreacute de liberteacute et drsquoautonomie a eacuteteacute au deacutebut assez deacuteroutante

mais tregraves instructif

Enfin nous tenions agrave remercier Mme Leymarie qui nous a suivis et aiguilleacute tout au long de ce

projet

Station meacuteteacuteo autonome 2012

34

XV ANNEXES

Programme complet

Deacuteclaration 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()

deacuteclaration des variables

int cond=0Condition pour laffichage sur leacutecran LCD

int BP=0

Initialisation et affectation des ports

PORTA=0

PORTB=0 initialisation

PORTC=0

TRISB=0 Port B deacuteclarer en sortie

TRISA=0xFF Port A en entreacutee

ADCON1=0x84 Justifieacute agrave droite active RA0RA1RA3 analogique

ADCON0=0x85 Fosc32 sur PA0 en service

TRISB=0 Port B deacuteclarer en sortie

TRISC=0xFFPort C deacuteclarer en entreacutee

Configuration et initialisation de leacutecran LCD

Lcd_Config(ampPORTB 0 1 WR 5 4 3 2) Configure lecran

Lcd_Init(ampPORTB) initialisation du LCD

Lcd_Cmd(Lcd_CURSOR_OFF) Enleve le curseur

Lcd_Cmd(Lcd_CLEAR) Efface lecran

Initialisation du module I2C

I2C_Init(100000)initialisation de la communication I2C

I2C_Start()Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90)Mode de controcircle en mode eacutecriture

I2C_Wr(0xAC)Accegraves au registre de configuration

I2C_Wr(0x0A)Registre de configuration mesure en continu

I2C_Stop()Arrecirct du signal

I2C_Start()Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90)Mode de controcircle en mode eacutecriture

I2C_Wr(0xEE)Deacutebut de la conversion

I2C_Stop()Arrecirct du sigal

Station meacuteteacuteo autonome 2012

35

Configuration du mode capture

T1CON=0x31 Configuration du timer1

CCP1CON=0x05 Paramegravetrage du mode capture

PIE1TMR1IE=1 Autorise les deacutebordements du timer 1

Boucle infinie

while(1)

cond=cond+1Increacutemente la variable cond

switch(BP)

case 0

humidite(ampcond)Appel la fonction humiditeacute

if(PORTAF2==1)Ces if permet de changer la valeur de BP

BP=1

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)Temps quon relacircche bien le bouton

break

case 1

temperature(ampcond)Appel la fonction tempeacuterature

if(PORTAF2==1)

BP=2

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)

break

case 2

vent(ampcond)Appel la fonction vent

if(PORTAF2==1)

BP=0

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)

break

Fonction humiditeacute

void humidite(int cond)

long H U VLDeacuteclaration des variables

char HH hum[8] humtxt[]=Humidite

VL=Adc_read(0) Valeur lue sur RA0(humiditeacute)

U=(VL5000)1023 Convertit la valeur lue en tension x1000

H=(U-810)(0031) Convertit la tension en humiditeacute x1000

Station meacuteteacuteo autonome 2012

36

if(Hgt100000)Si H gt 100(impossible) alors = 100

H=100000

if(Hlt0)Si H lt 0(impossible) alors = 0

H=0

hum[0]=(H100000)+48Valeur des centaines affecteacute en ascii(48=0)

HH=(H10000)10

hum[1]=HH+48Valeur des dizaines affecteacute en ascii

HH=(H1000)10

hum[2]=HH+48Valeur des uniteacutes affecteacute en ascii

hum[3]=44Virgule affecteacute en ascii

HH=(H100)10

hum[4]=HH+48Valeur de la premiegravere deacutecimale affecteacute en ascii

HH=(H10)10

hum[5]=HH+48Valeur de la deuxiegraveme deacutecimale affecteacute en ascii

hum[6]=37Pourcentage affecteacute en ascii

if(cond==50)Appel la fonction LCD tous les 1000

lcd(1 1 8 humtxt)Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 7 hum)Affiche la chaine de caractegravere hum sur le LCD

cond=0Remise a 0 de la condition

Xbee(7 hum) Envoi la chaicircne de caractegravere hum dans la fonction xbee

Fonction tempeacuterature

void temperature(int cond)

char temp[7] temptxt[]=Temperature LSB

signed char MSB

I2C_Start()Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90)Mode de controcircle en mode eacutecriture

I2C_Wr(0xAA)Lecture de la tempeacuterature

I2C_Stop()Arrecirct du sigal

I2C_Start()Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x91)Mode de controcircle en mode lecture

MSB = I2C_Rd(1)Nombre signeacute donnant la tempeacuterature entre +125deg et -55degC

LSB = I2C_Rd(0)Si bit 7 = 1 tempeacuterature MSB +05degC

I2C_Stop()Arrecirct du sigal

if(MSBlt0)

MSB = abs(MSB) Si temperature neacutegative valeur absolue de MSB

Temp[0]=45 Signe - affecteacute en ascii

else

Station meacuteteacuteo autonome 2012

37

Temp[0]=43signe + affecteacute en ascii

Temp[1]=(MSB10)+48 Valeur des dizaines affecteacute en ascii

Temp[2]=(MSB10)+48 Valeur des uniteacutes affecteacute en ascii

Temp[3]=44 Virgule affecteacute en ascii

if (LSB==128) Si bit 7 agrave 1 alors +05deg

Temp[4]=5

else Si bit 7 agrave 0 alors +00deg

Temp[4]=0

Temp[5]=223 degreacute affecteacute en ascii

Temp[6]=67 C affecteacute en ascii

if(cond==50)Appel la fonction LCD tous les 1000

lcd(1 1 11 temptxt)Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 7 temp)Affiche la chaine de caractegravere hum sur le LCD

cond=0Remise a 0 de la condition

Xbee(7 temp) Envoi la chaicircne de caractegravere temp dans la fonction xbee

Fonction vent

void vent(int cond)

unsigned long tl th per

int vitfreq

char vent[13] txtvent[]=Vitesse du vent VV

if(PIR1CCP1IF==1) Test si front montant agrave lieu

TMR1H=0 Initialisation du timer1 bit de point fort

TMR1L=0 Initialisation du timer1 bit de point faible

th=CCPR1H Les valeurs sont copieacute dans des variables

tl=CCPR1L

th=thltlt8 Deacutecalage car th =gt bit de point fort

per = th|tl On concategravene les deux valeurs nous obtenons la peacuteriode

PIR1CCP1IF=0 Remise a 0 du drapeau

if(PIR1TMR1IF==1) Si deacutepassement du timer 1

per=65535+per On ajoute une retenue lorsquon a fait un tour (16bit)

PIR1TMR1IF=0 Remise a 0 du drapeau deacutepassement

Station meacuteteacuteo autonome 2012

38

freq=671310perCalacul de la freacutequence

vit=freq179 + 692Calcul de la vitesse que lon x100

if(vitlt200)En dessous 2ms la mesure est aleacuteatoire agrave cause du 2egraveme deacutebordement

vit=0

vent[0]=(vit10000)+48Valeur des centaines affecteacute en ascii(48=0)

VV=(vit1000)10

vent[1]=VV+48Valeur des dizaines affecteacute en ascii

VV=(vit100)10

vent[2]=VV+48Valeur des uniteacute affecteacute en ascii

VV=(vit10)10

vent[3]=44Virgule affecteacute en ascii

vent[4]=VV+48Valeur de la 1er deacutecimale affecteacute en ascii

VV=vit10

vent[5]=VV+48Valeur de la 2egraveme deacutecimale affecteacute en ascii

vent[6]=109m affecteacute en ascii

vent[7]=47 affecteacute en ascii

vent[8]=115s affecteacute en ascii

if(cond==50)Appel la fonction LCD tous les 1000

lcd(1 1 15 txtvent)Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 9 vent)Affiche la chaine de caractegravere hum sur le LCD

cond=0Remise a 0 de la condition

Xbee(9 vent) Envoi la chaicircne de caractegravere vent dans la fonction xbee

Fonction affichage

void lcd(int li int co int nb char receive[15])

int i

for(i=0 iltnb i++)Boucle for

Lcd_chr(li (co+i) receive[i])Affiche les caractegraveres jusquagrave i

Usart

void xbee(int nb char receive[15])

int i

Usart_Init(9600)Vitesse de transmission

for(i=0 iltnb i++)Boucle for

Usart_Write(receive[i])Envoi les caractegraveres sur lHyperTerminal jusquagrave i

Station meacuteteacuteo autonome 2012

26

X Simulation une station meacuteteacuteo autonome

Maintenant que tous nos capteurs sont installeacutes nous allons mettre agrave profit le bouton

poussoir installeacute dans la partie LCD Crsquoest-agrave-dire que nous allons rassembler tous les programmes

preacuteceacutedents pour nrsquoen faire qursquoun Il suffira drsquoappuyer sur le bouton poussoir pour faire deacutefiler les

diffeacuterentes valeurs comme une vraie station meacuteteacuteo

A La structure du programme

Boucle infinie

while(1)

cond=cond+1 Increacutemente la variable cond

switch(BP)

case 0

humidite(ampcond) Appel la fonction humiditeacute

if(PORTAF2==1) Ces if permet de changer la valeur de BP

BP=1

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250) Temps quon relacircche bien le bouton

break

case 1

temperature(ampcond) Appel la fonction tempeacuterature

if(PORTAF2==1)

BP=2

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)

break

case 2

vent(ampcond) Appel la fonction vent

if(PORTAF2==1)

BP=0

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)

break

Nous avons choisi drsquoutiliser un Switch nous avons donc juste rajouteacute une variable BP

Lorsqursquoil y a appui sur le bouton poussoir la variable BP srsquoincreacutemente et le programme passe agrave une

autre case et donc utilise une nouvelle fonction La temporisation nous donne le temps de relacirccher le

bouton pour eacuteviter de faire deacutefiler le menu sans le vouloir

Station meacuteteacuteo autonome 2012

27

B La simulation

Etant donneacute que nous ne pouvions pas prendre le mateacuteriel avec nous il eacutetait impeacuteratif de

pouvoir faire des simulations Pour cela nous avons utiliseacute un logiciel tregraves utile Proteus ISIS Ce

logiciel possegravede une tregraves grande librairie et permet de rentrer nos programmes sur le PIC virtuel

geacuteneacutereacute par le logiciel Pour simuler le capteur drsquohumiditeacute nous avons utiliseacute un potentiomegravetre Pour

celui de lrsquoaneacutemomegravetre comme pour nos mesures nous avons brancheacute virtuellement un GBF sur la

borne associeacute et observeacute son signal agrave lrsquoaide drsquoun oscilloscope

Voilagrave un aperccedilu de la simulation effectueacute sur ISIS

Veacuterification theacuteorique du vent

Vitesse du vent = 0179 37 + 0629

Vitesse du vent = 7657ms

Veacuterification theacuteorique de lrsquohumiditeacute

H= (315-081)0031

H=7548

Veacuterification theacuteorique de la

tempeacuterature

La valeur afficheacutee correspond bien

aux 27degC seacutelectionneacute sur le capteur

Station meacuteteacuteo autonome 2012

28

XI Transmission des donneacutees par liaison ZigBee

ZigBee est un protocole de haut niveau permettant la communication de petites radios agrave

consommation reacuteduite baseacutee sur le standard IEEE 802154

Cette technologie a pour but la communication de courte distance telle que le propose deacutejagrave

la technologie Bluetooth tout en eacutetant moins chegravere plus simple et avec une fiabiliteacute assez eacuteleveacutee

Dans notre projet nous nous servirons de ZigBee pour permettre une transmission par ondes

de nos donneacutees de la station meacuteteacuteo vers un ordinateur Pour cela nous avons 2 modules Xbee pro 2

platines drsquointerfaces une avec des pattes (liaison platine) et lrsquoautre avec une sortie RS232 (liaison pc)

Caracteacuteristique eacutelectrique

Les signaux Xbee ont une amplitude de 33V mais sont alimenteacutes en 5V (tension de notre

source USB) cacircbleacutes sur la bornes VIN (laquo Power input from 6-12Vdc 300mA or higher raquo) Mais

notre source nrsquoeacutetant pas assez puissante pour alimenter toute notre installation Nous utiliserons

donc une source externe de 5V qui sera utiliseacutee pour alimenter les 2 systegravemes Xbee

Description des Bornes du Xbee qui nous inteacuteresse

Station meacuteteacuteo autonome 2012

29

A Scheacutema eacutelectrique du module Xbee

Nous avons cacircbleacute la sortie TX du microcontrocircleur qui eacutemet un signal jusqursquoagrave la borne RX du

Xbee qui reacuteceptionne ce signal Apregraves la transmission se fait par onde entre les 2 modules Xbee Pour

le module qui reccediloit le signal un cacircble RS232 suffit agrave faire la liaison entre celui-ci et le PC

B Envoi des donneacutees la liaison Usart

Un USART (Universal synchronous amp Asynchronous Receiver Transmitter) est un eacutemetteur-

reacutecepteur universel En langage courant cest le composant utiliseacute pour faire la liaison entre

lordinateur et le port seacuterie Lordinateur envoie les donneacutees en parallegravele (autant de fils que de bits

de donneacutees) Il faut donc transformer ces donneacutees pour les faire passer agrave travers une liaison seacuterie qui

utilise un mecircme fil pour faire passer tous les bits de donneacutees

Constitution dune trame USART

un bit de start toujours agrave 0 servant agrave la synchronisation du reacutecepteur

les donneacutees la taille peut varier (geacuteneacuteralement entre 5 et 9 bits)

eacuteventuellement un bit de pariteacute paire ou impaire

et un bit de stop toujours agrave 1 (la dureacutee peut varier entre 1 15 et 2 temps bit)

Le niveau logique de repos est le 1

Figure 14 Trame USART

Station meacuteteacuteo autonome 2012

30

Afin de faciliter les liaisons entre peacuteripheacuteriques (PC microcontrocircleur modem hellip) des vitesses

de transmission sont normaliseacutees luniteacute baud correspondant agrave un temps bit Dans notre cas nous

choisirons une vitesse de transmission de 9600bps

C Programme drsquoenvoi des donneacutees par liaison Usart

Gracircce agrave la librairie de MikroC il est tregraves facile drsquoenvoyer des donneacutees par liaison Usart Cela

fonctionne comme pour envoyer des caractegraveres sur lrsquoeacutecran LCD Il faut juste ensuite choisir la vitesse

de transmission qui sera 9600bps Voici la fonction et un morceau du programme qui sert agrave envoyer

les caractegraveres sur Xbee et de Xbee agrave un HyperTerminal

Fonction humiditeacute

void humidite(int cond)

long H U VL Deacuteclaration des variables

char HH hum[8] humtxt[]=Humidite

helliphellip

Xbee(8 hum) Envoi la chaicircne de caractegravere hum dans la fonction xbee

Usart

void xbee(int nb char receive[20])

int i

Usart_Init(9600) Vitesse de transmission

for(i=0 ilt=nb i++) Boucle for

Usart_Write(receive[i]) Envoi les caractegraveres sur lrsquoHyperTerminal jusquagrave i

Station meacuteteacuteo autonome 2012

31

XII Estimation du coucirct du projet

On peut voir sur ce tableau que le prix de reviens pour les eacuteleacutements que nous avons utiliseacute

est de 14506euro TTC Ce qui est plutocirct oneacutereux compareacute aux stations meacuteteacuteo du marcheacute qui oscille

entre 6euro et 400euro En sachant que la nocirctre est loin drsquoecirctre finaliseacute (finition estheacutetique ergonomie et

ajout de nouvelle fonction comme la date et lrsquoheure)

Composant Quantiteacute Prix (TVA inclus) Liens Quartz 20000MHz 1 111 euro Lien

Capaciteacute 22pF 2 010 euro lien

PIC 16F876 1 427 euro lien

LCD MODULE 1 1575 euro lien

Potentiomegravetre 10KΩ 1 618 euro lien

Reacutesistance 33 Ω 1 035 euro lien

Reacutesistance 10 K Ω 2 070 euro lien

Reacutesistance 1 KΩ 3 105 euro lien

LED rouge 1 013 euro lien

DS1621 1 650 euro lien

Bouton poussoir 1 060 euro lien

Module Xbee 2 4000 euro lien

Platine dinterface (XBEE) RS232 1 1890 euro lien

Platine dinterface (XBEE) 1 1364 euro lien

Capteur drsquohumiditeacute 1 2692 euro lien

Transistor 1 561 euro lien

Diode 1 325 euro lien

Totales 1 14506 euro

Station meacuteteacuteo autonome 2012

32

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

panelsbut 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 Itrsquos also possible to measure

humidity and wind speed Then itrsquos 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 its 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 Itrsquos 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

Station meacuteteacuteo autonome 2012

33

XIV Conclusion

Ce projet sur la conception drsquoune station meacuteteacuteo autonome qui nous a eacuteteacute confieacute a eacuteteacute tregraves

enrichissant Il nous a permis de mettre en relations les connaissances acquises durant lrsquoanneacutee mais

aussi acqueacuterir de nouvelles connaissances comme le fonctionnement drsquoun microcontrocircleur En effet

nous nrsquoavions jamais programmeacute sur microcontrocircleur Il a fallu srsquoadapter et apprendre agrave utiliser des

nouveaux logiciels tels que Proteus MikroC ainsi que Labview

De cette expeacuterience nous avons aussi appris agrave ecirctre autonome Nous avons saisi que la

compreacutehension des documents techniques et des librairies eacutetait un point essentiel de notre projet

En programmation nous nrsquoavions pas le droit agrave lrsquoerreur car la moindre faute pouvait conduire le

systegraveme agrave un dysfonctionnement Ce projet nous a demandeacute beaucoup de rigueur de patience et de

temps

Toutefois nous nrsquoavons pas eu malheureusement le temps drsquoinstaller le capteur de

tempeacuterature inteacuterieure par manque de temps Plus encore nous aurions aimeacute approfondir certains

points Par exemple pouvoir installer les composants sur circuit imprimeacute et concevoir un support

viable pour en faire une vraie station meacuteteacuteo Lrsquoinstallation drsquoune girouette aurait eacuteteacute appreacuteciable

pour connaicirctre le sens du vent Aussi le programme aurait sans doute pu ecirctre encore ameacutelioreacute pour

de meilleures performances

Malgreacute ce manque de temps nous sommes tregraves satisfaits du fonctionnement de ce module

qui nous a permis de comprendre lrsquoutiliteacute des parties theacuteoriques pour lrsquoapplication et la mise en

œuvre drsquoun systegraveme Lrsquoapproche peacutedagogique de nous diriger vers les solutions sans jamais les

donner de nous laisser un grand degreacute de liberteacute et drsquoautonomie a eacuteteacute au deacutebut assez deacuteroutante

mais tregraves instructif

Enfin nous tenions agrave remercier Mme Leymarie qui nous a suivis et aiguilleacute tout au long de ce

projet

Station meacuteteacuteo autonome 2012

34

XV ANNEXES

Programme complet

Deacuteclaration 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()

deacuteclaration des variables

int cond=0Condition pour laffichage sur leacutecran LCD

int BP=0

Initialisation et affectation des ports

PORTA=0

PORTB=0 initialisation

PORTC=0

TRISB=0 Port B deacuteclarer en sortie

TRISA=0xFF Port A en entreacutee

ADCON1=0x84 Justifieacute agrave droite active RA0RA1RA3 analogique

ADCON0=0x85 Fosc32 sur PA0 en service

TRISB=0 Port B deacuteclarer en sortie

TRISC=0xFFPort C deacuteclarer en entreacutee

Configuration et initialisation de leacutecran LCD

Lcd_Config(ampPORTB 0 1 WR 5 4 3 2) Configure lecran

Lcd_Init(ampPORTB) initialisation du LCD

Lcd_Cmd(Lcd_CURSOR_OFF) Enleve le curseur

Lcd_Cmd(Lcd_CLEAR) Efface lecran

Initialisation du module I2C

I2C_Init(100000)initialisation de la communication I2C

I2C_Start()Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90)Mode de controcircle en mode eacutecriture

I2C_Wr(0xAC)Accegraves au registre de configuration

I2C_Wr(0x0A)Registre de configuration mesure en continu

I2C_Stop()Arrecirct du signal

I2C_Start()Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90)Mode de controcircle en mode eacutecriture

I2C_Wr(0xEE)Deacutebut de la conversion

I2C_Stop()Arrecirct du sigal

Station meacuteteacuteo autonome 2012

35

Configuration du mode capture

T1CON=0x31 Configuration du timer1

CCP1CON=0x05 Paramegravetrage du mode capture

PIE1TMR1IE=1 Autorise les deacutebordements du timer 1

Boucle infinie

while(1)

cond=cond+1Increacutemente la variable cond

switch(BP)

case 0

humidite(ampcond)Appel la fonction humiditeacute

if(PORTAF2==1)Ces if permet de changer la valeur de BP

BP=1

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)Temps quon relacircche bien le bouton

break

case 1

temperature(ampcond)Appel la fonction tempeacuterature

if(PORTAF2==1)

BP=2

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)

break

case 2

vent(ampcond)Appel la fonction vent

if(PORTAF2==1)

BP=0

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)

break

Fonction humiditeacute

void humidite(int cond)

long H U VLDeacuteclaration des variables

char HH hum[8] humtxt[]=Humidite

VL=Adc_read(0) Valeur lue sur RA0(humiditeacute)

U=(VL5000)1023 Convertit la valeur lue en tension x1000

H=(U-810)(0031) Convertit la tension en humiditeacute x1000

Station meacuteteacuteo autonome 2012

36

if(Hgt100000)Si H gt 100(impossible) alors = 100

H=100000

if(Hlt0)Si H lt 0(impossible) alors = 0

H=0

hum[0]=(H100000)+48Valeur des centaines affecteacute en ascii(48=0)

HH=(H10000)10

hum[1]=HH+48Valeur des dizaines affecteacute en ascii

HH=(H1000)10

hum[2]=HH+48Valeur des uniteacutes affecteacute en ascii

hum[3]=44Virgule affecteacute en ascii

HH=(H100)10

hum[4]=HH+48Valeur de la premiegravere deacutecimale affecteacute en ascii

HH=(H10)10

hum[5]=HH+48Valeur de la deuxiegraveme deacutecimale affecteacute en ascii

hum[6]=37Pourcentage affecteacute en ascii

if(cond==50)Appel la fonction LCD tous les 1000

lcd(1 1 8 humtxt)Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 7 hum)Affiche la chaine de caractegravere hum sur le LCD

cond=0Remise a 0 de la condition

Xbee(7 hum) Envoi la chaicircne de caractegravere hum dans la fonction xbee

Fonction tempeacuterature

void temperature(int cond)

char temp[7] temptxt[]=Temperature LSB

signed char MSB

I2C_Start()Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90)Mode de controcircle en mode eacutecriture

I2C_Wr(0xAA)Lecture de la tempeacuterature

I2C_Stop()Arrecirct du sigal

I2C_Start()Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x91)Mode de controcircle en mode lecture

MSB = I2C_Rd(1)Nombre signeacute donnant la tempeacuterature entre +125deg et -55degC

LSB = I2C_Rd(0)Si bit 7 = 1 tempeacuterature MSB +05degC

I2C_Stop()Arrecirct du sigal

if(MSBlt0)

MSB = abs(MSB) Si temperature neacutegative valeur absolue de MSB

Temp[0]=45 Signe - affecteacute en ascii

else

Station meacuteteacuteo autonome 2012

37

Temp[0]=43signe + affecteacute en ascii

Temp[1]=(MSB10)+48 Valeur des dizaines affecteacute en ascii

Temp[2]=(MSB10)+48 Valeur des uniteacutes affecteacute en ascii

Temp[3]=44 Virgule affecteacute en ascii

if (LSB==128) Si bit 7 agrave 1 alors +05deg

Temp[4]=5

else Si bit 7 agrave 0 alors +00deg

Temp[4]=0

Temp[5]=223 degreacute affecteacute en ascii

Temp[6]=67 C affecteacute en ascii

if(cond==50)Appel la fonction LCD tous les 1000

lcd(1 1 11 temptxt)Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 7 temp)Affiche la chaine de caractegravere hum sur le LCD

cond=0Remise a 0 de la condition

Xbee(7 temp) Envoi la chaicircne de caractegravere temp dans la fonction xbee

Fonction vent

void vent(int cond)

unsigned long tl th per

int vitfreq

char vent[13] txtvent[]=Vitesse du vent VV

if(PIR1CCP1IF==1) Test si front montant agrave lieu

TMR1H=0 Initialisation du timer1 bit de point fort

TMR1L=0 Initialisation du timer1 bit de point faible

th=CCPR1H Les valeurs sont copieacute dans des variables

tl=CCPR1L

th=thltlt8 Deacutecalage car th =gt bit de point fort

per = th|tl On concategravene les deux valeurs nous obtenons la peacuteriode

PIR1CCP1IF=0 Remise a 0 du drapeau

if(PIR1TMR1IF==1) Si deacutepassement du timer 1

per=65535+per On ajoute une retenue lorsquon a fait un tour (16bit)

PIR1TMR1IF=0 Remise a 0 du drapeau deacutepassement

Station meacuteteacuteo autonome 2012

38

freq=671310perCalacul de la freacutequence

vit=freq179 + 692Calcul de la vitesse que lon x100

if(vitlt200)En dessous 2ms la mesure est aleacuteatoire agrave cause du 2egraveme deacutebordement

vit=0

vent[0]=(vit10000)+48Valeur des centaines affecteacute en ascii(48=0)

VV=(vit1000)10

vent[1]=VV+48Valeur des dizaines affecteacute en ascii

VV=(vit100)10

vent[2]=VV+48Valeur des uniteacute affecteacute en ascii

VV=(vit10)10

vent[3]=44Virgule affecteacute en ascii

vent[4]=VV+48Valeur de la 1er deacutecimale affecteacute en ascii

VV=vit10

vent[5]=VV+48Valeur de la 2egraveme deacutecimale affecteacute en ascii

vent[6]=109m affecteacute en ascii

vent[7]=47 affecteacute en ascii

vent[8]=115s affecteacute en ascii

if(cond==50)Appel la fonction LCD tous les 1000

lcd(1 1 15 txtvent)Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 9 vent)Affiche la chaine de caractegravere hum sur le LCD

cond=0Remise a 0 de la condition

Xbee(9 vent) Envoi la chaicircne de caractegravere vent dans la fonction xbee

Fonction affichage

void lcd(int li int co int nb char receive[15])

int i

for(i=0 iltnb i++)Boucle for

Lcd_chr(li (co+i) receive[i])Affiche les caractegraveres jusquagrave i

Usart

void xbee(int nb char receive[15])

int i

Usart_Init(9600)Vitesse de transmission

for(i=0 iltnb i++)Boucle for

Usart_Write(receive[i])Envoi les caractegraveres sur lHyperTerminal jusquagrave i

Station meacuteteacuteo autonome 2012

27

B La simulation

Etant donneacute que nous ne pouvions pas prendre le mateacuteriel avec nous il eacutetait impeacuteratif de

pouvoir faire des simulations Pour cela nous avons utiliseacute un logiciel tregraves utile Proteus ISIS Ce

logiciel possegravede une tregraves grande librairie et permet de rentrer nos programmes sur le PIC virtuel

geacuteneacutereacute par le logiciel Pour simuler le capteur drsquohumiditeacute nous avons utiliseacute un potentiomegravetre Pour

celui de lrsquoaneacutemomegravetre comme pour nos mesures nous avons brancheacute virtuellement un GBF sur la

borne associeacute et observeacute son signal agrave lrsquoaide drsquoun oscilloscope

Voilagrave un aperccedilu de la simulation effectueacute sur ISIS

Veacuterification theacuteorique du vent

Vitesse du vent = 0179 37 + 0629

Vitesse du vent = 7657ms

Veacuterification theacuteorique de lrsquohumiditeacute

H= (315-081)0031

H=7548

Veacuterification theacuteorique de la

tempeacuterature

La valeur afficheacutee correspond bien

aux 27degC seacutelectionneacute sur le capteur

Station meacuteteacuteo autonome 2012

28

XI Transmission des donneacutees par liaison ZigBee

ZigBee est un protocole de haut niveau permettant la communication de petites radios agrave

consommation reacuteduite baseacutee sur le standard IEEE 802154

Cette technologie a pour but la communication de courte distance telle que le propose deacutejagrave

la technologie Bluetooth tout en eacutetant moins chegravere plus simple et avec une fiabiliteacute assez eacuteleveacutee

Dans notre projet nous nous servirons de ZigBee pour permettre une transmission par ondes

de nos donneacutees de la station meacuteteacuteo vers un ordinateur Pour cela nous avons 2 modules Xbee pro 2

platines drsquointerfaces une avec des pattes (liaison platine) et lrsquoautre avec une sortie RS232 (liaison pc)

Caracteacuteristique eacutelectrique

Les signaux Xbee ont une amplitude de 33V mais sont alimenteacutes en 5V (tension de notre

source USB) cacircbleacutes sur la bornes VIN (laquo Power input from 6-12Vdc 300mA or higher raquo) Mais

notre source nrsquoeacutetant pas assez puissante pour alimenter toute notre installation Nous utiliserons

donc une source externe de 5V qui sera utiliseacutee pour alimenter les 2 systegravemes Xbee

Description des Bornes du Xbee qui nous inteacuteresse

Station meacuteteacuteo autonome 2012

29

A Scheacutema eacutelectrique du module Xbee

Nous avons cacircbleacute la sortie TX du microcontrocircleur qui eacutemet un signal jusqursquoagrave la borne RX du

Xbee qui reacuteceptionne ce signal Apregraves la transmission se fait par onde entre les 2 modules Xbee Pour

le module qui reccediloit le signal un cacircble RS232 suffit agrave faire la liaison entre celui-ci et le PC

B Envoi des donneacutees la liaison Usart

Un USART (Universal synchronous amp Asynchronous Receiver Transmitter) est un eacutemetteur-

reacutecepteur universel En langage courant cest le composant utiliseacute pour faire la liaison entre

lordinateur et le port seacuterie Lordinateur envoie les donneacutees en parallegravele (autant de fils que de bits

de donneacutees) Il faut donc transformer ces donneacutees pour les faire passer agrave travers une liaison seacuterie qui

utilise un mecircme fil pour faire passer tous les bits de donneacutees

Constitution dune trame USART

un bit de start toujours agrave 0 servant agrave la synchronisation du reacutecepteur

les donneacutees la taille peut varier (geacuteneacuteralement entre 5 et 9 bits)

eacuteventuellement un bit de pariteacute paire ou impaire

et un bit de stop toujours agrave 1 (la dureacutee peut varier entre 1 15 et 2 temps bit)

Le niveau logique de repos est le 1

Figure 14 Trame USART

Station meacuteteacuteo autonome 2012

30

Afin de faciliter les liaisons entre peacuteripheacuteriques (PC microcontrocircleur modem hellip) des vitesses

de transmission sont normaliseacutees luniteacute baud correspondant agrave un temps bit Dans notre cas nous

choisirons une vitesse de transmission de 9600bps

C Programme drsquoenvoi des donneacutees par liaison Usart

Gracircce agrave la librairie de MikroC il est tregraves facile drsquoenvoyer des donneacutees par liaison Usart Cela

fonctionne comme pour envoyer des caractegraveres sur lrsquoeacutecran LCD Il faut juste ensuite choisir la vitesse

de transmission qui sera 9600bps Voici la fonction et un morceau du programme qui sert agrave envoyer

les caractegraveres sur Xbee et de Xbee agrave un HyperTerminal

Fonction humiditeacute

void humidite(int cond)

long H U VL Deacuteclaration des variables

char HH hum[8] humtxt[]=Humidite

helliphellip

Xbee(8 hum) Envoi la chaicircne de caractegravere hum dans la fonction xbee

Usart

void xbee(int nb char receive[20])

int i

Usart_Init(9600) Vitesse de transmission

for(i=0 ilt=nb i++) Boucle for

Usart_Write(receive[i]) Envoi les caractegraveres sur lrsquoHyperTerminal jusquagrave i

Station meacuteteacuteo autonome 2012

31

XII Estimation du coucirct du projet

On peut voir sur ce tableau que le prix de reviens pour les eacuteleacutements que nous avons utiliseacute

est de 14506euro TTC Ce qui est plutocirct oneacutereux compareacute aux stations meacuteteacuteo du marcheacute qui oscille

entre 6euro et 400euro En sachant que la nocirctre est loin drsquoecirctre finaliseacute (finition estheacutetique ergonomie et

ajout de nouvelle fonction comme la date et lrsquoheure)

Composant Quantiteacute Prix (TVA inclus) Liens Quartz 20000MHz 1 111 euro Lien

Capaciteacute 22pF 2 010 euro lien

PIC 16F876 1 427 euro lien

LCD MODULE 1 1575 euro lien

Potentiomegravetre 10KΩ 1 618 euro lien

Reacutesistance 33 Ω 1 035 euro lien

Reacutesistance 10 K Ω 2 070 euro lien

Reacutesistance 1 KΩ 3 105 euro lien

LED rouge 1 013 euro lien

DS1621 1 650 euro lien

Bouton poussoir 1 060 euro lien

Module Xbee 2 4000 euro lien

Platine dinterface (XBEE) RS232 1 1890 euro lien

Platine dinterface (XBEE) 1 1364 euro lien

Capteur drsquohumiditeacute 1 2692 euro lien

Transistor 1 561 euro lien

Diode 1 325 euro lien

Totales 1 14506 euro

Station meacuteteacuteo autonome 2012

32

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

panelsbut 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 Itrsquos also possible to measure

humidity and wind speed Then itrsquos 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 its 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 Itrsquos 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

Station meacuteteacuteo autonome 2012

33

XIV Conclusion

Ce projet sur la conception drsquoune station meacuteteacuteo autonome qui nous a eacuteteacute confieacute a eacuteteacute tregraves

enrichissant Il nous a permis de mettre en relations les connaissances acquises durant lrsquoanneacutee mais

aussi acqueacuterir de nouvelles connaissances comme le fonctionnement drsquoun microcontrocircleur En effet

nous nrsquoavions jamais programmeacute sur microcontrocircleur Il a fallu srsquoadapter et apprendre agrave utiliser des

nouveaux logiciels tels que Proteus MikroC ainsi que Labview

De cette expeacuterience nous avons aussi appris agrave ecirctre autonome Nous avons saisi que la

compreacutehension des documents techniques et des librairies eacutetait un point essentiel de notre projet

En programmation nous nrsquoavions pas le droit agrave lrsquoerreur car la moindre faute pouvait conduire le

systegraveme agrave un dysfonctionnement Ce projet nous a demandeacute beaucoup de rigueur de patience et de

temps

Toutefois nous nrsquoavons pas eu malheureusement le temps drsquoinstaller le capteur de

tempeacuterature inteacuterieure par manque de temps Plus encore nous aurions aimeacute approfondir certains

points Par exemple pouvoir installer les composants sur circuit imprimeacute et concevoir un support

viable pour en faire une vraie station meacuteteacuteo Lrsquoinstallation drsquoune girouette aurait eacuteteacute appreacuteciable

pour connaicirctre le sens du vent Aussi le programme aurait sans doute pu ecirctre encore ameacutelioreacute pour

de meilleures performances

Malgreacute ce manque de temps nous sommes tregraves satisfaits du fonctionnement de ce module

qui nous a permis de comprendre lrsquoutiliteacute des parties theacuteoriques pour lrsquoapplication et la mise en

œuvre drsquoun systegraveme Lrsquoapproche peacutedagogique de nous diriger vers les solutions sans jamais les

donner de nous laisser un grand degreacute de liberteacute et drsquoautonomie a eacuteteacute au deacutebut assez deacuteroutante

mais tregraves instructif

Enfin nous tenions agrave remercier Mme Leymarie qui nous a suivis et aiguilleacute tout au long de ce

projet

Station meacuteteacuteo autonome 2012

34

XV ANNEXES

Programme complet

Deacuteclaration 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()

deacuteclaration des variables

int cond=0Condition pour laffichage sur leacutecran LCD

int BP=0

Initialisation et affectation des ports

PORTA=0

PORTB=0 initialisation

PORTC=0

TRISB=0 Port B deacuteclarer en sortie

TRISA=0xFF Port A en entreacutee

ADCON1=0x84 Justifieacute agrave droite active RA0RA1RA3 analogique

ADCON0=0x85 Fosc32 sur PA0 en service

TRISB=0 Port B deacuteclarer en sortie

TRISC=0xFFPort C deacuteclarer en entreacutee

Configuration et initialisation de leacutecran LCD

Lcd_Config(ampPORTB 0 1 WR 5 4 3 2) Configure lecran

Lcd_Init(ampPORTB) initialisation du LCD

Lcd_Cmd(Lcd_CURSOR_OFF) Enleve le curseur

Lcd_Cmd(Lcd_CLEAR) Efface lecran

Initialisation du module I2C

I2C_Init(100000)initialisation de la communication I2C

I2C_Start()Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90)Mode de controcircle en mode eacutecriture

I2C_Wr(0xAC)Accegraves au registre de configuration

I2C_Wr(0x0A)Registre de configuration mesure en continu

I2C_Stop()Arrecirct du signal

I2C_Start()Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90)Mode de controcircle en mode eacutecriture

I2C_Wr(0xEE)Deacutebut de la conversion

I2C_Stop()Arrecirct du sigal

Station meacuteteacuteo autonome 2012

35

Configuration du mode capture

T1CON=0x31 Configuration du timer1

CCP1CON=0x05 Paramegravetrage du mode capture

PIE1TMR1IE=1 Autorise les deacutebordements du timer 1

Boucle infinie

while(1)

cond=cond+1Increacutemente la variable cond

switch(BP)

case 0

humidite(ampcond)Appel la fonction humiditeacute

if(PORTAF2==1)Ces if permet de changer la valeur de BP

BP=1

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)Temps quon relacircche bien le bouton

break

case 1

temperature(ampcond)Appel la fonction tempeacuterature

if(PORTAF2==1)

BP=2

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)

break

case 2

vent(ampcond)Appel la fonction vent

if(PORTAF2==1)

BP=0

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)

break

Fonction humiditeacute

void humidite(int cond)

long H U VLDeacuteclaration des variables

char HH hum[8] humtxt[]=Humidite

VL=Adc_read(0) Valeur lue sur RA0(humiditeacute)

U=(VL5000)1023 Convertit la valeur lue en tension x1000

H=(U-810)(0031) Convertit la tension en humiditeacute x1000

Station meacuteteacuteo autonome 2012

36

if(Hgt100000)Si H gt 100(impossible) alors = 100

H=100000

if(Hlt0)Si H lt 0(impossible) alors = 0

H=0

hum[0]=(H100000)+48Valeur des centaines affecteacute en ascii(48=0)

HH=(H10000)10

hum[1]=HH+48Valeur des dizaines affecteacute en ascii

HH=(H1000)10

hum[2]=HH+48Valeur des uniteacutes affecteacute en ascii

hum[3]=44Virgule affecteacute en ascii

HH=(H100)10

hum[4]=HH+48Valeur de la premiegravere deacutecimale affecteacute en ascii

HH=(H10)10

hum[5]=HH+48Valeur de la deuxiegraveme deacutecimale affecteacute en ascii

hum[6]=37Pourcentage affecteacute en ascii

if(cond==50)Appel la fonction LCD tous les 1000

lcd(1 1 8 humtxt)Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 7 hum)Affiche la chaine de caractegravere hum sur le LCD

cond=0Remise a 0 de la condition

Xbee(7 hum) Envoi la chaicircne de caractegravere hum dans la fonction xbee

Fonction tempeacuterature

void temperature(int cond)

char temp[7] temptxt[]=Temperature LSB

signed char MSB

I2C_Start()Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90)Mode de controcircle en mode eacutecriture

I2C_Wr(0xAA)Lecture de la tempeacuterature

I2C_Stop()Arrecirct du sigal

I2C_Start()Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x91)Mode de controcircle en mode lecture

MSB = I2C_Rd(1)Nombre signeacute donnant la tempeacuterature entre +125deg et -55degC

LSB = I2C_Rd(0)Si bit 7 = 1 tempeacuterature MSB +05degC

I2C_Stop()Arrecirct du sigal

if(MSBlt0)

MSB = abs(MSB) Si temperature neacutegative valeur absolue de MSB

Temp[0]=45 Signe - affecteacute en ascii

else

Station meacuteteacuteo autonome 2012

37

Temp[0]=43signe + affecteacute en ascii

Temp[1]=(MSB10)+48 Valeur des dizaines affecteacute en ascii

Temp[2]=(MSB10)+48 Valeur des uniteacutes affecteacute en ascii

Temp[3]=44 Virgule affecteacute en ascii

if (LSB==128) Si bit 7 agrave 1 alors +05deg

Temp[4]=5

else Si bit 7 agrave 0 alors +00deg

Temp[4]=0

Temp[5]=223 degreacute affecteacute en ascii

Temp[6]=67 C affecteacute en ascii

if(cond==50)Appel la fonction LCD tous les 1000

lcd(1 1 11 temptxt)Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 7 temp)Affiche la chaine de caractegravere hum sur le LCD

cond=0Remise a 0 de la condition

Xbee(7 temp) Envoi la chaicircne de caractegravere temp dans la fonction xbee

Fonction vent

void vent(int cond)

unsigned long tl th per

int vitfreq

char vent[13] txtvent[]=Vitesse du vent VV

if(PIR1CCP1IF==1) Test si front montant agrave lieu

TMR1H=0 Initialisation du timer1 bit de point fort

TMR1L=0 Initialisation du timer1 bit de point faible

th=CCPR1H Les valeurs sont copieacute dans des variables

tl=CCPR1L

th=thltlt8 Deacutecalage car th =gt bit de point fort

per = th|tl On concategravene les deux valeurs nous obtenons la peacuteriode

PIR1CCP1IF=0 Remise a 0 du drapeau

if(PIR1TMR1IF==1) Si deacutepassement du timer 1

per=65535+per On ajoute une retenue lorsquon a fait un tour (16bit)

PIR1TMR1IF=0 Remise a 0 du drapeau deacutepassement

Station meacuteteacuteo autonome 2012

38

freq=671310perCalacul de la freacutequence

vit=freq179 + 692Calcul de la vitesse que lon x100

if(vitlt200)En dessous 2ms la mesure est aleacuteatoire agrave cause du 2egraveme deacutebordement

vit=0

vent[0]=(vit10000)+48Valeur des centaines affecteacute en ascii(48=0)

VV=(vit1000)10

vent[1]=VV+48Valeur des dizaines affecteacute en ascii

VV=(vit100)10

vent[2]=VV+48Valeur des uniteacute affecteacute en ascii

VV=(vit10)10

vent[3]=44Virgule affecteacute en ascii

vent[4]=VV+48Valeur de la 1er deacutecimale affecteacute en ascii

VV=vit10

vent[5]=VV+48Valeur de la 2egraveme deacutecimale affecteacute en ascii

vent[6]=109m affecteacute en ascii

vent[7]=47 affecteacute en ascii

vent[8]=115s affecteacute en ascii

if(cond==50)Appel la fonction LCD tous les 1000

lcd(1 1 15 txtvent)Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 9 vent)Affiche la chaine de caractegravere hum sur le LCD

cond=0Remise a 0 de la condition

Xbee(9 vent) Envoi la chaicircne de caractegravere vent dans la fonction xbee

Fonction affichage

void lcd(int li int co int nb char receive[15])

int i

for(i=0 iltnb i++)Boucle for

Lcd_chr(li (co+i) receive[i])Affiche les caractegraveres jusquagrave i

Usart

void xbee(int nb char receive[15])

int i

Usart_Init(9600)Vitesse de transmission

for(i=0 iltnb i++)Boucle for

Usart_Write(receive[i])Envoi les caractegraveres sur lHyperTerminal jusquagrave i

Station meacuteteacuteo autonome 2012

28

XI Transmission des donneacutees par liaison ZigBee

ZigBee est un protocole de haut niveau permettant la communication de petites radios agrave

consommation reacuteduite baseacutee sur le standard IEEE 802154

Cette technologie a pour but la communication de courte distance telle que le propose deacutejagrave

la technologie Bluetooth tout en eacutetant moins chegravere plus simple et avec une fiabiliteacute assez eacuteleveacutee

Dans notre projet nous nous servirons de ZigBee pour permettre une transmission par ondes

de nos donneacutees de la station meacuteteacuteo vers un ordinateur Pour cela nous avons 2 modules Xbee pro 2

platines drsquointerfaces une avec des pattes (liaison platine) et lrsquoautre avec une sortie RS232 (liaison pc)

Caracteacuteristique eacutelectrique

Les signaux Xbee ont une amplitude de 33V mais sont alimenteacutes en 5V (tension de notre

source USB) cacircbleacutes sur la bornes VIN (laquo Power input from 6-12Vdc 300mA or higher raquo) Mais

notre source nrsquoeacutetant pas assez puissante pour alimenter toute notre installation Nous utiliserons

donc une source externe de 5V qui sera utiliseacutee pour alimenter les 2 systegravemes Xbee

Description des Bornes du Xbee qui nous inteacuteresse

Station meacuteteacuteo autonome 2012

29

A Scheacutema eacutelectrique du module Xbee

Nous avons cacircbleacute la sortie TX du microcontrocircleur qui eacutemet un signal jusqursquoagrave la borne RX du

Xbee qui reacuteceptionne ce signal Apregraves la transmission se fait par onde entre les 2 modules Xbee Pour

le module qui reccediloit le signal un cacircble RS232 suffit agrave faire la liaison entre celui-ci et le PC

B Envoi des donneacutees la liaison Usart

Un USART (Universal synchronous amp Asynchronous Receiver Transmitter) est un eacutemetteur-

reacutecepteur universel En langage courant cest le composant utiliseacute pour faire la liaison entre

lordinateur et le port seacuterie Lordinateur envoie les donneacutees en parallegravele (autant de fils que de bits

de donneacutees) Il faut donc transformer ces donneacutees pour les faire passer agrave travers une liaison seacuterie qui

utilise un mecircme fil pour faire passer tous les bits de donneacutees

Constitution dune trame USART

un bit de start toujours agrave 0 servant agrave la synchronisation du reacutecepteur

les donneacutees la taille peut varier (geacuteneacuteralement entre 5 et 9 bits)

eacuteventuellement un bit de pariteacute paire ou impaire

et un bit de stop toujours agrave 1 (la dureacutee peut varier entre 1 15 et 2 temps bit)

Le niveau logique de repos est le 1

Figure 14 Trame USART

Station meacuteteacuteo autonome 2012

30

Afin de faciliter les liaisons entre peacuteripheacuteriques (PC microcontrocircleur modem hellip) des vitesses

de transmission sont normaliseacutees luniteacute baud correspondant agrave un temps bit Dans notre cas nous

choisirons une vitesse de transmission de 9600bps

C Programme drsquoenvoi des donneacutees par liaison Usart

Gracircce agrave la librairie de MikroC il est tregraves facile drsquoenvoyer des donneacutees par liaison Usart Cela

fonctionne comme pour envoyer des caractegraveres sur lrsquoeacutecran LCD Il faut juste ensuite choisir la vitesse

de transmission qui sera 9600bps Voici la fonction et un morceau du programme qui sert agrave envoyer

les caractegraveres sur Xbee et de Xbee agrave un HyperTerminal

Fonction humiditeacute

void humidite(int cond)

long H U VL Deacuteclaration des variables

char HH hum[8] humtxt[]=Humidite

helliphellip

Xbee(8 hum) Envoi la chaicircne de caractegravere hum dans la fonction xbee

Usart

void xbee(int nb char receive[20])

int i

Usart_Init(9600) Vitesse de transmission

for(i=0 ilt=nb i++) Boucle for

Usart_Write(receive[i]) Envoi les caractegraveres sur lrsquoHyperTerminal jusquagrave i

Station meacuteteacuteo autonome 2012

31

XII Estimation du coucirct du projet

On peut voir sur ce tableau que le prix de reviens pour les eacuteleacutements que nous avons utiliseacute

est de 14506euro TTC Ce qui est plutocirct oneacutereux compareacute aux stations meacuteteacuteo du marcheacute qui oscille

entre 6euro et 400euro En sachant que la nocirctre est loin drsquoecirctre finaliseacute (finition estheacutetique ergonomie et

ajout de nouvelle fonction comme la date et lrsquoheure)

Composant Quantiteacute Prix (TVA inclus) Liens Quartz 20000MHz 1 111 euro Lien

Capaciteacute 22pF 2 010 euro lien

PIC 16F876 1 427 euro lien

LCD MODULE 1 1575 euro lien

Potentiomegravetre 10KΩ 1 618 euro lien

Reacutesistance 33 Ω 1 035 euro lien

Reacutesistance 10 K Ω 2 070 euro lien

Reacutesistance 1 KΩ 3 105 euro lien

LED rouge 1 013 euro lien

DS1621 1 650 euro lien

Bouton poussoir 1 060 euro lien

Module Xbee 2 4000 euro lien

Platine dinterface (XBEE) RS232 1 1890 euro lien

Platine dinterface (XBEE) 1 1364 euro lien

Capteur drsquohumiditeacute 1 2692 euro lien

Transistor 1 561 euro lien

Diode 1 325 euro lien

Totales 1 14506 euro

Station meacuteteacuteo autonome 2012

32

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

panelsbut 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 Itrsquos also possible to measure

humidity and wind speed Then itrsquos 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 its 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 Itrsquos 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

Station meacuteteacuteo autonome 2012

33

XIV Conclusion

Ce projet sur la conception drsquoune station meacuteteacuteo autonome qui nous a eacuteteacute confieacute a eacuteteacute tregraves

enrichissant Il nous a permis de mettre en relations les connaissances acquises durant lrsquoanneacutee mais

aussi acqueacuterir de nouvelles connaissances comme le fonctionnement drsquoun microcontrocircleur En effet

nous nrsquoavions jamais programmeacute sur microcontrocircleur Il a fallu srsquoadapter et apprendre agrave utiliser des

nouveaux logiciels tels que Proteus MikroC ainsi que Labview

De cette expeacuterience nous avons aussi appris agrave ecirctre autonome Nous avons saisi que la

compreacutehension des documents techniques et des librairies eacutetait un point essentiel de notre projet

En programmation nous nrsquoavions pas le droit agrave lrsquoerreur car la moindre faute pouvait conduire le

systegraveme agrave un dysfonctionnement Ce projet nous a demandeacute beaucoup de rigueur de patience et de

temps

Toutefois nous nrsquoavons pas eu malheureusement le temps drsquoinstaller le capteur de

tempeacuterature inteacuterieure par manque de temps Plus encore nous aurions aimeacute approfondir certains

points Par exemple pouvoir installer les composants sur circuit imprimeacute et concevoir un support

viable pour en faire une vraie station meacuteteacuteo Lrsquoinstallation drsquoune girouette aurait eacuteteacute appreacuteciable

pour connaicirctre le sens du vent Aussi le programme aurait sans doute pu ecirctre encore ameacutelioreacute pour

de meilleures performances

Malgreacute ce manque de temps nous sommes tregraves satisfaits du fonctionnement de ce module

qui nous a permis de comprendre lrsquoutiliteacute des parties theacuteoriques pour lrsquoapplication et la mise en

œuvre drsquoun systegraveme Lrsquoapproche peacutedagogique de nous diriger vers les solutions sans jamais les

donner de nous laisser un grand degreacute de liberteacute et drsquoautonomie a eacuteteacute au deacutebut assez deacuteroutante

mais tregraves instructif

Enfin nous tenions agrave remercier Mme Leymarie qui nous a suivis et aiguilleacute tout au long de ce

projet

Station meacuteteacuteo autonome 2012

34

XV ANNEXES

Programme complet

Deacuteclaration 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()

deacuteclaration des variables

int cond=0Condition pour laffichage sur leacutecran LCD

int BP=0

Initialisation et affectation des ports

PORTA=0

PORTB=0 initialisation

PORTC=0

TRISB=0 Port B deacuteclarer en sortie

TRISA=0xFF Port A en entreacutee

ADCON1=0x84 Justifieacute agrave droite active RA0RA1RA3 analogique

ADCON0=0x85 Fosc32 sur PA0 en service

TRISB=0 Port B deacuteclarer en sortie

TRISC=0xFFPort C deacuteclarer en entreacutee

Configuration et initialisation de leacutecran LCD

Lcd_Config(ampPORTB 0 1 WR 5 4 3 2) Configure lecran

Lcd_Init(ampPORTB) initialisation du LCD

Lcd_Cmd(Lcd_CURSOR_OFF) Enleve le curseur

Lcd_Cmd(Lcd_CLEAR) Efface lecran

Initialisation du module I2C

I2C_Init(100000)initialisation de la communication I2C

I2C_Start()Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90)Mode de controcircle en mode eacutecriture

I2C_Wr(0xAC)Accegraves au registre de configuration

I2C_Wr(0x0A)Registre de configuration mesure en continu

I2C_Stop()Arrecirct du signal

I2C_Start()Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90)Mode de controcircle en mode eacutecriture

I2C_Wr(0xEE)Deacutebut de la conversion

I2C_Stop()Arrecirct du sigal

Station meacuteteacuteo autonome 2012

35

Configuration du mode capture

T1CON=0x31 Configuration du timer1

CCP1CON=0x05 Paramegravetrage du mode capture

PIE1TMR1IE=1 Autorise les deacutebordements du timer 1

Boucle infinie

while(1)

cond=cond+1Increacutemente la variable cond

switch(BP)

case 0

humidite(ampcond)Appel la fonction humiditeacute

if(PORTAF2==1)Ces if permet de changer la valeur de BP

BP=1

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)Temps quon relacircche bien le bouton

break

case 1

temperature(ampcond)Appel la fonction tempeacuterature

if(PORTAF2==1)

BP=2

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)

break

case 2

vent(ampcond)Appel la fonction vent

if(PORTAF2==1)

BP=0

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)

break

Fonction humiditeacute

void humidite(int cond)

long H U VLDeacuteclaration des variables

char HH hum[8] humtxt[]=Humidite

VL=Adc_read(0) Valeur lue sur RA0(humiditeacute)

U=(VL5000)1023 Convertit la valeur lue en tension x1000

H=(U-810)(0031) Convertit la tension en humiditeacute x1000

Station meacuteteacuteo autonome 2012

36

if(Hgt100000)Si H gt 100(impossible) alors = 100

H=100000

if(Hlt0)Si H lt 0(impossible) alors = 0

H=0

hum[0]=(H100000)+48Valeur des centaines affecteacute en ascii(48=0)

HH=(H10000)10

hum[1]=HH+48Valeur des dizaines affecteacute en ascii

HH=(H1000)10

hum[2]=HH+48Valeur des uniteacutes affecteacute en ascii

hum[3]=44Virgule affecteacute en ascii

HH=(H100)10

hum[4]=HH+48Valeur de la premiegravere deacutecimale affecteacute en ascii

HH=(H10)10

hum[5]=HH+48Valeur de la deuxiegraveme deacutecimale affecteacute en ascii

hum[6]=37Pourcentage affecteacute en ascii

if(cond==50)Appel la fonction LCD tous les 1000

lcd(1 1 8 humtxt)Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 7 hum)Affiche la chaine de caractegravere hum sur le LCD

cond=0Remise a 0 de la condition

Xbee(7 hum) Envoi la chaicircne de caractegravere hum dans la fonction xbee

Fonction tempeacuterature

void temperature(int cond)

char temp[7] temptxt[]=Temperature LSB

signed char MSB

I2C_Start()Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90)Mode de controcircle en mode eacutecriture

I2C_Wr(0xAA)Lecture de la tempeacuterature

I2C_Stop()Arrecirct du sigal

I2C_Start()Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x91)Mode de controcircle en mode lecture

MSB = I2C_Rd(1)Nombre signeacute donnant la tempeacuterature entre +125deg et -55degC

LSB = I2C_Rd(0)Si bit 7 = 1 tempeacuterature MSB +05degC

I2C_Stop()Arrecirct du sigal

if(MSBlt0)

MSB = abs(MSB) Si temperature neacutegative valeur absolue de MSB

Temp[0]=45 Signe - affecteacute en ascii

else

Station meacuteteacuteo autonome 2012

37

Temp[0]=43signe + affecteacute en ascii

Temp[1]=(MSB10)+48 Valeur des dizaines affecteacute en ascii

Temp[2]=(MSB10)+48 Valeur des uniteacutes affecteacute en ascii

Temp[3]=44 Virgule affecteacute en ascii

if (LSB==128) Si bit 7 agrave 1 alors +05deg

Temp[4]=5

else Si bit 7 agrave 0 alors +00deg

Temp[4]=0

Temp[5]=223 degreacute affecteacute en ascii

Temp[6]=67 C affecteacute en ascii

if(cond==50)Appel la fonction LCD tous les 1000

lcd(1 1 11 temptxt)Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 7 temp)Affiche la chaine de caractegravere hum sur le LCD

cond=0Remise a 0 de la condition

Xbee(7 temp) Envoi la chaicircne de caractegravere temp dans la fonction xbee

Fonction vent

void vent(int cond)

unsigned long tl th per

int vitfreq

char vent[13] txtvent[]=Vitesse du vent VV

if(PIR1CCP1IF==1) Test si front montant agrave lieu

TMR1H=0 Initialisation du timer1 bit de point fort

TMR1L=0 Initialisation du timer1 bit de point faible

th=CCPR1H Les valeurs sont copieacute dans des variables

tl=CCPR1L

th=thltlt8 Deacutecalage car th =gt bit de point fort

per = th|tl On concategravene les deux valeurs nous obtenons la peacuteriode

PIR1CCP1IF=0 Remise a 0 du drapeau

if(PIR1TMR1IF==1) Si deacutepassement du timer 1

per=65535+per On ajoute une retenue lorsquon a fait un tour (16bit)

PIR1TMR1IF=0 Remise a 0 du drapeau deacutepassement

Station meacuteteacuteo autonome 2012

38

freq=671310perCalacul de la freacutequence

vit=freq179 + 692Calcul de la vitesse que lon x100

if(vitlt200)En dessous 2ms la mesure est aleacuteatoire agrave cause du 2egraveme deacutebordement

vit=0

vent[0]=(vit10000)+48Valeur des centaines affecteacute en ascii(48=0)

VV=(vit1000)10

vent[1]=VV+48Valeur des dizaines affecteacute en ascii

VV=(vit100)10

vent[2]=VV+48Valeur des uniteacute affecteacute en ascii

VV=(vit10)10

vent[3]=44Virgule affecteacute en ascii

vent[4]=VV+48Valeur de la 1er deacutecimale affecteacute en ascii

VV=vit10

vent[5]=VV+48Valeur de la 2egraveme deacutecimale affecteacute en ascii

vent[6]=109m affecteacute en ascii

vent[7]=47 affecteacute en ascii

vent[8]=115s affecteacute en ascii

if(cond==50)Appel la fonction LCD tous les 1000

lcd(1 1 15 txtvent)Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 9 vent)Affiche la chaine de caractegravere hum sur le LCD

cond=0Remise a 0 de la condition

Xbee(9 vent) Envoi la chaicircne de caractegravere vent dans la fonction xbee

Fonction affichage

void lcd(int li int co int nb char receive[15])

int i

for(i=0 iltnb i++)Boucle for

Lcd_chr(li (co+i) receive[i])Affiche les caractegraveres jusquagrave i

Usart

void xbee(int nb char receive[15])

int i

Usart_Init(9600)Vitesse de transmission

for(i=0 iltnb i++)Boucle for

Usart_Write(receive[i])Envoi les caractegraveres sur lHyperTerminal jusquagrave i

Station meacuteteacuteo autonome 2012

29

A Scheacutema eacutelectrique du module Xbee

Nous avons cacircbleacute la sortie TX du microcontrocircleur qui eacutemet un signal jusqursquoagrave la borne RX du

Xbee qui reacuteceptionne ce signal Apregraves la transmission se fait par onde entre les 2 modules Xbee Pour

le module qui reccediloit le signal un cacircble RS232 suffit agrave faire la liaison entre celui-ci et le PC

B Envoi des donneacutees la liaison Usart

Un USART (Universal synchronous amp Asynchronous Receiver Transmitter) est un eacutemetteur-

reacutecepteur universel En langage courant cest le composant utiliseacute pour faire la liaison entre

lordinateur et le port seacuterie Lordinateur envoie les donneacutees en parallegravele (autant de fils que de bits

de donneacutees) Il faut donc transformer ces donneacutees pour les faire passer agrave travers une liaison seacuterie qui

utilise un mecircme fil pour faire passer tous les bits de donneacutees

Constitution dune trame USART

un bit de start toujours agrave 0 servant agrave la synchronisation du reacutecepteur

les donneacutees la taille peut varier (geacuteneacuteralement entre 5 et 9 bits)

eacuteventuellement un bit de pariteacute paire ou impaire

et un bit de stop toujours agrave 1 (la dureacutee peut varier entre 1 15 et 2 temps bit)

Le niveau logique de repos est le 1

Figure 14 Trame USART

Station meacuteteacuteo autonome 2012

30

Afin de faciliter les liaisons entre peacuteripheacuteriques (PC microcontrocircleur modem hellip) des vitesses

de transmission sont normaliseacutees luniteacute baud correspondant agrave un temps bit Dans notre cas nous

choisirons une vitesse de transmission de 9600bps

C Programme drsquoenvoi des donneacutees par liaison Usart

Gracircce agrave la librairie de MikroC il est tregraves facile drsquoenvoyer des donneacutees par liaison Usart Cela

fonctionne comme pour envoyer des caractegraveres sur lrsquoeacutecran LCD Il faut juste ensuite choisir la vitesse

de transmission qui sera 9600bps Voici la fonction et un morceau du programme qui sert agrave envoyer

les caractegraveres sur Xbee et de Xbee agrave un HyperTerminal

Fonction humiditeacute

void humidite(int cond)

long H U VL Deacuteclaration des variables

char HH hum[8] humtxt[]=Humidite

helliphellip

Xbee(8 hum) Envoi la chaicircne de caractegravere hum dans la fonction xbee

Usart

void xbee(int nb char receive[20])

int i

Usart_Init(9600) Vitesse de transmission

for(i=0 ilt=nb i++) Boucle for

Usart_Write(receive[i]) Envoi les caractegraveres sur lrsquoHyperTerminal jusquagrave i

Station meacuteteacuteo autonome 2012

31

XII Estimation du coucirct du projet

On peut voir sur ce tableau que le prix de reviens pour les eacuteleacutements que nous avons utiliseacute

est de 14506euro TTC Ce qui est plutocirct oneacutereux compareacute aux stations meacuteteacuteo du marcheacute qui oscille

entre 6euro et 400euro En sachant que la nocirctre est loin drsquoecirctre finaliseacute (finition estheacutetique ergonomie et

ajout de nouvelle fonction comme la date et lrsquoheure)

Composant Quantiteacute Prix (TVA inclus) Liens Quartz 20000MHz 1 111 euro Lien

Capaciteacute 22pF 2 010 euro lien

PIC 16F876 1 427 euro lien

LCD MODULE 1 1575 euro lien

Potentiomegravetre 10KΩ 1 618 euro lien

Reacutesistance 33 Ω 1 035 euro lien

Reacutesistance 10 K Ω 2 070 euro lien

Reacutesistance 1 KΩ 3 105 euro lien

LED rouge 1 013 euro lien

DS1621 1 650 euro lien

Bouton poussoir 1 060 euro lien

Module Xbee 2 4000 euro lien

Platine dinterface (XBEE) RS232 1 1890 euro lien

Platine dinterface (XBEE) 1 1364 euro lien

Capteur drsquohumiditeacute 1 2692 euro lien

Transistor 1 561 euro lien

Diode 1 325 euro lien

Totales 1 14506 euro

Station meacuteteacuteo autonome 2012

32

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

panelsbut 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 Itrsquos also possible to measure

humidity and wind speed Then itrsquos 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 its 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 Itrsquos 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

Station meacuteteacuteo autonome 2012

33

XIV Conclusion

Ce projet sur la conception drsquoune station meacuteteacuteo autonome qui nous a eacuteteacute confieacute a eacuteteacute tregraves

enrichissant Il nous a permis de mettre en relations les connaissances acquises durant lrsquoanneacutee mais

aussi acqueacuterir de nouvelles connaissances comme le fonctionnement drsquoun microcontrocircleur En effet

nous nrsquoavions jamais programmeacute sur microcontrocircleur Il a fallu srsquoadapter et apprendre agrave utiliser des

nouveaux logiciels tels que Proteus MikroC ainsi que Labview

De cette expeacuterience nous avons aussi appris agrave ecirctre autonome Nous avons saisi que la

compreacutehension des documents techniques et des librairies eacutetait un point essentiel de notre projet

En programmation nous nrsquoavions pas le droit agrave lrsquoerreur car la moindre faute pouvait conduire le

systegraveme agrave un dysfonctionnement Ce projet nous a demandeacute beaucoup de rigueur de patience et de

temps

Toutefois nous nrsquoavons pas eu malheureusement le temps drsquoinstaller le capteur de

tempeacuterature inteacuterieure par manque de temps Plus encore nous aurions aimeacute approfondir certains

points Par exemple pouvoir installer les composants sur circuit imprimeacute et concevoir un support

viable pour en faire une vraie station meacuteteacuteo Lrsquoinstallation drsquoune girouette aurait eacuteteacute appreacuteciable

pour connaicirctre le sens du vent Aussi le programme aurait sans doute pu ecirctre encore ameacutelioreacute pour

de meilleures performances

Malgreacute ce manque de temps nous sommes tregraves satisfaits du fonctionnement de ce module

qui nous a permis de comprendre lrsquoutiliteacute des parties theacuteoriques pour lrsquoapplication et la mise en

œuvre drsquoun systegraveme Lrsquoapproche peacutedagogique de nous diriger vers les solutions sans jamais les

donner de nous laisser un grand degreacute de liberteacute et drsquoautonomie a eacuteteacute au deacutebut assez deacuteroutante

mais tregraves instructif

Enfin nous tenions agrave remercier Mme Leymarie qui nous a suivis et aiguilleacute tout au long de ce

projet

Station meacuteteacuteo autonome 2012

34

XV ANNEXES

Programme complet

Deacuteclaration 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()

deacuteclaration des variables

int cond=0Condition pour laffichage sur leacutecran LCD

int BP=0

Initialisation et affectation des ports

PORTA=0

PORTB=0 initialisation

PORTC=0

TRISB=0 Port B deacuteclarer en sortie

TRISA=0xFF Port A en entreacutee

ADCON1=0x84 Justifieacute agrave droite active RA0RA1RA3 analogique

ADCON0=0x85 Fosc32 sur PA0 en service

TRISB=0 Port B deacuteclarer en sortie

TRISC=0xFFPort C deacuteclarer en entreacutee

Configuration et initialisation de leacutecran LCD

Lcd_Config(ampPORTB 0 1 WR 5 4 3 2) Configure lecran

Lcd_Init(ampPORTB) initialisation du LCD

Lcd_Cmd(Lcd_CURSOR_OFF) Enleve le curseur

Lcd_Cmd(Lcd_CLEAR) Efface lecran

Initialisation du module I2C

I2C_Init(100000)initialisation de la communication I2C

I2C_Start()Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90)Mode de controcircle en mode eacutecriture

I2C_Wr(0xAC)Accegraves au registre de configuration

I2C_Wr(0x0A)Registre de configuration mesure en continu

I2C_Stop()Arrecirct du signal

I2C_Start()Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90)Mode de controcircle en mode eacutecriture

I2C_Wr(0xEE)Deacutebut de la conversion

I2C_Stop()Arrecirct du sigal

Station meacuteteacuteo autonome 2012

35

Configuration du mode capture

T1CON=0x31 Configuration du timer1

CCP1CON=0x05 Paramegravetrage du mode capture

PIE1TMR1IE=1 Autorise les deacutebordements du timer 1

Boucle infinie

while(1)

cond=cond+1Increacutemente la variable cond

switch(BP)

case 0

humidite(ampcond)Appel la fonction humiditeacute

if(PORTAF2==1)Ces if permet de changer la valeur de BP

BP=1

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)Temps quon relacircche bien le bouton

break

case 1

temperature(ampcond)Appel la fonction tempeacuterature

if(PORTAF2==1)

BP=2

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)

break

case 2

vent(ampcond)Appel la fonction vent

if(PORTAF2==1)

BP=0

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)

break

Fonction humiditeacute

void humidite(int cond)

long H U VLDeacuteclaration des variables

char HH hum[8] humtxt[]=Humidite

VL=Adc_read(0) Valeur lue sur RA0(humiditeacute)

U=(VL5000)1023 Convertit la valeur lue en tension x1000

H=(U-810)(0031) Convertit la tension en humiditeacute x1000

Station meacuteteacuteo autonome 2012

36

if(Hgt100000)Si H gt 100(impossible) alors = 100

H=100000

if(Hlt0)Si H lt 0(impossible) alors = 0

H=0

hum[0]=(H100000)+48Valeur des centaines affecteacute en ascii(48=0)

HH=(H10000)10

hum[1]=HH+48Valeur des dizaines affecteacute en ascii

HH=(H1000)10

hum[2]=HH+48Valeur des uniteacutes affecteacute en ascii

hum[3]=44Virgule affecteacute en ascii

HH=(H100)10

hum[4]=HH+48Valeur de la premiegravere deacutecimale affecteacute en ascii

HH=(H10)10

hum[5]=HH+48Valeur de la deuxiegraveme deacutecimale affecteacute en ascii

hum[6]=37Pourcentage affecteacute en ascii

if(cond==50)Appel la fonction LCD tous les 1000

lcd(1 1 8 humtxt)Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 7 hum)Affiche la chaine de caractegravere hum sur le LCD

cond=0Remise a 0 de la condition

Xbee(7 hum) Envoi la chaicircne de caractegravere hum dans la fonction xbee

Fonction tempeacuterature

void temperature(int cond)

char temp[7] temptxt[]=Temperature LSB

signed char MSB

I2C_Start()Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90)Mode de controcircle en mode eacutecriture

I2C_Wr(0xAA)Lecture de la tempeacuterature

I2C_Stop()Arrecirct du sigal

I2C_Start()Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x91)Mode de controcircle en mode lecture

MSB = I2C_Rd(1)Nombre signeacute donnant la tempeacuterature entre +125deg et -55degC

LSB = I2C_Rd(0)Si bit 7 = 1 tempeacuterature MSB +05degC

I2C_Stop()Arrecirct du sigal

if(MSBlt0)

MSB = abs(MSB) Si temperature neacutegative valeur absolue de MSB

Temp[0]=45 Signe - affecteacute en ascii

else

Station meacuteteacuteo autonome 2012

37

Temp[0]=43signe + affecteacute en ascii

Temp[1]=(MSB10)+48 Valeur des dizaines affecteacute en ascii

Temp[2]=(MSB10)+48 Valeur des uniteacutes affecteacute en ascii

Temp[3]=44 Virgule affecteacute en ascii

if (LSB==128) Si bit 7 agrave 1 alors +05deg

Temp[4]=5

else Si bit 7 agrave 0 alors +00deg

Temp[4]=0

Temp[5]=223 degreacute affecteacute en ascii

Temp[6]=67 C affecteacute en ascii

if(cond==50)Appel la fonction LCD tous les 1000

lcd(1 1 11 temptxt)Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 7 temp)Affiche la chaine de caractegravere hum sur le LCD

cond=0Remise a 0 de la condition

Xbee(7 temp) Envoi la chaicircne de caractegravere temp dans la fonction xbee

Fonction vent

void vent(int cond)

unsigned long tl th per

int vitfreq

char vent[13] txtvent[]=Vitesse du vent VV

if(PIR1CCP1IF==1) Test si front montant agrave lieu

TMR1H=0 Initialisation du timer1 bit de point fort

TMR1L=0 Initialisation du timer1 bit de point faible

th=CCPR1H Les valeurs sont copieacute dans des variables

tl=CCPR1L

th=thltlt8 Deacutecalage car th =gt bit de point fort

per = th|tl On concategravene les deux valeurs nous obtenons la peacuteriode

PIR1CCP1IF=0 Remise a 0 du drapeau

if(PIR1TMR1IF==1) Si deacutepassement du timer 1

per=65535+per On ajoute une retenue lorsquon a fait un tour (16bit)

PIR1TMR1IF=0 Remise a 0 du drapeau deacutepassement

Station meacuteteacuteo autonome 2012

38

freq=671310perCalacul de la freacutequence

vit=freq179 + 692Calcul de la vitesse que lon x100

if(vitlt200)En dessous 2ms la mesure est aleacuteatoire agrave cause du 2egraveme deacutebordement

vit=0

vent[0]=(vit10000)+48Valeur des centaines affecteacute en ascii(48=0)

VV=(vit1000)10

vent[1]=VV+48Valeur des dizaines affecteacute en ascii

VV=(vit100)10

vent[2]=VV+48Valeur des uniteacute affecteacute en ascii

VV=(vit10)10

vent[3]=44Virgule affecteacute en ascii

vent[4]=VV+48Valeur de la 1er deacutecimale affecteacute en ascii

VV=vit10

vent[5]=VV+48Valeur de la 2egraveme deacutecimale affecteacute en ascii

vent[6]=109m affecteacute en ascii

vent[7]=47 affecteacute en ascii

vent[8]=115s affecteacute en ascii

if(cond==50)Appel la fonction LCD tous les 1000

lcd(1 1 15 txtvent)Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 9 vent)Affiche la chaine de caractegravere hum sur le LCD

cond=0Remise a 0 de la condition

Xbee(9 vent) Envoi la chaicircne de caractegravere vent dans la fonction xbee

Fonction affichage

void lcd(int li int co int nb char receive[15])

int i

for(i=0 iltnb i++)Boucle for

Lcd_chr(li (co+i) receive[i])Affiche les caractegraveres jusquagrave i

Usart

void xbee(int nb char receive[15])

int i

Usart_Init(9600)Vitesse de transmission

for(i=0 iltnb i++)Boucle for

Usart_Write(receive[i])Envoi les caractegraveres sur lHyperTerminal jusquagrave i

Station meacuteteacuteo autonome 2012

30

Afin de faciliter les liaisons entre peacuteripheacuteriques (PC microcontrocircleur modem hellip) des vitesses

de transmission sont normaliseacutees luniteacute baud correspondant agrave un temps bit Dans notre cas nous

choisirons une vitesse de transmission de 9600bps

C Programme drsquoenvoi des donneacutees par liaison Usart

Gracircce agrave la librairie de MikroC il est tregraves facile drsquoenvoyer des donneacutees par liaison Usart Cela

fonctionne comme pour envoyer des caractegraveres sur lrsquoeacutecran LCD Il faut juste ensuite choisir la vitesse

de transmission qui sera 9600bps Voici la fonction et un morceau du programme qui sert agrave envoyer

les caractegraveres sur Xbee et de Xbee agrave un HyperTerminal

Fonction humiditeacute

void humidite(int cond)

long H U VL Deacuteclaration des variables

char HH hum[8] humtxt[]=Humidite

helliphellip

Xbee(8 hum) Envoi la chaicircne de caractegravere hum dans la fonction xbee

Usart

void xbee(int nb char receive[20])

int i

Usart_Init(9600) Vitesse de transmission

for(i=0 ilt=nb i++) Boucle for

Usart_Write(receive[i]) Envoi les caractegraveres sur lrsquoHyperTerminal jusquagrave i

Station meacuteteacuteo autonome 2012

31

XII Estimation du coucirct du projet

On peut voir sur ce tableau que le prix de reviens pour les eacuteleacutements que nous avons utiliseacute

est de 14506euro TTC Ce qui est plutocirct oneacutereux compareacute aux stations meacuteteacuteo du marcheacute qui oscille

entre 6euro et 400euro En sachant que la nocirctre est loin drsquoecirctre finaliseacute (finition estheacutetique ergonomie et

ajout de nouvelle fonction comme la date et lrsquoheure)

Composant Quantiteacute Prix (TVA inclus) Liens Quartz 20000MHz 1 111 euro Lien

Capaciteacute 22pF 2 010 euro lien

PIC 16F876 1 427 euro lien

LCD MODULE 1 1575 euro lien

Potentiomegravetre 10KΩ 1 618 euro lien

Reacutesistance 33 Ω 1 035 euro lien

Reacutesistance 10 K Ω 2 070 euro lien

Reacutesistance 1 KΩ 3 105 euro lien

LED rouge 1 013 euro lien

DS1621 1 650 euro lien

Bouton poussoir 1 060 euro lien

Module Xbee 2 4000 euro lien

Platine dinterface (XBEE) RS232 1 1890 euro lien

Platine dinterface (XBEE) 1 1364 euro lien

Capteur drsquohumiditeacute 1 2692 euro lien

Transistor 1 561 euro lien

Diode 1 325 euro lien

Totales 1 14506 euro

Station meacuteteacuteo autonome 2012

32

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

panelsbut 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 Itrsquos also possible to measure

humidity and wind speed Then itrsquos 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 its 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 Itrsquos 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

Station meacuteteacuteo autonome 2012

33

XIV Conclusion

Ce projet sur la conception drsquoune station meacuteteacuteo autonome qui nous a eacuteteacute confieacute a eacuteteacute tregraves

enrichissant Il nous a permis de mettre en relations les connaissances acquises durant lrsquoanneacutee mais

aussi acqueacuterir de nouvelles connaissances comme le fonctionnement drsquoun microcontrocircleur En effet

nous nrsquoavions jamais programmeacute sur microcontrocircleur Il a fallu srsquoadapter et apprendre agrave utiliser des

nouveaux logiciels tels que Proteus MikroC ainsi que Labview

De cette expeacuterience nous avons aussi appris agrave ecirctre autonome Nous avons saisi que la

compreacutehension des documents techniques et des librairies eacutetait un point essentiel de notre projet

En programmation nous nrsquoavions pas le droit agrave lrsquoerreur car la moindre faute pouvait conduire le

systegraveme agrave un dysfonctionnement Ce projet nous a demandeacute beaucoup de rigueur de patience et de

temps

Toutefois nous nrsquoavons pas eu malheureusement le temps drsquoinstaller le capteur de

tempeacuterature inteacuterieure par manque de temps Plus encore nous aurions aimeacute approfondir certains

points Par exemple pouvoir installer les composants sur circuit imprimeacute et concevoir un support

viable pour en faire une vraie station meacuteteacuteo Lrsquoinstallation drsquoune girouette aurait eacuteteacute appreacuteciable

pour connaicirctre le sens du vent Aussi le programme aurait sans doute pu ecirctre encore ameacutelioreacute pour

de meilleures performances

Malgreacute ce manque de temps nous sommes tregraves satisfaits du fonctionnement de ce module

qui nous a permis de comprendre lrsquoutiliteacute des parties theacuteoriques pour lrsquoapplication et la mise en

œuvre drsquoun systegraveme Lrsquoapproche peacutedagogique de nous diriger vers les solutions sans jamais les

donner de nous laisser un grand degreacute de liberteacute et drsquoautonomie a eacuteteacute au deacutebut assez deacuteroutante

mais tregraves instructif

Enfin nous tenions agrave remercier Mme Leymarie qui nous a suivis et aiguilleacute tout au long de ce

projet

Station meacuteteacuteo autonome 2012

34

XV ANNEXES

Programme complet

Deacuteclaration 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()

deacuteclaration des variables

int cond=0Condition pour laffichage sur leacutecran LCD

int BP=0

Initialisation et affectation des ports

PORTA=0

PORTB=0 initialisation

PORTC=0

TRISB=0 Port B deacuteclarer en sortie

TRISA=0xFF Port A en entreacutee

ADCON1=0x84 Justifieacute agrave droite active RA0RA1RA3 analogique

ADCON0=0x85 Fosc32 sur PA0 en service

TRISB=0 Port B deacuteclarer en sortie

TRISC=0xFFPort C deacuteclarer en entreacutee

Configuration et initialisation de leacutecran LCD

Lcd_Config(ampPORTB 0 1 WR 5 4 3 2) Configure lecran

Lcd_Init(ampPORTB) initialisation du LCD

Lcd_Cmd(Lcd_CURSOR_OFF) Enleve le curseur

Lcd_Cmd(Lcd_CLEAR) Efface lecran

Initialisation du module I2C

I2C_Init(100000)initialisation de la communication I2C

I2C_Start()Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90)Mode de controcircle en mode eacutecriture

I2C_Wr(0xAC)Accegraves au registre de configuration

I2C_Wr(0x0A)Registre de configuration mesure en continu

I2C_Stop()Arrecirct du signal

I2C_Start()Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90)Mode de controcircle en mode eacutecriture

I2C_Wr(0xEE)Deacutebut de la conversion

I2C_Stop()Arrecirct du sigal

Station meacuteteacuteo autonome 2012

35

Configuration du mode capture

T1CON=0x31 Configuration du timer1

CCP1CON=0x05 Paramegravetrage du mode capture

PIE1TMR1IE=1 Autorise les deacutebordements du timer 1

Boucle infinie

while(1)

cond=cond+1Increacutemente la variable cond

switch(BP)

case 0

humidite(ampcond)Appel la fonction humiditeacute

if(PORTAF2==1)Ces if permet de changer la valeur de BP

BP=1

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)Temps quon relacircche bien le bouton

break

case 1

temperature(ampcond)Appel la fonction tempeacuterature

if(PORTAF2==1)

BP=2

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)

break

case 2

vent(ampcond)Appel la fonction vent

if(PORTAF2==1)

BP=0

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)

break

Fonction humiditeacute

void humidite(int cond)

long H U VLDeacuteclaration des variables

char HH hum[8] humtxt[]=Humidite

VL=Adc_read(0) Valeur lue sur RA0(humiditeacute)

U=(VL5000)1023 Convertit la valeur lue en tension x1000

H=(U-810)(0031) Convertit la tension en humiditeacute x1000

Station meacuteteacuteo autonome 2012

36

if(Hgt100000)Si H gt 100(impossible) alors = 100

H=100000

if(Hlt0)Si H lt 0(impossible) alors = 0

H=0

hum[0]=(H100000)+48Valeur des centaines affecteacute en ascii(48=0)

HH=(H10000)10

hum[1]=HH+48Valeur des dizaines affecteacute en ascii

HH=(H1000)10

hum[2]=HH+48Valeur des uniteacutes affecteacute en ascii

hum[3]=44Virgule affecteacute en ascii

HH=(H100)10

hum[4]=HH+48Valeur de la premiegravere deacutecimale affecteacute en ascii

HH=(H10)10

hum[5]=HH+48Valeur de la deuxiegraveme deacutecimale affecteacute en ascii

hum[6]=37Pourcentage affecteacute en ascii

if(cond==50)Appel la fonction LCD tous les 1000

lcd(1 1 8 humtxt)Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 7 hum)Affiche la chaine de caractegravere hum sur le LCD

cond=0Remise a 0 de la condition

Xbee(7 hum) Envoi la chaicircne de caractegravere hum dans la fonction xbee

Fonction tempeacuterature

void temperature(int cond)

char temp[7] temptxt[]=Temperature LSB

signed char MSB

I2C_Start()Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90)Mode de controcircle en mode eacutecriture

I2C_Wr(0xAA)Lecture de la tempeacuterature

I2C_Stop()Arrecirct du sigal

I2C_Start()Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x91)Mode de controcircle en mode lecture

MSB = I2C_Rd(1)Nombre signeacute donnant la tempeacuterature entre +125deg et -55degC

LSB = I2C_Rd(0)Si bit 7 = 1 tempeacuterature MSB +05degC

I2C_Stop()Arrecirct du sigal

if(MSBlt0)

MSB = abs(MSB) Si temperature neacutegative valeur absolue de MSB

Temp[0]=45 Signe - affecteacute en ascii

else

Station meacuteteacuteo autonome 2012

37

Temp[0]=43signe + affecteacute en ascii

Temp[1]=(MSB10)+48 Valeur des dizaines affecteacute en ascii

Temp[2]=(MSB10)+48 Valeur des uniteacutes affecteacute en ascii

Temp[3]=44 Virgule affecteacute en ascii

if (LSB==128) Si bit 7 agrave 1 alors +05deg

Temp[4]=5

else Si bit 7 agrave 0 alors +00deg

Temp[4]=0

Temp[5]=223 degreacute affecteacute en ascii

Temp[6]=67 C affecteacute en ascii

if(cond==50)Appel la fonction LCD tous les 1000

lcd(1 1 11 temptxt)Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 7 temp)Affiche la chaine de caractegravere hum sur le LCD

cond=0Remise a 0 de la condition

Xbee(7 temp) Envoi la chaicircne de caractegravere temp dans la fonction xbee

Fonction vent

void vent(int cond)

unsigned long tl th per

int vitfreq

char vent[13] txtvent[]=Vitesse du vent VV

if(PIR1CCP1IF==1) Test si front montant agrave lieu

TMR1H=0 Initialisation du timer1 bit de point fort

TMR1L=0 Initialisation du timer1 bit de point faible

th=CCPR1H Les valeurs sont copieacute dans des variables

tl=CCPR1L

th=thltlt8 Deacutecalage car th =gt bit de point fort

per = th|tl On concategravene les deux valeurs nous obtenons la peacuteriode

PIR1CCP1IF=0 Remise a 0 du drapeau

if(PIR1TMR1IF==1) Si deacutepassement du timer 1

per=65535+per On ajoute une retenue lorsquon a fait un tour (16bit)

PIR1TMR1IF=0 Remise a 0 du drapeau deacutepassement

Station meacuteteacuteo autonome 2012

38

freq=671310perCalacul de la freacutequence

vit=freq179 + 692Calcul de la vitesse que lon x100

if(vitlt200)En dessous 2ms la mesure est aleacuteatoire agrave cause du 2egraveme deacutebordement

vit=0

vent[0]=(vit10000)+48Valeur des centaines affecteacute en ascii(48=0)

VV=(vit1000)10

vent[1]=VV+48Valeur des dizaines affecteacute en ascii

VV=(vit100)10

vent[2]=VV+48Valeur des uniteacute affecteacute en ascii

VV=(vit10)10

vent[3]=44Virgule affecteacute en ascii

vent[4]=VV+48Valeur de la 1er deacutecimale affecteacute en ascii

VV=vit10

vent[5]=VV+48Valeur de la 2egraveme deacutecimale affecteacute en ascii

vent[6]=109m affecteacute en ascii

vent[7]=47 affecteacute en ascii

vent[8]=115s affecteacute en ascii

if(cond==50)Appel la fonction LCD tous les 1000

lcd(1 1 15 txtvent)Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 9 vent)Affiche la chaine de caractegravere hum sur le LCD

cond=0Remise a 0 de la condition

Xbee(9 vent) Envoi la chaicircne de caractegravere vent dans la fonction xbee

Fonction affichage

void lcd(int li int co int nb char receive[15])

int i

for(i=0 iltnb i++)Boucle for

Lcd_chr(li (co+i) receive[i])Affiche les caractegraveres jusquagrave i

Usart

void xbee(int nb char receive[15])

int i

Usart_Init(9600)Vitesse de transmission

for(i=0 iltnb i++)Boucle for

Usart_Write(receive[i])Envoi les caractegraveres sur lHyperTerminal jusquagrave i

Station meacuteteacuteo autonome 2012

31

XII Estimation du coucirct du projet

On peut voir sur ce tableau que le prix de reviens pour les eacuteleacutements que nous avons utiliseacute

est de 14506euro TTC Ce qui est plutocirct oneacutereux compareacute aux stations meacuteteacuteo du marcheacute qui oscille

entre 6euro et 400euro En sachant que la nocirctre est loin drsquoecirctre finaliseacute (finition estheacutetique ergonomie et

ajout de nouvelle fonction comme la date et lrsquoheure)

Composant Quantiteacute Prix (TVA inclus) Liens Quartz 20000MHz 1 111 euro Lien

Capaciteacute 22pF 2 010 euro lien

PIC 16F876 1 427 euro lien

LCD MODULE 1 1575 euro lien

Potentiomegravetre 10KΩ 1 618 euro lien

Reacutesistance 33 Ω 1 035 euro lien

Reacutesistance 10 K Ω 2 070 euro lien

Reacutesistance 1 KΩ 3 105 euro lien

LED rouge 1 013 euro lien

DS1621 1 650 euro lien

Bouton poussoir 1 060 euro lien

Module Xbee 2 4000 euro lien

Platine dinterface (XBEE) RS232 1 1890 euro lien

Platine dinterface (XBEE) 1 1364 euro lien

Capteur drsquohumiditeacute 1 2692 euro lien

Transistor 1 561 euro lien

Diode 1 325 euro lien

Totales 1 14506 euro

Station meacuteteacuteo autonome 2012

32

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

panelsbut 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 Itrsquos also possible to measure

humidity and wind speed Then itrsquos 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 its 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 Itrsquos 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

Station meacuteteacuteo autonome 2012

33

XIV Conclusion

Ce projet sur la conception drsquoune station meacuteteacuteo autonome qui nous a eacuteteacute confieacute a eacuteteacute tregraves

enrichissant Il nous a permis de mettre en relations les connaissances acquises durant lrsquoanneacutee mais

aussi acqueacuterir de nouvelles connaissances comme le fonctionnement drsquoun microcontrocircleur En effet

nous nrsquoavions jamais programmeacute sur microcontrocircleur Il a fallu srsquoadapter et apprendre agrave utiliser des

nouveaux logiciels tels que Proteus MikroC ainsi que Labview

De cette expeacuterience nous avons aussi appris agrave ecirctre autonome Nous avons saisi que la

compreacutehension des documents techniques et des librairies eacutetait un point essentiel de notre projet

En programmation nous nrsquoavions pas le droit agrave lrsquoerreur car la moindre faute pouvait conduire le

systegraveme agrave un dysfonctionnement Ce projet nous a demandeacute beaucoup de rigueur de patience et de

temps

Toutefois nous nrsquoavons pas eu malheureusement le temps drsquoinstaller le capteur de

tempeacuterature inteacuterieure par manque de temps Plus encore nous aurions aimeacute approfondir certains

points Par exemple pouvoir installer les composants sur circuit imprimeacute et concevoir un support

viable pour en faire une vraie station meacuteteacuteo Lrsquoinstallation drsquoune girouette aurait eacuteteacute appreacuteciable

pour connaicirctre le sens du vent Aussi le programme aurait sans doute pu ecirctre encore ameacutelioreacute pour

de meilleures performances

Malgreacute ce manque de temps nous sommes tregraves satisfaits du fonctionnement de ce module

qui nous a permis de comprendre lrsquoutiliteacute des parties theacuteoriques pour lrsquoapplication et la mise en

œuvre drsquoun systegraveme Lrsquoapproche peacutedagogique de nous diriger vers les solutions sans jamais les

donner de nous laisser un grand degreacute de liberteacute et drsquoautonomie a eacuteteacute au deacutebut assez deacuteroutante

mais tregraves instructif

Enfin nous tenions agrave remercier Mme Leymarie qui nous a suivis et aiguilleacute tout au long de ce

projet

Station meacuteteacuteo autonome 2012

34

XV ANNEXES

Programme complet

Deacuteclaration 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()

deacuteclaration des variables

int cond=0Condition pour laffichage sur leacutecran LCD

int BP=0

Initialisation et affectation des ports

PORTA=0

PORTB=0 initialisation

PORTC=0

TRISB=0 Port B deacuteclarer en sortie

TRISA=0xFF Port A en entreacutee

ADCON1=0x84 Justifieacute agrave droite active RA0RA1RA3 analogique

ADCON0=0x85 Fosc32 sur PA0 en service

TRISB=0 Port B deacuteclarer en sortie

TRISC=0xFFPort C deacuteclarer en entreacutee

Configuration et initialisation de leacutecran LCD

Lcd_Config(ampPORTB 0 1 WR 5 4 3 2) Configure lecran

Lcd_Init(ampPORTB) initialisation du LCD

Lcd_Cmd(Lcd_CURSOR_OFF) Enleve le curseur

Lcd_Cmd(Lcd_CLEAR) Efface lecran

Initialisation du module I2C

I2C_Init(100000)initialisation de la communication I2C

I2C_Start()Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90)Mode de controcircle en mode eacutecriture

I2C_Wr(0xAC)Accegraves au registre de configuration

I2C_Wr(0x0A)Registre de configuration mesure en continu

I2C_Stop()Arrecirct du signal

I2C_Start()Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90)Mode de controcircle en mode eacutecriture

I2C_Wr(0xEE)Deacutebut de la conversion

I2C_Stop()Arrecirct du sigal

Station meacuteteacuteo autonome 2012

35

Configuration du mode capture

T1CON=0x31 Configuration du timer1

CCP1CON=0x05 Paramegravetrage du mode capture

PIE1TMR1IE=1 Autorise les deacutebordements du timer 1

Boucle infinie

while(1)

cond=cond+1Increacutemente la variable cond

switch(BP)

case 0

humidite(ampcond)Appel la fonction humiditeacute

if(PORTAF2==1)Ces if permet de changer la valeur de BP

BP=1

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)Temps quon relacircche bien le bouton

break

case 1

temperature(ampcond)Appel la fonction tempeacuterature

if(PORTAF2==1)

BP=2

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)

break

case 2

vent(ampcond)Appel la fonction vent

if(PORTAF2==1)

BP=0

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)

break

Fonction humiditeacute

void humidite(int cond)

long H U VLDeacuteclaration des variables

char HH hum[8] humtxt[]=Humidite

VL=Adc_read(0) Valeur lue sur RA0(humiditeacute)

U=(VL5000)1023 Convertit la valeur lue en tension x1000

H=(U-810)(0031) Convertit la tension en humiditeacute x1000

Station meacuteteacuteo autonome 2012

36

if(Hgt100000)Si H gt 100(impossible) alors = 100

H=100000

if(Hlt0)Si H lt 0(impossible) alors = 0

H=0

hum[0]=(H100000)+48Valeur des centaines affecteacute en ascii(48=0)

HH=(H10000)10

hum[1]=HH+48Valeur des dizaines affecteacute en ascii

HH=(H1000)10

hum[2]=HH+48Valeur des uniteacutes affecteacute en ascii

hum[3]=44Virgule affecteacute en ascii

HH=(H100)10

hum[4]=HH+48Valeur de la premiegravere deacutecimale affecteacute en ascii

HH=(H10)10

hum[5]=HH+48Valeur de la deuxiegraveme deacutecimale affecteacute en ascii

hum[6]=37Pourcentage affecteacute en ascii

if(cond==50)Appel la fonction LCD tous les 1000

lcd(1 1 8 humtxt)Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 7 hum)Affiche la chaine de caractegravere hum sur le LCD

cond=0Remise a 0 de la condition

Xbee(7 hum) Envoi la chaicircne de caractegravere hum dans la fonction xbee

Fonction tempeacuterature

void temperature(int cond)

char temp[7] temptxt[]=Temperature LSB

signed char MSB

I2C_Start()Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90)Mode de controcircle en mode eacutecriture

I2C_Wr(0xAA)Lecture de la tempeacuterature

I2C_Stop()Arrecirct du sigal

I2C_Start()Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x91)Mode de controcircle en mode lecture

MSB = I2C_Rd(1)Nombre signeacute donnant la tempeacuterature entre +125deg et -55degC

LSB = I2C_Rd(0)Si bit 7 = 1 tempeacuterature MSB +05degC

I2C_Stop()Arrecirct du sigal

if(MSBlt0)

MSB = abs(MSB) Si temperature neacutegative valeur absolue de MSB

Temp[0]=45 Signe - affecteacute en ascii

else

Station meacuteteacuteo autonome 2012

37

Temp[0]=43signe + affecteacute en ascii

Temp[1]=(MSB10)+48 Valeur des dizaines affecteacute en ascii

Temp[2]=(MSB10)+48 Valeur des uniteacutes affecteacute en ascii

Temp[3]=44 Virgule affecteacute en ascii

if (LSB==128) Si bit 7 agrave 1 alors +05deg

Temp[4]=5

else Si bit 7 agrave 0 alors +00deg

Temp[4]=0

Temp[5]=223 degreacute affecteacute en ascii

Temp[6]=67 C affecteacute en ascii

if(cond==50)Appel la fonction LCD tous les 1000

lcd(1 1 11 temptxt)Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 7 temp)Affiche la chaine de caractegravere hum sur le LCD

cond=0Remise a 0 de la condition

Xbee(7 temp) Envoi la chaicircne de caractegravere temp dans la fonction xbee

Fonction vent

void vent(int cond)

unsigned long tl th per

int vitfreq

char vent[13] txtvent[]=Vitesse du vent VV

if(PIR1CCP1IF==1) Test si front montant agrave lieu

TMR1H=0 Initialisation du timer1 bit de point fort

TMR1L=0 Initialisation du timer1 bit de point faible

th=CCPR1H Les valeurs sont copieacute dans des variables

tl=CCPR1L

th=thltlt8 Deacutecalage car th =gt bit de point fort

per = th|tl On concategravene les deux valeurs nous obtenons la peacuteriode

PIR1CCP1IF=0 Remise a 0 du drapeau

if(PIR1TMR1IF==1) Si deacutepassement du timer 1

per=65535+per On ajoute une retenue lorsquon a fait un tour (16bit)

PIR1TMR1IF=0 Remise a 0 du drapeau deacutepassement

Station meacuteteacuteo autonome 2012

38

freq=671310perCalacul de la freacutequence

vit=freq179 + 692Calcul de la vitesse que lon x100

if(vitlt200)En dessous 2ms la mesure est aleacuteatoire agrave cause du 2egraveme deacutebordement

vit=0

vent[0]=(vit10000)+48Valeur des centaines affecteacute en ascii(48=0)

VV=(vit1000)10

vent[1]=VV+48Valeur des dizaines affecteacute en ascii

VV=(vit100)10

vent[2]=VV+48Valeur des uniteacute affecteacute en ascii

VV=(vit10)10

vent[3]=44Virgule affecteacute en ascii

vent[4]=VV+48Valeur de la 1er deacutecimale affecteacute en ascii

VV=vit10

vent[5]=VV+48Valeur de la 2egraveme deacutecimale affecteacute en ascii

vent[6]=109m affecteacute en ascii

vent[7]=47 affecteacute en ascii

vent[8]=115s affecteacute en ascii

if(cond==50)Appel la fonction LCD tous les 1000

lcd(1 1 15 txtvent)Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 9 vent)Affiche la chaine de caractegravere hum sur le LCD

cond=0Remise a 0 de la condition

Xbee(9 vent) Envoi la chaicircne de caractegravere vent dans la fonction xbee

Fonction affichage

void lcd(int li int co int nb char receive[15])

int i

for(i=0 iltnb i++)Boucle for

Lcd_chr(li (co+i) receive[i])Affiche les caractegraveres jusquagrave i

Usart

void xbee(int nb char receive[15])

int i

Usart_Init(9600)Vitesse de transmission

for(i=0 iltnb i++)Boucle for

Usart_Write(receive[i])Envoi les caractegraveres sur lHyperTerminal jusquagrave i

Station meacuteteacuteo autonome 2012

32

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

panelsbut 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 Itrsquos also possible to measure

humidity and wind speed Then itrsquos 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 its 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 Itrsquos 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

Station meacuteteacuteo autonome 2012

33

XIV Conclusion

Ce projet sur la conception drsquoune station meacuteteacuteo autonome qui nous a eacuteteacute confieacute a eacuteteacute tregraves

enrichissant Il nous a permis de mettre en relations les connaissances acquises durant lrsquoanneacutee mais

aussi acqueacuterir de nouvelles connaissances comme le fonctionnement drsquoun microcontrocircleur En effet

nous nrsquoavions jamais programmeacute sur microcontrocircleur Il a fallu srsquoadapter et apprendre agrave utiliser des

nouveaux logiciels tels que Proteus MikroC ainsi que Labview

De cette expeacuterience nous avons aussi appris agrave ecirctre autonome Nous avons saisi que la

compreacutehension des documents techniques et des librairies eacutetait un point essentiel de notre projet

En programmation nous nrsquoavions pas le droit agrave lrsquoerreur car la moindre faute pouvait conduire le

systegraveme agrave un dysfonctionnement Ce projet nous a demandeacute beaucoup de rigueur de patience et de

temps

Toutefois nous nrsquoavons pas eu malheureusement le temps drsquoinstaller le capteur de

tempeacuterature inteacuterieure par manque de temps Plus encore nous aurions aimeacute approfondir certains

points Par exemple pouvoir installer les composants sur circuit imprimeacute et concevoir un support

viable pour en faire une vraie station meacuteteacuteo Lrsquoinstallation drsquoune girouette aurait eacuteteacute appreacuteciable

pour connaicirctre le sens du vent Aussi le programme aurait sans doute pu ecirctre encore ameacutelioreacute pour

de meilleures performances

Malgreacute ce manque de temps nous sommes tregraves satisfaits du fonctionnement de ce module

qui nous a permis de comprendre lrsquoutiliteacute des parties theacuteoriques pour lrsquoapplication et la mise en

œuvre drsquoun systegraveme Lrsquoapproche peacutedagogique de nous diriger vers les solutions sans jamais les

donner de nous laisser un grand degreacute de liberteacute et drsquoautonomie a eacuteteacute au deacutebut assez deacuteroutante

mais tregraves instructif

Enfin nous tenions agrave remercier Mme Leymarie qui nous a suivis et aiguilleacute tout au long de ce

projet

Station meacuteteacuteo autonome 2012

34

XV ANNEXES

Programme complet

Deacuteclaration 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()

deacuteclaration des variables

int cond=0Condition pour laffichage sur leacutecran LCD

int BP=0

Initialisation et affectation des ports

PORTA=0

PORTB=0 initialisation

PORTC=0

TRISB=0 Port B deacuteclarer en sortie

TRISA=0xFF Port A en entreacutee

ADCON1=0x84 Justifieacute agrave droite active RA0RA1RA3 analogique

ADCON0=0x85 Fosc32 sur PA0 en service

TRISB=0 Port B deacuteclarer en sortie

TRISC=0xFFPort C deacuteclarer en entreacutee

Configuration et initialisation de leacutecran LCD

Lcd_Config(ampPORTB 0 1 WR 5 4 3 2) Configure lecran

Lcd_Init(ampPORTB) initialisation du LCD

Lcd_Cmd(Lcd_CURSOR_OFF) Enleve le curseur

Lcd_Cmd(Lcd_CLEAR) Efface lecran

Initialisation du module I2C

I2C_Init(100000)initialisation de la communication I2C

I2C_Start()Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90)Mode de controcircle en mode eacutecriture

I2C_Wr(0xAC)Accegraves au registre de configuration

I2C_Wr(0x0A)Registre de configuration mesure en continu

I2C_Stop()Arrecirct du signal

I2C_Start()Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90)Mode de controcircle en mode eacutecriture

I2C_Wr(0xEE)Deacutebut de la conversion

I2C_Stop()Arrecirct du sigal

Station meacuteteacuteo autonome 2012

35

Configuration du mode capture

T1CON=0x31 Configuration du timer1

CCP1CON=0x05 Paramegravetrage du mode capture

PIE1TMR1IE=1 Autorise les deacutebordements du timer 1

Boucle infinie

while(1)

cond=cond+1Increacutemente la variable cond

switch(BP)

case 0

humidite(ampcond)Appel la fonction humiditeacute

if(PORTAF2==1)Ces if permet de changer la valeur de BP

BP=1

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)Temps quon relacircche bien le bouton

break

case 1

temperature(ampcond)Appel la fonction tempeacuterature

if(PORTAF2==1)

BP=2

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)

break

case 2

vent(ampcond)Appel la fonction vent

if(PORTAF2==1)

BP=0

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)

break

Fonction humiditeacute

void humidite(int cond)

long H U VLDeacuteclaration des variables

char HH hum[8] humtxt[]=Humidite

VL=Adc_read(0) Valeur lue sur RA0(humiditeacute)

U=(VL5000)1023 Convertit la valeur lue en tension x1000

H=(U-810)(0031) Convertit la tension en humiditeacute x1000

Station meacuteteacuteo autonome 2012

36

if(Hgt100000)Si H gt 100(impossible) alors = 100

H=100000

if(Hlt0)Si H lt 0(impossible) alors = 0

H=0

hum[0]=(H100000)+48Valeur des centaines affecteacute en ascii(48=0)

HH=(H10000)10

hum[1]=HH+48Valeur des dizaines affecteacute en ascii

HH=(H1000)10

hum[2]=HH+48Valeur des uniteacutes affecteacute en ascii

hum[3]=44Virgule affecteacute en ascii

HH=(H100)10

hum[4]=HH+48Valeur de la premiegravere deacutecimale affecteacute en ascii

HH=(H10)10

hum[5]=HH+48Valeur de la deuxiegraveme deacutecimale affecteacute en ascii

hum[6]=37Pourcentage affecteacute en ascii

if(cond==50)Appel la fonction LCD tous les 1000

lcd(1 1 8 humtxt)Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 7 hum)Affiche la chaine de caractegravere hum sur le LCD

cond=0Remise a 0 de la condition

Xbee(7 hum) Envoi la chaicircne de caractegravere hum dans la fonction xbee

Fonction tempeacuterature

void temperature(int cond)

char temp[7] temptxt[]=Temperature LSB

signed char MSB

I2C_Start()Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90)Mode de controcircle en mode eacutecriture

I2C_Wr(0xAA)Lecture de la tempeacuterature

I2C_Stop()Arrecirct du sigal

I2C_Start()Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x91)Mode de controcircle en mode lecture

MSB = I2C_Rd(1)Nombre signeacute donnant la tempeacuterature entre +125deg et -55degC

LSB = I2C_Rd(0)Si bit 7 = 1 tempeacuterature MSB +05degC

I2C_Stop()Arrecirct du sigal

if(MSBlt0)

MSB = abs(MSB) Si temperature neacutegative valeur absolue de MSB

Temp[0]=45 Signe - affecteacute en ascii

else

Station meacuteteacuteo autonome 2012

37

Temp[0]=43signe + affecteacute en ascii

Temp[1]=(MSB10)+48 Valeur des dizaines affecteacute en ascii

Temp[2]=(MSB10)+48 Valeur des uniteacutes affecteacute en ascii

Temp[3]=44 Virgule affecteacute en ascii

if (LSB==128) Si bit 7 agrave 1 alors +05deg

Temp[4]=5

else Si bit 7 agrave 0 alors +00deg

Temp[4]=0

Temp[5]=223 degreacute affecteacute en ascii

Temp[6]=67 C affecteacute en ascii

if(cond==50)Appel la fonction LCD tous les 1000

lcd(1 1 11 temptxt)Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 7 temp)Affiche la chaine de caractegravere hum sur le LCD

cond=0Remise a 0 de la condition

Xbee(7 temp) Envoi la chaicircne de caractegravere temp dans la fonction xbee

Fonction vent

void vent(int cond)

unsigned long tl th per

int vitfreq

char vent[13] txtvent[]=Vitesse du vent VV

if(PIR1CCP1IF==1) Test si front montant agrave lieu

TMR1H=0 Initialisation du timer1 bit de point fort

TMR1L=0 Initialisation du timer1 bit de point faible

th=CCPR1H Les valeurs sont copieacute dans des variables

tl=CCPR1L

th=thltlt8 Deacutecalage car th =gt bit de point fort

per = th|tl On concategravene les deux valeurs nous obtenons la peacuteriode

PIR1CCP1IF=0 Remise a 0 du drapeau

if(PIR1TMR1IF==1) Si deacutepassement du timer 1

per=65535+per On ajoute une retenue lorsquon a fait un tour (16bit)

PIR1TMR1IF=0 Remise a 0 du drapeau deacutepassement

Station meacuteteacuteo autonome 2012

38

freq=671310perCalacul de la freacutequence

vit=freq179 + 692Calcul de la vitesse que lon x100

if(vitlt200)En dessous 2ms la mesure est aleacuteatoire agrave cause du 2egraveme deacutebordement

vit=0

vent[0]=(vit10000)+48Valeur des centaines affecteacute en ascii(48=0)

VV=(vit1000)10

vent[1]=VV+48Valeur des dizaines affecteacute en ascii

VV=(vit100)10

vent[2]=VV+48Valeur des uniteacute affecteacute en ascii

VV=(vit10)10

vent[3]=44Virgule affecteacute en ascii

vent[4]=VV+48Valeur de la 1er deacutecimale affecteacute en ascii

VV=vit10

vent[5]=VV+48Valeur de la 2egraveme deacutecimale affecteacute en ascii

vent[6]=109m affecteacute en ascii

vent[7]=47 affecteacute en ascii

vent[8]=115s affecteacute en ascii

if(cond==50)Appel la fonction LCD tous les 1000

lcd(1 1 15 txtvent)Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 9 vent)Affiche la chaine de caractegravere hum sur le LCD

cond=0Remise a 0 de la condition

Xbee(9 vent) Envoi la chaicircne de caractegravere vent dans la fonction xbee

Fonction affichage

void lcd(int li int co int nb char receive[15])

int i

for(i=0 iltnb i++)Boucle for

Lcd_chr(li (co+i) receive[i])Affiche les caractegraveres jusquagrave i

Usart

void xbee(int nb char receive[15])

int i

Usart_Init(9600)Vitesse de transmission

for(i=0 iltnb i++)Boucle for

Usart_Write(receive[i])Envoi les caractegraveres sur lHyperTerminal jusquagrave i

Station meacuteteacuteo autonome 2012

33

XIV Conclusion

Ce projet sur la conception drsquoune station meacuteteacuteo autonome qui nous a eacuteteacute confieacute a eacuteteacute tregraves

enrichissant Il nous a permis de mettre en relations les connaissances acquises durant lrsquoanneacutee mais

aussi acqueacuterir de nouvelles connaissances comme le fonctionnement drsquoun microcontrocircleur En effet

nous nrsquoavions jamais programmeacute sur microcontrocircleur Il a fallu srsquoadapter et apprendre agrave utiliser des

nouveaux logiciels tels que Proteus MikroC ainsi que Labview

De cette expeacuterience nous avons aussi appris agrave ecirctre autonome Nous avons saisi que la

compreacutehension des documents techniques et des librairies eacutetait un point essentiel de notre projet

En programmation nous nrsquoavions pas le droit agrave lrsquoerreur car la moindre faute pouvait conduire le

systegraveme agrave un dysfonctionnement Ce projet nous a demandeacute beaucoup de rigueur de patience et de

temps

Toutefois nous nrsquoavons pas eu malheureusement le temps drsquoinstaller le capteur de

tempeacuterature inteacuterieure par manque de temps Plus encore nous aurions aimeacute approfondir certains

points Par exemple pouvoir installer les composants sur circuit imprimeacute et concevoir un support

viable pour en faire une vraie station meacuteteacuteo Lrsquoinstallation drsquoune girouette aurait eacuteteacute appreacuteciable

pour connaicirctre le sens du vent Aussi le programme aurait sans doute pu ecirctre encore ameacutelioreacute pour

de meilleures performances

Malgreacute ce manque de temps nous sommes tregraves satisfaits du fonctionnement de ce module

qui nous a permis de comprendre lrsquoutiliteacute des parties theacuteoriques pour lrsquoapplication et la mise en

œuvre drsquoun systegraveme Lrsquoapproche peacutedagogique de nous diriger vers les solutions sans jamais les

donner de nous laisser un grand degreacute de liberteacute et drsquoautonomie a eacuteteacute au deacutebut assez deacuteroutante

mais tregraves instructif

Enfin nous tenions agrave remercier Mme Leymarie qui nous a suivis et aiguilleacute tout au long de ce

projet

Station meacuteteacuteo autonome 2012

34

XV ANNEXES

Programme complet

Deacuteclaration 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()

deacuteclaration des variables

int cond=0Condition pour laffichage sur leacutecran LCD

int BP=0

Initialisation et affectation des ports

PORTA=0

PORTB=0 initialisation

PORTC=0

TRISB=0 Port B deacuteclarer en sortie

TRISA=0xFF Port A en entreacutee

ADCON1=0x84 Justifieacute agrave droite active RA0RA1RA3 analogique

ADCON0=0x85 Fosc32 sur PA0 en service

TRISB=0 Port B deacuteclarer en sortie

TRISC=0xFFPort C deacuteclarer en entreacutee

Configuration et initialisation de leacutecran LCD

Lcd_Config(ampPORTB 0 1 WR 5 4 3 2) Configure lecran

Lcd_Init(ampPORTB) initialisation du LCD

Lcd_Cmd(Lcd_CURSOR_OFF) Enleve le curseur

Lcd_Cmd(Lcd_CLEAR) Efface lecran

Initialisation du module I2C

I2C_Init(100000)initialisation de la communication I2C

I2C_Start()Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90)Mode de controcircle en mode eacutecriture

I2C_Wr(0xAC)Accegraves au registre de configuration

I2C_Wr(0x0A)Registre de configuration mesure en continu

I2C_Stop()Arrecirct du signal

I2C_Start()Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90)Mode de controcircle en mode eacutecriture

I2C_Wr(0xEE)Deacutebut de la conversion

I2C_Stop()Arrecirct du sigal

Station meacuteteacuteo autonome 2012

35

Configuration du mode capture

T1CON=0x31 Configuration du timer1

CCP1CON=0x05 Paramegravetrage du mode capture

PIE1TMR1IE=1 Autorise les deacutebordements du timer 1

Boucle infinie

while(1)

cond=cond+1Increacutemente la variable cond

switch(BP)

case 0

humidite(ampcond)Appel la fonction humiditeacute

if(PORTAF2==1)Ces if permet de changer la valeur de BP

BP=1

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)Temps quon relacircche bien le bouton

break

case 1

temperature(ampcond)Appel la fonction tempeacuterature

if(PORTAF2==1)

BP=2

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)

break

case 2

vent(ampcond)Appel la fonction vent

if(PORTAF2==1)

BP=0

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)

break

Fonction humiditeacute

void humidite(int cond)

long H U VLDeacuteclaration des variables

char HH hum[8] humtxt[]=Humidite

VL=Adc_read(0) Valeur lue sur RA0(humiditeacute)

U=(VL5000)1023 Convertit la valeur lue en tension x1000

H=(U-810)(0031) Convertit la tension en humiditeacute x1000

Station meacuteteacuteo autonome 2012

36

if(Hgt100000)Si H gt 100(impossible) alors = 100

H=100000

if(Hlt0)Si H lt 0(impossible) alors = 0

H=0

hum[0]=(H100000)+48Valeur des centaines affecteacute en ascii(48=0)

HH=(H10000)10

hum[1]=HH+48Valeur des dizaines affecteacute en ascii

HH=(H1000)10

hum[2]=HH+48Valeur des uniteacutes affecteacute en ascii

hum[3]=44Virgule affecteacute en ascii

HH=(H100)10

hum[4]=HH+48Valeur de la premiegravere deacutecimale affecteacute en ascii

HH=(H10)10

hum[5]=HH+48Valeur de la deuxiegraveme deacutecimale affecteacute en ascii

hum[6]=37Pourcentage affecteacute en ascii

if(cond==50)Appel la fonction LCD tous les 1000

lcd(1 1 8 humtxt)Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 7 hum)Affiche la chaine de caractegravere hum sur le LCD

cond=0Remise a 0 de la condition

Xbee(7 hum) Envoi la chaicircne de caractegravere hum dans la fonction xbee

Fonction tempeacuterature

void temperature(int cond)

char temp[7] temptxt[]=Temperature LSB

signed char MSB

I2C_Start()Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90)Mode de controcircle en mode eacutecriture

I2C_Wr(0xAA)Lecture de la tempeacuterature

I2C_Stop()Arrecirct du sigal

I2C_Start()Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x91)Mode de controcircle en mode lecture

MSB = I2C_Rd(1)Nombre signeacute donnant la tempeacuterature entre +125deg et -55degC

LSB = I2C_Rd(0)Si bit 7 = 1 tempeacuterature MSB +05degC

I2C_Stop()Arrecirct du sigal

if(MSBlt0)

MSB = abs(MSB) Si temperature neacutegative valeur absolue de MSB

Temp[0]=45 Signe - affecteacute en ascii

else

Station meacuteteacuteo autonome 2012

37

Temp[0]=43signe + affecteacute en ascii

Temp[1]=(MSB10)+48 Valeur des dizaines affecteacute en ascii

Temp[2]=(MSB10)+48 Valeur des uniteacutes affecteacute en ascii

Temp[3]=44 Virgule affecteacute en ascii

if (LSB==128) Si bit 7 agrave 1 alors +05deg

Temp[4]=5

else Si bit 7 agrave 0 alors +00deg

Temp[4]=0

Temp[5]=223 degreacute affecteacute en ascii

Temp[6]=67 C affecteacute en ascii

if(cond==50)Appel la fonction LCD tous les 1000

lcd(1 1 11 temptxt)Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 7 temp)Affiche la chaine de caractegravere hum sur le LCD

cond=0Remise a 0 de la condition

Xbee(7 temp) Envoi la chaicircne de caractegravere temp dans la fonction xbee

Fonction vent

void vent(int cond)

unsigned long tl th per

int vitfreq

char vent[13] txtvent[]=Vitesse du vent VV

if(PIR1CCP1IF==1) Test si front montant agrave lieu

TMR1H=0 Initialisation du timer1 bit de point fort

TMR1L=0 Initialisation du timer1 bit de point faible

th=CCPR1H Les valeurs sont copieacute dans des variables

tl=CCPR1L

th=thltlt8 Deacutecalage car th =gt bit de point fort

per = th|tl On concategravene les deux valeurs nous obtenons la peacuteriode

PIR1CCP1IF=0 Remise a 0 du drapeau

if(PIR1TMR1IF==1) Si deacutepassement du timer 1

per=65535+per On ajoute une retenue lorsquon a fait un tour (16bit)

PIR1TMR1IF=0 Remise a 0 du drapeau deacutepassement

Station meacuteteacuteo autonome 2012

38

freq=671310perCalacul de la freacutequence

vit=freq179 + 692Calcul de la vitesse que lon x100

if(vitlt200)En dessous 2ms la mesure est aleacuteatoire agrave cause du 2egraveme deacutebordement

vit=0

vent[0]=(vit10000)+48Valeur des centaines affecteacute en ascii(48=0)

VV=(vit1000)10

vent[1]=VV+48Valeur des dizaines affecteacute en ascii

VV=(vit100)10

vent[2]=VV+48Valeur des uniteacute affecteacute en ascii

VV=(vit10)10

vent[3]=44Virgule affecteacute en ascii

vent[4]=VV+48Valeur de la 1er deacutecimale affecteacute en ascii

VV=vit10

vent[5]=VV+48Valeur de la 2egraveme deacutecimale affecteacute en ascii

vent[6]=109m affecteacute en ascii

vent[7]=47 affecteacute en ascii

vent[8]=115s affecteacute en ascii

if(cond==50)Appel la fonction LCD tous les 1000

lcd(1 1 15 txtvent)Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 9 vent)Affiche la chaine de caractegravere hum sur le LCD

cond=0Remise a 0 de la condition

Xbee(9 vent) Envoi la chaicircne de caractegravere vent dans la fonction xbee

Fonction affichage

void lcd(int li int co int nb char receive[15])

int i

for(i=0 iltnb i++)Boucle for

Lcd_chr(li (co+i) receive[i])Affiche les caractegraveres jusquagrave i

Usart

void xbee(int nb char receive[15])

int i

Usart_Init(9600)Vitesse de transmission

for(i=0 iltnb i++)Boucle for

Usart_Write(receive[i])Envoi les caractegraveres sur lHyperTerminal jusquagrave i

Station meacuteteacuteo autonome 2012

34

XV ANNEXES

Programme complet

Deacuteclaration 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()

deacuteclaration des variables

int cond=0Condition pour laffichage sur leacutecran LCD

int BP=0

Initialisation et affectation des ports

PORTA=0

PORTB=0 initialisation

PORTC=0

TRISB=0 Port B deacuteclarer en sortie

TRISA=0xFF Port A en entreacutee

ADCON1=0x84 Justifieacute agrave droite active RA0RA1RA3 analogique

ADCON0=0x85 Fosc32 sur PA0 en service

TRISB=0 Port B deacuteclarer en sortie

TRISC=0xFFPort C deacuteclarer en entreacutee

Configuration et initialisation de leacutecran LCD

Lcd_Config(ampPORTB 0 1 WR 5 4 3 2) Configure lecran

Lcd_Init(ampPORTB) initialisation du LCD

Lcd_Cmd(Lcd_CURSOR_OFF) Enleve le curseur

Lcd_Cmd(Lcd_CLEAR) Efface lecran

Initialisation du module I2C

I2C_Init(100000)initialisation de la communication I2C

I2C_Start()Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90)Mode de controcircle en mode eacutecriture

I2C_Wr(0xAC)Accegraves au registre de configuration

I2C_Wr(0x0A)Registre de configuration mesure en continu

I2C_Stop()Arrecirct du signal

I2C_Start()Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90)Mode de controcircle en mode eacutecriture

I2C_Wr(0xEE)Deacutebut de la conversion

I2C_Stop()Arrecirct du sigal

Station meacuteteacuteo autonome 2012

35

Configuration du mode capture

T1CON=0x31 Configuration du timer1

CCP1CON=0x05 Paramegravetrage du mode capture

PIE1TMR1IE=1 Autorise les deacutebordements du timer 1

Boucle infinie

while(1)

cond=cond+1Increacutemente la variable cond

switch(BP)

case 0

humidite(ampcond)Appel la fonction humiditeacute

if(PORTAF2==1)Ces if permet de changer la valeur de BP

BP=1

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)Temps quon relacircche bien le bouton

break

case 1

temperature(ampcond)Appel la fonction tempeacuterature

if(PORTAF2==1)

BP=2

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)

break

case 2

vent(ampcond)Appel la fonction vent

if(PORTAF2==1)

BP=0

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)

break

Fonction humiditeacute

void humidite(int cond)

long H U VLDeacuteclaration des variables

char HH hum[8] humtxt[]=Humidite

VL=Adc_read(0) Valeur lue sur RA0(humiditeacute)

U=(VL5000)1023 Convertit la valeur lue en tension x1000

H=(U-810)(0031) Convertit la tension en humiditeacute x1000

Station meacuteteacuteo autonome 2012

36

if(Hgt100000)Si H gt 100(impossible) alors = 100

H=100000

if(Hlt0)Si H lt 0(impossible) alors = 0

H=0

hum[0]=(H100000)+48Valeur des centaines affecteacute en ascii(48=0)

HH=(H10000)10

hum[1]=HH+48Valeur des dizaines affecteacute en ascii

HH=(H1000)10

hum[2]=HH+48Valeur des uniteacutes affecteacute en ascii

hum[3]=44Virgule affecteacute en ascii

HH=(H100)10

hum[4]=HH+48Valeur de la premiegravere deacutecimale affecteacute en ascii

HH=(H10)10

hum[5]=HH+48Valeur de la deuxiegraveme deacutecimale affecteacute en ascii

hum[6]=37Pourcentage affecteacute en ascii

if(cond==50)Appel la fonction LCD tous les 1000

lcd(1 1 8 humtxt)Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 7 hum)Affiche la chaine de caractegravere hum sur le LCD

cond=0Remise a 0 de la condition

Xbee(7 hum) Envoi la chaicircne de caractegravere hum dans la fonction xbee

Fonction tempeacuterature

void temperature(int cond)

char temp[7] temptxt[]=Temperature LSB

signed char MSB

I2C_Start()Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90)Mode de controcircle en mode eacutecriture

I2C_Wr(0xAA)Lecture de la tempeacuterature

I2C_Stop()Arrecirct du sigal

I2C_Start()Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x91)Mode de controcircle en mode lecture

MSB = I2C_Rd(1)Nombre signeacute donnant la tempeacuterature entre +125deg et -55degC

LSB = I2C_Rd(0)Si bit 7 = 1 tempeacuterature MSB +05degC

I2C_Stop()Arrecirct du sigal

if(MSBlt0)

MSB = abs(MSB) Si temperature neacutegative valeur absolue de MSB

Temp[0]=45 Signe - affecteacute en ascii

else

Station meacuteteacuteo autonome 2012

37

Temp[0]=43signe + affecteacute en ascii

Temp[1]=(MSB10)+48 Valeur des dizaines affecteacute en ascii

Temp[2]=(MSB10)+48 Valeur des uniteacutes affecteacute en ascii

Temp[3]=44 Virgule affecteacute en ascii

if (LSB==128) Si bit 7 agrave 1 alors +05deg

Temp[4]=5

else Si bit 7 agrave 0 alors +00deg

Temp[4]=0

Temp[5]=223 degreacute affecteacute en ascii

Temp[6]=67 C affecteacute en ascii

if(cond==50)Appel la fonction LCD tous les 1000

lcd(1 1 11 temptxt)Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 7 temp)Affiche la chaine de caractegravere hum sur le LCD

cond=0Remise a 0 de la condition

Xbee(7 temp) Envoi la chaicircne de caractegravere temp dans la fonction xbee

Fonction vent

void vent(int cond)

unsigned long tl th per

int vitfreq

char vent[13] txtvent[]=Vitesse du vent VV

if(PIR1CCP1IF==1) Test si front montant agrave lieu

TMR1H=0 Initialisation du timer1 bit de point fort

TMR1L=0 Initialisation du timer1 bit de point faible

th=CCPR1H Les valeurs sont copieacute dans des variables

tl=CCPR1L

th=thltlt8 Deacutecalage car th =gt bit de point fort

per = th|tl On concategravene les deux valeurs nous obtenons la peacuteriode

PIR1CCP1IF=0 Remise a 0 du drapeau

if(PIR1TMR1IF==1) Si deacutepassement du timer 1

per=65535+per On ajoute une retenue lorsquon a fait un tour (16bit)

PIR1TMR1IF=0 Remise a 0 du drapeau deacutepassement

Station meacuteteacuteo autonome 2012

38

freq=671310perCalacul de la freacutequence

vit=freq179 + 692Calcul de la vitesse que lon x100

if(vitlt200)En dessous 2ms la mesure est aleacuteatoire agrave cause du 2egraveme deacutebordement

vit=0

vent[0]=(vit10000)+48Valeur des centaines affecteacute en ascii(48=0)

VV=(vit1000)10

vent[1]=VV+48Valeur des dizaines affecteacute en ascii

VV=(vit100)10

vent[2]=VV+48Valeur des uniteacute affecteacute en ascii

VV=(vit10)10

vent[3]=44Virgule affecteacute en ascii

vent[4]=VV+48Valeur de la 1er deacutecimale affecteacute en ascii

VV=vit10

vent[5]=VV+48Valeur de la 2egraveme deacutecimale affecteacute en ascii

vent[6]=109m affecteacute en ascii

vent[7]=47 affecteacute en ascii

vent[8]=115s affecteacute en ascii

if(cond==50)Appel la fonction LCD tous les 1000

lcd(1 1 15 txtvent)Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 9 vent)Affiche la chaine de caractegravere hum sur le LCD

cond=0Remise a 0 de la condition

Xbee(9 vent) Envoi la chaicircne de caractegravere vent dans la fonction xbee

Fonction affichage

void lcd(int li int co int nb char receive[15])

int i

for(i=0 iltnb i++)Boucle for

Lcd_chr(li (co+i) receive[i])Affiche les caractegraveres jusquagrave i

Usart

void xbee(int nb char receive[15])

int i

Usart_Init(9600)Vitesse de transmission

for(i=0 iltnb i++)Boucle for

Usart_Write(receive[i])Envoi les caractegraveres sur lHyperTerminal jusquagrave i

Station meacuteteacuteo autonome 2012

35

Configuration du mode capture

T1CON=0x31 Configuration du timer1

CCP1CON=0x05 Paramegravetrage du mode capture

PIE1TMR1IE=1 Autorise les deacutebordements du timer 1

Boucle infinie

while(1)

cond=cond+1Increacutemente la variable cond

switch(BP)

case 0

humidite(ampcond)Appel la fonction humiditeacute

if(PORTAF2==1)Ces if permet de changer la valeur de BP

BP=1

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)Temps quon relacircche bien le bouton

break

case 1

temperature(ampcond)Appel la fonction tempeacuterature

if(PORTAF2==1)

BP=2

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)

break

case 2

vent(ampcond)Appel la fonction vent

if(PORTAF2==1)

BP=0

Lcd_Cmd(Lcd_CLEAR)

Delay_ms(250)

break

Fonction humiditeacute

void humidite(int cond)

long H U VLDeacuteclaration des variables

char HH hum[8] humtxt[]=Humidite

VL=Adc_read(0) Valeur lue sur RA0(humiditeacute)

U=(VL5000)1023 Convertit la valeur lue en tension x1000

H=(U-810)(0031) Convertit la tension en humiditeacute x1000

Station meacuteteacuteo autonome 2012

36

if(Hgt100000)Si H gt 100(impossible) alors = 100

H=100000

if(Hlt0)Si H lt 0(impossible) alors = 0

H=0

hum[0]=(H100000)+48Valeur des centaines affecteacute en ascii(48=0)

HH=(H10000)10

hum[1]=HH+48Valeur des dizaines affecteacute en ascii

HH=(H1000)10

hum[2]=HH+48Valeur des uniteacutes affecteacute en ascii

hum[3]=44Virgule affecteacute en ascii

HH=(H100)10

hum[4]=HH+48Valeur de la premiegravere deacutecimale affecteacute en ascii

HH=(H10)10

hum[5]=HH+48Valeur de la deuxiegraveme deacutecimale affecteacute en ascii

hum[6]=37Pourcentage affecteacute en ascii

if(cond==50)Appel la fonction LCD tous les 1000

lcd(1 1 8 humtxt)Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 7 hum)Affiche la chaine de caractegravere hum sur le LCD

cond=0Remise a 0 de la condition

Xbee(7 hum) Envoi la chaicircne de caractegravere hum dans la fonction xbee

Fonction tempeacuterature

void temperature(int cond)

char temp[7] temptxt[]=Temperature LSB

signed char MSB

I2C_Start()Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90)Mode de controcircle en mode eacutecriture

I2C_Wr(0xAA)Lecture de la tempeacuterature

I2C_Stop()Arrecirct du sigal

I2C_Start()Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x91)Mode de controcircle en mode lecture

MSB = I2C_Rd(1)Nombre signeacute donnant la tempeacuterature entre +125deg et -55degC

LSB = I2C_Rd(0)Si bit 7 = 1 tempeacuterature MSB +05degC

I2C_Stop()Arrecirct du sigal

if(MSBlt0)

MSB = abs(MSB) Si temperature neacutegative valeur absolue de MSB

Temp[0]=45 Signe - affecteacute en ascii

else

Station meacuteteacuteo autonome 2012

37

Temp[0]=43signe + affecteacute en ascii

Temp[1]=(MSB10)+48 Valeur des dizaines affecteacute en ascii

Temp[2]=(MSB10)+48 Valeur des uniteacutes affecteacute en ascii

Temp[3]=44 Virgule affecteacute en ascii

if (LSB==128) Si bit 7 agrave 1 alors +05deg

Temp[4]=5

else Si bit 7 agrave 0 alors +00deg

Temp[4]=0

Temp[5]=223 degreacute affecteacute en ascii

Temp[6]=67 C affecteacute en ascii

if(cond==50)Appel la fonction LCD tous les 1000

lcd(1 1 11 temptxt)Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 7 temp)Affiche la chaine de caractegravere hum sur le LCD

cond=0Remise a 0 de la condition

Xbee(7 temp) Envoi la chaicircne de caractegravere temp dans la fonction xbee

Fonction vent

void vent(int cond)

unsigned long tl th per

int vitfreq

char vent[13] txtvent[]=Vitesse du vent VV

if(PIR1CCP1IF==1) Test si front montant agrave lieu

TMR1H=0 Initialisation du timer1 bit de point fort

TMR1L=0 Initialisation du timer1 bit de point faible

th=CCPR1H Les valeurs sont copieacute dans des variables

tl=CCPR1L

th=thltlt8 Deacutecalage car th =gt bit de point fort

per = th|tl On concategravene les deux valeurs nous obtenons la peacuteriode

PIR1CCP1IF=0 Remise a 0 du drapeau

if(PIR1TMR1IF==1) Si deacutepassement du timer 1

per=65535+per On ajoute une retenue lorsquon a fait un tour (16bit)

PIR1TMR1IF=0 Remise a 0 du drapeau deacutepassement

Station meacuteteacuteo autonome 2012

38

freq=671310perCalacul de la freacutequence

vit=freq179 + 692Calcul de la vitesse que lon x100

if(vitlt200)En dessous 2ms la mesure est aleacuteatoire agrave cause du 2egraveme deacutebordement

vit=0

vent[0]=(vit10000)+48Valeur des centaines affecteacute en ascii(48=0)

VV=(vit1000)10

vent[1]=VV+48Valeur des dizaines affecteacute en ascii

VV=(vit100)10

vent[2]=VV+48Valeur des uniteacute affecteacute en ascii

VV=(vit10)10

vent[3]=44Virgule affecteacute en ascii

vent[4]=VV+48Valeur de la 1er deacutecimale affecteacute en ascii

VV=vit10

vent[5]=VV+48Valeur de la 2egraveme deacutecimale affecteacute en ascii

vent[6]=109m affecteacute en ascii

vent[7]=47 affecteacute en ascii

vent[8]=115s affecteacute en ascii

if(cond==50)Appel la fonction LCD tous les 1000

lcd(1 1 15 txtvent)Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 9 vent)Affiche la chaine de caractegravere hum sur le LCD

cond=0Remise a 0 de la condition

Xbee(9 vent) Envoi la chaicircne de caractegravere vent dans la fonction xbee

Fonction affichage

void lcd(int li int co int nb char receive[15])

int i

for(i=0 iltnb i++)Boucle for

Lcd_chr(li (co+i) receive[i])Affiche les caractegraveres jusquagrave i

Usart

void xbee(int nb char receive[15])

int i

Usart_Init(9600)Vitesse de transmission

for(i=0 iltnb i++)Boucle for

Usart_Write(receive[i])Envoi les caractegraveres sur lHyperTerminal jusquagrave i

Station meacuteteacuteo autonome 2012

36

if(Hgt100000)Si H gt 100(impossible) alors = 100

H=100000

if(Hlt0)Si H lt 0(impossible) alors = 0

H=0

hum[0]=(H100000)+48Valeur des centaines affecteacute en ascii(48=0)

HH=(H10000)10

hum[1]=HH+48Valeur des dizaines affecteacute en ascii

HH=(H1000)10

hum[2]=HH+48Valeur des uniteacutes affecteacute en ascii

hum[3]=44Virgule affecteacute en ascii

HH=(H100)10

hum[4]=HH+48Valeur de la premiegravere deacutecimale affecteacute en ascii

HH=(H10)10

hum[5]=HH+48Valeur de la deuxiegraveme deacutecimale affecteacute en ascii

hum[6]=37Pourcentage affecteacute en ascii

if(cond==50)Appel la fonction LCD tous les 1000

lcd(1 1 8 humtxt)Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 7 hum)Affiche la chaine de caractegravere hum sur le LCD

cond=0Remise a 0 de la condition

Xbee(7 hum) Envoi la chaicircne de caractegravere hum dans la fonction xbee

Fonction tempeacuterature

void temperature(int cond)

char temp[7] temptxt[]=Temperature LSB

signed char MSB

I2C_Start()Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x90)Mode de controcircle en mode eacutecriture

I2C_Wr(0xAA)Lecture de la tempeacuterature

I2C_Stop()Arrecirct du sigal

I2C_Start()Deacutetermine si lI2C est libre et lance le signal

I2C_Wr(0x91)Mode de controcircle en mode lecture

MSB = I2C_Rd(1)Nombre signeacute donnant la tempeacuterature entre +125deg et -55degC

LSB = I2C_Rd(0)Si bit 7 = 1 tempeacuterature MSB +05degC

I2C_Stop()Arrecirct du sigal

if(MSBlt0)

MSB = abs(MSB) Si temperature neacutegative valeur absolue de MSB

Temp[0]=45 Signe - affecteacute en ascii

else

Station meacuteteacuteo autonome 2012

37

Temp[0]=43signe + affecteacute en ascii

Temp[1]=(MSB10)+48 Valeur des dizaines affecteacute en ascii

Temp[2]=(MSB10)+48 Valeur des uniteacutes affecteacute en ascii

Temp[3]=44 Virgule affecteacute en ascii

if (LSB==128) Si bit 7 agrave 1 alors +05deg

Temp[4]=5

else Si bit 7 agrave 0 alors +00deg

Temp[4]=0

Temp[5]=223 degreacute affecteacute en ascii

Temp[6]=67 C affecteacute en ascii

if(cond==50)Appel la fonction LCD tous les 1000

lcd(1 1 11 temptxt)Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 7 temp)Affiche la chaine de caractegravere hum sur le LCD

cond=0Remise a 0 de la condition

Xbee(7 temp) Envoi la chaicircne de caractegravere temp dans la fonction xbee

Fonction vent

void vent(int cond)

unsigned long tl th per

int vitfreq

char vent[13] txtvent[]=Vitesse du vent VV

if(PIR1CCP1IF==1) Test si front montant agrave lieu

TMR1H=0 Initialisation du timer1 bit de point fort

TMR1L=0 Initialisation du timer1 bit de point faible

th=CCPR1H Les valeurs sont copieacute dans des variables

tl=CCPR1L

th=thltlt8 Deacutecalage car th =gt bit de point fort

per = th|tl On concategravene les deux valeurs nous obtenons la peacuteriode

PIR1CCP1IF=0 Remise a 0 du drapeau

if(PIR1TMR1IF==1) Si deacutepassement du timer 1

per=65535+per On ajoute une retenue lorsquon a fait un tour (16bit)

PIR1TMR1IF=0 Remise a 0 du drapeau deacutepassement

Station meacuteteacuteo autonome 2012

38

freq=671310perCalacul de la freacutequence

vit=freq179 + 692Calcul de la vitesse que lon x100

if(vitlt200)En dessous 2ms la mesure est aleacuteatoire agrave cause du 2egraveme deacutebordement

vit=0

vent[0]=(vit10000)+48Valeur des centaines affecteacute en ascii(48=0)

VV=(vit1000)10

vent[1]=VV+48Valeur des dizaines affecteacute en ascii

VV=(vit100)10

vent[2]=VV+48Valeur des uniteacute affecteacute en ascii

VV=(vit10)10

vent[3]=44Virgule affecteacute en ascii

vent[4]=VV+48Valeur de la 1er deacutecimale affecteacute en ascii

VV=vit10

vent[5]=VV+48Valeur de la 2egraveme deacutecimale affecteacute en ascii

vent[6]=109m affecteacute en ascii

vent[7]=47 affecteacute en ascii

vent[8]=115s affecteacute en ascii

if(cond==50)Appel la fonction LCD tous les 1000

lcd(1 1 15 txtvent)Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 9 vent)Affiche la chaine de caractegravere hum sur le LCD

cond=0Remise a 0 de la condition

Xbee(9 vent) Envoi la chaicircne de caractegravere vent dans la fonction xbee

Fonction affichage

void lcd(int li int co int nb char receive[15])

int i

for(i=0 iltnb i++)Boucle for

Lcd_chr(li (co+i) receive[i])Affiche les caractegraveres jusquagrave i

Usart

void xbee(int nb char receive[15])

int i

Usart_Init(9600)Vitesse de transmission

for(i=0 iltnb i++)Boucle for

Usart_Write(receive[i])Envoi les caractegraveres sur lHyperTerminal jusquagrave i

Station meacuteteacuteo autonome 2012

37

Temp[0]=43signe + affecteacute en ascii

Temp[1]=(MSB10)+48 Valeur des dizaines affecteacute en ascii

Temp[2]=(MSB10)+48 Valeur des uniteacutes affecteacute en ascii

Temp[3]=44 Virgule affecteacute en ascii

if (LSB==128) Si bit 7 agrave 1 alors +05deg

Temp[4]=5

else Si bit 7 agrave 0 alors +00deg

Temp[4]=0

Temp[5]=223 degreacute affecteacute en ascii

Temp[6]=67 C affecteacute en ascii

if(cond==50)Appel la fonction LCD tous les 1000

lcd(1 1 11 temptxt)Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 7 temp)Affiche la chaine de caractegravere hum sur le LCD

cond=0Remise a 0 de la condition

Xbee(7 temp) Envoi la chaicircne de caractegravere temp dans la fonction xbee

Fonction vent

void vent(int cond)

unsigned long tl th per

int vitfreq

char vent[13] txtvent[]=Vitesse du vent VV

if(PIR1CCP1IF==1) Test si front montant agrave lieu

TMR1H=0 Initialisation du timer1 bit de point fort

TMR1L=0 Initialisation du timer1 bit de point faible

th=CCPR1H Les valeurs sont copieacute dans des variables

tl=CCPR1L

th=thltlt8 Deacutecalage car th =gt bit de point fort

per = th|tl On concategravene les deux valeurs nous obtenons la peacuteriode

PIR1CCP1IF=0 Remise a 0 du drapeau

if(PIR1TMR1IF==1) Si deacutepassement du timer 1

per=65535+per On ajoute une retenue lorsquon a fait un tour (16bit)

PIR1TMR1IF=0 Remise a 0 du drapeau deacutepassement

Station meacuteteacuteo autonome 2012

38

freq=671310perCalacul de la freacutequence

vit=freq179 + 692Calcul de la vitesse que lon x100

if(vitlt200)En dessous 2ms la mesure est aleacuteatoire agrave cause du 2egraveme deacutebordement

vit=0

vent[0]=(vit10000)+48Valeur des centaines affecteacute en ascii(48=0)

VV=(vit1000)10

vent[1]=VV+48Valeur des dizaines affecteacute en ascii

VV=(vit100)10

vent[2]=VV+48Valeur des uniteacute affecteacute en ascii

VV=(vit10)10

vent[3]=44Virgule affecteacute en ascii

vent[4]=VV+48Valeur de la 1er deacutecimale affecteacute en ascii

VV=vit10

vent[5]=VV+48Valeur de la 2egraveme deacutecimale affecteacute en ascii

vent[6]=109m affecteacute en ascii

vent[7]=47 affecteacute en ascii

vent[8]=115s affecteacute en ascii

if(cond==50)Appel la fonction LCD tous les 1000

lcd(1 1 15 txtvent)Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 9 vent)Affiche la chaine de caractegravere hum sur le LCD

cond=0Remise a 0 de la condition

Xbee(9 vent) Envoi la chaicircne de caractegravere vent dans la fonction xbee

Fonction affichage

void lcd(int li int co int nb char receive[15])

int i

for(i=0 iltnb i++)Boucle for

Lcd_chr(li (co+i) receive[i])Affiche les caractegraveres jusquagrave i

Usart

void xbee(int nb char receive[15])

int i

Usart_Init(9600)Vitesse de transmission

for(i=0 iltnb i++)Boucle for

Usart_Write(receive[i])Envoi les caractegraveres sur lHyperTerminal jusquagrave i

Station meacuteteacuteo autonome 2012

38

freq=671310perCalacul de la freacutequence

vit=freq179 + 692Calcul de la vitesse que lon x100

if(vitlt200)En dessous 2ms la mesure est aleacuteatoire agrave cause du 2egraveme deacutebordement

vit=0

vent[0]=(vit10000)+48Valeur des centaines affecteacute en ascii(48=0)

VV=(vit1000)10

vent[1]=VV+48Valeur des dizaines affecteacute en ascii

VV=(vit100)10

vent[2]=VV+48Valeur des uniteacute affecteacute en ascii

VV=(vit10)10

vent[3]=44Virgule affecteacute en ascii

vent[4]=VV+48Valeur de la 1er deacutecimale affecteacute en ascii

VV=vit10

vent[5]=VV+48Valeur de la 2egraveme deacutecimale affecteacute en ascii

vent[6]=109m affecteacute en ascii

vent[7]=47 affecteacute en ascii

vent[8]=115s affecteacute en ascii

if(cond==50)Appel la fonction LCD tous les 1000

lcd(1 1 15 txtvent)Affiche la chaine de caractegravere humtxt sur le LCD

lcd(2 1 9 vent)Affiche la chaine de caractegravere hum sur le LCD

cond=0Remise a 0 de la condition

Xbee(9 vent) Envoi la chaicircne de caractegravere vent dans la fonction xbee

Fonction affichage

void lcd(int li int co int nb char receive[15])

int i

for(i=0 iltnb i++)Boucle for

Lcd_chr(li (co+i) receive[i])Affiche les caractegraveres jusquagrave i

Usart

void xbee(int nb char receive[15])

int i

Usart_Init(9600)Vitesse de transmission

for(i=0 iltnb i++)Boucle for

Usart_Write(receive[i])Envoi les caractegraveres sur lHyperTerminal jusquagrave i