Arduino : Un Bandeau LED commandé par Ethernet ?

Arduino : Un Bandeau LED commandé par Ethernet ?
Note de l’utilisateur

Bonjour, suite à la lecture de cette article sur le blog de toute la domotique, j’ai eu envi de me lancer dans l’aventure Arduino.

Un Ardunio Késako ? c’est un microcontroleur. Pour etre plus pragmatique, c’est un une carte électronique avec des entrées sorties (numérique et analogique) et un « processeur » qui permet de piloter le tout via des programmes (en C++) qu’on lui inject.

Ce premier article sur le sujet sera dédié à une petite trouvaille, un bandeau LED RGB addressable. Et comme il faut pouvoir l’intégrer dans notre environnement Domotique, on ajoutera une carte ethernet pour piloter notre bandeau par le réseau (en http).

1/ Le matos

Alors pour notre recette, il faut mettre dans notre marmitte :

  •  1 Arduino (uno dans mon cas) :

  • Un shield ethernet :
  • Un bande RGB Addressable (= où l’on peu commander séparément chaque LED)

En ce qui me concerne, j’ai acheter le tout sur ce site http://www.alpha-crucis.com/.

D’un point de vu tarif, cela reste raisonnable : Arduino Uno (20€) + Ethernet (30€) + Bande LED (30€) = 80€ Surtout qu’il sera possible de completer le tout avec des capteurs de températures / humidité, luminosité, etc pour moins de 10 € chaque capteur.

2/ Le montage

Le montage reste assez simple.

- Connecter l’Arduino et et Shield :

Alimenter la bande led (5V – 12V), j’ai utilisé l’une des multiples alimentations de bidules HS ou remisés :

Connecter l’entré de commande (le fils blanc) et la masse du bandeau :

Pour facilité la connexion via un BreadBord, j’ai découpé le contour en plastique de la fiche transparante. Il est sinon possible d’utiliser des jumpers femelles

Coté Arduino il faut connecter le fils de masse à l’un des nombreux connecteur Gnd et l’entré data à l’un des ports digitaux (non utilisé par le shield) : 7 dans mon exemple.

Mélangez bien, voila le montage final :

3/ Le codage

Pour contrôler notre bande, il existe une libraire Arduino toute faite :-) que vous pourrez retrouver sur cette page.

En utilisant les examples trouvé sur le web voila le code complète qui permet de générer la page web de commande et de lancer les fonctions.

> Le code principal

#include <PololuLedStrip.h>
#include <SPI.h>
#include <Ethernet.h>

// Create an ledStrip object on pin 12.
PololuLedStrip<7> ledStrip;

// Create a buffer for holding 60 colors.  Takes 180 bytes.
#define LED_COUNT 30
rgb_color colors[LED_COUNT];

byte mac[] = {
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192,168,10, 177);
EthernetServer server(80);
String readString = String(30); //string for fetching data from address

String LEDON = ""; //LED status flag

void setup() {
 // Open  communications and wait for port to open:

  // start the Ethernet connection and the server:
  Ethernet.begin(mac, ip);
  server.begin();
  Serial.begin(9600);

}

void loop(){
  // Create a client connection
  EthernetClient client = server.available();
  if (client) {
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        //read char by char HTTP request
          if (readString.length() < 30) {
            //store characters to string
            readString+=c;
          }
          //output chars to serial port
          Serial.print(c);
          //if HTTP request has ended
          if (c == '\n') {
            //lets check if LED should be lighted
            if(readString.indexOf("L=K2000") >=0) { LEDON = "K2000" ;}
            else if(readString.indexOf("L=Variation") >=0) { LEDON = "Variation";}
            else if(readString.indexOf("L=StarTrek") >=0) { LEDON = "StarTrek" ;}
            else if (readString.indexOf("?") >=0) { LEDON = "";}
            // now output HTML data starting with standart header
            client.println("HTTP/1.1 200 OK");
            client.println("Content-Type: text/html");
            client.println();
            //send first heading
            client.println("<font color='red'><h1>HTTP test routines</font></h1>");
            client.println("<br /><hr />");//some space between lines
            //controlling led via checkbox
            client.println("<h1>LED control</h1>");
            //address will look like http://192.168.1.110/?L=1 when submited
            client.println("<form method=get name=LED><input type=CHECKBOX name=L value=K2000>K2000<br><input type=CHECKBOX name=L value=StarTrek>StarTrek<br><input type=CHECKBOX name=L value=Variation>Variation<br><input type=submit value=submit></form>");
            client.println("<br />");
            //printing LED status
            client.print("<font size='5'>LED status: ");
            client.println("<font color='green' size='5'>"+LEDON);
            client.println("</body></html>");
            //clearing string for next read
            readString="";
            //stopping client
            client.stop();

        }
      }
    }
  }
  if(LEDON=="Variation") {Variation();}
  else if (LEDON == "K2000") {K2000();}
  else if (LEDON == "StarTrek") {StarTrek();}
  else {blanc();}
}

Comme je suis un geek, j’ai fait quelques effets amusants :

Un K200

> K2000

void K2000() {
  // Update the colors.
  static boolean sens = true;
  static int y = 0;
  static unsigned long previousMillis =0;

  unsigned long currentMillis = millis();
  if(currentMillis - previousMillis > 50) {

    //byte time = millis() >> 5;
    //byte y = time % LED_COUNT;
    for(byte i = 0; i < LED_COUNT; i++)
    {
      //byte x = time - 8*i;
      byte red;
      if(i > y) {
        red = 0;
      }
      else {
        red = 255/(1+(y-i)*32);
      }
      if (sens) {
        colors[i] = (rgb_color){
          red, 0, 0        };
      }
      else {
        colors[LED_COUNT-1-i] = (rgb_color){
          red, 0, 0        };
      }
    }
    // Write the colors to the LED strip.
    ledStrip.write(colors, LED_COUNT);

    y++;

    //delay(40);
    Serial.println(y);
    if (y == (LED_COUNT)) {
      Serial.println("Changement de sens.");
      sens = !sens;
      y=0;
    }
    previousMillis = currentMillis;
  }
}

Un chenillard à la StarTrek

> Chenillard StarTrek
void StarTrek() {
  // Update the colors.
  static int y = 0;
  static unsigned long previousMillis =0;

  unsigned long currentMillis = millis();
  if(currentMillis - previousMillis > 75) {

    //byte time = millis() >> 5;
    //byte y = time % LED_COUNT;
    for(byte i = 0; i < LED_COUNT/2; i++)
    {
      //byte x = time - 8*i;
      byte red;
      if(i > y) {
        red = 0;
      }
      else {
        red = 255/(1+(y-i)*32);
      }

      colors[i] = (rgb_color){ red, 0, 0};
      colors[LED_COUNT-1-i] = (rgb_color){ red, 0, 0};
    }
    // Write the colors to the LED strip.
    ledStrip.write(colors, LED_COUNT);

    y++;

    //delay(40);
    Serial.println(y);
    if (y == (LED_COUNT/2)) {
      y=0;
    }
    previousMillis = currentMillis;
  }
}

Un variateur pour passer par toutes les couleurs possibles

> Variateur de couleurs
void Variation() {
  // Update the colors.
  static unsigned long y = 0;
  static unsigned long previousMillis =0;

  unsigned long currentMillis = millis();
  if(currentMillis - previousMillis > 1) {

    byte red,green,blue;
    red = y;
    green = y >> 4;
    blue = y >> 8;
    //byte time = millis() >> 5;
    //byte y = time % LED_COUNT;
    for(byte i = 0; i < LED_COUNT; i++)
    {
      colors[i] = (rgb_color){ red, green, blue};
    }
    // Write the colors to the LED strip.
    ledStrip.write(colors, LED_COUNT);

    y++;
    if(blue==255) y=0;
    previousMillis = currentMillis;
  }
}

void blanc() {
  // Update the colors.
  static unsigned long previousMillis =0;

  unsigned long currentMillis = millis();
  if(currentMillis - previousMillis > 1000) {

    for(byte i = 0; i < LED_COUNT; i++)
    {
      colors[i] = (rgb_color){ 0, 0, 0};
    }
    // Write the colors to the LED strip.
    ledStrip.write(colors, LED_COUNT);

    previousMillis = currentMillis;
  }
}

4/ Le résultat

J’ai fait une petite vidéo pour montrer le résultat obtenu :

5/ Le Bilan

Maintenant nous avons donc un bandeau LED RGB qui peut à la demande, changer de couleur ou effectuer des motifs pré-définis. Mais a quoi cela peut-il bien servir me direz-vous ? Pour faire un « retour utilisateur » !

il existe dans les gammes domotiques de nombreux capteurs et actionneurs, par contre le nombre de module permettant à l’utilisateur de visualiser l’état de son système domotique est faible. Bien sur ,le plus connu de tous est le Karotz (ex Nabaztag). Vous pouvez le faire parler ou faire de la couleur a volonté. Maintenant vous pourrez également utiliser l’éclairage. Faire varier la couleur du bandeau en fonction de la consommation de l’habitat, déclencher un chenillard  en cas d’alarme… Tout est possible avec une petite dose d’imagination :-)

Il faut bien sur avoir l’âme un peu bidouilleur pour se lancer dans l’aventure, mais j’ai été surpris et séduis par la facilité de mise en route et la grande communauté supportant Arduino.

9 Commentaires

  1. avatar
    Algeroth 6 septembre 2012 à  14 h 10 min - Reply

    Sympa comme article! Cela donne une idée de nombreuses choses que l on peut réaliser avec un arduino et shields ethernet pour de la domotique!

    • avatar
      Antor 6 septembre 2012 à  20 h 21 min - Reply

      Salut Algeroth,

      Effectivement cela ouvre pas mal de porte. J’ai également commandé une carte wifi pour couper les fils et des capteurs de plusieurs types … j’en parlerai probablement dans un prochain article.

  2. avatar
    mika 6 septembre 2012 à  15 h 37 min - Reply

    bonjour.
    top site et super article qui donne envie.
    je suis curieux de savoir comment on peu associer une box eedomus a une carte Arduino.
    pour ce qui est de faire varier la couleur du bandeau en fonction de la consommation de l’habitat, vous récupérer la conso sur une box? possible?

    • avatar
      Antor 6 septembre 2012 à  20 h 19 min - Reply

      Bonjour Mika,

      Je suis pas un expert de l’eedomus (mais je devrais pouvoir la tester bientôt :-)), mais le principe reste le même. On passe par des sondes virtuels internet. L’Arduino héberge un simple page web qui permet de passer les ordres.

      Pour récupérer la consommation de l’habitat tu peux utiliser un capteur Zwave par pince (AEO_HEM2) et l’on récupère les valeurs via la box domotique Eedomus ou Vera.

  3. avatar
    yanick 13 novembre 2012 à  0 h 29 min - Reply

    bonjour
    je viens de recevoir mon ruban a led adressable de 60 led je viens de tester votre montage j’ai modifie dans le code le count remplace par count 60 mais mon ruban ne reagit pas de facon correct y a t il d’autre parametres a ajuster?
    merci

  4. avatar
    Philippe 6 mai 2013 à  16 h 43 min - Reply

    Si tu veux faire des économies avec les cartes wifi et ethernet, je te conseille le raspberry pi, il est à 45$ avec ethernet inclus, tu sais ajouter un dongle wifi USB pour qques euros de plus. tu peux ensuite l’utiliser pour piloter un arduino via son port série ;)
    raspberry tourne sous linux, donc facile d’y installer un serveur genre apache et du php pour hoster les pages web de l’application domotique.

  5. avatar
    Patator 23 mai 2013 à  13 h 07 min - Reply

    Bonjour,
    petite question: quel outils utilisez-vous pour coder sous arduino? N’y a-t-il que l’outil de développement standard ou existe-t-il des plugins pour des outils de développement existants?
    Merci

    • avatar
      Antor 24 mai 2013 à  11 h 47 min - Reply

      Bonjour Patator,

      Il existe un IDE pour Arduino qui permet de coder, de charger les librairies, de compiler, et d’envoyer sur la carte. Tu le trouveras sur le site d’Arduino : http://arduino.cc/fr/Main/DebuterInstallation

      • avatar
        Patator 24 mai 2013 à  13 h 03 min - Reply

        OK, merci :)

Laisser un commentaire