Sommaire

publicité
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
Téléchargement