Mini-projet

En Terminale STI2D, nous avons réalisé un mini-projet avant le projet de 70h noté au BAC. Nous devions créer un système par groupes de 2 grâce aux cartes Arduino.


Une alarme

Nous devions créer une alarme selon le cahier des charges ci-dessous.

Diagramme des cas d'utilisation

Diagramme des cas d'utilisation

Je me suis occupé de la détéction d'ouverture de porte. J'ai utilisé un capteur à ultrasons puis un capteur à effet Hall.
Mon collègue s'est occupé de l'envoi de mail. Il a utilisé la bibliothèque Gsender.h

Normes

A2P
Sécurité faible.
Adaptée aux particuliers, pour faire fuir les cambrioleurs amateurs.
A2P 2
Sécurité moyenne.
Adaptée aux particuliers particulièrement exposés ou à des petits commerces.
A2P 3
Sécurité moyenne.
Adaptée aux particuliers possédant des biens de grande valeur et aux commerces moyens.

Choix du capteur

Nous avions le choix entre deux capteurs pour détecter l'ouverture de porte. Le capteur à ultrasons ou le capteur à effet Hall.

Le capteur à ultrasons

Le capteur à ultrasons permet de mesurer les distances.
En mettant le capteur à côté de la porte, quand la porte est fermée, le capteur mesure la distance entre lui et le mur ; et quand la porte est ouverte, il mesure la distance entre lui et la porte, ce qui donne une valeur plus faible.

Shema

On se sert de cet écart de distance pour détecter quand la porte est ouverte.

Cette solution n'est pas parfaite. Si quelqu'un passe devant le capteur, cela fausse les résultats.

Le capteur à effet Hall

Le capteur à effet Hall est un capteur de champ magnétique.
En mettant le capteur sur le chambranle de la porte et un aimant sur la porte, on peut détecter l'ouverture et la fermeture de la porte sans avoir de faux-positif si quelqu'un passe devant.
De plus, le capteur à effet Hall fonctionne en 3.3V, contrairement au capteur à ultrasons. Étant donné que l'ESP8266 est en 3.3V également, cela simplifie l'utilisation du capteur.


Mise en place

Pour réaliser l'alarme nous avons besoin :
  • d'un microcontrôleur équipé d'une carte WiFi
  • d'un capteur à effet Hall
  • d'un interrupteur
  • d'un bouton-poussoir
  • d'une résistance de 200Ω
  • de câbles

Détection d'ouverture de porte

Pour l'utilisation du capteur, il sufit de lire son entrée.
Le capteur fonctionne en numérique.


// ------======== Détection Porte ========------
  Serial.print("état du capteur :  ");
  Serial.println(digitalRead(Capteur));

  if (digitalRead(Capteur) == 1){
  /* clignotement LED pour montrer que la porte s'est ouverte */
  digitalWrite(LED, LOW);
  delay(100);
  digitalWrite(LED, HIGH);
  delay(100);
  digitalWrite(LED, LOW);
  delay(100);
  digitalWrite(LED, HIGH);
          

Code complet

Pour l'envoi des mail, on utilise la bibliothèque Gsender.h


#include < ESP8266WiFi.h >
#include "Gsender.h"


// ------======== Pin composant ========------


/* interupteur marche-arrêt et bouton stop */

const int BP_MA = 5;          //interrupteur à la broche D0
const int BP_HERE = 14;       //interrupteur à la broche D5
int CH = 0;               //Etat du bouton marche-arrêt
int ETAT_BP_HERE;             //Etat du bouton-poussoir
int CODE_BP_HERE;             //compteur bouton-poussoir
int temps;                    //timer avant l'envoi du mail

/* LED */
const int LED = 0;            //LED en broche D3

/* Buzzer */
int MusiquePin = 2;           //Buzzer en broche D4

/* capteur à effet Hall */
int Capteur = 16 ;


// ------======== Wi-Fi Settings ========------

const char* ssid = "LoremIpsum";             // Nom du WiFi
const char* password = "***********";   // Mot de passe du WiFi



// ==============================================================================================================
void setup() {

  /* Initialise le port série */
  Serial.begin(115200);

  // ------======== Initialise le WiFi ========-----

   WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
  }
  Serial.println("connecté au WiFi");

  // -------======== Initialise la LED ========------

  pinMode(LED, OUTPUT);
  digitalWrite(LED, LOW);

  Serial.println("LED initialisée");

  // -------======== Initialise des boutons ========------
  pinMode(BP_MA, OUTPUT);
  pinMode(BP_HERE, OUTPUT);

  Serial.println("boutons initialisés");
  // ------======== Initialise les broches ========------

  pinMode(Capteur, INPUT);

  Serial.println("capteur initialisé");


  // ------======== clignotement led pour monter que le set up est fini ========------

        digitalWrite(LED, LOW);
        delay(500);
        digitalWrite(LED, HIGH);
        delay(500);
        digitalWrite(LED, LOW);
        delay(500);
        digitalWrite(LED, HIGH);

}

// ==============================================================================================================


void loop() {

  if(digitalRead (BP_MA) == 1){                            //le bouton on/off est sur on
    if(CH == 0){
      Serial.println("interupteur sur on");
      Serial.println("on attend 30s");                     // on attend 30s après allumage pour refermer la porte
      delay(30000);
      CH = 1;
    }
    if(digitalRead (BP_MA) == 1){                          //le bouton on/off est sur on
    digitalWrite(LED, HIGH);                //La led s'allume pour indiqué que le système est sous tention

  // ------======== Détection Porte ========------
       Serial.print("état du capteur :  ");
       Serial.println(digitalRead(Capteur));

       if (digitalRead(Capteur) == 1){
    /* clignottement led pour monter que la porte c'est ouverte */
        digitalWrite(LED, LOW);
        delay(100);
        digitalWrite(LED, HIGH);
        delay(100);
        digitalWrite(LED, LOW);
        delay(100);
        digitalWrite(LED, HIGH);



    // ------======== envoie mail ========-----

/* voleur ou propriétaire ? */


    /* Timer */
    temps = 0;
    ETAT_BP_HERE = 0;
    while( temps <= 20 ){
      if(digitalRead(BP_HERE) == 1){
        ETAT_BP_HERE = 1;
        Serial.println("ah? c'est vous?");

        /* signial de detection de bouton */
          digitalWrite(LED, LOW);
          delay(200);
          digitalWrite(LED, HIGH);
          delay(200);
          digitalWrite(LED, LOW);
          delay(200);
          digitalWrite(LED, HIGH);

          temps = 30;
      }
      delay(1000);
      temps++;  //ajoute +1 à "temps", tant que "temps" est inférieur à 30
      Serial.println("on attend");
    }

    Serial.println("temps de battement depassé");


/* envoie du mail */
    if(ETAT_BP_HERE == 0){
     /* envoie du mail */
        Gsender *gsender = Gsender::Instance();     // Getting pointer to class instance
    String subject = "Alerte intrusion";
    if(gsender->Subject(subject)->Send("tatoup779@gmail.com", "Une personne est rentrer chez vous !")) {
        Serial.println("Message send.");
    }
    /* si il na pas reussi a envoyé le mail */
    else {
        Serial.print("Error sending message: ");
        Serial.println(gsender->getError());
    }


      }      // fin si ce n'es pas le proprietaire
    }        // fin si la porte est ouverte
  }          // fin si le bouton marche arret est sur on après les 30s
}            // fin si le boutons marche arret est sur on

else{                                         // si l'interupteur n'est pas sur on
  if(CH == 1){
    CH = 0;
  }
  Serial.println("interupteur sur off");
  digitalWrite(LED, LOW);                     // on eteins la led

}         // fin si interupteur sur off


}         // fin loop