Version 1.0 du document – L’énoncé pourrait changer
Objectifs
Développer un système d’alarme connecté à une centrale de contrôle avec des fonctions tels que; envoi de messages entre deux systèmes (centrale de surveillance et système d’alarme), affichage de l’heure en temps réel sans utilisation de délais, lecture de la température et de l’humidité, détection de mouvements et utilisation d’un clavier numérique pour la saisie de valeurs.
Le projet sera réalisé en trois (3) étapes:
Démarrage du projet: Schéma Wokwi, écrans de départ, horloge et COM UART
Remise le 2022.12.02 – 15/40%
Code de sécurité et utilisation d’un clavier numérique
Remise le 2022.12.09 – 12/40%
Gestion des événements (codesAlarme) des capteurs du système d’alarme
Remise le 2022.12.16 – 13/40%
Étape 01 – Écrans de départ, RTC et communication UART
Pondération: 25/40 Date de remise: 2022.12.02 – 16h00
1 – Directives de l’étape 01
A) Sous WOKWI, à partir d’un système constitué des éléments suivants:
NOTE: Voir la section 4.1 pour un exemple d’utilisation de l’écran TFT ILI9341.
Un écran 4-Digit TM1637
Un RTC DS1307
UART3 (Centrale de surveillance) connecté à UART1 (Système d’alarme)
Note: cette connexion sera utilisée pour envoyer des évènements du système d’alarme vers la centrale de surveillance.
C’est à vous de fixer les broches pour la connexion des modules au MEGA.
B) À partir du code source suivant:
// 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
if (connexionALaCentrale()){
afficherPageEcran(systemeEnLigne);
}
} // setup
// ********************************************************
void loop()
// ********************************************************
{
afficherTemps();
} // loop()
// ********************************************************
void afficherPageEcran(Ecrans ecran, int delai = 0)
// ********************************************************
{
} // afficherPageEcran
// ********************************************************
void initialisationDesAppareils()
// ********************************************************
{
//Initialisation du UART de la centrale
//Initialisation du UART du système d alarme
//Initilisation du LCD
//Initialisation du TFT
//Initialisation du bouton
//Initialisation du 4-digit
//Initialisation du RTC
} // initialisationDesAppareils
// ********************************************************
boolean connexionALaCentrale()
// ********************************************************
{
// Retourner 'true' ou 'false' selon le cas.
} // connexionALaCentrale
// ********************************************************
void afficherTemps()
// ********************************************************
{
} // afficherTemps
NOTE IMPORTANTE: Vous devez démarrer votre projet à partir du code précédent et programmer les différentes fonctions en place. Si ce n’est pas le cas, votre projet sera refusé.
C) Il faut programmer une application qui:
Au démarrage, initialise, par la fonction ‘initialisationDesAppareils()‘, les différents modules connectés au MEGA ainsi que les UARTs:
Bouton, LCD, TFT, RTC, 4-Digit,
La vitesse Serial est 9600
La vitesse de UART3 et UART1 est 115200
Affiche, dans l’ordre, les écrans suivants:
AFFICHÉES pendant 2 secondes enum: ecranOuverture et centraleEcranOuverture _____________________________________________________
Il faut APPUYER sur le bouton pour passer aux écrans suivants enum: ecranInstruction _____________________________________________________
Affichés seulement suite au bouton appuyé enum: systemeEnLigne et centraleSystemeEnLigne. Note: Il est possible de les regrouper sous ‘systemeEnLigne‘. _____________________________________________________
Utilise la fonction ‘afficherPageEcran(Ecrans ecran, int delai)‘ pour l’affichage des pages écrans.
La page écran à afficher est renseignée par une valeur enum de la définition suivante:
Met en place un système de communication UART entre une centrale de surveillance (UART3) et un système d’alarme (UART1)
Suite au déclenchement du bouton, la fonction ‘boolean connexionALaCentrale()‘ est appelé:
Le système d’alarme, via UART1, envoie le code ‘evenement_systeme_enligne‘ à la centrale de surveillance via UART3.
Ce message est un élément de l’enum suivant:
Le programme attend UNE_SECONDE
La centrale de surveillance lit (if available) le code reçu.
Si le code reçu est ‘evenement_systeme_enligne‘ alors les écrans suivants seront affichés:
Si NON (en cas d’échec de connexion),
Le message suivant sera affiché dans la console de déboggage
‘Evenement non traité‘
Affiche l’heure en temps réel
L’heure est affichée sur le 4-Digit après l’écran ‘ecranOuverture‘
La lecture de l’heure et son affichage sont traités par la fonction ‘afficherTemps()‘
Le caractère ‘:‘ doit clignoter à chaque seconde (1/2 ON, 1/2 OFF)
La fonction ne doit pas être bloquante (NE PAS UTILISER de ‘Delay()‘)
Indice: ‘millis()’
Il faut:
Documenter l’entête des fonctions.
Documenter le code source.
Utiliser des noms de variables significatif.
Utiliser des noms de fonctions significatif.
Utiliser des MACRO/const pour les valeurs constantes.
Ne pas utiliser des chaines de caractères directement dans le programme (MACRO/const).
Utiliser la syntaxe suivante pour les chaines de caractères: F(« Je suis en mémoire programme »);.
Placer les #define, const, déclarations de fonctions, enum, …, dans un fichier d’entête.
Normaliser le code source, c-a-d, remplacer la redondance par des fonctions.
Grille de correction de l’étape 01
Respect du devis, commentaires, implémentation des fonctions, pages écrans
30%
Affichage de l’heure, clignotement du ‘:’ et fonction non bloquante
20%
Élaboration du schéma de connexion des éléments électroniques sous Wokwi
10%
Utilisation correct du fichier « mesdefines.h »
10%
Utilisation correct des deux enum: Ecrans et codesAlarme
10%
Communication UART entre les deux systèmes
20%
Méthode de remise de l’étape 01
LEA, au plus tard à la date mentionnée plus haut.
Il faut remettre,
1 – un fichier .zip du projet:
2 – un fichier contenant le lien vers le projet Wokwi.
Étape 02 – Code de sécurité (clavier numérique)
Utilisation d’un détecteur de mouvement et d’un clavier
Pondération: 15/40 Date de remise: 2022.12.09 – 16h00
Voici les directives de l’étape 02
ATTENTION, Il ne faut pas réaliser l’étape 02 dans le projet de l’étape 01. IL FAUT TRAVAILLER À PARTIR D’UNE COPIE.
1.0 – Afficher l’écran suivant (après le dernier écran de l’étape 01)
1.1 – Afficher le NOM du jour, le NUMÉRO du jour et le NOM du mois.
1.2 – Afficher le temps écoulé depuis le démarrage du système, en JOURS HH:MM:SS
char key = keypad.getKey();
if (key != NO_KEY) { // Si touche appuyée
valeurCle = key - 48; // convertir la valeur du caractère en valeur numérique. Par exemple, '0' vaut 48.
Serial << key;
ecranPrincipal << key;
}
3 – Connecter un détecteur de mouvement et une DEL
3.1 – Si le détecteur de mouvement est activé,
3.1.1 – il faut allumer la DEL,
3.1.2 – Afficher l’écran suivant:
3.2 – L’écran précédent est affiché pendant 30 secondes ou jusqu’à la saisie du code 5555
Si le temps est dépassé ou que le code d’alarme est invalide alors,
L’écran du point 1.0 est réaffiché
Le message suivant est affiché dans la console:
Aviser la centrale de l’intrusion
4 – Lire et valider le code d’alarme
il faut lire quatre touches à partir du clavier
faire la somme de la valeur numérique des quatre touches
Par exemple, 1 + 2 + 3 + 4 = 10. 6 + 6 + 6 + 6 = 24.
Le code valide est 5555 donc = 20.
Si le code est valide,
Éteindre la DEL
Afficher l’écran du point 1.0
Afficher dans la console le message suivant:
Code d’alarme valide
5 – Voici une animation de l’étape 02
IMPORTANT,
À partir de maintenant il faut afficher dans la console de déboggage que si la macro DEBUG est définie.
Faire clignoter le caractère ‘:’ du 4-Digit même pendant la saisie du code du système d’alarme.
Méthode de remise de l’étape 02
LEA, au plus tard à la date mentionnée plus haut.
Pour l’étape 02 de l’épreuve synthèse, il faut enregistrer votre étape 01 en ‘save copy’ sous WOKWI et travailler avec cette nouvelle copie.
Il faudra remettre un lien vers la version 02 de votre projet.
ATTENTION, Il ne faut pas réaliser l’étape 02 dans le projet de l’étape 01.
Il faut remettre,
1 – un fichier .zip du projet:
2 – un fichier contenant le lien vers le projet Wokwi.
Étape 03 – Gestion des capteurs et MSG vers la centrale
Examen en classe – 19 dec
Pondération: 10/10 Date de remise: 2022.12.19
Section 4 – Références
4.1 – Exemple d’utilisation d’un écran TFT ILI9341 (voir les exemples pointés par ce lien).
Voici les broches à utiliser, sous Wokwi, pour relier un écran TFT ILI9341 à un Arduino MEGA: