0% ont trouvé ce document utile (0 vote)
7 vues5 pages

Contrôle Automatique de Système I2C

Ce document est un code source pour un système de contrôle automatisé de l'humidité et de la température utilisant un affichage LCD. Il définit des seuils pour l'humidité, la température, et le niveau d'eau dans un réservoir, et comprend des fonctions pour lire des capteurs, contrôler des vannes et une pompe, et afficher des informations. Le système peut fonctionner en mode automatique ou manuel, en fonction des entrées utilisateur.

Transféré par

deadhoat2222
Copyright
© All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats TXT, PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
7 vues5 pages

Contrôle Automatique de Système I2C

Ce document est un code source pour un système de contrôle automatisé de l'humidité et de la température utilisant un affichage LCD. Il définit des seuils pour l'humidité, la température, et le niveau d'eau dans un réservoir, et comprend des fonctions pour lire des capteurs, contrôler des vannes et une pompe, et afficher des informations. Le système peut fonctionner en mode automatique ou manuel, en fonction des entrées utilisateur.

Transféré par

deadhoat2222
Copyright
© All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats TXT, PDF, TXT ou lisez en ligne sur Scribd

#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);
}
}

Vous aimerez peut-être aussi