2022.ES

20 novembre 2022

Objets connectés, Épreuve Synthèse (40%)


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:

  1. Démarrage du projet: Schéma Wokwi, écrans de départ, horloge et COM UART
    • Remise le 2022.12.02 – 15/40%
  2. Code de sécurité et utilisation d’un clavier numérique
    • Remise le 2022.12.09 – 12/40%
  3. 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:



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:

  1. 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
  2. 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‘.
      _____________________________________________________

  3. 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:
  4. 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é
  5. 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()’
  6. 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 écrans30%
Affichage de l’heure, clignotement du ‘:’ et fonction non bloquante20%
Élaboration du schéma de connexion des éléments électroniques sous Wokwi10%
Utilisation correct du fichier « mesdefines.h »10%
Utilisation correct des deux enum: Ecrans et codesAlarme 10%
Communication UART entre les deux systèmes20%

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)

2 – Ajouter un clavier numérique au projet:


2.2 – Voici comment lire les touches du clavier:

    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

4 – Lire et valider le code d’alarme


5 – Voici une animation de l’étape 02

IMPORTANT,


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:

Et pour les librairies:

#include "SPI.h"
#include "Adafruit_GFX.h"
#include "Adafruit_ILI9341.h"