2021-L3-Galilee-IoT : Cherch'Objet

Notre projet à pour but d'aider les gens qui égarent trop souvent leurs objets du quotidien. Il est composé de 3 esp8266 qui se communiquent entre eux et aussi à tout appareil pouvant utiliser un navigateur web via un Webserver.

Slides & Videos

Members

NameContribution
BALAN FabriceRecherche pour l'état de l'art
Recherche sur les composants à utiliser
Codage du projet
Préparation des slides pour la soutenance
Vidéo
MAHTALI MohamedRecherche et rédaction de l'état de l'art
Recherche sur les composants à utiliser
Le montage
Préparation des slides pour la soutenance
Les diagrammes
Rédaction du rapport

State of the Art

Technical Aspect

Quel est le principe de fonctionnement du GPS ?

Grace a ce dispositif on peut savoir ou on se situe n’importe où sur terre. Il fonctionne
grâce à un système composé d’une trentaine de satellites en orbite autour de la
Terre. Les satellites envoient sur Terre des signaux qui comportent leurs positions dans l’espace, l’heure et la date d’émission du signal. La puce GPS qui se trouve dans nos appareils permet de capter les signaux de ces dits satellites.
Pour permettre de se localiser il faut un minimum de 4 satellites : 3 qui vont se charger
de la localiser par trilatération (comme la triangulation, avec un calcul de distances, mais
sans calcul des angles) et un autre pour la synchronisation car une différence de 1
microseconde correspond à environ 300m de la position.

Bluetooth - Fonctionnement

Le Bluetooth est une norme de communication sans fil permettant qui permet aux appareils électroniques d’échange de données. Il utilise des ondes radio en ultra haute fréquence sur la bande de fréquence de 2,4 GHz (utilise aussi par le wifi). Cette bande est répartie en 79 canaux de 1 MHz et émet un signal très faible. Sa portée est très réduite, et est utile pour les transferts de données à courte distance.

Le Bluetooth est basé sur un mode de fonctionnement dit maître/esclave. Pour assurer la sécurité de la norme, une connexion Bluetooth se fait généralement suivant la procédure :

Mode passif : en attente d’une connexion

Phase d’inquisition : découverte des points d’accès

Synchronisation avec le point d’accès (paging)

Découverte des services du point d’accès

Création d’un canal avec le point d’accès

Pairage à l’aide d’un code PIN (sécurité)

Utilisation du réseau

Wifi - modes de fonctionnement

Un réseau wifi utilise des ondes radio sur une fréquence de 2.4 GHz (comme le Bluetooth). Pour fonctionner et transmettre les données, un appareil doit posséder un adaptateur sans fil qui lui permet de traduire des données en signal radio. Ce dernier est envoyé au routeur qui permet de le décoder et de l’envoyer sur internet grâce à une connexion Ethernet. Dans l’autre sens, les données provenant d’internet passent par le routeur pour être transformées en un signal radio qui sera capté par l’adaptateur sans fil de l’appareil.

Project Description

Problem Definition
Il arrive souvent, à tout le monde, de perdre des objets utilisés au quotidien. Souvent, ces objets là sont dans la même pièce que nous et, il nous arriver de passer des heures, voire une journée, avant de les retrouver.
Challenges & Motivation
Nous partageons tous les deux un point commun : nous sommes souvent tête en l’air et cela nous arrive souvent de perdre nos affaires. Donc, on s’est dit que pourquoi ne pas créer un objet nous permettant de retrouver nos objets perdus.

Il nous fallait trouver la meilleure solution pour implémenter notre idée. D’après nos recherches, il que nous est venu l’idée de créer un boitier qu'on va accrocher à nos objets et qui émet du son en se servant d'une télécommande servant aussi de station wifi. Et on a créé le webserver a utilisé sur pc, smartphone et autres car il peut arriver aussi qu'on perd la télécommande.
Real and Complete Usecases

 

 

Technical Description

Les ESP 8266 utilisent la technologie ESP NOW pour se communiquer. La liaison est en mode bi-directionnel entre les boitier et la télécommande. A chaque appuie sur le bouton poussoir, les boitiers envoient l’état du Buzzer par esp-now.

La télécommande sert aussi a créé un point d’accès afin d’avoir un réseau wifi local pour que les boitiers et aussi pour que d’autres appareils utilisant le wifi puissent se connecter. Et grâce un webserver configurer sur la télécommande et les boitiers, on peut avoir accès aux boitiers a partir d’un ordinateur ou d’un smartphone.

En se connectant au Wifi de la télécommande, pour avoir accès au contrôle aux boitiers et aussi pour voir leur état, il faut se rendre sur le site : 192.168.4.20 pour les deux, ou encore sur 192.168.4.100 pour le boitier 1 et 192.168.4.200 pour le boitier 2.

Hardware

Materials
ImageNamePart NumberPriceCountLink
ESP 826674257537799127,79 €3🛒
Led B073CYK8X5 0.1€2🛒
Bouton poussoirB00H3CVRGY0.1€4🛒
BuzzerB07RDHNT1P0.69€2🛒
Schematic

Software

Arduino Code

#include 
#include 

//etat des Objets
bool etat1 = false ; 
bool etat2 = false ;
String etatBuzzer1 = "off";
String etatBuzzer2 = "off";

// Callback when data is sent : verifier si on a bien envoye le msg
void OnDataSent(uint8_t *mac_addr, uint8_t sendStatus);

// Callback when data is received : recevoir msg
void OnDataRecv(uint8_t * mac, uint8_t *incomingData, uint8_t len); 

const int bouton1 = D5 ;
const int bouton2 = D6 ;

char * ssid = "MON PROJET IoT" ;
char * password = "sapasgadew" ;

// MAC Address commande 
uint8_t Obj1Addresse[] = {0xD8, 0xBF, 0xC0, 0x14, 0xBC, 0x24};
uint8_t Obj2Addresse[] = {0xD8, 0xBF, 0xC0, 0x14, 0x09, 0x26};


// Set web server port number to 80
WiFiServer server(80);

// Variable to store the HTTP request
String header;


// Current time
unsigned long currentTime = millis();
// Previous time
unsigned long previousTime = 0; 
// Define timeout time in milliseconds (example: 2000ms = 2s)
const long timeoutTime = 2000;


IPAddress ip(192,168,4,20);
IPAddress gateway(192,168,4,9);
IPAddress subnet(255,255,255,0);
  
void setup() 
{
  Serial.begin(115200);
  pinMode (bouton1, INPUT_PULLUP) ;
  pinMode (bouton2, INPUT_PULLUP) ;
  
  // Set device as a Wi-Fi soft ap Station
  WiFi.mode(WIFI_AP_STA);

  WiFi.softAPConfig(ip, gateway, subnet);
  WiFi.softAP(ssid,password);

  //configurer esp now

  if (esp_now_init() != 0) {
    Serial.println("Error initializing ESP-NOW");
    return;
  }

  // ESP-NOW mode
  esp_now_set_self_role(ESP_NOW_ROLE_COMBO);

  //Objet 1
  esp_now_add_peer(Obj1Addresse, ESP_NOW_ROLE_COMBO, 1, NULL, 0) ;
  //Objet 2
  esp_now_add_peer(Obj2Addresse, ESP_NOW_ROLE_COMBO, 1, NULL, 0) ;

  esp_now_register_send_cb(OnDataSent);
  esp_now_register_recv_cb(OnDataRecv);

  server.begin();

}

   bool test = false ;
   
void loop() 
{
   WiFiClient client = server.available();   // Listen for incoming clients

  if (client) 
  {                             
    Serial.println("New Client.");          
    String currentLine = ""; 
    currentTime = millis();
    previousTime = currentTime;
    
    while (client.connected() && currentTime - previousTime <= timeoutTime) 
    { 
      currentTime = millis();         
      if (client.available()) {             
        char c = client.read();             
        header += c;
       
        if (c == '\n') 
        {                    
          if (currentLine.length() == 0) {
            
            if (header.indexOf("GET /1/on") >= 0) 
            {
              Serial.println("Obj1 ON");
              etatBuzzer1 = "on";
              etat1 = true ;
              esp_now_send(Obj1Addresse, (uint8_t *) &etat1, sizeof(etat1));
            } 
            
            else if (header.indexOf("GET /1/off") >= 0) 
            {
              Serial.println("Obj1 OFF");
              etatBuzzer1 = "off";
              etat1 = false ;
              esp_now_send(Obj1Addresse, (uint8_t *) &etat1, sizeof(etat1));
            } 
            
            else if (header.indexOf("GET /2/on") >= 0) 
            {
              Serial.println("Obj2 ON");
              etatBuzzer2 = "on";
              etat2 = true ;
              esp_now_send(Obj2Addresse, (uint8_t *) &etat2, sizeof(etat2));
            } 
            
            else if (header.indexOf("GET /2/off") >= 0) 
            {
              Serial.println("Obj2 OFF");
              etatBuzzer2 = "off";
              etat2 = false; 
              esp_now_send(Obj2Addresse, (uint8_t *) &etat2, sizeof(etat2));
            }
            
            client.println("");
            client.println("");
            client.println("");
            
            client.println("");
            
            client.println("

Controle des objets

"); if(etat1) etatBuzzer1 = "on" ; else etatBuzzer1 = "off" ; if(etat2) etatBuzzer2 = "on" ; else etatBuzzer2 = "off" ; client.println("

Objet 1 - Etat " + etatBuzzer1 + "

"); if (etatBuzzer1=="off") client.println("

"); else client.println("

"); client.println("

Objet 2 - Etat " + etatBuzzer2 + "

"); if (etatBuzzer2=="off") client.println("

"); else client.println("

"); client.println(""); client.println(); break; } else currentLine = ""; } else if (c != '\r') currentLine += c; // add it to the end of the currentLine } } header = ""; client.stop(); Serial.println("Client disconnected."); } int bouton1_etat = digitalRead(bouton1); if (bouton1_etat == LOW) //si on appuie sur le bouton { etat1 = !etat1 ; //changement d'etat delay(1000) ; esp_now_send(Obj1Addresse, (uint8_t *) &etat1, sizeof(etat1)); } int bouton2_etat = digitalRead(bouton2); if (bouton2_etat == LOW) //si on appuie sur le bouton { etat2 = !etat2 ; //changement d'etat delay(1000) ; esp_now_send(Obj2Addresse, (uint8_t *) &etat2, sizeof(etat2)); } } // verifier si on a bien envoye les donnees void OnDataSent(uint8_t *mac_addr, uint8_t sendStatus) { if (sendStatus == 0) Serial.println("Delivery success"); else Serial.println("Delivery fail"); } //recevoir donnee void OnDataRecv(uint8_t * mac, uint8_t *incomingData, uint8_t len) { bool verife = true ; for(int i = 0 ; i < 6 ; i++ ) { if(mac[i] != Obj1Addresse[i] ) { verife = false ; break; } } if(verife) memcpy(&etat1, incomingData, sizeof(etat1)); else memcpy(&etat2, incomingData, sizeof(etat2)); }
#include 
#include 

// Replace with your network credentials
char * ssid = "MON PROJET IoT" ;
char * password = "sapasgadew" ;

//etat
bool etat = false;
String etatBuzzer = "off";

// MAC Address commande 
uint8_t CommandeAddress[] = {0x10, 0x52, 0x1C, 0x02, 0x4C, 0xAC};

//port
const int buzzer = D5 ;
const int bouton = D3 ;
const int led = D4 ;

//configurer ip static
IPAddress ip(192,168,4,100);
IPAddress gateway(192,168,4,9);
IPAddress subnet(255,255,255,0);

// Web Server port 80
WiFiServer server(80);

String header;

// Current time
unsigned long currentTime = millis();
// Previous time
unsigned long previousTime = 0; 
// Define timeout time in milliseconds (example: 2000ms = 2s)
const long timeoutTime = 2000;

void setup() {
  Serial.begin(115200);
  
  pinMode (buzzer, OUTPUT) ;
  pinMode (led, OUTPUT) ;
  pinMode (bouton, INPUT_PULLUP);
  
  //Configure wifi
  WiFi.mode(WIFI_STA);
  
  Serial.print("Connection a :");
  Serial.println(ssid);
 
  WiFi.config(ip,gateway,subnet);
  WiFi.begin(ssid, password);
 
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  Serial.println("");
  Serial.println("Wifi connecte");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());

  
  //configuration espnow
  if (esp_now_init() != 0) {
    Serial.println("Erreur ESP-NOW");
    return;
  }

  // ESP-NOW mode
  esp_now_set_self_role(ESP_NOW_ROLE_COMBO);
  esp_now_add_peer(CommandeAddress, ESP_NOW_ROLE_COMBO, 1, NULL, 0);
  
  //fonction envoyer et recevoir
  esp_now_register_send_cb(OnDataSent);
  esp_now_register_recv_cb(OnDataRecv);
  
  server.begin();
}

void loop(){
  if(WiFi.status() != WL_CONNECTED)
    digitalWrite(led, LOW);

  else
    digitalWrite(led, HIGH);
  
  WiFiClient client = server.available(); 

  if (client) 
  {                            
    Serial.println("New Client."); 
    String currentLine = "";       
    currentTime = millis();
    previousTime = currentTime;
    
    while (client.connected() && currentTime - previousTime <= timeoutTime) 
    { 
      currentTime = millis();         
      
      if (client.available()) 
      {    
        char c = client.read();
        header += c;
        
        if (c == '\n') 
        {                    
          if (currentLine.length() == 0) 
          {
            if (header.indexOf("GET /1/on") >= 0) 
            {
              Serial.println("BUZZER on");
              etat = true ;
              tone(buzzer,10);
              esp_now_send(CommandeAddress, (uint8_t *) &etat, sizeof(etat));
            } 
            
            else if (header.indexOf("GET /1/off") >= 0) 
            {
              Serial.println("BUZZER off");
              etat = false ;
              noTone(buzzer);
              esp_now_send(CommandeAddress, (uint8_t *) &etat, sizeof(etat));
            } 
                        
            client.println("");
            client.println("");
            client.println("");
            
            client.println("");
            
            client.println("

Objet 1

"); if(etat) etatBuzzer = "on" ; else etatBuzzer = "off" ; client.println("

Etat sonnerie - " + etatBuzzer + "

"); if (etatBuzzer=="off") client.println("

"); else client.println("

"); client.println(""); client.println(); break; } else currentLine = ""; } else if (c != '\r') currentLine += c; } } header = ""; client.stop(); Serial.println("Client disconnected."); } int bouton_etat = digitalRead(bouton); // read new state if (bouton_etat == LOW) //si on appuie sur le bouton { etat = !etat ; //changement d'etat delay(1000) ; sonner(etat); esp_now_send(CommandeAddress, (uint8_t *) &etat, sizeof(etat)); } } void sonner(bool action) { if(action) { Serial.println("Bouton ON"); tone(buzzer,10); } else { Serial.println("Bouton OFF"); noTone(buzzer); } } //verifier si on a bien envoye les donnees void OnDataSent(uint8_t *mac_addr, uint8_t sendStatus) { if (sendStatus == 0) Serial.println("Delivery success"); else Serial.println("Delivery fail"); } // fonction recevoir donnee void OnDataRecv(uint8_t * mac, uint8_t *incomingData, uint8_t len) { memcpy(&etat, incomingData, sizeof(etat)); Serial.print("Recu: "); Serial.println(etat); sonner(etat); }

External Services