ALVES Bruno THEROND Quentin G308B Compte rendu projet GEII 2ème années. Arrosage automatique intérieur ou extérieur. Sommaire Page 1 sur 25 1) Information sur les arrosages automatiques 2) Milieu associés 2.1- Milieu humain 2.2- Milieu économique 2.3-Milieu technique 2.4- Milieu physique 3) Remarque concernant le système : 3.1- Mise en œuvre 3.2- Mesure physique 4) Diagramme sagittal 4.1- Description des liaisons 5) Description de l’arrosage automatique intérieur ou extérieur 6) Schéma fonctionnel 6.1- Description des fonctions 6.1.1- FS1.1 : Capter 6.1.2- FS1.2 : Commander 6.1.3- FS1.3 : Traiter les données 6.1.4- FS1.4 : Distribuer eau 6.1.5- FS1.5 : Afficher 7) Schéma structurel 8) Liste des composants 9) Description des fonctions du schéma structurel. 9.0- FS1.0 : Alimentation 9.1- FS1.1 : Capter 9.1.1- L’oscillateur 9.1.2- La détection de crête 9.2- FS1.2 : Commander 9.3-FS1.3 : Traiter les données 9.3.1- Définition des entrées, sorties du microcontrôleur. 9.4- FS1.4 : Distribuer eau 9.5- FS1.5 : Afficher Page 2 sur 25 9.5.1- Description des broches de l’afficheur LCD. 10) Algorigramme 11) Association des fonctions 11.1- Explication de la mise en œuvre 12) Annexe 12.1- Programme 12.2- Datasheet Page 3 sur 25 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 à 150euros pour un système d’arrosage électronique. 2) Milieu associés 2.1- Milieu humain L’arrosage automatique doit pouvoir être installé et utiliser 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 à 125euros mon chère que dans un magasin mais surtout beaucoup plus performant car il prend en conte l’humidité de la terre. 2.3- Milieu technique Ce système est alimenter par une alimentation secteur 230v/12vDC et peu commander différant appareil 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 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’exposions de gout d’eau sur des feuilles au soleil peuvent bruler les feuilles. 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 et important de l’enterrai au niveau des racines de vos plantes. 4) Diagramme sagittal Page 4 sur 25 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éfinit, cependant un capteur d’humidité du sol validera votre arrosage à condition que le taux d’humidité sois inferieur à celui que vous aurez réglé. Il est aussi possible de commander l’arrosage manuellement si vous le désiré. Si vous possédez une serre ou un placard d’intérieur ce système d’arrosage permet la commande de deux lampes à différente plage horaire réglé par vous (permettant la simulation d’ensoleillement des saisons). 6) Schéma fonctionnel Page 5 sur 25 6.1- Description des fonctions : 6.1.1- FS1.1 : Capter Capte l’humidité au niveau du sol. Entrées L3 : Grandeur physique de l’humidité du sol. Sortie Vch : 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éplacé 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 Vrc : Code binaire de 4 bites en parallèle de 0 à 9 permettant la sélection du menu. 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 Vch : Tension analogique représentative de l’humidité du sol. Vrc : Code binaire de 4 bites en parallèle de 0 à 9 permettant la sélection du menu. Sortie Vcp : Tension de command de la pompe ou de l’électrovanne. Vca : Informations envoyées à l’afficheur 6.1.4- FS1.4 : Distribuer eau Commende de puissance de la pompe ou de l’électrovanne de distribution d’eau. Entrées Vcp : Tension de command de la pompe ou de l’électrovanne. Page 6 sur 25 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 Vca : Informations envoyées à l’afficheur Sortie L2 : Information sur le taux d’humidité, l’heure… et sur les différents modes. 7) Schéma structurel 8) Liste des composants 9) Description des fonctions du schéma structurel. 9.0- FS1.0 : Alimentation La fonction alimentation permet de créée, grâce à une tension d’entré de 12V, du +9V, +5V ,0V et du -9V en sortie. Page 7 sur 25 …………………………. C, C : Condencateur chimique polarisé. Il réalise le filtrage. C, C, C, C : condensateurs plastique, sert d’anti-parasite pour suprimer les hautes fréquances (ils sont conseilés dans la documentation technique). C : Condencateur chimique polarisé. U : 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 minimu de la tension de sorti plus Vdrop (2V), sois Ve = Vs + Vdrop = 9 + 2 = 11V minimum, pour un bon fonctionnemant du régulateur. U : 7805 regultateur 5V il permet de réguler la tension d’entrée 9V DC en une tension de 5V DC. U : ICL7660 inverseur de tension il permet d’invercer une tension 12V en -12V. U : 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). R, R : Resistances permétant de fixer le courant de la diode ( 15mA ). D1, D2 : Diodes electroluminésante (rouge). Elle permet de créé un signal visuelle permétant a l’utilisateur de savoir que la carte est bien alimantée. Calcule d’un radiateur : (hipothése: LCD=20mA, 4 relais alimenté = 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 Page 8 sur 25 Putil<Pmax. L’utiliter 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. …………………………. ; R,R,C,C : résistances et condensateurs plastique formant un filtre passe bande D, D : diodes elles perment de l’imiter l’amplitude pour que la sinusoide n’arrive pas à saturation. R,R : resistance qui donne du gain au notre montage pour que le critaire de Barkhausen soit vrai (HxA=1). RV : resistance variable elle permet de faire varier l’amplitude de la sinusoide de 4 à 8V. R : résistance de 2.7 Mhom permet d’avoir en sortie une tension linéaire par rapport à l’humidité. CAP1 : h25K5 capteur d’humidité résistif. Son impédance varie de 9Mhom à 2Khom en fonction de l’humidité. U : AOP BEFET avec une grande impédance d’entrée et slew rate à 13V/uS. D, R, C : 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ésiré 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é voire courbe ci dessous. Page 9 sur 25 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 continu é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é. Pour avoir une tension la plus linéaire il faut que la constante de temps RC soit plus grande que 1 / (2πf). Voir les deux courbes ci dessous qui illustre deux constante de temps RC différant. RC << 1 / (2πf) : cette solution ne correspond pas à nos attente R=150hom RC >> 1 / (2πf) : cette solution correspond à nos attente R=390K Page 10 sur 25 Relever (pratique) de l’oscillateur, du pont diviseur et de la détection de crête. 9.2- FS1.2 : Commander Génère un numéro binaire permettant de ce déplacé dans le menu. …………………………………… R, SW: permet d’incrémenté plusieurs variables du programme. R, SW: permet de valider une action dans le programme. Roue codeur: créé grâce à la broche commune un code sur 4 bit en parallèle allant de 0 à 9 en décimal permet de ce 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. …....................................... C : condensateur plastique, sert à filtrer les hautes et basses fréquences. Q, C, C : cette structure permet de cadencer le microcontrôleur à 4MHz. Page 11 sur 25 U : Le PIC18F4520 est une architecture étendue basée sur la famille des PIC18F452 il offre des nouvelles fonctionnalités comme : un jeu d'instructions étendu, des modes de gestion de l'alimentation, une vitesse plus élevée au niveau du ADC, l’USART a été renforcée 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 10bit. 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émenté plusieurs variables du programme. BP1: permet de valider une action dans le programme. RC0, RC1, RC2, RC3: code sur 4 bit en parallèle allant de 0 à 9 en décimal (roue codeuse) permet de ce déplacer dans le menu. OSC1: entrée d’horloge reliée à l’oscillateur à quartz. Sortie : RB0, RB1, RB2, RB3: bus de donnés 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 Commende de puissance de la pompe, des lampes et de l’électrovanne. ………………………………………… R : résistances permettant de faire fonctionner les transistors en bloqué/saturés D : diode de roue libre, absorbe le pic de courant dû à la bobine et à la commutation des transistors. (Sert à protéger les transistors) D : diode, elle permet de protégé le microcontrôleur du sens des courants. Q : transistors fonctionnant en commutation (facteur de saturation = K = 3). RL : relais, ils assurent l’isolation galvanique entre la partie commande et la partie puissance. SW : 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. Page 12 sur 25 7 à 14 : D0 à D7 : Bus de donnés. Dans nôtres 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. L’algorithme du programme du système d’arrosage et 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és (réglage capteur, heure, pompe, lampe) Page 13 sur 25 Page 14 sur 25 11) Association des fonctions 11.1- Explication de la mise en œuvre Une foi le système d’arrosage automatique branché et réglé, son fonctionnement doit être le suivant : 12) Annexe 12.1- Datasheet 12.2- Programme Page 15 sur 25 /*********************************************************** 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) /*********************************************************** 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"; char txt9[] = ":"; char txt10[] = "POMPE ON"; char txt11[] = "LP1 ON"; char txt14[] = "LP1 OFF"; Page 16 sur 25 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; // portB à 1 // le port B et en sortie // RAZ des broches du port d // Toutes les broches du port d sont des entrés si =1 (0=sortie) // portc en sortie // portc = 0 // Toutes les broches du port A sont des entrés (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 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 while(1) { lecture_roue_codeus(); // appel de la fonction roue codeuse Page 17 sur 25 } } /*********************************************************** Lecture roue codeuse: appel les fonctions concernées en fonction du n° lus 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(); Lcd_Out(1,9,txt11); if(RD1_bit==1){reglage_lampe();} test_raz=5; } if (RD2_bit==1 && RD3_bit==0 && RD4_bit==1) Page 18 sur 25 { 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); } /*********************************************************** 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 { Page 19 sur 25 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); 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(); Page 20 sur 25 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(); 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) Page 21 sur 25 {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 tout 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;} 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;} Page 22 sur 25 } } /*********************************************************** 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); } /*********************************************************** 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; Page 23 sur 25 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() { 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); } Page 24 sur 25 /*********************************************************** 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 25 sur 25