compte rendu projet geii 2ème année. arrosage automatique ...darty30.free.fr/iut claude...

39
Page 1 sur 39 ALVES Bruno THEROND Quentin G308B Compte rendu projet GEII 2ème année. Arrosage automatique intérieur ou extérieur.

Upload: others

Post on 07-Feb-2020

17 views

Category:

Documents


0 download

TRANSCRIPT

Page 1 sur 39

ALVES Bruno THEROND Quentin G308B

Compte rendu projet GEII 2ème année.

Arrosage automatique

intérieur ou extérieur.

Page 2 sur 39

Sommaire

Présentation du système.

1) Information sur les arrosages automatiques ………………………………..page

2) Milieux associés ……………………………………………………………..page 2.1- Milieu humain ……………………………………………………..page

2.2- Milieu économique ………………………………………………..page 2.3- Milieu technique …………………………………………………..page 2.4- Milieu physique ……………………………………….…………..page

3) Remarque concernant le système …………………………………………..page 3.1- Mise en œuvre ……………………………………………………..page

3.2- Mesure physique …………………………………………………..page 4) Diagramme sagittal ...…………………………………………..…………..page

4.1- Description des liaisons …………………………………………...page

5) Description de l’arrosage automatique intérieur ou extérieur ……………..page 6) Schéma fonctionnel …………………………...……………………….…..page

6.1- Description des fonctions …………..……………………………..page 6.1.1- FS1.1 : Capter……………………………………….…..page 6.1.2- FS1.2 : Commander……………………………………..page

6.1.3- FS1.3 : Traiter les données……………….……………..page 6.1.4- FS1.4 : Distribuer eau………………………….………..page

6.1.5- FS1.5 : Afficher …………………………………….…..page

Etude du système.

7) Schéma structurel…………………………………………………………..page 8) Liste des composants……………………………………………………….page

9) Description des fonctions du schéma structurel …………………………..page 9.0- FS1.0 : Alimentation ……………………………………………..page

9.0.1- Calcule d’un radiateur …………………………………..page

9.1- FS1.1 : Capter……………………………………………………..page 9.1.1- L’oscillateur……………………………………………...page

9.1.2- La détection de crête……………………………………..page 9.2- FS1.2 : Commander………………………………………………..page 9.3-FS1.3 : Traiter les données………………………………………....page

9.3.1- Définition des entrées, sorties du microcontrôleur………page 9.4- FS1.4 : Distribuer eau………………………………………….…..page

9.5- FS1.5 : Afficher………………………………………………..…..page 9.5.1- Description des broches de l’afficheur LCD…………….page

10) Algorigramme……………………………………………………..………..page

10.1- Algorigramme du programme principale…………………………page 10.2- Algorigramme du TIMER1……………………………………….page

11) Association des fonctions…………………………………………………..page 11.1- Réglage du système. ……………………………………………..page 11.1- Explication de la mise en œuvre…………………………………..page

11.2- Explication des différents menus……………………………..…..page

Annexe

Page 3 sur 39

12- Programme…………………………………………….…………..page

13- Datasheet…………………………………………………………..page

Page 4 sur 39

1) Information sur les arrosages automatiques

Les produits et systèmes d'arrosage automatiques assurent une irrigation optimale et sans

effort dans les jardins, sur les balcons et dans les serres. Les prix varient de 35 à 150 euros pour un système d’arrosage électronique.

2) Milieux associés

2.1- Milieu humain L’arrosage automatique doit pouvoir être installé et utilisé par des personnes n’ayant aucune

connaissance dans le domaine de l’électronique.

2.2- Milieu économique 25 euros maximum. Le prix de notre système et relativement intéressant par rapport au prix

du marché actuel. De 10 à 125 euros moins cher que dans un magasin mais surtout beaucoup plus performant car il prend en comp te l’humidité de la terre.

2.3- Milieu technique

Ce système est alimenter par une alimentation secteur 230v/12vDC et peut commander différents appareils : pompe, électrovanne, lampe…

2.4- Milieu physique

Le système d’arrosage étant dans une boite il peut être installé à l’extérieur comme à l’intérieur.

3) Remarque concernant le système

3.1- Mise en œuvre

Il ne faut jamais faire fonctionner un système d'irrigation le jour car cela entraine : - un gaspillage de l’eau. Les taux d'évaporation les plus élevés s'observent le jour pour les végétaux et gazons. Lorsqu'un système d'irrigation fonctionne pendant la journée, l'eau

distribuée n'a généralement pas le temps de s'infiltrer jusqu'à la zone racinaire (ni de glisser des feuilles jusqu'au sol) pour que les végétaux puissent l'utiliser avant qu'elle ne s'évapore.

-des brulures. En effet l’exposition de gouttes d’eau sur des feuilles au soleil peuvent les bruler. Il est donc important de déterminer un créneau d'arrosage aux premières heures de l'aube.

3.2- Mesure physique

Ce système d’arrosage automatique contient un capteur d’humidité du sol (20 à 90 rh) il est important de l’enterrer au niveau des racines de vos plantes.

Page 5 sur 39

4) Diagramme sagittal

4.1- Description des liaisons

L1 : Permet à l’utilisateur de paramétrer le système d’arrosage (taux d’humidité, heure et temps d’arrosage…) ainsi que de déclencher l’irrigation.

L2 : Information sur le taux d’humidité, l’heure… et sur les différents modes. L3 : Grandeur physique de l’humidité du sol. L4 : Consigne de marche de la pompe et/ou de l’électrovanne pour l’irrigation.

5) Description de l’arrosage automatique intérieur ou extérieur Ce système d’arrosage automatique intérieur ou extérieur assure l’irrigation de vos plantes à

une heure définie, cependant un capteur d’humidité du sol validera votre arrosage à condition que le taux d’humidité soit inferieur à celui que vous aurez réglé. Il est aussi possible de

commander l’arrosage manuellement si vous le désirez. Si vous possédez une serre ou un placard d’intérieur ce système d’arrosage permet la commande de deux lampes à différentes plages horaires réglées par vous (permettant la simulation d’ensoleillement des saisons).

Page 6 sur 39

6) Schéma fonctionnel

6.1- Description des fonctions :

6.1.0- FS1.0 : Alimentation

La fonction alimentation permet de créer, grâce à une tension d’entrée de 12V, du +9V, +5V

,0V et du -9V en sortie. Entrée

12V DC.

Sorties +9V, +5V, 0V, -9V.

6.1.1- FS1.1 : Capter

Capte l’humidité au niveau du sol.

Entrées L3 : Grandeur physique de l’humidité du sol.

Sortie

an2 : Tension analogique représentative de l’humidité du sol. 6.1.2- FS1.2 : Commander

Génère un numéro binaire permettant de ce déplacer dans le menu.

Entrées L1 : Permet à l’utilisateur de paramétrer le système d’arrosage (taux d’humidité, heure et temps d’arrosage…) ainsi que de déclencher l’irrigation.

Sortie

Page 7 sur 39

RD0 à RD5 : Code binaire de 4 bits en parallèle de 0 à 9, permettant la sélection du menu.

Plus deux boutons poussoirs pour l’incrémentation et la validation des commandes.

6.1.3- FS1.3 : Traiter les données

Assure grâce à un traitement programmé (logiciel microcontrôleur) l’acquisition le traitement et la restitution des informations.

Entrées

An2 : Tension analogique représentative de l’humidité du sol. RD0 à RD5 : Code binaire de 4 bits en parallèle de 0 à 9, permettant la sélection du menu. Plus deux boutons poussoirs pour l’incrémentation et la validation des commandes.

Sortie

RC0 à RC3 : Tension de commande de la pompe ou de l’électrovanne. RB0 à RB5 : Informations envoyées à l’afficheur

6.1.4- FS1.4 : Distribuer eau

Commande de puissance de la pompe ou de l’électrovanne de distribution d’eau.

Entrées RC0 à RC3 : Tension de command de la pompe ou de l’électrovanne.

Sortie

L4 : Consigne de marche de la pompe et/ou de l’électrovanne pour l’irrigation. 6.1.5- FS1.5 : Afficher

Permet l’affichage sous forme digital des informations à destination de l’utilisateur.

Entrées RB0 à RB5 : Informations envoyées à l’afficheur

Sortie L2 : Information sur le taux d’humidité, l’heure… et sur les différents modes.

Page 8 sur 39

7) Schéma structurel

Page 9 sur 39

8) Liste des composants

14 Resistors

Quantity:

References

Value

Order Code

1

R1

330

1

R2

680

1

R3

22k

3

R4, R9, R10

10k

1

R5

12k

1

R6

15k

1

R7

2700k

1

R8

390k

4

R11-R14

1200

13 Capacitors

Quantity:

References

Value

Order Code

2

C1, C2

18p

Maplin WX47B

2

C3, C7

100uF

5

C4, C5, C8, C9, C13

100nF

1

C6

10uF

2

C10, C11

10nF

1

C12

1uF

6 Integrated Circuits

Quantity:

References

Value

Order Code

1

U1

PIC18F4520

1

U2

TL084

1

U3

7809

1

U4

7805

1

U5

ICL7660

1

U6

7909

4 Transistors

Quantity:

References

Value

Order Code

4

Q1-Q4

2N2222A

10 Diodes

Quantity:

References

Value

Order Code

8

D1, D4-D10

1N4148

2

D2, D3

LEDGEII

19 Miscellaneous

Quantity:

References

Value

Order Code

2

ALIM12V=, GND

CONN-L1

1

CAPT1

CAPTEURH

4

J1-J4

TBLOCK-I4

1

LCD1

LM016L

4

RL1-RL4

G5CLE-1-DC5

2

RV1, RV2

10k

2

S1, S2

SW-TACTIL

1

SW1

ROUE_CODEUSE BCD

1

SW2

SW-SLIDE

1

X1

CRYSTAL

Page 10 sur 39

9) Description des fonctions du schéma structurel.

9.0- FS1.0 : Alimentation

La fonction alimentation permet de créer, grâce à une tension d’entrée de 12V, du +9V, +5V ,0V et du -9V en sortie.

C3, C7 : Condensateurs chimiques polarisés. Ils réalisent le filtrage.

C4, C5, C8, C9 : Condensateurs plastiques, servent d’anti-parasite pour supprimer les hautes fréquances (ils sont conseillés dans la documentation technique). C6 : Condensateur chimique polarisé.

U3 : 7809 regultateur 9V il permet de réguler la tension d’entrée 12V DC en une tension de 9V DC. D’après la documentation constructeur du 78XX et 79XX il faut une tension d’entrée

minimum de la tension de sortie plus Vdrop (2V), soit Ve = Vs + Vdrop = 9 + 2 = 11V minimum, pour un bon fonctionnemant du régulateur. U4 : 7805 regultateur 5V il permet de réguler la tension d’entrée 9V DC en une tension de 5V

DC. U5 : ICL7660 inverseur de tension il permet d’inverser une tension 12V en -12V.

U6 : 7909 regultateur -9V il permet de réguler la tension d’entrée -12V DC en une tension de -9V DC.

Relevé oscilografique de l’alimentation negative (vert = sortie ICL7660, rouge = sortie 7909).

Page 11 sur 39

R1, R2 : Resistances perméttant de fixer le courant de la diode ( 15mA ). D2, D4 : Diodes electroluminésantes (rouge). Elle permet de créé un signal visuel perméttant

à l’utilisateur de savoir que la carte est bien alimentée. 9.0.1- Calcule d’un radiateur :

hypothèse: LCD=20mA, 4 relais alimentés = 4x63mA, autre 50mA

Isystéme = 20+252+50 = 322mA

Pmax(+ou-9V,5V) = (Tj – Ta)/RTHja = (125-25)/65 = 1,5W Putil(9V) = Isystéme*(Ve-Vs) = 322*10^-3*(12-9) = 0,996W

Putil(5V) = Isystéme*(Ve-Vs) = 322*10^-3*(9-5) = 1,328W |Putil(-9V)| = Isystéme*(Ve-Vs) = 322*10^-3*(-12+9) = 0,996W Putil<Pmax.

L’utilité d’un radiateur pour les régulateurs n’est pas indispensable à température ambiante.

9.1- FS1.1 : Capter

Capte l’humidité au niveau du sol.

R3, R4, C10, C11 : Résistances et condensateurs plastiques formant un filtre passe bande D4, D5 : Diodes elles perment de limiter l’amplitude pour que la sinusoide n’arrive pas à saturation.

R5, R6 : Resistance qui donne du gain à notre montage pour que le critaire de Barkhausen soit vrai (HxA=1).

RV1 : Resistance variable elle permet de faire varier l’amplitude de la sinusoïde de 4 à 8V.

Page 12 sur 39

R7 : Résistance de 2.7 Mhom permet d’avoir en sortie une tension linéaire par rapport à

l’humidité. CAPT1 : H25K5 capteur d’humidité résistif. Son impédance varie de 9Mhom à 2Khom en

fonction de l’humidité. U2A, B, C : AOP BEFET avec une grande impédance d’entrée et slew rate à 13V/uS. D6, R8, C12 : Cette association de diode résistance et condensateur forme un détecteur de

crête

9.1.1- L’oscillateur.

Suite au problème d’oxydation du capteur alimenté en continu nous avons décidé d’alimenter

celui-ci en alternatif + ou -5V à 1KHz.

Cette sinusoïde passera dans un pont diviseur constitué de notre capteur et d’une résistance de 2.7 Mhom pour nous donnée en sortie une tension linéaire par rapport à l’humidité (voir

courbe ci-dessous).

9.1.2- La détection de crête.

Le détecteur de crête permet de transformer le signal sinusoïdal en tension continue égale à la

tension crête de notre sinusoïde. On se servira de même du signal de sortie réinjecté dans le premier AOP, pour réduire au maximum le courant dérivé.

0

1

2

3

4

5

6

Page 13 sur 39

Pour avoir une tension la plus linéaire possible, il faut que la constante de temps RC soit plus grande que 1 / (2πf). Voir les deux courbes ci dessous qui illustrent deux constantes de temps

RC différentes. RC << 1 / (2πf) : Cette solution ne correspond pas à nos attentes R=150hom

RC >> 1 / (2πf) : Cette solution correspond à nos attentes R=390K

Relever (pratique) de l’oscillateur, du pont diviseur et de la détection de crête.

Page 14 sur 39

9.2- FS1.2 : Commander

Génère un numéro binaire permettant de se déplacer dans le menu.

R9, SW: Permet d’incrémenter plusieurs variables du programme.

R10, SW: Permet de valider une action dans le programme. SW1 : Roue codeuse, crée grâce à la broche commune un code sur 4 bits en parallèle allant de

0 à 9 en décimal permet de se déplacer dans le menu.

9.3- FS1.3 : Traiter les données

Assure grâce à un traitement programmé (logiciel microcontrôleur) l’acquisition, le traitement et la restitution des informations.

C13 : Condensateur plastique, sert à filtrer les hautes et basses fréquences.

X1, C1, C2 : Cette structure permet de cadencer le microcontrôleur à 4MHz. U1 : Le PIC18F4520 est une architecture étendue basée sur la famille des PIC18F452 il offre

de nouvelles fonctionnalités comme : un jeu d'instructions étendue, des modes de gestion de l'alimentation, une vitesse plus élevée au niveau du ADC, l’USART a été renforcé et bien d’autre nouveauté. Il possède une mémoire de programme de 32Koctets, une mémoire de

donnée de 256 octets et un ADC sur 10bits.

9.3.1- Définition des entrées, sorties du microcontrôleur.

Entrées :

CAN: Tension analogique entre 0 à 5v représentative du taux d’humidité. BP0: Permet d’incrémenter plusieurs variables du programme.

Page 15 sur 39

BP1: Permet de valider une action dans le programme.

RC0, RC1, RC2, RC3: Code sur 4 bits en parallèle allant de 0 à 9 en décimal (roue codeuse) permet de se déplacer dans le menu.

OSC1: Entrée d’horloge reliée à l’oscillateur à quartz. Sortie :

RB0, RB1, RB2, RB3: Bus de données pour le LCD. RB4: Sélection du registre.

RB5: Sortie permettant la validation de l’affichage LCD CMD0: Commande de la pompe CMD1: Commande de la lampe une

CMD2: Commande de la lampe deux CMD3: Commande de l’électrovanne.

OSC2: Sortie d’horloge reliée à l’oscillateur à quartz.

9.4- FS1.4 : Distribuer eau

Commande de puissance de la pompe, des lampes et de l’électrovanne.

R11, R12, R13, R14 : Résistances permettant de faire fonctionner les transistors en

bloqué/saturé D1, D8, D9, D10 : Diodes de roues libres, absorbe le pic de courant dû à la bobine et à la

commutation des transistors. (Sert à protéger les transistors) D7 : Diode, elle permet de protéger le microcontrôleur du sens des courants. Q1, Q2, Q3, Q4 : Transistors fonctionnant en commutation (facteur de saturation = K = 3).

RL1, RL2, RL3, RL4 : Relais, ils assurent l’isolation galvanique entre la partie commande et la partie puissance.

Page 16 sur 39

SW2 : Interrupteur, permet à l’utilisateur de commander la pompe manuellement en saturant

le transistor.

9.5- FS1.5 : Afficher

Permet l’affichage sous forme digital des informations à destination de l’utilisateur.

9.5.1- Description des broches de l’afficheur LCD.

7 à 14 : D0 à D7 : Bus de données. Dans notre cas le bus est sur 4 bit de D4 à D7 6 : E : Entrée de validation (ENABLE); elle est active sur front descendant. Lorsque E=0 les

entrées du bus de l'afficheur sont à l'état haute impédance. 5 : R/W: Lecture ou écriture. (READ/WRITE). Lorsque R/W est au niveau bas, l'afficheur est en mode "écriture", et lorsque R/W est au niveau haut, l'afficheur est en mode "lecture".

4 : RS: Sélection du registre. (REGISTER SELECT). Grâce à cette broche, l'afficheur est capable de faire la différence entre une commande et une donnée. Un niveau bas indique une

commande et un niveau haut indique une donnée. 3 : VSS : Masse. 2 : VDD : + 5 V

1 : VLC : Cette tension permet le réglage du contraste de l'afficheur.

10) Algorigramme.

10.1- Algorigramme du programme principale

L’algorithme du programme du système d’arrosage est donnée ci-dessous, il décrit la fonction

du programme compilé dans le PIC18F4520. Au démarrage il va lire les sauvegardes dans L’EEPROM à l’adresse 000000h. Il va ensuite effectuer les instructions suivantes tout en appelant le TIMER1 tout les 50ms.

Instruction :

-Initialisation -Réglage de l’heure -Activation du TIMER1

-Puis lire le port D, qui, en fonction du numéro lu, appellera les fonctions concernées (réglage capteur, heure, pompe, lampe)

Page 17 sur 39

Page 18 sur 39

10.2- Algorigramme du TIMER1

L’algorigramme du TIMER1 est sensiblement le même que celui du LAB3 donnée ci-dessous

qui nous a été fourni par Monsieur BOUCHET. La seule différence est l’appel de la fonction traitement toutes les 500ms.

11) Association des fonctions

11.1- Réglage du système.

Avant tout chose brancher une sonde d’oscilloscope sur le connecteur CAPT1, alimenter le

système, puis régler l’amplitude crête de la sinusoïde à 5V.

11.2- Explication de la mise en œuvre

Une foi le système d’arrosage automatique branché et réglé, son fonctionnement doit être le

suivant : - A l’allumage le système vous demande de régler l’heure et les minutes actuelles

Page 19 sur 39

- Si le message « mettre RC=0 » s’affiche comme ci-dessous vous devrez mettre la roue

codeuse sur la valeur 0.

- Une fois sur 0 vous verrez l’affichage de l’heure ainsi que le taux d’humidité de la

terre. Par défaut le système à des paramètres d’usinage que vous pouvez régler grâce au menu.

- Pour se balader dans le menu il suffit d’incrémenter la roue codeuse. Si vous voulez

régler les différents paramètres du menu il suffit d’appuyer sur OK.

11.3- Explication des différents menus.

RC1= 1 : réglage de l’humidité

RC2= 2 : réglage de l’heure

Page 20 sur 39

RC3= 3 : réglage pompe

RC4= 4 : réglage lampe 1

RC5= 5 : réglage lampe 2

RC6= 6 : réglage temps d’allumage de la pompe

Page 21 sur 39

Compte rendu de fabrication

Page 22 sur 39

1) Modification du schéma structurel: (oublie de 4 résistances de pull-down sur SW1)

Page 23 sur 39

2) Typon : Top copper, Bottom copper, top skil.

Page 24 sur 39

3) Typon : Bottom copper.

4) Mise au point et branchement :

1ere étape :

Brancher le système sur une tension 12V DC, si les deux LED s’allument c’est que la partie

alimentation fonctionne correctement.

2ème étape :

Page 25 sur 39

Une fois les composants soudés (ne pas mettre le microcontrôleur), il faut régler l’amplitude

de notre oscillateur pour que celui-ci arrive à une tension crête de 5V. Pour cela il faut

brancher un oscilloscope sur la patte 1 d’U2 et tourner le potentiomètre RV1.

3ème étape :

Débrancher l’alimentation puis insérer ensuite le LCD, la roue codeuse, la pompe, ect… sur

leur emplacement.

4ème étape :

Mettre la sonde d’humidité dans la terre puis brancher le système sur une tension 12V DC.

Page 26 sur 39

5ème étape :

Le Système d’arrosage contenant des paramètres d’usine il doit être opérationnel tout de

suite. Si vous désirez changer ses paramètres, aller à la page 19, 20 du compte rendu qui

est la mise en œuvre pour un utilisateur.

5) Problèmes rencontrés et essaies finaux.

Au premier branchement nous avons rencontré deux problèmes :

-Le premier problème rencontré et celui de l’affichage du LCD car celui-ci avait un réglage du contraste négatif. Néanmoins l’affichage fonction très bien avec un afficheur positif nous n’avons donc pas fait de changement sur le schéma.

-Le deuxième problème rencontré et celui de la roue codeuse. Au début le menu s’afficher de manière aléatoire. Après plusieurs tests nous avons remarqué qu’il fallait des résistances de

pull-down pour que le microcontrôleur puise détecter un niveau « 0 ». Nous avons donc immédiatement modifié cette erreur sur le schéma.

Page 27 sur 39

Une fois la carte opérationnelle au niveau de l’électronique nous avons branché tous les

périphériques externes d’entré sortie de notre carte pour tester le programme. Par chance comme nous avions test tout les fonctions une par une pendant la phase de programmation

nous avons eu aucun BUG à ce niveau là.

6) Conclusion

Quentin : ce projet ma permis de confirmer mon orientation professionnel puisque j’aimerai travailler dans la conception de système électronique. J’ai aussi acquis de nombreuses

connaissances en programmation de microcontrôleur en C. Bruno : J’ai acquis de nombreuses connaissances en programmation et en gestion d’affichage

LCD.

Page 28 sur 39

Annexe

Page 29 sur 39

12) Programme

/*********************************************************** Configuration LCD ***********************************************************/ // connection du modul lcd sbit LCD_RS at RB4_bit; sbit LCD_EN at RB5_bit; sbit LCD_D4 at RB0_bit; sbit LCD_D5 at RB1_bit; sbit LCD_D6 at RB2_bit; sbit LCD_D7 at RB3_bit; sbit LCD_RS_Direction at TRISB4_bit; sbit LCD_EN_Direction at TRISB5_bit; sbit LCD_D4_Direction at TRISB0_bit; sbit LCD_D5_Direction at TRISB1_bit; sbit LCD_D6_Direction at TRISB2_bit; sbit LCD_D7_Direction at TRISB3_bit; /*********************************************************** Fonction ***********************************************************/ void RC_0(); // roue codeuse = 0 : affiche heure et humidité + traitement programme void lecture_roue_codeus(); // fonction de lecture de la roue codeuse void reglage_h_m(); // fonction de réglage heure minute void test_raz_LCD(); // efface les caractères du LCD si changement du menu void capteurf(); // lecture, affichage, enregistrement, et conversion de la tension analogique void reglage_capteur(); // réglage du seuil d'humidité void traitement(); // permet de commander les relais. void pompe(); // réglage de l'heure d'allumage et de l'extinction de la pompe. void reglage_lampe(); // réglage de l'heure d'allumage et de l'extinction de la lampe. void reglage_lampe_deux(); // réglage de l'heure d'allumage et de l'extinction de la lampe 2. void reglage_temps_pompe(); // réglage du temps d'allumage de la pompe void temps(); // temps = 200ms (anti-rebond) void interrupt() ; // fonction d’interruption TIMER1 /*********************************************************** Variable global ***********************************************************/ char seg1[8]; // pour l'affichage de seconde char seg2[8]; // pour l'affichage de minute char seg3[8]; // pour l'affichage de heure char adc[12]; // pour l'affichage de l'humidité char seg4[8]; // pour l'affichage des réglage lampe, pompe, humidité... char txt1[] = "REGLAGE"; char txt2[] = "HEURE"; char txt3[] = "MINUTE"; char txt4[] = ":D0++, D1=OK"; char txt5[] = "HUMIDITE:"; char txt6[] = "%"; char txt7[] = "<20"; char txt8[] = ">45";

Page 30 sur 39

char txt9[] = ":"; char txt10[] = "POMPE ON"; char txt11[] = "LP1 ON"; char txt14[] = "LP1 OFF"; char txt12[] = "LP2 ON"; char txt13[] = "POMPE OF"; char txt15[] = "LP2 OFF"; char txt16[] = "TPS P(m)"; char txt17[] = "D1=OK"; char txt18[] = "D0=LAMPE ON/OFF"; char txt19[] = "METTRE RC=0"; char zero[] = "0"; unsigned int capteur; // permet de stoker la valeur lus sur le CAN unsigned int pourcent, Rcapteur=20,Tpompe=1,tps_traitement=0,compoaraison_tps=0; //permet de stocker la valeur du pourcentage d'humidité char segonde=0,minute=0,heure=0,test_raz=0,n_fonction=0,PON=3,POFF=5; // stock h,m,s,n° de la fonction suivante et précédente char LON=7,LOFF=19,L2ON=7,L2OFF=23,i=0,controle_bit=0; // valeur de comparaison unsigned short ctn=0; // dépassement du compteur pour les secondes /*********************************************************** Programme principale ***********************************************************/ void main(){ ADCON1 |= 0x0F; PORTB = 0xFF; // portB à 1 TRISB = 0xFF; PORTD = 0; // RAZ des broches du port d TRISD = 0b00011111; // Toutes les broches du port d sont des entrées si =1 (0=sortie) TRISC = 0x00; // portc en sortie PORTC = 0x00; // portc = 0 TRISA = 0xFF; // Toutes les broches du port A sont des entrées (CAN) T1CON = 1; // mise en route du timer1 TMR1IF_bit = 0; // raz timer1 TMR1H = 0x3C; // initialisation à 0x3CAF TMR1L = 0xAF; // initialisation à 0x3CAF INTCON = 0xC0; // mise a 1 de GIE, PEIE Lcd_Init(); // initialisation LCD Lcd_Cmd(_LCD_CLEAR); // effacer LCD Lcd_Cmd(_LCD_CURSOR_OFF); // Curseur off reglage_h_m(); // fonction réglage heure minute while(RD2_bit==1 || RD3_bit==1 || RD4_bit==1) { Lcd_Out(1,1,txt19); //temps(); } TMR1IE_bit = 1; // initialisation TIMER1

Page 31 sur 39

while(1) { lecture_roue_codeus(); // appel de la fonction roue codeuse } } /*********************************************************** Lecture roue codeuse: appel les fonctions concernées en fonction du n° lu sur la roue codeuse ***********************************************************/ void lecture_roue_codeus() { if (RD2_bit==0 && RD3_bit==0 && RD4_bit==0) { n_fonction=1; test_raz_LCD(); RC_0(); capteurf(); test_raz=1; } else { Lcd_Out(1,1,txt1); Lcd_Out(2,12,txt17); } if (RD2_bit==1 && RD3_bit==0 && RD4_bit==0) { n_fonction=2; test_raz_LCD(); Lcd_Out(1,9,txt5); if(RD1_bit==1){reglage_capteur();} test_raz=2; } if (RD2_bit==0 && RD3_bit==1 && RD4_bit==0) { n_fonction=3; test_raz_LCD(); Lcd_Out(1,9,txt2); if(RD1_bit==1){reglage_h_m();} test_raz=3; } if (RD2_bit==1 && RD3_bit==1 && RD4_bit==0) { n_fonction=4; test_raz_LCD(); Lcd_Out(1,9,txt10); if(RD1_bit==1){pompe();} test_raz=4; } if (RD2_bit==0 && RD3_bit==0 && RD4_bit==1) { n_fonction=5; test_raz_LCD();

Page 32 sur 39

Lcd_Out(1,9,txt11); if(RD1_bit==1){reglage_lampe();} test_raz=5; } if (RD2_bit==1 && RD3_bit==0 && RD4_bit==1) { n_fonction=6; test_raz_LCD(); Lcd_Out(1,9,txt12); if(RD1_bit==1){reglage_lampe_deux();} test_raz=6; } if (RD2_bit==0 && RD3_bit==1 && RD4_bit==1) { n_fonction=7; test_raz_LCD(); Lcd_Out(1,9,txt16); if(RD1_bit==1){reglage_temps_pompe();} test_raz=7; } if (RD2_bit==1 && RD3_bit==1 && RD4_bit==1) { n_fonction=8; test_raz_LCD(); //Lcd_Out(1,9,txt12); //if(RD1_bit==1){reglage_lampe_deux();} test_raz=8; } } /*********************************************************** On efface les caractères du LCD si changement de menu ***********************************************************/ void test_raz_LCD() { if(test_raz!=n_fonction) { /*for(i=0; i<13; i++) { Lcd_Cmd(_LCD_SHIFT_LEFT); Delay_ms(50); }*/ Lcd_Cmd(_LCD_CLEAR);} } /*********************************************************** Temps = 200ms ***********************************************************/ void temps() { Delay_ms(200); }

Page 33 sur 39

/*********************************************************** Réglage de l'heure d'allumage et de l'extinction de la pompe. ***********************************************************/ void pompe() { Lcd_Out(1,9,txt10); Lcd_Out(2,5,txt4); temps(); do { ShortToStr(PON,seg4); Lcd_Out(2,1,seg4); if (RD0_bit==1) //test RD0 { PON=PON+1; temps(); if(PON==24){PON=0;} } }while(RD1_bit==0); //test RD1 temps(); Lcd_Out(1,9,txt13); do { ShortToStr(POFF,seg4); Lcd_Out(2,1,seg4); if (RD0_bit==1) { POFF=POFF+1; temps(); if(POFF==24){POFF=0;} } }while(RD1_bit==0); temps(); Lcd_Cmd(_LCD_CLEAR); } /*********************************************************** Réglage de l'heure d'allumage et de l'extinction de la lampe 2. ***********************************************************/ void reglage_lampe_deux() { temps(); Lcd_Out(1,9,txt12); Lcd_Out(2,5,txt4); do { ShortToStr(L2ON,seg4); Lcd_Out(2,1,seg4); if (RD0_bit==1) { L2ON++; temps(); if(L2ON==24){L2ON=0;} } }while(RD1_bit==0); temps(); Lcd_Out(1,9,txt15);

Page 34 sur 39

do { ShortToStr(L2OFF,seg4); Lcd_Out(2,1,seg4); if (RD0_bit==1) { L2OFF++; temps(); if(L2OFF==24){L2OFF=0;} } }while(RD1_bit==0); temps(); if(L2ON>L2OFF){ //si L2ON<l2OFF on change de programme donc possibilité de complémenter RC1 Lcd_Cmd(_LCD_CLEAR); Lcd_Out(1,1,txt18); Lcd_Out(2,1,txt17); do{ if (RD0_bit==1) {temps(); RC2_bit=(~RC2_bit);} }while(RD1_bit==0); temps(); } Lcd_Cmd(_LCD_CLEAR); } /*********************************************************** Réglage de l'heure d'allumage et de l'extinction de la lampe. ***********************************************************/ void reglage_lampe() { temps(); Lcd_Out(1,9,txt11); Lcd_Out(2,5,txt4); do { ShortToStr(LON,seg4); Lcd_Out(2,1,seg4); if (RD0_bit==1) { LON++; temps(); if(LON==24){LON=0;} } }while(RD1_bit==0); temps(); Lcd_Out(1,9,txt14); do { ShortToStr(LOFF,seg4); Lcd_Out(2,1,seg4); if (RD0_bit==1) { LOFF++; temps();

Page 35 sur 39

if(LOFF==24){LOFF=0;} } }while(RD1_bit==0); temps(); if(LON>LOFF){ //si LON>LOFF on change de programme donc possibilité de complémenter RC1 Lcd_Cmd(_LCD_CLEAR); Lcd_Out(1,1,txt18); Lcd_Out(2,1,txt17); do{ if (RD0_bit==1) {temps(); RC1_bit=(~RC1_bit);} }while(RD1_bit==0); temps(); } Lcd_Cmd(_LCD_CLEAR); } /*********************************************************** Lecture, affichage, enregistrement, et conversion de la tension analogique ***********************************************************/ void capteurf() { if(ctn==5){ capteur = ADC_Read(2); // enregistre la valeur du CAN(10bits) dans capteur toutes les 500ms } pourcent = ((capteur + 287)/27); // équation de la zone de linéarité du capteur intToStr(pourcent, adc); Lcd_Out(2,16,txt6); Lcd_Out(2,1,txt5); if(capteur<259){Lcd_Out(2,13,txt7);} if((capteur>=259) && (capteur<=942)) // zone de linéarité du capteur {Lcd_Out(2,10,adc);} if(capteur>942){Lcd_Out(2,13,txt8);} } /*********************************************************** Traitement: permet de commander les relais. ***********************************************************/ void traitement() { compoaraison_tps = Tpompe*60; if((heure>=PON)&&(heure<=POFF)) //condition déclanchement pompe { if(tps_traitement<=compoaraison_tps){ if(pourcent<=Rcapteur&&controle_bit==0){RC0_bit=1; controle_bit=1;} } // mise a 1 du bit rc0 else{RC0_bit=0; tps_traitement=0; } }else{RC0_bit=0;controle_bit=0;}

Page 36 sur 39

if(LON<=LOFF){ if((heure>=LON) && (heure<LOFF)) {RC1_bit=1;} else{RC1_bit=0;} }else{ if(LOFF==heure){RC1_bit=0;} if(LON==heure){RC1_bit=1;} } if(L2ON<=L2OFF){ if((heure>=L2ON) && (heure<L2OFF)) {RC2_bit=1;} else{RC2_bit=0;} }else{ if(L2OFF==heure){RC2_bit=0;} if(L2ON==heure){RC2_bit=1;} } } /*********************************************************** Réglage heure minute ***********************************************************/ void reglage_h_m() { temps(); Lcd_Out(1,1,txt1); Lcd_Out(1,9,txt2); Lcd_Out(2,5,txt4); do { ShortToStr(heure,seg3); Lcd_Out(2,1,seg3); if (RD0_bit==1) { heure++; temps(); if(heure==24){heure=0;} } }while(RD1_bit==0); temps(); Lcd_Out(1,1,txt1); Lcd_Out(1,9,txt3); Lcd_Out(2,5,txt4); do { ShortToStr(minute,seg2); Lcd_Out(2,1,seg2); if (RD0_bit==1) { minute++; temps(); if(minute==60){minute=0;} } }while(RD1_bit==0); temps(); Lcd_Cmd(_LCD_CLEAR);

Page 37 sur 39

} /*********************************************************** Réglage du seuil d'humidité ***********************************************************/ void reglage_capteur() { temps(); Lcd_Out(2,5,txt4); do { ShortToStr(Rcapteur,seg4); Lcd_Out(2,1,seg4); if (RD0_bit==1) { Rcapteur=Rcapteur+1; temps(); if(Rcapteur>45){Rcapteur=20;} } }while(RD1_bit==0); temps(); Lcd_Cmd(_LCD_CLEAR); } /*********************************************************** Réglage du temps d'allumage de la pompe ************************************************************/ void reglage_temps_pompe() { temps(); Lcd_Out(2,5,txt4); do { ShortToStr(Tpompe,seg4); Lcd_Out(2,1,seg4); if (RD0_bit==1) { if(Tpompe<20) {Tpompe=Tpompe+1;} else{Tpompe=Tpompe+5;} temps(); if(Tpompe>90){Tpompe=1;} } }while(RD1_bit==0); temps(); Lcd_Cmd(_LCD_CLEAR); } /*********************************************************** Affichage de l'heure et appel la fonction capteur ***********************************************************/ void RC_0() {

Page 38 sur 39

if(heure<10){Lcd_Out(1,5,zero);} ByteToStr(heure,seg3); Lcd_Out(1,4,seg3); if(heure<10){Lcd_Out(1,5,zero);} if(minute<10){Lcd_Out(1,8,zero);} Lcd_Out(1,7,txt9); ByteToStr(minute,seg2-1); Lcd_Out(1,8,seg2); if(minute<10){Lcd_Out(1,8,zero);} Lcd_Out(1,10,txt9); if(segonde<10){Lcd_Out(1,11,zero);} ByteToStr(segonde,seg1); Lcd_Out(1,10,seg1); if(segonde<10){Lcd_Out(1,11,zero);} Lcd_Out(1,10,txt9); } /*********************************************************** Programme d'interruption ***********************************************************/ void interrupt() { TMR1IF_bit = 0; // raz du timer1 TMR1H = 0x3C; // initialisation à 0x3CAF =50ms TMR1L = 0xAF; ctn++; if(ctn==20){ segonde++; traitement(); if(RC0_bit==1){ tps_traitement++;} if(segonde==60) { segonde=0; minute++; } if(minute==60) { minute=0; heure++; } if(heure==24){heure=0;} ctn=0; } }

Page 39 sur 39

13) Datasheet