Ci dessus le programme complet réalisé jusqu'à présent. Le programme est le même avec et sans ethernet.
Dans la phase setup, le programme affiche quelques textes sur le LCD, force les relais à l'état haut et récupère des valeurs de variable dans l'eeprom.
Lorsque la carte ethernet est installée, le dernier texte affiché est "Démarrage du système informatique" puis l'écran devient vierge( ceci correspond à la dernière instruction dans le setup).
Normalement apparait ensuite l'écran d'accueil avec la date et l'heure (ici simulé par du texte pour le moment) et l'affichage de deux température ainsi que le mode de régulation.
volatile byte rpmcount;
unsigned int rpm;
unsigned long timeold;
long previousMillis = 0;
// --- Inclusion des librairies utilisées ---
#include <LiquidCrystal.h> // Inclusion de la librairie pour afficheur LCD
#include <EEPROM.h>
int adresse = 0; // adresses entre 0 et 1023 pour Arduino UNO - 1024 octets
byte valeur=0;
//--------Variables réglages seuils
int TensionR1Zone1 = 0 ;
int R1Zone1 = 20;
int TensionR2Zone1 = 0;
int R2Zone1 = 30;
//********************************************************************************
//----------Variable Temperatures----------------------------------------------------------
#define TCZone1 1
int tempZone1;
int tempZone2;
int tempZone3;
int tempZone4;
int tempZone5;
int tempZoneAmbiant;
int VitesseZ1 = 0;
//****************************************************************************************
//--------Variable Menu LCD
int Droit = 0;
int Centre = 0;
int Gauche = 0;
int EtatMenu = 0;
int EtatCentre = 0;
int lcdRAZ = 0; // Variable empechant l'effacement de l'écran d'un menu à chaque boucle alors que la page n'a pas changé
int Accueil = 0;
int etatPrecedentCentre = 0;
int etatPrecedentGauche = 0;
int etatPrecedentDroit = 0;
int etatPrecedentHaut = 0;
int etatPrecedentBas = 0;
int etatPrecedentD = 0;
int etatPrecedentG = 0;
int Haut = 0;
int Bas = 0;
int D = 0;
int G = 0;
int LigneSup = 0; // Variable pour supprimer uniquement la fleche précédente sans l'écran complet
int Ligne=0; // Variable de selection de la ligne
int Colonne4 = 3;
int Ligne4 = 1;
int Ligne4Sup = 0;
int Colonne4Sup = 0;
int C3=0; // Variable gérant le nombre de colonne pour la page des seuils au niveau des boutons D et G
int Valid = 0;
int Mode = 1;
//*******************************************************************************
//--------------Variable LCD----------------------------------------------------------
byte degrees[8] = {
B00000,
B01000,
B10100,
B01000,
B00000,
B00000,
B00000,
B00000,
};
const int RS=2; //declaration constante de broche
const int E=22; //declaration constante de broche
const int D4=23; //declaration constante de broche
const int D5=24; //declaration constante de broche
const int D6=25; //declaration constante de broche
const int D7=26; //declaration constante de broche
// --- Initialisation des fonctionnalités utilisées ---
LiquidCrystal lcd(RS, E, D4, D5, D6, D7);// initialisation LCD en mode 4 bits
//****************************************************
void setup() { // debut de la fonction setup()
Serial.begin(9600);
//--------------Voies pour les relais régulation températures -------------------------------
pinMode(27, OUTPUT); //met la broche en sortie
pinMode(28, OUTPUT);
pinMode(29, OUTPUT);
pinMode(30, OUTPUT);
pinMode(31, OUTPUT);
pinMode(32, OUTPUT);
pinMode(33, OUTPUT);
pinMode(34, OUTPUT);
pinMode(35, OUTPUT);
pinMode(36, OUTPUT);
pinMode(37, OUTPUT);
//--------------Voies boutons MENU LCD-------------------------------------------
pinMode(51, INPUT); // Bouton droit
pinMode(52, INPUT); // Bouton Centre
pinMode(53, INPUT); // Bouton gauche
pinMode(50, INPUT); //Bouton Haut
pinMode(49, INPUT); // Bouton Bas
pinMode(48, INPUT); // Bouton Valid
pinMode(47, INPUT);
//**************************************************************************
//-----------INITIALISATION LCD-------------------------------------------
lcd.begin(20,4); // Initialise le LCD avec 20 colonnes x 4 lignes
delay(10); // pause rapide pour laisser temps initialisation
lcd.createChar(1, degrees );
//*********************************************************************
// --------------Séquence de démarrage---------------------------
digitalWrite(27, HIGH);
digitalWrite(28, HIGH);
digitalWrite(29, HIGH);
digitalWrite(30, HIGH);
digitalWrite(31, HIGH);
digitalWrite(32, HIGH);
digitalWrite(33, HIGH);
digitalWrite(34, HIGH);
digitalWrite(35, HIGH);
digitalWrite(36, HIGH);
R1Zone1 = EEPROM.read(0);
R2Zone1 = EEPROM.read(1);
lcd.setCursor(1, 0) ;
lcd.print("INITIALISATION DU") ;
lcd.setCursor(1, 1) ;
lcd.print("SYSTEME C.P.I.S.I.") ;
lcd.setCursor(0, 3) ;
lcd.print("Ver:1.0 build 090212") ;
delay(4000);
lcd.clear(); // // efface écran et met le curseur en haut à gauche
delay(10); // pour laisser temps effacer écran
lcd.setCursor(4, 1) ;
lcd.print("DEMARRAGE DU") ;
lcd.setCursor(0, 2) ;
lcd.print("SYSTEME INFORMATIQUE") ;
delay(2000);
lcd.clear(); // // efface écran et met le curseur en haut à gauche
delay(10);
}
void loop(){ // debut de la fonction loop()
unsigned long currentMillis = millis();
Droit = digitalRead(51);
Centre = digitalRead(52);
Gauche = digitalRead(53);
Haut = digitalRead(49);
Bas = digitalRead(50);
G = digitalRead(48); // Bouton droit selection
D = digitalRead(47); // Bouton gauche selection
//--------------ECRAN D'ACCUEIL--------------------------------------
//time = millis();
Serial.print (Valid);
if (Accueil == 2){
EtatMenu = 0;
lcdRAZ = 0;
Accueil = 0;
}
//********************************************************************
//--------------Gestion régulattion-----------------------------------
if(currentMillis - previousMillis > 5000) {
previousMillis = currentMillis;
analogRead (0);
delay(20);
tempZone1 = analogRead(0) * 5000L / 1024L / 10;
analogRead (1);
delay(20);
tempZone2 = analogRead(1) * 5000L / 1024L / 10;
analogRead (2);
delay(20);
tempZone3 = analogRead(2) * 5000L / 1024L / 10;
analogRead (3);
delay(20);
tempZone4 = analogRead(3) * 5000L / 1024L / 10;
analogRead (4);
delay(20);
tempZone5 = analogRead(4) * 5000L / 1024L / 10;
analogRead (5);
delay(20);
tempZoneAmbiant = analogRead(5) * 5000L / 1024L / 10;
}
//-------------ZONE 1 -------------------------------------------
switch (Mode)
{
case 1 :
if (tempZone1 >=R2Zone1)
{
digitalWrite (27, HIGH) ;
digitalWrite (28, HIGH);
VitesseZ1 = 2;
}
else if (tempZone1 <= R1Zone1)
{
digitalWrite (28, LOW) ;
VitesseZ1 = 0;
}
else
{
digitalWrite (28, HIGH) ;
digitalWrite (27, LOW) ;
VitesseZ1 = 1;
}
break;
case 0 :
if (tempZone1 <= R1Zone1)
{
digitalWrite (28, LOW) ;
VitesseZ1 = 0;
}
else
{
digitalWrite (28, HIGH) ;
digitalWrite (27, LOW) ;
VitesseZ1 = 1;
}
break;
case 2:
digitalWrite (27, HIGH) ;
digitalWrite (28, HIGH);
VitesseZ1=2;
break;
}
//**************************************************************
//---------- ZONE 2 --------------------------------------------
if (tempZone2 >=R2Zone1)
{
digitalWrite (30, HIGH) ;
}
else if (tempZone2 <= R1Zone1)
{
digitalWrite (29, LOW) ;
}
else
{
digitalWrite (29, HIGH) ;
digitalWrite (30, LOW) ;
}
//*************************************************************
//---------- ZONE 3 --------------------------------------------
if (tempZone3 >=R2Zone1)
{
digitalWrite (31, HIGH) ;
}
else if (tempZone3 <= R1Zone1)
{
digitalWrite (32, LOW) ;
}
else
{
digitalWrite (32, HIGH) ;
digitalWrite (31, LOW) ;
}
//*************************************************************
//---------- ZONE 4 --------------------------------------------
if (tempZone4 >=R2Zone1)
{
digitalWrite (33, HIGH) ;
}
else if (tempZone4 <= R1Zone1)
{
digitalWrite (34, LOW) ;
}
else
{
digitalWrite (34, HIGH) ;
digitalWrite (33, LOW) ;
}
//*************************************************************
//---------- ZONE 5 --------------------------------------------
if (tempZone5 >=R2Zone1)
{
digitalWrite (35, HIGH) ;
}
else if (tempZone5 <= R1Zone1)
{
digitalWrite (36, LOW) ;
}
else
{
digitalWrite (36, HIGH) ;
digitalWrite (35, LOW) ;
}
//*************************************************************
//*********************************************************************
//----------Gestion boutons menu LCD -------------------------------
if ((Gauche == HIGH) && (etatPrecedentGauche == LOW))
{
// if (Valid == 1)
// {
// }
// else
// {
EtatMenu = EtatMenu+1;
Accueil = 0;
lcdRAZ = 0;
Colonne4 = 3;
Ligne4 = 1;
C3=0;
delay(10);
}
etatPrecedentGauche = Gauche;
// }
/*
if ((Centre == HIGH) && (etatPrecedentCentre == LOW))
{
EtatCentre = 1 ;
Accueil = Accueil + 1;
lcdRAZ = 0;
lcd.clear();
delay(10);
}
etatPrecedentCentre = Centre;
*/
if ((Droit == HIGH) && (etatPrecedentDroit == LOW))
{
// if (Valid == 1)
// {
// }
// else
// {
EtatMenu = EtatMenu-1;
Accueil = 0;
lcdRAZ = 0;
Colonne4 = 3;
Ligne4 = 1;
C3=0;
delay(10);
}
etatPrecedentDroit = Droit;
// }
/* if ((Haut == HIGH) && (etatPrecedentHaut == LOW))
{
R1Zone1 = R1Zone1 + 1;
// lcd.setCursor(Colonne4, Ligne4) ;
// lcd.print("R1Zone1") ;
lcdRAZ = 0;
delay(10);
}
etatPrecedentHaut = Haut;
*/
//*********************************************************************
// ---------------------------MENU LCD ----------------------------------------------------
switch (EtatMenu){
case 0 :
if (lcdRAZ == 0){
lcd.clear();
}
lcd.setCursor(0, 1) ;
lcd.print("04/03/2012 09:18") ;
lcd.setCursor(0, 0) ;
lcd.print("MODE SYST.: ") ;
lcd.setCursor(12, 0) ;
if ((D == HIGH) && (etatPrecedentD == LOW))
{
Mode = Mode +1;
}
etatPrecedentD = D;
if ((G == HIGH) && (etatPrecedentG == LOW))
{
Mode = Mode -1;
}
etatPrecedentG = G;
switch (Mode)
{
case 0 :
lcd.print("Silence");
break;
case 1 :
lcd.print(" ");
lcd.setCursor(12, 0) ;
lcd.print("Auto");
break;
case 2 :
lcd.print("Maximum");
break;
}
lcd.setCursor(0, 2) ;
lcd.print("TExt:") ;
lcd.print(tempZoneAmbiant);
lcd.write( 1 );
lcd.print("C");
lcd.setCursor(11, 2) ;
lcd.print("TInt:") ;
lcd.print(tempZone1);
lcd.write( 1 );
lcd.print("C");
delay(100);
EtatMenu = 0;
lcdRAZ = 1;
break;
case 1 : // MENU TEMPERATURES 1/2
if (lcdRAZ == 0){
lcd.clear();
}
//******************************
switch (VitesseZ1)
{
case 2 :
lcd.setCursor(12,1 ) ;
lcd.print("V:FORT ") ;
break;
case 0 :
lcd.setCursor(12, 1) ;
lcd.print("V:OFF ") ;
break;
case 1 :
lcd.setCursor(12,1 ) ;
lcd.print("V:MOYEN") ;
break;
}
//***************************
if (tempZone2 >=R2Zone1)
{
lcd.setCursor(12,2 ) ;
lcd.print("V:FORT ") ;
}
else if (tempZone2 <=R1Zone1)
{
lcd.setCursor(12, 2) ;
lcd.print("V:OFF ") ;
}
else
{
lcd.setCursor(12,2 ) ;
lcd.print("V:MOYEN") ;
}
//*********************************
if (tempZone3 >=R2Zone1)
{
lcd.setCursor(12,3 ) ;
lcd.print("V:FORT ") ;
}
else if (tempZone3 <=R1Zone1)
{
lcd.setCursor(12, 3) ;
lcd.print("V:OFF ") ;
}
else
{
lcd.setCursor(12,3 ) ;
lcd.print("V:MOYEN") ;
}
//---------------AFFICHAGE TEMERATURES-----------------------------------------------
lcd.setCursor(0, 0) ;
lcd.print("Temperatures PAGE 1") ;
lcd.setCursor(0, 1) ;
lcd.print("ZONE 1:") ;
lcd.print(tempZone1) ;
lcd.write( 1 );
lcd.print("C");
lcd.setCursor(0, 2) ;
lcd.print("ZONE 2:") ;
lcd.print(tempZone2) ;
lcd.write( 1 );
lcd.print("C");
lcd.setCursor(0, 3) ;
lcd.print("ZONE 3:") ;
lcd.print(tempZone3) ;
lcd.write( 1 );
lcd.print("C");
delay (100);
lcdRAZ = 1;
break;
case 2 : // MENU TEMPERATURES 2/2
if (lcdRAZ == 0){
lcd.clear();
}
if (tempZone4 >=R2Zone1)
{
lcd.setCursor(12,1 ) ;
lcd.print("V:FORT ") ;
}
else if (tempZone4 <=R1Zone1)
{
lcd.setCursor(12, 1) ;
lcd.print("V:OFF ") ;
}
else
{
lcd.setCursor(12,1 ) ;
lcd.print("V:MOYEN") ;
}
//***************************
if (tempZone5 >=R2Zone1)
{
lcd.setCursor(12,2 ) ;
lcd.print("V:FORT ") ;
}
else if (tempZone5 <=R1Zone1)
{
lcd.setCursor(12, 2) ;
lcd.print("V:OFF ") ;
}
else
{
lcd.setCursor(12,2 ) ;
lcd.print("V:MOYEN") ;
}
lcd.setCursor(0, 0) ;
lcd.print("Temperatures PAGE 2") ;
lcd.setCursor(0, 1) ;
lcd.print("ZONE 4:") ;
lcd.print(tempZone4) ;
lcd.write( 1 );
lcd.print("C");
lcd.setCursor(0, 2) ;
lcd.print("ZONE 5:") ;
lcd.print(tempZone5) ;
lcd.write( 1 );
lcd.print("C");
lcd.setCursor(0, 3) ;
lcd.print("ZONE EXT:") ;
lcd.print(tempZoneAmbiant) ;
lcd.write( 1 );
lcd.print("C");
lcdRAZ = 1;
break;
case 3 : // MENU REGLAGES SEUILS 1/2
if (lcdRAZ == 0){
lcd.clear();
}
Haut = digitalRead(49);
Bas = digitalRead(50);
G = digitalRead(48); // Bouton droit selection
D = digitalRead(47); // Bouton gauche selection
if ((D == HIGH) && (etatPrecedentD == LOW))
{
if (Valid == 1)
{
}
else
{
C3=C3+1;
if (C3 >2 )
{
C3 =2;
// Colonne4 = 3;
// Ligne4 = 1;
// lcd.setCursor(12, 1) ;
// lcd.print(" ") ;
}
if( C3 == 1)
{
lcd.setCursor(Colonne4, Ligne4) ;
lcd.print("->") ;
}
if (C3 == 2)
{
Colonne4 = 12;
Colonne4Sup = 3;
lcd.setCursor(Colonne4, Ligne4) ;
lcd.print("->") ;
lcd.setCursor(Colonne4Sup, Ligne4) ;
lcd.print(" ") ;
}
}
}
etatPrecedentD = D;
if ((G == HIGH) && (etatPrecedentG == LOW))
{
if (Valid == 1)
{
}
else
{
C3=C3-1;
if (C3 < 1 ) // Condition surveillant le dépassement de déplacement G et D
{
C3 =1;
// Colonne4 = 12; // On réinitialise la position de la fleche
// Ligne4 = 1;
// lcd.setCursor(Colonne4, Ligne4) ;
// lcd.print("->") ;
}
if( C3 == 1)
{
Colonne4 = 3;
Colonne4Sup = 12;
lcd.setCursor(Colonne4, Ligne4) ;
lcd.print("->") ;
lcd.setCursor(Colonne4Sup, Ligne4) ;
lcd.print(" ") ;
}
if (C3 == 2)
{
Colonne4 = 12;
Colonne4Sup = 3;
lcd.setCursor(Colonne4, Ligne4) ;
lcd.print("->") ;
lcd.setCursor(Colonne4Sup, Ligne4) ;
lcd.print(" ") ;
}
}
}
etatPrecedentG = G;
if ((Centre == HIGH) && (etatPrecedentCentre == LOW))
{
Valid = Valid +1;
if (Valid == 1)
{
lcd.setCursor(Colonne4, Ligne4) ;
lcd.print("+>") ;
}
if (Valid == 2)
{
lcd.setCursor(Colonne4, Ligne4) ;
lcd.print("->") ;
Valid = 0;
}
lcdRAZ = 0;
delay(10);
}
if (Valid == 1)
{
//----------- Gestion de la consigne R1Zone1-------------
if (Colonne4 == 3 && Ligne4 == 1)
{
if ((Haut == HIGH) && (etatPrecedentHaut == LOW))
{
R1Zone1 = R1Zone1 + 1;
delay(10);
}
etatPrecedentHaut = Haut;
if ((Bas == HIGH) && (etatPrecedentBas == LOW))
{
R1Zone1 = R1Zone1 - 1;
delay(10);
}
etatPrecedentBas = Bas;
}
EEPROM.write(0, R1Zone1);
//----------Gestion de la consigne R2Zone1 ------------------
if (Colonne4 == 12 && Ligne4 == 1)
{
if ((Haut == HIGH) && (etatPrecedentHaut == LOW))
{
R2Zone1 = R2Zone1 + 1;
delay(10);
}
etatPrecedentHaut = Haut;
if ((Bas == HIGH) && (etatPrecedentBas == LOW))
{
R2Zone1 = R2Zone1 - 1;
delay(10);
}
etatPrecedentBas = Bas;
}
EEPROM.write(1, R2Zone1);
}
// ***************************************************
lcd.setCursor(0, 0) ;
lcd.print("REGLAGES SEUILS 1/2") ;
lcd.setCursor(0, 1) ;
lcd.print("Z1:") ;
lcd.setCursor(5, 1) ;
lcd.print("1=") ;
lcd.print(R1Zone1) ;
lcd.write( 1 ); // affiche le signe degré
lcd.print("C");
lcd.setCursor(14, 1) ;
lcd.print("2=") ;
lcd.print(R2Zone1) ;
lcd.write( 1 ); // affiche le signe degré
lcd.print("C");
delay(100);
lcdRAZ = 1;
break;
}
}
Ci-dessous le montage. Je l'ai un peu épuré. Je n'ai pas câblé les capteurs de températures qui sont sur les ports A0 à A5 ni les boutons poussoirs qui vont de D47 à D51.
Les fils blancs correspondent à la commande des relais. Ils sont sur les ports D27 à D36.
L'écran LCD est câblé en 4 fils au lieu de 8. Les signaux D4 à D7 sont sur les ports D23 à D26. le signal est RS est sur D2 et E sur D22.
Le 5V est pris sur l'arduino.
J'espère que vous avez assez d'information et je vous remercie pour votre aide.