Arrosage automatique intérieur ou extérieur.

publicité
ALVES Bruno
THEROND Quentin
G308B
Compte rendu projet GEII 2ème année.
Arrosage automatique
intérieur ou extérieur.
Page 1 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 2 sur 39
12- Programme…………………………………………….…………..page
13- Datasheet…………………………………………………………..page
Page 3 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 compte 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 4 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 5 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 : Commande r
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 6 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 : Distribue r 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 7 sur 39
7) Schéma structurel
Page 8 sur 39
8) Liste des composants
14 Resistors
Quantity:
References
Value
1
R1
330
Order Code
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
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
13 Capacitors
6 Integrated Circuits
Quantity:
References
Value
1
U1
P IC18F4520
1
U2
TL084
1
U3
7809
1
U4
7805
1
U5
ICL7660
1
U6
7909
Quantity:
References
Value
4
Q1-Q4
2N2222A
Quantity:
References
Value
8
D1, D4-D10
1N4148
2
D2, D3
LEDGEII
Order Code
4 Transistors
Order Code
10 Diodes
Order Code
19 Miscellaneous
Quantity:
References
Value
2
ALIM12V=, GND
CONN-L1
1
CAP T1
CAP TEURH
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
Order Code
Page 9 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 10 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 11 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).
6
5
4
3
2
1
0
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é.
Page 12 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 illustre nt 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 13 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 fa mille 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 14 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 15 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 : V SS : 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 16 sur 39
Page 17 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 18 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 19 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 20 sur 39
Compte rendu de fabrication
Page 21 sur 39
1) Modification du sché ma structurel: (oublie de 4 résistances de pull-down sur SW1)
Page 22 sur 39
2) Typon : Top coppe r, Bottom copper, top skil.
Page 23 sur 39
3) Typon : Bottom coppe r.
4) Mise au point et branchement :
1ere étape :
Brancher le système sur une tension 12V DC, si les deux LED s’allume nt c’est que la partie
alimentation fonctionne correctement.
2ème étape :
Page 24 sur 39
Une fois les composants soudés (ne pas mettre le microcontrôleur), il fa ut 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 25 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 26 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 27 sur 39
Annexe
Page 28 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 29 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;
TRISB = 0xFF;
PORTD = 0;
TRISD = 0b00011111;
TRISC = 0x00;
PORTC = 0x00;
TRISA = 0xFF;
// RAZ des broches du port d
// Toutes les broches du port d sont des entrées si =1 (0=sortie)
// portc en sortie
// portc = 0
// Toutes les broches du port A sont des entrées (CAN)
T1CON = 1;
TMR1IF_bit = 0;
TMR1H = 0x3C;
TMR1L = 0xAF;
INTCON = 0xC0;
// mise en route du timer1
// raz timer1
// initialisation à 0x3CAF
// initialisation à 0x3CAF
// mise a 1 de GIE, PEIE
// portB à 1
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 30 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 31 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 32 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 33 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 34 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 35 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 36 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 37 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 38 sur 39
13) Datasheet
Page 39 sur 39
Téléchargement