Publié le

Collier wifi pour chien (ESP8266)

Mathieu m’a demandé si je pouvais lui faire un système pour être prévenu lorsque Stuart (son chien) n’est plus à portée du wifi. Du coup je me suis lancé dans la confection d’un prototype ainsi que d’une interface de contrôle.

1. Le prototype :

Je suis habitué à travailler avec l’ESP8266 donc naturellement je vais l’utiliser ici.

Le prototype est assez simple (mais relativement efficace !) :

IMG_0923

Je passe sur les branchements, voici le fichier :

#include <ESP8266WiFi.h>
#define led 2

const char* ssid     = "Livebox-4246-ext";
const char* password = "";

const char* host = "192.168.1.50";

void setup() {
  Serial.begin(115200);
  delay(10);
  pinMode(led,OUTPUT);
  digitalWrite(led,LOW);
  
  // We start by connecting to a WiFi network

  Serial.println();
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);
  
  WiFi.begin(ssid, password);
  
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  Serial.println("");
  Serial.println("WiFi connected");  
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
}

int value = 0;

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

  Serial.print("connecting to ");
  Serial.println(host);
  
  // Use WiFiClient class to create TCP connections
  WiFiClient client;
  const int httpPort = 80;
  if (!client.connect(host, httpPort)) {
    Serial.println("connection failed");
    return;
  }
  
  // We now create a URI for the request
  String url = "/stuart/stuart.php";
  
  Serial.print("Requesting URL: ");
  Serial.println(url);
  
  // This will send the request to the server
  client.print(String("GET ") + url + " HTTP/1.1\r\n" +
               "Host: " + host + "\r\n" + 
               "Connection: close\r\n\r\n");
  delay(10);
  
  // Read all the lines of the reply from server and print them to Serial
  while(client.available()){
    String line = client.readStringUntil('\r');
    Serial.print(line);
  }
  
  Serial.println();
  Serial.println("closing connection");

  delay(60000);
}

 

 

IMG_0929

Voici la version sans les leds.

La vidéo suivante vous montre le passage de l’état non connecté (led rouge) à connecté (led verte) :

 

2. La partie récupération des données et traitement :

Pour le moment j’ai tout hébergé sur mon NAS synology.

J’ai donc créé dans un premier temps deux tables :

  • Une « detection » qui va enregistrer le timestamp de la dérnière connexion de l’ESP8266
  • Une « suivit » pour activer/désactiver le tracking.

2.1 L’alimentation de la table détection :

J’ai créé un script php qui ajoute juste à ma table le temps php :

<?php
   include("connexionDB.php");

   $date = time();
   mysql_query("INSERT INTO detection (datedetection) VALUES ('$date')");
 echo $date;
?>

2.2 Le contrôle de la surveillance :

Bon Mathieu ne vas pas surveiller Stuart H24, donc il fallait trouver un système pour ne pas créer d’alerte quand on éteint le boitier.

J’ai donc ajouté la table suivit pour savoir si oui ou non on surveille le chien :

<?php 
$page = $_SERVER['PHP_SELF'];
$sec = "5";
include("connexionDB.php");
$req2 = mysql_query("SELECT * FROM suivit ORDER BY rowid DESC LIMIT 1");
   $data2 = mysql_fetch_array($req2);
   
   $etat_suivit = $data2['etat_suivit'];
?>

<style>
    html, body {
   margin: 0;
   padding: 20;
        width:100%;
   height: 100%;
}
    
    div#contenu 
    {
     
   border:none;
        width:100%;
   min-height:100%;
   
    }
    
</style>


<html>
    <head>
   <!-- <meta http-equiv="refresh" content="<?php echo $sec?>;URL='<?php echo $page?>'"> -->
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, user-scalable=no">
          <link rel="stylesheet" type="text/css" href="css/style.css" />
        <title>Gestion tracker</title>
    </head>
    <body>
        <!-- Menu d'entête : -->
        
        <?php if($etat_suivit == 1) {
         $date = time();
   $req = mysql_query("SELECT * FROM detection ORDER BY rowid DESC LIMIT 1");
   $data = mysql_fetch_array($req);
   $last = $data['datedetection'];
   $ecart = $date-$last;
         ?>
         Temps depuis la dernière détection : <?php echo $ecart; ?> sec <Br>
         <?php
        }
        ?>
        <!-- Menu Gauche : -->
        Etat du tracker : 
        
         <div style="width: 50%; height: 10%; float: left ;" class="switch demo">
         <form method='POST' action="post.php">

   
   <input type="checkbox" name="myCheckbox" value="on"
   <?php
   $req2 = mysql_query("SELECT * FROM suivit ORDER BY rowid DESC LIMIT 1");
   $data2 = mysql_fetch_array($req2);
   
   $etat_suivit = $data2['etat_suivit'];
   if ($etat_suivit == 1) {
      ?>
      CHECKED
      <?php
   }
   ?>
   > 
   
   <label><i></i></label>
   
   </div>
   <div style="width: 50%; height: 10%; float: left ;">
   <input type="submit" name="Envoyer" value="Envoyer" />
   </div>
   </form>
   
        
    </body>
</html>

Et le fichier post.php :

<?php 
include("connexionDB.php");


if(isset($_POST['myCheckbox']) && $_POST['myCheckbox']=="on")
{
    $myCheckbox='1';
}
else
{      
    $myCheckbox='0';
}

mysql_query("INSERT INTO suivit(etat_suivit) VALUES ('$myCheckbox')");
         
?>

<SCRIPT LANGUAGE="JavaScript"> 
document.location.href="gestion.php" 
</SCRIPT> 

 

C’est pas du grand art, mais c’est juste dans un premier temps faire des tests, voilà ce que ça donne :

IMG_0932 [162328]IMG_0933 [162329]

 

2.3 Le système d’alerte :

Alors petit fichier php toujours, que mon NAS va exécuter toutes les minutes :

<?php
   

   include("connexionDB.php");
   $date = time();
   $req = mysql_query("SELECT * FROM detection ORDER BY rowid DESC LIMIT 1");
   $data = mysql_fetch_array($req);
   $last = $data['datedetection'];
   $ecart = $date-$last;
   echo $ecart;

   $req2 = mysql_query("SELECT * FROM suivit ORDER BY rowid DESC LIMIT 1");
   $data2 = mysql_fetch_array($req2);
   
   $etat_suivit = $data2['etat_suivit'];
   echo $etat_suivit ;
?>

<?php
if ($ecart > 65 && $etat_suivit > 0) {
$to = "j.pgarcia@me.com";
$subject = "Alerte Stuart";
$body = "Stuart est hors de porté wifi depuis ".$ecart." secondes !";
$headers = 'From: ESP8266 Stuart';

mail($to, $subject, $body, $headers);


}


?>

Et voilà pour le moment !