Electronique > Les bases

7 / Vu-mètre amélioré

Nous allons repartir du montage : 6/ vu-mètre et changer les LEDS par 2 anneaux de 8 LED.
L'objectif est d'arriver à ce résultat :

I/ L'anneau de 8 LED (WS2818).

Cette anneau est composé de 8 LEDS RVB (Rouge, Vert, Bleu). Pour chaque LED, on peux choisir ses couleurs ainsi que sa luminosité. L'association de couleurs nous permet de former d'autres couleurs (Orange, jaune, blanc...).

Attention, à l'achat les connecteurs ne sont ni soudés, ni fournis. Ce sera à vous de les souder.

L'anneau possède 4 broches :

  • 5V
  • GND
  • DI (Input / Entrée)
  • DO (Output / Sortie)

DI / DO permet de mettre plusieurs anneaux en série.

Pour piloter l'anneau LED, nous allons utiliser la bibliothèque de HobbyComponent : https://github.com/HobbyComponents/HCWS2812

  • Télécharger la librairie en cliquant sur download et download ZIP.
  • Dézipper le fichier.
  • Renommer le dossier en HCWS2812
  • Copier le dossier dans votre dossier libraries :
    • Sous windows : Mes Documents/Arduino/libraries
    • Sous mac : Documents/Arduino/libraries
  • Redémarrer votre IDE Arduino.

II/ Le schéma

La particularité dans ce montage est qu'on utilise une alimentation de breadboard pour alimenter les anneaux de LED. En effet, à pleine puissance et toutes les LEDS alumées, elles peuvent tirer un courant trop important pour l'arduino. Par contre il est important d'alimenter le micro avec l'arduino pour que l'entrée analogique est la même référence de tension.

III/ Le branchement sur Breadboard

Rien de particulier sur le montage. SI vous avez soudé des pins sur les anneaux LED vous pouvez les brancher directement sur votre BreadBoard.

IV/ Le programme

Les 2 anneaux de LED vont avoir une plage de mini / maxi différentes (qui correspond à aucune led allumée et toutes les led allumées) pour réagir de manière différente.

L'anneau de droite :

  • Son mini va etre mesuré au démarrage de l'arduino et ne vas plus bouger.
  • Son maxi va etre mesuré à chaque boucle et réinitialiser toutes les 40 mesures.

L'anneau de gauche :

  • Son mini / maxi va etre mesuré à chaque boucle.
  • Son mini / maxi va etre réinitialiser toutes les 20 mesures.

N'hésiter pas à laisser un commentaire si vous avez des questions supplémentaires.

/*

Ce programme utilise la librairie fourni par HobbyComponents.
Vous pouvez la télécharger sur le forum :
http://forum.hobbycomponents.com/viewforum.php?f=58

Ou sur leur Github 
https://github.com/HobbyComponents/HCWS2812

*/

// On inclue la bibliotheque HCWS2812.
#include "HCWS2812.h"
HCWS2812 HCWS2812;

// On déclare les variables qu'on va utiliser dans le programme.
int microAnalog,index,val;
int mini_ambiant,maxi_ambiant,mini_sample,maxi_sample,sample,val_ambiant,val_sample;

void setup() 
{
  mini_ambiant = mini_sample = 1023;
  maxi_ambiant = maxi_sample = 0;
  sample = 0;

  //On éteint toutes les LEDS.
  HCWS2812.SetBG(0, 0, 0);
  HCWS2812.ClearBuffer();

  // échantillonage du mini ambiant
  for(index = 0; index < 16; index++) {
    // On allume les LEDS en verte une par une
    // pour montrer la progression.
    RGBBuffer[GREEN][index] = (index +1) * 14 ;
    HCWS2812.Refresh();

    // On lit la valeur retournée par le micro
    microAnalog = analogRead(0);

    // On la stocke si elle est plus petite que le mini.
    if(microAnalog<mini_ambiant)
      mini_ambiant=microAnalog; 
    delay(100);
  }

  //On éteint toutes les LEDS.
  HCWS2812.ClearBuffer();
  delay(1000);

  // On définit les Maxi
  maxi_ambiant=mini_ambiant+4;
  maxi_sample=maxi_ambiant;
}

void loop() 
{
  // On lit la valeur retournée par le micro
  microAnalog = analogRead(0);

  // La plage Mini / Maxi va etre différente sur l'anneau gauche et droit.
  // Sur l'anneau gauche (sample) on va réinitialiser le mini et le maxi toutes les 20 mesures
  // Il sera plus réactif / dynamique.
  if(sample%20==0) {
    maxi_sample=mini_sample+4;
    mini_sample=1023;
  }
  // Sur l'anneau droit (ambiant) on va réinitialiser uniquement le maxi toutes les 40 mesures.
  if(sample%40==0) {
    maxi_ambiant=mini_ambiant+6;
  }
  sample++;
  
  // A chaque boucle on enregistre le maxi des 2 anneaux
  if(microAnalog>maxi_ambiant) {
    maxi_ambiant=microAnalog;
  }
  if(microAnalog>maxi_sample) {
    maxi_sample=microAnalog;
  }
  // Et le mini de l'anneau gauche pour avoir une plage dynamique.
  if(microAnalog<mini_sample)
     mini_sample=microAnalog; 

  // On éteint toutes les LEDS
  HCWS2812.ClearBuffer();

  // La fonction MAP va permettre de retourner une valeur proportionnelle (entre 1 et 9) à la valeur  mini / maxi.
  // C'est un produit en croix.
  //  1 et 9 -  correspond au nombre de LED, (+1 : pour toutes allumées).
  val_ambiant = map(microAnalog, mini_ambiant, maxi_ambiant, 1, 9);
  val_sample = map(microAnalog, mini_sample, maxi_sample, 1, 9);

  // On allume les LED en fonction de la valeur retournée (entre 1 et 9)
  // VERT 1 - 12%
  if(val_ambiant>0) {
    RGBBuffer[GREEN][0] = 30;
  }
  if(val_sample>0) {
    RGBBuffer[GREEN][8] = 30;
  }
  delay(10);
  HCWS2812.Refresh();

  // VERT 2 - 24%
  if(val_ambiant>1) {
    RGBBuffer[GREEN][1] = 60;
  }
  if(val_sample>1) {
    RGBBuffer[GREEN][15] = 60;
  }
  delay(10);
  HCWS2812.Refresh();

  // VERT 3 - 36%
  if(val_ambiant>2) {
    RGBBuffer[GREEN][2] = 90;
  }
  if(val_sample>2) {
    RGBBuffer[GREEN][14] = 90;
  }
  delay(10);
  HCWS2812.Refresh();

  // ORANGE 1 - 47 %
  if(val_ambiant>3) {
    RGBBuffer[RED][3] = 120 ;
    RGBBuffer[GREEN][3] = 77; 
  }
  if(val_sample>3) {
    RGBBuffer[RED][13] = 120 ;
    RGBBuffer[GREEN][13] = 77;    
  }
  delay(10);
  HCWS2812.Refresh();

  // ORANGE 2 -  59% 
  if(val_ambiant>4) {
    RGBBuffer[RED][4] = 150 ;
    RGBBuffer[GREEN][4] = 97;
  }
  if(val_sample>4) {
    RGBBuffer[RED][12] = 150 ;
    RGBBuffer[GREEN][12] = 97;
  }
  delay(10);
  HCWS2812.Refresh();

  // ORANGE 3 - 71%
  if(val_ambiant>5) {
    RGBBuffer[RED][5] = 180 ;
    RGBBuffer[GREEN][5] = 116;
  }
  if(val_sample>5) {
    RGBBuffer[RED][11] = 180 ;
    RGBBuffer[GREEN][11] = 116;
  }
  delay(10);
  HCWS2812.Refresh();

  // ROUGE 1 - 82%
  if(val_ambiant>6) {
    RGBBuffer[RED][6] = 210 ;
  }
  if(val_sample>6) {
    RGBBuffer[RED][10] = 210 ;
  }
  delay(10);
  HCWS2812.Refresh();

  // ROUGE 2 - 95%
  if(val_ambiant>7) {
    RGBBuffer[RED][7] = 240 ;
  }
  if(val_sample>7) {
    RGBBuffer[RED][9] = 240 ;
  }
  delay(10);
  HCWS2812.Refresh();

  // Si le volume ambiant dépasse 8 
  // on allume les 2 anneaux LED en blanc à pleine puissance
  if(val_ambiant>8) {
    for(index = 0; index < 16; index++) {
      RGBBuffer[RED][index] = 255 ;
      RGBBuffer[GREEN][index] = 255 ;
      RGBBuffer[BLUE][index] = 255 ;
    }
    HCWS2812.Refresh();
    delay(200);
  }
}