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