View
862
Download
23
Category
Preview:
Citation preview
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
Recommended