// Projet de session 2022
// Auteur: Nathaniel Courtemanche
// Date: 2022-11-26
// ==============================================
// Un système d’alarme connecté à une centrale de contrôle avec des fonctions qui
// envoi des messages entre deux systèmes, affiche l'heure en temps réel
// sans délais et plus tard va lire la température et de l'humidité, va détecter les mouvements et une
// utilisation d'un clavier numérique pour saisir des valeurs
// ==============================================
#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
byte etatBouton = digitalRead(BOUTON);
while (etatBouton == false)
{
etatBouton = digitalRead(BOUTON);
afficherTemps();
} // while()
delay(DELAI_FILTRE_BRUIT_BOUTON);
// Fin de Lecture du bouton
if (connexionALaCentrale()){
afficherPageEcran(systemeEnLigne);
} // if()
} // setup
// ********************************************************
void loop()
// ********************************************************
{
afficherTemps();
} // loop()
// ********************************************************
void afficherPageEcran(Ecrans ecran, int delai = 0)
// ********************************************************
{
switch(ecran) {
case ecranOuverture: // L'écran de début sur l'écran principal
ecranPrincipal.setCursor(COLONNE_DEBUT, LIGNE_DEBUT);
ecranPrincipal.print(F(FR_TITRE));
ecranPrincipal.setCursor(COLONNE_DEBUT, LIGNE_DEUX);
ecranPrincipal.print(F(LIGNE));
ecranPrincipal.setCursor(COLONNE_VERSION, LIGNE_TROIS);
ecranPrincipal.print(F(FR_VERSION));
ecranPrincipal.setCursor(COLONNE_PAR, LIGNE_QUATRE);
ecranPrincipal.print(F(PAR));
break;
case centraleEcranOuverture: // L'écran de début sur l'écran centrale
ecranCentraleSurveillance.setCursor(ILI_COLONNE_TITRE, ILI_LIGNE_TITRE);
ecranCentraleSurveillance.setTextColor(ILI9341_RED);
ecranCentraleSurveillance.setTextSize(ILI_TITLE_SIZE);
ecranCentraleSurveillance.print(F(CENTRALE_DEBUT));
for(int i = 0; i < LARGEUR_ILI; i++)
{
ecranCentraleSurveillance.drawPixel(i, LIGNE_CENTRALE, ILI9341_WHITE);
}
ecranCentraleSurveillance.setCursor(ILI_COLONNE_DEBUT, ILI_ATTENTE_LIGNE);
ecranCentraleSurveillance.setTextColor(ILI9341_YELLOW);
ecranCentraleSurveillance.setTextSize(ILI_TEXTE_SIZE);
ecranCentraleSurveillance.print(F(ATTENTE));
break;
case ecranInstruction: // L'écran d'instruction sur l'écran principal
ecranPrincipal.clear();
ecranPrincipal.setCursor(COLONNE_DEBUT, LIGNE_DEBUT);
ecranPrincipal.print(F(INSTRUCTION_LIGNE1));
ecranPrincipal.setCursor(COLONNE_DEBUT, LIGNE_DEUX);
ecranPrincipal.print(F(INSTRUCTION_LIGNE2));
ecranPrincipal.setCursor(COLONNE_DEBUT, LIGNE_TROIS);
ecranPrincipal.print(F(INSTRUCTION_LIGNE3));
ecranPrincipal.setCursor(COLONNE_DEBUT, LIGNE_QUATRE);
ecranPrincipal.print(F(INSTRUCTION_LIGNE4));
break;
case systemeEnLigne: // L'écran pour montrer que les systeme son en ligne sur les deux
ecranPrincipal.clear();
ecranPrincipal.setCursor(COLONNE_SYSTEME, LIGNE_DEBUT);
ecranPrincipal.print(F(EN_LIGNE));
ecranPrincipal.setCursor(COLONNE_DEBUT, LIGNE_DEUX);
ecranPrincipal.print(F(LIGNE));
ecranPrincipal.setCursor(COLONNE_FIN, LIGNE_TROIS);
ecranPrincipal.print(F(FIN));
ecranPrincipal.setCursor(COLONNE_DEBUT, LIGNE_QUATRE);
ecranPrincipal.print(LIGNE);
ecranCentraleSurveillance.setCursor(ILI_COLONNE_DEBUT, ILI_EN_LIGNE_LIGNE);
ecranCentraleSurveillance.setTextColor(ILI9341_YELLOW);
ecranCentraleSurveillance.setTextSize(ILI_TEXTE_SIZE);
ecranCentraleSurveillance.print(F(EN_LIGNE));
break;
}
delay(delai);
} // afficherPageEcran
// ********************************************************
void initialisationDesAppareils()
// ********************************************************
{
Serial1.begin(UART_VITESSE); //Initialisation du UART de la centrale
Serial3.begin(UART_VITESSE); //Initialisation du UART du système d alarme
ecranPrincipal.begin(LCD_NB_COLONNE, LCD_NB_LIGNE); //Initialisation de la LCD
ecranCentraleSurveillance.begin(); //Initialisation du TFT
pinMode(BOUTON, INPUT); //Initialisation du bouton
horloge.begin(); //Initialisation du 4-digit
affichageHorloge.init(); //Initialisation du RTC
affichageHorloge.set(LUMIERE);
} // initialisationDesAppareils
// ********************************************************
boolean connexionALaCentrale()
// ********************************************************
{
Serial1.write(evenement_systeme_enligne);
delay(UNE_SECONDE);
if(Serial3.available()) {
Serial << F(TENTATIVE);
Serial << F(ENVOI);
byte unMessage = Serial3.read();
if(unMessage == evenement_systeme_enligne) {
Serial << F(SUCCESS);
return true;
}
else
{
return false;
}
}// Retourner 'true' ou 'false' selon le cas.
} // connexionALaCentrale
// ********************************************************
void afficherTemps()
// ********************************************************
{
static unsigned long int momentPresent = millis();
static int deuxPoint;
horloge.getTime();
if (millis() - momentPresent >= UNE_SECONDE / 2) {
momentPresent = millis();
if(deuxPoint % 2)
{
affichageHorloge.point(true);
}
else
{
affichageHorloge.point(false);
}
deuxPoint++;
}
affichageHorloge.display(0, horloge.hour / 10);
affichageHorloge.display(1, horloge.hour % 10);
affichageHorloge.display(2, horloge.minute / 10);
affichageHorloge.display(3, horloge.minute % 10);
} // afficherTemps