Une simple guirlande 16 leds

Je viens de créer une simple petite guirlande ronde avec une uno, 16 leds, 4 résistances et du fil téléphonique 4 paires ou réseau.
On utilise une matrice 4x4 pour allumer les leds, une seule à la fois on active les 4 premières broches avec du 5v et les 4 suivantes avec du 0v,

le branchement pas très compliqué

le code :

// une guirlande à 16 led et 4 résistances
// 8 sorties sont utilisés en mode pultiplexage
// pour simplifier la programmation j'ai utilisé le port D de la uno qui comprend les 8 premères pins, de 0 à 7 qui seront configurées en sortie
// les pins 0, 1, 2 et 3 sont les bornes positive et activera ligne par ligne les leds
// les pins 4, 5, 6 et 7 sont les masses si leurs états est à 0 la led s'allume 0=masse, et 1=5v
// 

unsigned long t1=0, t2=0; // t1 sert de base temps pour chaque animation,  t2 pour changer d'animation toutes les 10 secondes
byte c1=1,c2=1,pr; // divers compteur pour les animations
int dir=1; // sert à faire défiler certaine animatin dans un sens ou un autre
boolean b1; // sert à l'animation n°9

void setup() {
  DDRD=0xFF;    // met les broches de 0 à 7 en output, c'est très simple en utilisant le portD
 }

void loop() {
  unsigned long time=millis(); // mémorise le temps
  
  if (time>t2) { t2=t2+10000; pr=random(1, 20);}  // toutes les 10 secondes  on change d'animation aléatoirement
//pr=19;
switch (pr)
  {
  case 1:  { // animation 1   
    led(1+(-time/50)%16);
   
   break;}  
  
  case 2:  { // animation 2
    if (time>t1) { t1=t1+50; c1++;}
    if (c1>16) c1=1;
    if (c1==c2) c2=c1-1; 
    if (c2<1) c2=16;
    led(c1);
    led(c2);

   break;}  
  
  case 3:  { // etc ...
   if (time>t1) { t1=t1+300; c1++;}
   int l=c1+sin(time/150.0)*9+8;
   led((l)%16+1);
 
   break;}  

  case 4:  { 
    led(1+(time/50)%8);
    led(9+(time/50)%8);
    
    break;} 
    
  case 5:  { 
    if (time>t1) { t1=t1+50; c1=random(0, 17);}
    led(c1); 
    break;}
    
  case 6:  { 
    if (time>t1) { t1=t1+150; c1+=4;}
    if (c1>16) c1=1; 
    led(c1); led(c1+1); led(c1+2); led(c1+3);
    break;}    
    
  case 7:  { 
    if (time>t1) { t1=t1+200; c1=random(0, 17); c2=random(0, 17);} 
    led(c1); led(c2); 
    break;}  
  
  case 8:  { 
     led(1+(time/10)%16); 
   break;}  
  
  case 9:  { 
    if (time>t1) { t1=t1+200; b1=!b1;}
    if (b1) { led(1);led(3);led(5);led(7);} else {led(9);led(11);led(13);led(15);} 
    break;} 
   
  case 10:  {  
     led(16-(time/50)%16); 
    break;}  
   
  case 11:  { 
    if (time>t1) { t1=t1+20; c1=random(0, 17);}
    led(c1); 
    break;}
    
  case 12:  { 
    if (time>t1) { t1=t1+200; c1++;}
    if (c1>8) c1=1;
    led(c1); led(17-c1);
    break;}
    
  case 13:  { 
    if (time>t1) { t1=t1+50; c1++;}
    if (c1>4) {c1=1; c2++;  }
    if (c2>12) c2=0;
    led(c1+c2); 
    break;}   
    
  case 14:  { 
    if (time>t1) { t1=t1+100; c1++;} 
    led(sin(time/150.0-c1)*9+8);
   
    break;}   
    
   case 15:  {   
    led(sin(time/150.0)*9+8);
   
    break;}  
    
   case 16:  {  
    int l=time/700.0 + sin(time/300.0)*17;
    led(1+l%16);
   
    break;}  
    
   case 17:  {  
     led(1+(5+time/190)%16);
     led(1+(10-time/15)%16);
   
   break;}     
   
   case 18:  {  
     led(1+(time/190)%16);
     led(1+(8+time/190)%16);
     led(1+(-time/50)%16);
   
   break;}      
   
   case 19:  {  
    c1=200-(time/20)%400;   
    led(1+(time/ (200-c1))%16);
 
   
   break;} 

  }
}

void led(int x){ // fonction pour allumer le feu ( une seule led à la fois )

switch (x)
  {                                      // le bit de droite est la pin 0 et le bit complètement à gauche la pin 7
   case 1:  { PORTD=B11100001 ; break;}  // pin 0 à 5v, et pin 4 à 0v au croisement des deux fils branché à ces bornes la led s'allume
   case 2:  { PORTD=B11010001 ; break;}
   case 3:  { PORTD=B10110001 ; break;}
   case 4:  { PORTD=B01110001 ; break;}
  
   case 5:  { PORTD=B11100010 ; break;}
   case 6:  { PORTD=B11010010 ; break;}
   case 7:  { PORTD=B10110010 ; break;} 
   case 8:  { PORTD=B01110010 ; break;}
  
   case 9:  { PORTD=B11100100 ; break;}
   case 10: { PORTD=B11010100 ; break;}
   case 11: { PORTD=B10110100 ; break;}
   case 12: { PORTD=B01110100 ; break;}
   
   case 13: { PORTD=B11101000 ; break;}
   case 14: { PORTD=B11011000 ; break;}
   case 15: { PORTD=B10111000 ; break;}     
   case 16: { PORTD=B01111000 ; break;} 
  }
}

La vidéo ...

le code peut encore être amélioré et ajouté des animations ...

[edit 1/11/2016] ajout de 3 animations il y en à 19 maintenant ...
La vidéo et les 19 animations...

Merci c’est super.

C’est , une bonne idée pour noël .
cela serai bien d’avoir des séquences différentes d'animations .

pour le moment le code comprend 19 animations qui changent toutes les 10 secondes j'en rajouterai certainement

Salut, est-ce que l'ont peut mettre plus de 16 leds ??? merci

Merci ca fonctionne très bien et c'est tres décoratif