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
Name | Contribution |
---|---|
BALAN Fabrice | Recherche pour l'état de l'art Recherche sur les composants à utiliser Codage du projet Préparation des slides pour la soutenance Vidéo |
MAHTALI Mohamed | Recherche 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
Business Aspect
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.
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
Challenges & Motivation
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
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); }