Bonjour,

J'ai quasiment terminé mon projet qui fonctionne, mais il me reste juste un petit point à régler sur deux boucles if qui semblent fonctionner à l'envers: oui je sais je me plante forcément quelque part !

Voici le code complet dans lequel j'ai mis beaucoup de point de débuggage pour suivre à la trace sur le Moniteur série, mais je ne comprends pas pourquoi le booléen "status_f3_engaged" passe de faux (0) à vrai (1) entre l'entrée dans la fonction (void f3), où il passe bien dans la partie "false", mais à l'intérieur de cette partie "false" il semble changer de signe avant que je le lui dise:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
 
void f3()
	{	//les 5 lignes ci-dessous permettent de connaitre les valeurs des booléens permettant ou pas,
		// d'enclancher les actions de f3
		Serial.print(F("void f3: valeur de status_rew_engaged= "));
		Serial.println(status_rew_engaged);
		Serial.print(F("et"));
		Serial.print(F("void f3: valeur de status_function_pause= "));
		Serial.println(status_function_pause);
		Serial.print(F("void f3: valeur de status_f3_engaged= "));
		Serial.println(status_f3_engaged);
 
		if(status_rew_engaged && status_function_pause) // car F3 ne doit pouvoir s'activer que si l'on est déjà en CUEING ARRIERE
		{
			if(status_f3_engaged = false)   // c'est-àdire si F3 n'est pas déjà engagée
											// donc si on n'est pas déjà en REW_CUEING_1/6
			{
				Serial.println(F("void f3 partie false: Réception du code du Bouton F3:"));
				Serial.println(IrReceiver.decodedIRData.decodedRawData, HEX);
 
				Serial.print(F("void f3 partie false: valeur de status_f3_engaged= "));
				Serial.println(status_f3_engaged); // pourquoi vaut-il 1 alors qu'il valait 0 en rentrant ???		
 
				digitalWrite(relai_REW,HIGH);	// on maintient le bouton REW enfoncé pour réduire à 1/6ème
				Serial.println(F("void f3 partie false: relai_REW passé à HIGH et on le laisse à HIGH"));
				Serial.println(F("et donc l'appareil baisse sa vitesse à 1/6ème"));
 
				// ne PAS désactiver le relais Rewind puisque qu'il faut simuler le bouton Rewind enfoncé
				Serial.println(F("void f3 partie false: relai_REW toujours à HIGH"));
 
				status_f3_engaged = !status_f3_engaged; // inverse le status de la fonction F3 à true puisqu'on vient de l'appeler
											// est indispensable pour gérer correctement l'affichage LCD au niveau de la boucle PAUSE
				Serial.print(F("void f3 partie false: le status_f3_engaged a été passé à "));
				Serial.println(status_f3_engaged);
				Serial.println();
 
				strcpy(active_input, "REW_CUEING_1/6th"); // on affecte donc la valeur "REW_CUEING_1/6th" à la fonction en cours
 
				lcd.clear(); // clear display
				lcd.setCursor(0,1); // left second line (1 from 1-16, Ligne 1 from 0-1)
				lcd.print(" < CUEING 1/6th"); // affiche que l'on est en CUEING ARRIERE 1/6ème
			}
			if(status_f3_engaged = true) // càd si on est déjà en CUEING ARRIERE 1/6ème
			{
				Serial.println(F("void f3 partie true: Réception du code du Bouton F3:"));
				Serial.println(IrReceiver.decodedIRData.decodedRawData, HEX);
 
				Serial.print(F(" partie true: valeur de status_f3_engaged= "));
				Serial.println(status_f3_engaged); // affiche true ou false selon la valeur de ce booléen
				Serial.println(F("void f3 partie true: devrait etre vrai, donc Relai_REW devrait etre actif"));
 
				status_f3_engaged = !status_f3_engaged; // inverse le status de la fonction F3 à true puisqu'on vient de l'appeler
											// est indispensable pour gérer correctement l'affichage LCD au niveau de la boucle PAUSE
				digitalWrite(relai_REW,LOW);	// on maintient le bouton REW enfoncé pour réduire à 1/6ème
				Serial.println(F("void f3 partie true: relai_REW passé à LOW"));
				Serial.println(F("void f3 partie true: et donc l'appareil devrait re-accélerer à 1/3rd tout en restant en CUEING ARRIERE"));
 
				strcpy(active_input, "REW_CUEING_1/3rd"); // on affecte donc la valeur "REW_CUEING_1/3rd" à la fonction en cours
 
				lcd.clear(); // clear display
				lcd.setCursor(0,1); // left second line (1 from 1-16, Ligne 1 from 0-1)
				lcd.print(" < CUEING 1/3rd"); // affiche que l'on est en CUEING ARRIERE 1/3rd
			}
		} // et si on n'est pas déjà en CUEING ARRIERE, alors ne rien faire
	}
et voici ce que j'observe sur le Moniteur Série:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
3EE
void f3: valeur de status_rew_engaged= 1
etvoid f3: valeur de status_function_pause= 1
void f3: valeur de status_f3_engaged= 0
void f3 partie true: Réception du code du Bouton F3:
3EE
 partie true: valeur de status_f3_engaged= 1
void f3 partie true: devrait etre vrai, donc Relai_REW devrait etre actif
void f3 partie true: relai_REW passé à LOW
void f3 partie true: et donc l'appareil devrait re-accélerer à 1/3rd tout en restant en CUEING ARRIERE
boucle IF f3: La fonction F3 a été appelée
0
0
Si on regarde le moniteur Série, la valeur de "status_f3_engaged" est 0 à l'appel de la fonction f3, mais le programme passe par la boucle partie "true" comme s'il était à 1 ???

Comme je ne crois pas à la magie noire, il y a forcément une erreur de ma part, mais où ? à force de regarder je finis par ne plus rien voir !