dessine moi un m0u10n

amis du duino bonjour,

ce post aurait pu être à la suite de mon post sur les led mais il peut aussi tout a fait faire l'objet d'un fil de discussion.

si tu veux pas tout lire, vas au fond
voici du code destiné à allumer et éteindre une led

void setup() 

{  
          
  // initialize the digital pin as an output.
 
  pinMode(13, OUTPUT);
 pinMode(12, OUTPUT);


}


void loop() 

{
//allume eteins led 13


  digitalWrite(13, HIGH);   // set the LED on
  delay(50);              // wait for a second
  digitalWrite(13, LOW);    // set the LED off
  delay(50);              // wait for a second


}

je prends ce code, admetons que je copie colles et que je le modifie avec les valeurs pour la led 12

//allume eteins led 12

digitalWrite(12, HIGH);   // set the LED on
  delay(50);              // wait for a second
  digitalWrite(12, LOW);    // set the LED off
  delay(50);              // wait for a second

super ma question est la suivante:

comment fait on pour creer un bout de code et le mettre dans une """"function""" ou qqch comme ça, de manière à pouvoir l'appeller quand bon me semble

si par exemple je créé une fonction qui sappelle led 13 qui a pour action allume eteint led 13, puis une autre fonction led 12 (allume etein led 12), puis je ferai pareil pour les autres, 11, 10 ,9 etc...

comment juste l'apeller, comme ça je peux plus facilement creer des combinaisons.

j'espere que ma question est claire.

en gros si tu veux pas lire =====> comment creer une fonction qui execute du code lorsqu'on l'apelle.

merki

void setup() {  
   pinMode(13, OUTPUT);
   pinMode(12, OUTPUT);
}

void loop() {
  led12();
  led13();
}

void led13() {
  digitalWrite(13, HIGH);  
  delay(50); 
  digitalWrite(13, LOW);
  delay(50);
}

void led12() {
  digitalWrite(12, HIGH); 
  delay(50);        
  digitalWrite(12, LOW);   
  delay(50);
}

http://www.siteduzero.com/tutoriel-3-14189-apprenez-a-programmer-en-c.html

:roll_eyes: ben oauis logique et simple :slight_smile:

merci

cool... maintenant attention niveau 2 de difficulté!

if j'appuies sur un bouton poussoir alors led 1
if j'appuies sur bouton poussoir a nouveau alors led 2
if j'appuies one again sur bouton poussoir, alors eteint.

ça s'ecrit betement

if (){

led1()}

if (){
led2()
}

bon il faut aussi venir seter la fonction btn poussoir
????

Il te faut un flag comme on dit, ça donne un truc genre :

int flag=0;

void loop(){
if (digitalread(9)==HIGH && flag ==0) {
led1();
flag++;
}

if (digitalread(9)==HIGH && flag ==1) {
led2();
flag++;
}

if (digitalread(9)==HIGH && flag ==2) {
ledoff();
flag=0;
}
}

J'oubliais : faudra surement mettre des delay() après chaque appuie, pour éviter de balayer les 3 fonctions en même temps

AlienArea51:
bonsoir
personnellement je ferai une interruption sur appui d'un bouton ==> increment d'un compteur et un switch case !

Les grands esprits se rencontrent ^^

byte cmp =0; // compteur d'index

void setup(){
	pinMode(9,INPUT); // bouton poussoir
	pinMode(10,OUTPUT); // led 1
	pinMode(11,OUTPUT); // led 2
}

void loop(){
	if(digitalRead(9) == HIGH){
	switch(cmp){
		case 0:
			led1();
			cmp++;
			break;
		case 1:
			led2();
			cmp++;
			break;
		case 2:
			cmp =0;
			break;
	}
}
delay(500); // anti rebond
}

void led1(){
  digitalWrite(10, HIGH);  
  delay(50); 
  digitalWrite(10, LOW);
  delay(50);
}

void led1(){
  digitalWrite(11, HIGH);  
  delay(50); 
  digitalWrite(11, LOW);
  delay(50);
}

ou pour les fou du c++

byte cmp =0; // compteur d'index

void setup(){
	pinMode(2,INPUT); // bouton poussoir
             digitalWrite(2,HIGH); // pull-up
	pinMode(10,OUTPUT); // led 1
	pinMode(11,OUTPUT); // led 2
             attachInterrupt(0,trigger, FALLING);
}

void loop(){

}

void trigger(){
	if(digitalRead(9) == HIGH){
	switch(cmp){
		case 0:
			led1();
			cmp++;
			break;
		case 1:
			led2();
			cmp++;
			break;
		case 2:
			cmp =0;
			break;
	}
}
delay(500); // anti rebond
}

void led1(){
  digitalWrite(10, HIGH);  
  delay(50); 
  digitalWrite(10, LOW);
  delay(50);
}

void led1(){
  digitalWrite(11, HIGH);  
  delay(50); 
  digitalWrite(11, LOW);
  delay(50);
}

yéééééééééé, alors super phase finale avant finalisation du projet...
j'ai placé un piezzo sur ma paroi, et j'aimerais éventuellement un micro....

priorité piezzo....

alors comme vous m'avez expliqués, je peux changer mes sequences avec un bouton poussoir mais là ce serait cool avec un piezzo.

quand je frappe sur mon piezzo, hop ça changerais de séquence.

j'ai lu un peu de doc sur le sujet, j'ai vu qu'il fallait régler un threshold...

niveau brochage le fil rouge de mon piezzo (+)... sur un pin en analog in
et le noir (-) sur le gnd de mon arduino... non de mon supeeeeer arduino

ensuite micro

ce serait hyper cool d'avoir ma voix, ou un son en entrée micro qui fais vu metre avec mes leds...

plus y a de son plus j'augmente l'intensité de mes leds... qq à un exemple de ça.

sumarize...

comment parametrer piezzo pour switch de sequence.

comment micro in ===> vu metre

j'ai bien trouvé ça mais ça balance un string via un port... moi juste lancer une sequence me convient

vj_muddy:
priorité piezzo....

alors comme vous m'avez expliqués, je peux changer mes sequences avec un bouton poussoir mais là ce serait cool avec un piezzo.

quand je frappe sur mon piezzo, hop ça changerais de séquence.

j'ai lu un peu de doc sur le sujet, j'ai vu qu'il fallait régler un threshold...

niveau brochage le fil rouge de mon piezzo (+)... sur un pin en analog in
et le noir (-) sur le gnd de mon arduino... non de mon supeeeeer arduino

Tu trouvera ton bonheur avec ces deux liens.

vj_muddy:
ensuite micro

ce serait hyper cool d'avoir ma voix, ou un son en entrée micro qui fais vu metre avec mes leds...

plus y a de son plus j'augmente l'intensité de mes leds... qq à un exemple de ça.

La réponse à tout les projets: sonelec-musique.com !
http://www.sonelec-musique.com/electronique_realisations_vumetre_007.html

vj_muddy:
comment parametrer piezzo pour switch de sequence.

tu utilise l'exemple knock pour détecter l'impact sur le piezo puis tu lance une fonction (if(knock == blabla) faireQuelquechose():wink: comme si c'etait un bouton en fait.
L'utilisation d'un micro directement avec un arduino n'est pas vraiment possible (sauf FFT et encore).

vj_muddy:
j'ai bien trouvé ça mais ça balance un string via un port... moi juste lancer une sequence me convient

http://www.arduino.cc/en/Tutorial/KnockSensor

#define THRESHOLD 100
#define SENSOR A0

void setup() {
}

void loop() {
  if (analogRead(SENSOR) >= THRESHOLD) {
    faireQuelqueChose();
  }
}

faireQuelqueChose(){
  // TODO
}

C'était pourtant pas compliquer :wink:

merci à toi, j'ai essayé de compiller le code, il me dit que je dois typer le fairequelquechose...

du coup j'ai fais ça :

#define THRESHOLD 100
#define SENSOR A0




void setup() {
  
  pinMode(12, OUTPUT);
}

void loop() {
  if (analogRead(SENSOR) >= THRESHOLD) {
   digitalWrite(12, HIGH);
  }
}

mais ma led reste allumée quoi qu'il arrive...

vj_muddy:
merci à toi, j'ai essayé de compiller le code, il me dit que je dois typer le fairequelquechose...

du coup j'ai fais ça :

#define THRESHOLD 100

#define SENSOR A0

void setup() {
 
 pinMode(12, OUTPUT);
}

void loop() {
 if (analogRead(SENSOR) >= THRESHOLD) {
  digitalWrite(12, HIGH);
 }
}





mais ma led reste allumée quoi qu'il arrive...

Normal :wink: la fonction fairequelquechose c'est toi qui doit la crée :wink: et pour ton code il fait ce qu'on lui dis, si il detecte un knock il alume la led point, rien ne lui dit de l'eteindre donc elle reste alumé.

#define THRESHOLD 100
#define SENSOR A0

void setup() {
}

void loop() {
  if (analogRead(SENSOR) >= THRESHOLD) {
    faireQuelqueChose();
  }
}
 
/* exemple */
void faireQuelqueChose(){
  digitalWrite(12, HIGH);
  delay(500);
  digitalWrite(12, LOW);
}

thks,

mais dans l'exemple que tu cite :

/* exemple */
void faireQuelqueChose(){
digitalWrite(12, HIGH);
delay(500);
digitalWrite(12, HIGH);

c''est pas plutot delay 500 puis digital write (12, LOW)?

vj_muddy:
thks,

mais dans l'exemple que tu cite :

/* exemple */
void faireQuelqueChose(){
digitalWrite(12, HIGH);
delay(500);
digitalWrite(12, HIGH);

c''est pas plutot delay 500 puis digital write (12, LOW)?

DOH! oui :blush:

Edit : j'ai fait la modif :wink:

hey hey heyyyyy, salut à tous, alors me revoilà moi, mon pc et mon duino :grin:

grace à votre aide, j'ai pu réaliser mon super interrupteur piezzo.

avec ce code :

#define THRESHOLD 100
#define SENSOR A0

void setup() {
}

void loop() {
  if (analogRead(SENSOR) >= THRESHOLD) {
    faireQuelqueChose();
  }
}
 
/* exemple */
void faireQuelqueChose(){
  digitalWrite(12, HIGH);
  delay(500);
  digitalWrite(12, LOW);
}

bien maintenant j'aimerais combiner ceci avec l'explication qui m'a été donné sur l'interrupteur avec compteur d'index, dans l'exemple si la pin d'entrée 9 est en position high, alors executer le reste de la commande.

byte cmp =0; // compteur d'index

void setup(){
	pinMode(9,INPUT); // bouton poussoir
	pinMode(10,OUTPUT); // led 1
	pinMode(11,OUTPUT); // led 2
}

void loop(){
	if(digitalRead(9) == HIGH){
	switch(cmp){
		case 0:
			led1();
			cmp++;
			break;
		case 1:
			led2();
			cmp++;
			break;
		case 2:
			cmp =0;
			break;
	}
}
delay(500); // anti rebond
}

void led1(){
  digitalWrite(10, HIGH);  
  delay(50); 
  digitalWrite(10, LOW);
  delay(50);
}

void led1(){
  digitalWrite(11, HIGH);  
  delay(50); 
  digitalWrite(11, LOW);
  delay(50);
}

mais etant donné qu'ici, si le thersold est supérieur ou = à 100, alors il effectue """faire quelquechose"""; j'aimerais remplacer le code qui dit if digital read = high alors blabla bla, est ce que je peux dire, if fairequelquechose == true, alors blabla bmla?

en gros je veux qu'a chaque hit de piezzo, lancer une fonction diferente,

à bientot!

Bonjour,

Voila de quoi te mettre sous la dent :wink:

#define THRESHOLD 100
#define SENSOR A0
byte cmp = 0; // compteur d'index

void setup(){
	pinMode(9,INPUT); // bouton poussoir
	pinMode(10,OUTPUT); // led 1
	pinMode(11,OUTPUT); // led 2
}

void loop(){
	if (analogRead(SENSOR) >= THRESHOLD) 
	switch(cmp){
		case 0:
			led1();
			cmp++;
			break;
		case 1:
			led2();
			cmp++;
			break;
		case 2:
			cmp = 0;
			break;
	}
}
delay(500); // anti rebond
}

void led1(){
  digitalWrite(10, HIGH);  
  delay(50); 
  digitalWrite(10, LOW);
  delay(50);
}

void led2(){
  digitalWrite(11, HIGH);  
  delay(50); 
  digitalWrite(11, LOW);
  delay(50);
}

super, ça fonctionne, mais il y avait 2 3 petites erreurs je rejoins le bazar corrigé

#define THRESHOLD 100
#define SENSOR A0
byte cmp =0; // compteur d'index

void setup(){
	pinMode(0,INPUT); // bouton poussoir
	pinMode(10,OUTPUT); // led 1
	pinMode(11,OUTPUT); // led 2
pinMode(12,OUTPUT); // led 3
}

void loop(){
	if (analogRead(SENSOR) >= THRESHOLD) 
	switch(cmp){
		case 0:
			led1();
			cmp++;
			break;
		case 1:
			led2();
			cmp++;
			break;
		case 2:
			

			led3();
			cmp++;
			break;

                case 3:
                        cmp = 0;
			break;
	}


delay(1); // anti rebond
}



void led1(){
  digitalWrite(10, HIGH);  
  delay(200); 
  digitalWrite(10, LOW);
  delay(2);
}

void led2(){
  digitalWrite(11, HIGH);  
  delay(200); 
  digitalWrite(11, LOW);
  delay(2);
}


void led3(){
  digitalWrite(12, HIGH);  
  delay(200); 
  digitalWrite(12, LOW);
  delay(2);
}

voici mon super code qui allume toutes mes leds.

maintenant apres quelques essais je me trouve face à un probleme

admetons que la sequence 1 soit une boucle qui allume/eteint successivement led 12, 11, 10 puis boucle, 12,11,10 puis boucle etc etc...

lors d'un autre appui sur piezzo alors passer à la sequence 2 qui allume/eteint succesivement led 9,8,7,6 puis boucle

etc etc.

je suis face à 2 blemes, comment si ce n'est avec loop, boucler une sequence... destinée à etre switchée et boucler sur une autre.

ici j'ai réussi à faire differentes séquences mais elle ne bouclent pas... et surtout le switch de cas ne peut s'effectuer seulement lorsque la sequence est terminée...

#define THRESHOLD 100
#define SENSOR A0
byte cmp =0; // compteur d'index

void setup(){
pinMode(0,INPUT); // Piezzo
	
 pinMode(12,OUTPUT); // led 12
  pinMode(11,OUTPUT); // led 11
   pinMode(10,OUTPUT); // led 10
    pinMode(9,OUTPUT); // led 9
     pinMode(8,OUTPUT); // led 8
      pinMode(7,OUTPUT); // led 7
        pinMode(6,OUTPUT); // led 6
	 pinMode(5,OUTPUT); // led 5
          pinMode(4,OUTPUT); // led 4
	   pinMode(3,OUTPUT); // led 3
            pinMode(2,OUTPUT); // led 2
	     pinMode(1,OUTPUT); // led 1

}




void loop(){
	if (analogRead(SENSOR) >= THRESHOLD) 
	switch(cmp){
		case 0:
			sequence1();
			cmp++;
			break;
		case 1:
			sequence2();
			cmp++;
			break;
		case 2:
			sequence3();
			cmp++;
			break;


                case 3:
                      sequence4();
			cmp++;
			break;


    case 4:
                      sequence5();
			cmp++;
			break;


  case 5:
                      sequence6();
			cmp++;
			break;

  case 6:
                      sequence7();
			cmp++;
			break;

  case 7:
                      sequence8();
			cmp++;
			break;


  case 8:
                      sequence9();
			cmp++;
			break;


  case 9:
                      sequence10();
			cmp++;
			break;

  case 10:
                      sequence11();
			cmp++;
			break;

  case 11:
                      sequence12();
			cmp++;
			break;

                case 12:
                        cmp = 0;
			break;
	}


delay(1); // anti rebond
}



void sequence1(){
  digitalWrite(1, HIGH);  
  delay(200); 
  digitalWrite(1, LOW);
  delay(2);
}

void sequence2(){
  digitalWrite(2, HIGH);  
  delay(200); 
  digitalWrite(2, LOW);
  delay(2);
}


void sequence3(){
  digitalWrite(3, HIGH);  
  delay(200); 
  digitalWrite(3, LOW);
  delay(2);
}
  
  void sequence4(){
  digitalWrite(4, HIGH);  
  delay(200); 
  digitalWrite(4, LOW);
  delay(2);
  }
  
  
  void sequence5(){
  digitalWrite(5, HIGH);  
  delay(200); 
  digitalWrite(5, LOW);
  delay(2);
}
 
 
 void sequence6(){
  digitalWrite(6, HIGH);  
  delay(200); 
  digitalWrite(6, LOW);
  delay(2);
}
 
 
 void sequence7(){
  digitalWrite(7, HIGH);  
  delay(200); 
  digitalWrite(7, LOW);
  delay(2);
}
 
 
 void sequence8(){
  digitalWrite(8, HIGH);  
  delay(200); 
  digitalWrite(8, LOW);
  delay(2);
}
 
 
 void sequence9(){
  digitalWrite(9, HIGH);  
  delay(200); 
  digitalWrite(9, LOW);
  delay(2);
}
 
 
 void sequence10(){
  digitalWrite(10, HIGH);  
  delay(200); 
  digitalWrite(10, LOW);
  delay(2);
}


void sequence11(){
  digitalWrite(11, HIGH);  
  delay(200); 
  digitalWrite(11, LOW);
  delay(2);
}
 
 
 void sequence12(){
  digitalWrite(12, HIGH);  
  delay(200); 
  digitalWrite(12, LOW);
  delay(2);
}

La "méthode Arduino" qui consiste à prendre un morceau de code et à le modifier a ses limites. Il arrive un moment ou il faut poser le clavier et prendre un papier et un crayon.
Il faut décrire dans un langage simple ce que l'on veut faire et ensuite le programme vient de lui même.

Dans ton cas par exemple

début boucle principale
afficher_séquence(numéro_de_sequence)
voir_si_il_y_a_une_commande
si commande
modifier_le_numero_de_la_sequence
fin_de_la_boucle

Ce genre de description fait apparaitre la structure du programme, le découpage en fonctions et les variables nécessaires.
Ensuite on descend d'un cran on détaille chacune des fonctions jusqu'à arriver à des fonctions de base qui se traduisent directement en C.

Et on évite ainsi des aberrations comme cette répétition des 4 même lignes pour afficher tes séquences.

au lieu d'écrire sequence1, séquence2, séquence3, .... il est plus simple (et plus compacte) d'écrire

void sequence_n(int numero_de_port){
  digitalWrite(numero_de_port, HIGH);  
  delay(200); 
  digitalWrite(numero_de_port, LOW);
  delay(2);
}

ensuite tu l'utilises comme cela

   sequence_n(11);
   sequence_n(12);
   sequence_n(13);

tu peux même rendre la chose encore plus facile à paramétrer en utilisant des tableaux et ainsi placer au début de ton code la description des séquences

int seq1[3]={11,12,13};
int index;

   for (index=0;index<3;index++){
     sequence_n(seq1[index]);
  }

ensuite si tu veux pouvoir changer en dynamique la séquence tu fais

int seq1[3]={11,12,13};
int seq2[3]={8,9,10};
int *seq;
int index;


   seq = seq 1;
   for (index=0;index<3;index++){
     sequence_n(seq[index]);
  }
  seq = seq 2;
   for (index=0;index<3;index++){
     sequence_n(seq[index]);
  }

Ensuite la réception d'une commande peut très conditionner l'affectation d'une table à la variable seq. Et on se dirige vers ce que tu veux faire

Bonjour,

fdunews a été plus rapide que moi!
J'ai repris le même principe que lui pour créer ce code : je me suis posé devant une feuille pour faire la structure puis j'ai remplis les fonctions.

//Constantes pour le parametrage des LEDs (afin d'eviter de fixer la pin dans le code)
#define LED_SEQ1_1 12
#define LED_SEQ1_2 11
#define LED_SEQ1_3 10

#define LED_SEQ2_1  9
#define LED_SEQ2_2  8
#define LED_SEQ2_3  7
#define LED_SEQ2_4  6

#define PIEZZO A0

#define THRESHOLD 100

//Déclaration des variables globales disponibles dans tout le code
int Compteur_Piezzo;
int State_Seq1;
int State_Seq2;

void setup() {
	//Declaration des E/S
	pinMode(LED_SEQ1_1, OUTPUT);
	pinMode(LED_SEQ1_2, OUTPUT);
	pinMode(LED_SEQ1_3, OUTPUT);

	pinMode(LED_SEQ2_1, OUTPUT);
	pinMode(LED_SEQ2_2, OUTPUT);
	pinMode(LED_SEQ2_3, OUTPUT);
	pinMode(LED_SEQ2_4, OUTPUT);


	//Initialisation des E/S
	ResetSeq1();
	ResetSeq2();


	Compteur_Piezzo = 1;
	State_Seq1 = 0;
	State_Seq2 = 0;

}//setup

void loop() {
	//Modification de la sequence sur pression du boutton piezzo
	if(analogRead(PIEZZO) >= THRESHOLD) {
		Compteur_Piezzo++;
		if(Compteur_Piezzo > 2)
			Compteur_Piezzo = 1;
	}
	
	//Affichage des sequences
	if(Compteur_Piezzo == 1) {
		ResetSeq2();
		IncSeq1();
	}
	else if(Compteur_Piezzo == 2) {
		ResetSeq1();
		IncSeq2();
	}
	else {
		SeqErreur();
	}
	
	delay(500);
}//loop

void ResetSeq1() {
	digitalWrite(LED_SEQ1_1, LOW);
	digitalWrite(LED_SEQ1_2, LOW);
	digitalWrite(LED_SEQ1_3, LOW);
}

void ResetSeq2() {
	digitalWrite(LED_SEQ2_1, LOW);
	digitalWrite(LED_SEQ2_2, LOW);
	digitalWrite(LED_SEQ2_3, LOW);
	digitalWrite(LED_SEQ2_4, LOW);
}

void IncSeq1() {
//En fonction de la variable d'état, on allume et éteint les leds dans l'ordre
	if(State_Seq1 == 1) {
		digitalWrite(LED_SEQ1_3, LOW);
		digitalWrite(LED_SEQ1_1, HIGH);
	}
	else if(State_Seq1 == 2) {
		digitalWrite(LED_SEQ1_1, LOW);
		digitalWrite(LED_SEQ1_2, HIGH);
	}
	else if(State_Seq1 == 3) {
		digitalWrite(LED_SEQ1_2, LOW);
		digitalWrite(LED_SEQ1_3, HIGH);	
	}
	else {
		ResetSeq1();
		State_Seq1 = 0;
	}
	State_Seq1++;
}

void IncSeq2() {
//En fonction de la variable d'état, on allume et éteint les leds dans l'ordre
	if(State_Seq2 == 1) {
		digitalWrite(LED_SEQ2_4, LOW);
		digitalWrite(LED_SEQ2_1, HIGH);
	}
	else if(State_Seq2 == 2) {
		digitalWrite(LED_SEQ2_1, LOW);
		digitalWrite(LED_SEQ2_2, HIGH);
	}
	else if(State_Seq2 == 3) {
		digitalWrite(LED_SEQ2_2, LOW);
		digitalWrite(LED_SEQ2_3, HIGH);	
	}
	else if(State_Seq2 == 4) {
		digitalWrite(LED_SEQ2_3, LOW);
		digitalWrite(LED_SEQ2_4, HIGH);	
	}
	else {
		ResetSeq2();
		State_Seq2 = 0;
	}
	State_Seq2++;
}

void SeqErreur() {
	digitalWrite(LED_SEQ1_1, HIGH);
	digitalWrite(LED_SEQ1_2, HIGH);
	digitalWrite(LED_SEQ1_3, HIGH);
	digitalWrite(LED_SEQ2_1, HIGH);
	digitalWrite(LED_SEQ2_2, HIGH);
	digitalWrite(LED_SEQ2_3, HIGH);
	digitalWrite(LED_SEQ2_4, HIGH);
}

Cet exemple est fonctionnel (je ne souhaitais pas faire compliqué) mais l'utilisation des tableaux est beaucoup plus efficace.

Et je répète ce qui vient d'être écrit : poser ton projet sur un papier (forum) et élabores un code dans son ensemble.
Cela évitera l'assemblage de morceaux qui donne quelque chose d'incompréhensible.

ET SURTOUT : commentez votre code pour les autre et vous plus tard!

En fait vj_muddy tu devrais commencer par lire le très bon tuto du Site du Zero (lien déjà donné par Skywodd : http://www.siteduzero.com/tutoriel-3-14189-apprenez-a-programmer-en-c.html)
Cela t'aiderai beaucoup et comme ça les questions que tu poserai serai vraiment des problèmes. Car là on a un peu l'impression que tu nous demande de faire ton code, ce qui n'est pas exactement l'objectif. :smiley: