#include "soft_i2c_lcd.
h"
// Définition des constantes
#define SEUIL_HUMIDITE 40 // en %
#define SEUIL_TEMP_AIR 30 // °C
#define SEUIL_VENTILATION 35 // seuil critique pour aération
#define SEUIL_BAS_RESEVOIR 10 // seuil bas du reservoir
#define SEUIL_HAUT_RESEVOIR 90 // seuil max du reservoir
// Constantes de conversion
#define TEMP_CONVERSION 0.489
#define CONVERSION (100.0/1023)
// Définition des broches pour l'affichage I2Cs
bit Soft_I2C_Scl at RC3_bit;
sbit Soft_I2C_Sda at RC4_bit;
sbit Soft_I2C_Scl_Direction at TRISC3_bit;
sbit Soft_I2C_Sda_Direction at TRISC4_bit;
// Déclaration des broches
// Sorties
sbit VANNEpp at RD0_bit; // Vanne principale
sbit VANNE1 at RD1_bit; // Vanne zone 1
sbit VANNE2 at RD2_bit; // Vanne zone 2
sbit POMP at RD3_bit; // POMP de reservoir
sbit vantilation at RD4_bit; // Contrôle ventilation
// Entrées
sbit MODE_AM at RB1_bit; // Sélecteur mode Auto/Manu
sbit BPP at RB2_bit; // Bouton Poussoir Pompe
sbit BPV1 at RB3_bit; // Bouton Poussoir Vanne 1
sbit BPV2 at RB4_bit; // Bouton Poussoir Vanne 2
sbit BP_VENT at RB5_bit; // Bouton Poussoir Ventilation
sbit BPomp at RB6_bit; // Bouton Poussoir pomp
// Direction des pins pour entré
sbit VANNEPP_Direction at TRISD0_bit;
sbit VANNE1_Direction at TRISD1_bit;
sbit VANNE2_Direction at TRISD2_bit;
sbit POMP_Direction at TRISD3_bit;
sbit vantilation_Direction at TRISD4_bit;
// Direction des pins pour sorti
sbit MODE_AM_Direction at TRISB1_bit;
sbit BPP_Direction at TRISB2_bit;
sbit BPV1_Direction at TRISB3_bit;
sbit BPV2_Direction at TRISB4_bit;
sbit BP_VENT_Direction at TRISB5_bit;
sbit BPomp_Direction at TRISB6_bit;
// Variables globales
char txt[8]; // Buffer pour formater texte sur LCD
unsigned int TempAir; // Variable pour température de l'air
unsigned int Hum[2]; // Array pour humidité des 2 zones
unsigned short pomp_active = 0;
unsigned short vanpp_active = 0; // États des éléments
unsigned short vanne1_active = 0;
unsigned short vanne2_active = 0;
unsigned short vent_active = 0;
unsigned int NiveauReservoir;
char NR[] = "00 %";
unsigned int NRE;
const unsigned short HUM_C[2] = {RA2, RA3}; // Canaux ADC pour humidité
// Prototypes des fonctions
void initialiser_systeme();
void lire_capteurs();
void controler_systeme();
void afficher_info();
void formater_nombre(char* dest, unsigned int val, char suffixe);
void formater_temp(char* dest, unsigned int val);
void controler_reservoir();
// Initialisation du système
void initialiser_systeme() {
// Configuration des ports analogiques
ANSEL = 0x0F; // RA0-3 analogiques
ANSELH = 0x02; // RE1 analogique
// Configuration ADC
ADC_Init();
POMP_Direction = 0;
POMP = 0;
// Configuration des directions
TRISA = 0xFF; // PORTA entrée
TRISE = 0xFF; // PORTE entrée
// Configuration sorties
VANNEPP_Direction = VANNE1_Direction = VANNE2_Direction = vantilation_Direction
= 0;
VANNEpp = VANNE1 = VANNE2 = vantilation = 0;
vanpp_active = 0;
// Configuration entrées
MODE_AM_Direction = BPP_Direction = BPV1_Direction = BPV2_Direction =
BPomp_Direction=BP_VENT_Direction = 1;
// Initialisation LCD
SOFT_I2C_Init();
I2C_LCD_Init();
I2C_LCD_Cmd(_LCD_CLEAR);
Delay_ms(100);
}
void lire_capteurs() { // Lecture des capteurs
unsigned short i;
// Lecture température air
TempAir = ADC_Read(RA0) * TEMP_CONVERSION;
// Lecture humidité des 2 zones
for(i = 0; i < 2; i++) {
Hum[i] = ADC_Read(HUM_C[i]) * CONVERSION;
}
}
void controler_reservoir() { //controle le nivaux de reservoire
NiveauReservoir = ADC_Read(RA1) * CONVERSION; //prondre la valeur de nivaux
if (NiveauReservoir < SEUIL_BAS_RESEVOIR) {
pomp_active =1; //active la pomp
POMP = 1;
}
else if (NiveauReservoir >= SEUIL_HAUT_RESEVOIR) {
pomp_active=0; //la pomp off
POMP = 0;
}
}
// Contrôle du système selon le mode
void controler_systeme() {
unsigned short i;
// MODE AUTOMATIQUE
unsigned short zones_seches = 0;
if (vanpp_active == 0 && NRE < 10) {
vanpp_active = 1; // Vérification des zones sèches
et contrôle des vannes
}
else if (vanpp_active == 1 && NRE > 95) {
vanpp_active = 0;
}
if (MODE_AM == 1) {
for(i = 0; i < 2; i++) {
if (Hum[i] < SEUIL_HUMIDITE) zones_seches++;
}
// Activer la pompe si besoin
VANNEpp = (zones_seches > 0 ) ? 1 : 0;
// Contrôle des vannes individuelles
VANNE1 = (Hum[0] < SEUIL_HUMIDITE);
VANNE2 = (Hum[1] < SEUIL_HUMIDITE);
// Contrôle de la ventilation
vantilation = (TempAir > SEUIL_VENTILATION);
// Mise à jour des états
vanpp_active = VANNEpp;
vanne1_active = VANNE1;
vanne2_active = VANNE2;
vent_active = vantilation;
pomp_active=POMP;
}
else { // MODE MANUEL
if (BPomp || pomp_active) { // Contrôle de la pompe
POMP = 1;
pomp_active = 1;
} else {
POMP = 0;
pomp_active=0;
}
if (BPP || vanpp_active) {
VANNEpp = 1; // Contrôle de la
vanpp_active = 1;
}
else {
VANNEpp = 0;
vanpp_active = 0;
}
if (BPV1 || vanne1_active) { // Contrôle des vannes 1
VANNE1 = 1;
vanne1_active = 1;
}
else {
VANNE1 = 0;
vanne1_active = 0;
}
if (BPV2 || vanne2_active) {
VANNE2 = 1;
vanne2_active = 1; // Contrôle des vannes 2
}
else {
VANNE2 = 0;
vanne2_active = 0;
}
if (BP_VENT || vent_active) {
vantilation = 1;
vent_active = 1; // Contrôle de la ventilation
}
else {
vantilation = 0;
vent_active = 0;
}
}
}
void afficher_info() { // Affichage des informations
// Effacer l'écran
I2C_LCD_Cmd(_LCD_CLEAR);
// Ligne 1: Titre et mode
I2C_LCD_Out(1, 1, "Projet 3IAII");
I2C_LCD_Out(1, 13, MODE_AM ? "AUTO" : "MANU");
// Ligne 2: Température et ventilation on / off
I2C_LCD_Out(2, 1, "T:");
formater_temp(txt, TempAir);
I2C_LCD_Out(2, 2, txt);
I2C_LCD_Out(2, 10, "FAN:");
I2C_LCD_Out_CP(vantilation ? "ON" : "OFF");
// Ligne 3: Humidité des deux zones
I2C_LCD_Out(3, -3, "H1:");
formater_nombre(txt, Hum[0], '%');
I2C_LCD_Out_CP(txt);
I2C_LCD_Out(3, 5, "H2:");
formater_nombre(txt, Hum[1], '%');
I2C_LCD_Out_CP(txt);
// Ligne 4: État des vannes
I2C_LCD_Out(4, -3, "VP:");
I2C_LCD_Out_CP(VANNEpp ? "ON" : "OFF");
I2C_LCD_Out(4, 5, "V1:");
I2C_LCD_Out_CP(VANNE1 ? "ON " : "OFF");
I2C_LCD_Out(4, -3, "VP:");
I2C_LCD_Out_CP(VANNEpp ? "ON" : "OFF");
I2C_LCD_Out(4, 5, "V2:");
I2C_LCD_Out_CP(VANNE2 ? "ON" : "OFF");
Delay_ms(100); // Pause pour lecture
I2C_LCD_Cmd(_LCD_CLEAR);
I2C_LCD_Out(1, 1, "Niveau:"); //Affichage du nivaux de reservoire
formater_nombre(txt, NiveauReservoir, '%');
I2C_LCD_Out_CP(txt );
I2C_LCD_Out(2,1, "Pompe: ");
I2C_LCD_Out_CP(POMP==1 ? "ON " : "OFF"); //Affichage pomp reservoire on /off
Delay_ms(100); // Pause pour lecture
}
void formater_nombre(char* dest, unsigned int val, char suffixe) {
dest[0] = (val / 10) % 10 + '0';
dest[1] = val % 10 + '0'; // determine la forme Affichage de nombre
dest[2] = suffixe;
dest[3] = 0;
}
void formater_temp(char* dest, unsigned int val) {
dest[0] = (val > 99) ? '1' : ' ';
dest[1] = (val / 10) % 10 + '0'; // Formater une température
dest[2] = val % 10 + '0';
dest[3] = '.';
dest[4] = '0';
dest[5] = 223; // Symbole degré
dest[6] = 'C';
dest[7] = 0;
}
void main() { // Fonction principale
initialiser_systeme();
while(1) {
controler_reservoir();
lire_capteurs();
controler_systeme();
afficher_info();
I2C_LCD_Cmd(_LCD_CLEAR);
}
}