WebPlug: la domotique en utilisant un arduino

Bonjour à tous.

Aujourd’hui, je vais vous montrer un des trucs les plus cools que l’on puisse faire avec un arduino: contrôler des appareils. Nous allons, avec très peu de choses, entrer de plein pied dans la domotique! Quand je dis “appareils”, je parle de vos lampes, de votre grille-pain…

Voici de quoi vous aurez besoin:

  • Tout d’abord, un Arduino. N’importe quel modèle conviendra. J’utilise un vieux Mega 1280 parce qu’il a beaucoup d’I/O, mais même le petit Mini Pro de chez sparkfun ferait l’affaire.

  • Ensuite, il nous faut un Shield Ethernet. J’utilise l’officiel, mais là encore il existe de nombreux modèles qui feraient l’affaire.
  • Des cartes à relais. J’ai trouvé des cartes opto-isolées à 4 relais chez YourDuino . Ils vendent des trucs dingues à de super prix, je vous les recommande fortement. 8 dollars pour une carte à 4 relais, c’est une super affaire. Ils vendent aussi des cartes à 1 et 8 relais.
  • Il vous faudra aussi quelques câbles.

Il nous faudra quelques autres trucs pour terminer le projet, mais en attendant c’est déjà pas mal.

Etape 1: le module ethernet.

La première chose à faire c’est de faire fonctionner le module ethernet. Assemblez les deux et branchez-les:

Ensuite, uploadez l’exemple “WebServer” de l’IDE arduino. Ensuite, utilisez votre navigateur pour aller à l’adresse IP spécifiée au tout début du code (et qui devrait être 192.168.1.177):

Cool, l’arduino répond! On peut passer à l’étape suivante!

Etape 2: contrôler les I/O sur commande

Maintenant, nous avons besoin de contrôler les entrées/sorties digitales en utilisant des URL. J’ai trouvé un tuto super sympa à ce propos sur le site de bildr. Le but est d’allumer et d’éteindre des LEDs, je l’ai donc un peu modifié pour qu’il corresponde à mes besoins:

//ARDUINO 1.0+ ONLY
//ARDUINO 1.0+ ONLY

#include <Ethernet.h>
#include <SPI.h>
boolean reading = false;

const int DLY = 100;
const int RLY1 = 30;
const int RLY2 = 31;
const int RLY3 = 32;
const int RLY4 = 33;

byte ip[] = { 192, 168, 0, 177 };   //Manual setup only
byte gateway[] = { 192, 168, 0, 1 }; //Manual setup only
byte subnet[] = { 255, 255, 255, 0 }; //Manual setup only

// if need to change the MAC address (Very Rare)
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };

EthernetServer server = EthernetServer(80); //port 80

void setup(){
  Serial.begin(9600);

  pinMode(RLY1, OUTPUT);
  pinMode(RLY2, OUTPUT);
  pinMode(RLY3, OUTPUT);
  pinMode(RLY4, OUTPUT);

  Serial.println("Testing relays...");

  for (int i=RLY1; i<=RLY4; i++) {
    digitalWrite(i, LOW);
    delay(DLY);
    digitalWrite(i, HIGH);
    delay(DLY);
    digitalWrite(i, LOW);
    delay(DLY);
  }

  Ethernet.begin(mac);
  //Ethernet.begin(mac, ip, gateway, subnet); //for manual setup

  server.begin();
  Serial.println(Ethernet.localIP());
}

void loop() {
  checkForClient();
}

void checkForClient(){

  EthernetClient client = server.available();

  if (client) {

    // an http request ends with a blank line
    boolean currentLineIsBlank = true;
    boolean sentHeader = false;

    while (client.connected()) {
      if (client.available()) {

        if(!sentHeader){
          // send a standard http response header
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println();
          sentHeader = true;
        }

        char c = client.read();

        if(reading && c == ' ') reading = false;
        if(c == '?') reading = true; //found the ?, begin reading the info

        if(reading){
           switch (c) {
            case '1':
              Serial.println("RLY1 ON");
              triggerPin(RLY1, true, client);
              break;

            case '2':
              Serial.println("RLY2 ON");
              triggerPin(RLY2, true, client);
              break;

            case '3':
              Serial.println("RLY3 ON");
              triggerPin(RLY3, true, client);
              break;

            case '4':
              Serial.println("RLY4 ON");
              triggerPin(RLY4, true, client);
              break;

            case '5':
              Serial.println("RLY1 OFF");
              triggerPin(RLY1, false, client);
              break;

            case '6':
              Serial.println("RLY2 OFF");
              triggerPin(RLY2, false, client);
              break;

            case '7':
              Serial.println("RLY3 OFF");
              triggerPin(RLY3, false, client);
              break;

            case '8':
              Serial.println("RLY4 OFF");
              triggerPin(RLY4, false, client);
              break;
          }
        }

        if (c == '\n' && currentLineIsBlank)  break;

        if (c == '\n') {
          currentLineIsBlank = true;
        } else if (c != '\r') {
          currentLineIsBlank = false;
        }
      }
    }

    delay(1); // give the web browser time to receive the data
    client.stop(); // close the connection:
  }
}

void triggerPin(int pin, boolean on, EthernetClient client){
  if (on == false) {
    digitalWrite(pin, HIGH);

    client.print("Turning off relay ");
    client.println(pin);
    client.print("<br>");
  } else {
    digitalWrite(pin, LOW);

    client.print("Turning on relay ");
    client.println(pin);
    client.print("<br>");
  }
  delay(DLY);
}

Maintenant, branchez la carte à relais: (I/O 30 -> relais 1, 1/0 31 -> relais 2 et ainsi de suite):

Ulploadez le code et ouvrez le Serial Monitor. Vous devriez entendre les relais cliqueter. Voici une vidéo que j’ai faite avec un délai un peu plus court (CLY=10) et deux carte de quatre relais:

En voici une autre. Cette fois ci j’utilise mon iPhone pour accéder à distance aux relais. Pour y parvenir, il vous faudra paramétrer votre box pour rediriger le port voulu vers l’arduino.

Voici la première partie du projet terminée, maintenant il nous faut une boite pour y mettre notre projet.