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;}
}
}
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...