Arduino : Un Bandeau LED commandé par Ethernet ?

Arduino : Un Bandeau LED commandé par Ethernet ?
User rating

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.

This post is also available in: French