// Projet de session 2022
// Document de départ
// ==============================================
// Insérez ICI le commentaire d'entête du fichier
// ==============================================
#include "mesdefines.h"
// NOTE IMPORTANTE: Ne placez aucune macro, enum, déclaration de fonctions,
// const,include (sauf pour 'mesdefines.h),dans ce fichier.
// Déclaration des objets à portée globale:
TM1637 affichageHorloge(CLK, DIO);
DS1307 horloge;
Adafruit_ILI9341 ecranCentraleSurveillance = Adafruit_ILI9341(TFT_CS, TFT_DC);
LiquidCrystal_I2C ecranPrincipal(LCD_ADRESSE_I2C,LCD_NB_COLONNE,LCD_NB_LIGNE);
// ********************************************************
void setup()
// ********************************************************
{
Serial.begin(UART_VITESSE_CONSOLE);
//NOTE: Placer une chaine de caractères entre F() permet de la stocker
// dans la mémoire programme au lieu de la mémoire variable.
//
// Étant donné qu'il n'y a pas beaucoup de mémoire variable,
// c'est une bonne pratique.
Serial << F(MSG_DEMARRAGE_DU_PROJET);
Serial << F(MSG_PROJET_PAR );
Serial << F(MSG_DEBUT_INIT);
initialisationDesAppareils();
Serial << F(MSG_FIN_INIT);
afficherPageEcran(centraleEcranOuverture);
afficherPageEcran(ecranOuverture, UNE_SECONDE * 2);
afficherPageEcran(ecranInstruction);
// Début de Lecture du bouton et affichage de l'heure en mode non bloquant
// ...
// Fin de Lecture du bouton
bool ecran = false;
while(!ecran) //Boucle et permet de garder l'écrans 1 avant que le boutton rouge sois appuyée
{
afficherTemps();
if(digitalRead(BUTTON_PIN))
{
delay(BRUIT_BUTTON); //Bruit qui compense pour le délai du bouton
while(digitalRead(BUTTON_PIN)) //Permet de changer d'écrans seulment quand le bouton est relaché
{
delay(BRUIT_BUTTON);
afficherTemps();
}
ecran = true;
}
}
if (connexionALaCentrale()){
afficherPageEcran(systemeEnLigne);
}
} // setup
// ********************************************************
void loop()
// ********************************************************
{
if(digitalRead(MOTIONSENSORPIN))
{
if (uneIntrusion())
{
Serial << "Aviser la centrale de l'intrusion";
}
else
{
Serial << "Code d'alarme valide";
digitalWrite(LEDPIN, LOW);
}
}else
{
afficherPageEcran(ecranTemp);
}
afficherTemps();
} // loop()
bool uneIntrusion()
{
static unsigned int debut30s = millis(); //Prend le temp du debut de l'intrusion
digitalWrite(LEDPIN, HIGH);
afficherPageEcran(ecranPIN);
char key;
int valeurCle;
int code[4];
for(int i = 0; i < 4; i++) //Prend les 4 input du clavier
{
key = keypad.getKey();
while( key == NO_KEY)
{
if((millis() - debut30s) >= TRENTE_SECONDE) // return true si le temp de 30 sec est ecoule
{
return true;
}
key = keypad.getKey();
}
if (key != NO_KEY)
{
valeurCle = key - 48; //Transform en valeur numerique
code[i] = valeurCle; // ajoute a l'array du code
}
}
int somme = code[0] + code[1] + code[2] + code[3]; //fait la somme de tous les inputs
if(somme != CODE) //Si ce n'est pas le bon return true
{
return true;
}
return false;
}
// ********************************************************
void afficherPageEcran(Ecrans ecran, int delai = 0)
// ********************************************************
{
switch (ecran) //
{
case ecranOuverture: //Écran d'ouverture sur le lcd
ecranPrincipal.setCursor(1,0);
ecranPrincipal.print(LCD_ECRAN1_1);
ecranPrincipal.setCursor(0,1);
for (int i = 0; i < 20; i++) //Créer une boucle pour afficher une ligne
{
ecranPrincipal.print('-');
}
ecranPrincipal.setCursor(3,2);
ecranPrincipal.print(LCD_ECRAN1_2);
ecranPrincipal.setCursor(4,3);
ecranPrincipal.print(LCD_ECRAN1_3);
break;
case centraleEcranOuverture: //Écran d'ouverture sur le ILI
//Dessine sur le ILI
ecranCentraleSurveillance.setCursor(ILI_POSITION1);
ecranCentraleSurveillance.setTextColor(ILI9341_RED); //Couleur rouge
ecranCentraleSurveillance.setTextSize(ILI_TAILLE1); //Taille: 3
ecranCentraleSurveillance.println(ILI_ECRAN1_1);
ecranCentraleSurveillance.setTextColor(ILI9341_WHITE); //Couleur white
ecranCentraleSurveillance.println("_____________");
ecranCentraleSurveillance.setCursor(0,120);
ecranCentraleSurveillance.setTextColor(ILI9341_YELLOW); //Couleur jaune
ecranCentraleSurveillance.setTextSize(ILI_TAILLE2); //Taille: 2
ecranCentraleSurveillance.println("Attente de connexion du client ...");
break;
case centraleSystemeEnLigne:
break;
case ecranAuteur:
break;
case ecranInstruction: //Montre les intructions
ecranPrincipal.setCursor(0,0);
ecranPrincipal.print(LCD_ECRAN2_1);
ecranPrincipal.setCursor(0,1);
ecranPrincipal.print(LCD_ECRAN2_2);
ecranPrincipal.setCursor(0,2);
ecranPrincipal.print(LCD_ECRAN2_3);
ecranPrincipal.setCursor(0,3);
ecranPrincipal.print(LCD_ECRAN2_4);
break;
case ecranPIN:
ecranPrincipal.setCursor(0,0);
ecranPrincipal.print(LCD_ECRAN5_1);
ecranPrincipal.setCursor(0,1);
for (int i = 0; i < 20; i++)
{
ecranPrincipal.print('-');
}
ecranPrincipal.setCursor(0,2);
ecranPrincipal.print(LCD_ECRAN5_2);
ecranPrincipal.setCursor(0,3);
ecranPrincipal.print("_ ");
break;
case systemeEnLigne: //Écran sur le lcd et le ILI quand ils sont connectés
ecranPrincipal.setCursor(0,0);
ecranPrincipal.print(LCD_ECRAN3_1);
ecranPrincipal.setCursor(0,1);
for (int i = 0; i < 20; i++)
{
ecranPrincipal.print('-');
}
ecranPrincipal.setCursor(0,2);
ecranPrincipal.print(LCD_ECRAN3_2);
ecranPrincipal.setCursor(0,3);
for (int i = 0; i < 20; i++)
{
ecranPrincipal.print('-');
}
ecranCentraleSurveillance.setCursor(0,170);
ecranCentraleSurveillance.println("Systeme en ligne");
break;
case ecranTemp:
ecranPrincipal.setCursor(0,0);
ecranPrincipal.print(LCD_ECRAN4_1);
ecranPrincipal.setCursor(0,1);
for (int i = 0; i < 20; i++)
{
ecranPrincipal.print('-');
}
ecranPrincipal.setCursor(0,2);
ecranPrincipal.print(nomJour[horloge.dayOfWeek]);
ecranPrincipal.print(" ");
ecranPrincipal.setCursor(9,2);
sprintf(chaineCaractere,"%02d ",horloge.dayOfMonth);
ecranPrincipal.print(chaineCaractere);
ecranPrincipal.setCursor(12,2);
ecranPrincipal.print(nomMois[horloge.month]);
ecranPrincipal.print(" ");
ecranPrincipal.setCursor(0,3);
int secondeSysteme = (millis()/1000) % 60;
int minuteSysteme = (millis()/60000) % 60;
int heureSysteme = (millis()/360000) % 24;
int jourSysteme = (millis()/86400000) % 365;
sprintf(chaineCaractere,"Actif: %03d, %02d:%02d:%02d",jourSysteme,heureSysteme,minuteSysteme,secondeSysteme);
ecranPrincipal.print(chaineCaractere);
break;
default:
break;
}
delay(delai); //Rajoute un delai si l'appelle de la fonction en donne un
} // afficherPageEcran
// ********************************************************
void initialisationDesAppareils()
// ********************************************************
{
//Initialisation du UART de la centrale
Serial1.begin(UART_VITESSE_CONSOLE);
//Initialisation du UART du système d alarme
Serial3.begin(UART_VITESSE_CONSOLE);
//Initilisation du LCD
ecranPrincipal.begin(LCD_NB_COLONNE,LCD_NB_LIGNE);
//Initialisation du TFT
ecranCentraleSurveillance.begin();
//Initialisation du bouton
pinMode(BUTTON_PIN, INPUT);
//Initialisation du 4-digit
affichageHorloge.init();
affichageHorloge.set(BRIGHTEST);
//Initialisation du RTC
horloge.begin();
//Initialisation du clavier
//MotionSensor
pinMode(MOTIONSENSORPIN, INPUT);
//LED
pinMode(LEDPIN, OUTPUT);
} // initialisationDesAppareils
// ********************************************************
boolean connexionALaCentrale()
// ********************************************************
{
// Retourner 'true' ou 'false' selon le cas.
Serial1.write(evenement_systeme_enligne); //Envoie le message
delay(UNE_SECONDE); //Attendre une seconde
if(Serial3.available()) //Seulement si le Serial3 recoit
{
byte message = Serial3.read(); //Met en variable le byte reçu
if(message == evenement_systeme_enligne) //Si le message reçu est le bon retourne true
{
return true;
}
}
return false; //Sinon retourne false
} // connexionALaCentrale
// ********************************************************
void afficherTemps()
// ********************************************************
{
horloge.getTime(); //Actualiser le temps
affichageHorloge.display(0, horloge.hour / 10); // Affiche séparement les dizaines et les unité des heures
affichageHorloge.display(1, horloge.hour % 10);
affichageHorloge.display(2, horloge.minute / 10); // Affiche séparement les dizaines et les unité des minute
affichageHorloge.display(3, horloge.minute % 10);
affichageHorloge.point(chaqueSeconde()); // Affiche les deux points chaque seconde
} // afficherTemps
bool chaqueSeconde()
{
static long momentPresent = millis();
static bool estTrue = false;
if(millis() - momentPresent >= 1000)
{
estTrue = !estTrue; //Inverse la valeur de estTrue
momentPresent = millis();
}
return estTrue; //retourne la valeur de estTrue
}