Interrupteur commandé par téléphone mobile


Une commande sans fil n'a rien d’extraordinaire en soi mais lorsque celle-ci est pilotée par son téléphone et qu'elle est en plus très compacte et pas chère alors cela devient très intéressant pour nos applications de modélisme ferroviaire.

Le relais WiFi:

Nous avions déjà proposé une commande sans fil des aiguilles basée sur des composants Arduino et petite radio en WiFi. Celle-ci était destinée à commander au moins 4 moteurs d'aiguilles avec un module de puissance. Pour commander un accessoire, des barrières de passage à niveau, voire un signal, il faut un montage plus simple et plus facile à placer. En faisant les magasins virtuels on trouve parfois son bonheur.
Ainsi, nous avons trouvé un petit relais WiFi qui est disponible sur un site marchand bien connu (lien suivant ESP8266 5V Wifi Relay Module TOI APP Controled Pour Smart Home Automation Board).
En fait, c'est un microcontrôleur très intégré avec un petit module WiFi tout aussi compact. L'ensemble est connecté sur une micro-carte sur laquelle se trouve le relais 5V. 

Vue de l'interrupteur connecté

L'objet est livré non programmé, donc on ne peut pas s'en servir immédiatement. Il est donc nécessaire de le programmer et pour cela il faut un petit adaptateur (lien suivant USB to ESP8266 ESP-01 ESP-01S Serial Wireless Wifi Adapter Module CH340G Driver). Ce n'est pas compliqué mais encore faut-il avoir le code.

Vue de l'objet dans son boitier

Le code:

Voici le code que l'on écrit dans son environnement préféré (ex: IDE Arduino) et qu'il faudra télécharger dans le processeur ESP. Je suis parti d'un exemple trouvé sur le Net. Le principe est de créer un petit client qui se connectera à serveur avec une adresse fixe et qui se met en attente des commandes que l'on va envoyer avec une petite application sur son smartphone.

La partie setup() du code sert à démarrer le serveur qui se connecte à votre réseau Wi-Fi.
Il y a aussi, en commentaires, un petit test du relais que l'on peut essayer pour s'assurer que le relais fonctionne bien.

Dans le programme principal (loop()), on attend que le client se connecte et puis on traite les commandes reçues. Celles-ci ont une syntaxe particulière mais pas du tout complexe, qui est imposée par le constructeur.

A noter que l'on peut utiliser son navigateur Web sur son PC pour envoyer des commandes HTTP. Cela est très intéressant pour des tests et/ou une application plus complète sur le PC.

/*
 *  This sketch demonstrates how to set up a simple HTTP-like server.
 *  The server will set a GPIO pin depending on the request
 *    http://server_ip/gpio/0 will set the GPIO2 low,
 *    http://server_ip/gpio/1 will set the GPIO2 high
 *    http://192.168.1.144/gpio/1
 *  server_ip is the IP address of the ESP8266 module, will be 
 *  printed to Serial when the module is connected.
 */

#include <ESP8266WiFi.h>

const char* ssid = "Votre réseau WiFi";
const char* password = "Votre mot de passe";

// Create an instance of the server
// specify the port to listen on as an argument
WiFiServer server(80);

void setup() {
  //Serial.begin(115200);
  Serial.begin(9600);
  delay(10);

  // Test relais 
  // prepare GPIO2
  //pinMode(2, OUTPUT);
  //digitalWrite(2, 0);
  
  // Connect to 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");
  
  // Start the server
  server.begin();
  Serial.println("Server started");

  // Print the IP address
  Serial.println(WiFi.localIP());
}

void loop() {
  // Check if a client has connected
  WiFiClient client = server.available();
  if (!client) {
    return;
  }
  
  // Wait until the client sends some data
  Serial.println("new client");
  while(!client.available()){
    delay(1);
  }
  
  // Read the first line of the request
  String req = client.readStringUntil('\r');
  Serial.println(req);
  client.flush();
  
  // Match the request
  int val;
  val = 2;
  if (req.indexOf("/gpio/0") != -1){
    val = 0;
    byte close[] = {0xA0, 0x01, 0x01, 0xA2};
    Serial.write(close, sizeof(close));
  }
  if (req.indexOf("/gpio/1") != -1){
    val = 1;
    byte open[] = {0xA0, 0x01, 0x00, 0xA1};
    Serial.write(open, sizeof(open));
  }
  if (val = 2) {
    Serial.println("invalid request");
    client.stop();
    return;
  }

  // Set GPIO2 according to the request
  //digitalWrite(2, val);
  
  client.flush();

  // Prepare the response
  String s = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n<!DOCTYPE HTML>\r\n<html>\r\nGPIO is now ";
  s += (val)?"high":"low";
  s += "</html>\n";

  // Send the response to the client
  client.print(s);
  delay(1);
  Serial.println("Client disonnected");

  // The client will actually be disconnected 
  // when the function returns and 'client' object is detroyed
}

L'Appli sur le smartphone:

Il faut une petite application pour se connecter à notre petit relais WiFi. Ceci ne manque pas sur le "store". A titre d'exemple j'ai pris WiFi Controller car elle est simple et ne m'inonde pas trop de publicité. L'adresse IP ainsi que le numéro de port sont à saisir dans l'appli. Dans mon exemple, ces données sont fournies par la "box" locale. Attention, car par défaut l'adresse et le numéro de port sont affectés par la box et ces données changent à chaque connexion de l'objet; c'est ce qu'on appelle le DHCP. Ainsi, il convient de fixer ces données en associant l'adresse IP, le numéro du port et l'adresse du matériel de l'objet connecté (adresse MAC qui est visible sur la box). 


Connexion au serveur

Ensuite, on doit configurer sur l'appli les deux touches "ON" et "OFF". Pour la commande "ON", on aura la séquence suivante en hexadécimal A0-01-01-A2. Pour la commande "OFF", on aura la séquence suivante en hexadécimal  A0-01-00-A1.

Commandes

Il ne reste plus qu'à tester!

Objet connecté:

Les premiers tests sont faits avec notre petit objet connecté (l'interrupteur) à vide. Mettre sous tension et connecter le WiFi Controller en sélectionnant la bonne adresse IP, puis appuyer sur le symbole de connexion, enfin appuyer sur "ON" et enfin écouter le relais claquer. On peut vérifier avec un multimètre que le contact est fermé.
Pour ouvrir le contact du relais, on sélectionne à nouveau l'adresse IP, puis on se reconnecte à l'objet  et enfin il faut appuyer sur "OFF". Le relais claque à nouveau. On peut vérifier avec un multimètre que le contact est ouvert.
Pour économiser l'énergie, le client est déconnecté après chaque commande. S'il n'y a aucune contrainte d'énergie pour votre application, alors il suffit de modifier le code. 

Le test final est fait avec un signal à LED. C'est simple et le résultat est visible facilement. A l'intérieur tout va bien mais à l'extérieur on peut être limité par la portée du WiFi. Il y a encore des progrès à faire de ce côté là. 

A vous d'essayer !