Programme escrime

Merci a tous,
jpbbricole, je ne comprend pas tous ce que tu a fait, mais tout fonctionne.
Enfin maintenant je doit ajouter de nouvelle condition.
Comment utiliser une sortie comme condition d'entrée.
Exemple si ledR est allumé je ne peut pas allumé ledV

J'ai fait ce programme pour susciter des questions, alors ne te gêne pas :wink:

C'est malheureusement souvent comme ça avec du code tout fait :frowning:

Dans ce cas, ce n'est pas parce que la LEDR est allumé que la LEDV ne peut pas l'être.
C'est parce que les conditions pour allumer la LEDR, ne permettent pas d'allumer la LEDV.
Si par exemple pour allumer LEDR, il faut que etatoucheB soit à vrai alors pour allumer la LEDV il faut que etatoucheA soit vrai et etattouchB soit faux.
Les conditions étant mutuellement exclusives, du coup pour allumer la LEDR on doit avoir etatoucheB à faux et etattoucheB à vrai.
J'ai volontairement pas pris en compte le temps d'appuis, qu'il faut bien sûre conservé :slight_smile:

Bonjour terwal

Un code tout fait est toujours mieux que pas de code du tout :wink:

Dans le cas qui nous intéresse, il y a des explications dans le post et des remarques dans le programme, de quoi susciter des questions, l'important est d'être présent pour y répondre.

Cordialement
jpbbricole

Question de point de vue et admettant que seulement ces deux choix se pose :wink:

Oui, ton code est de mon point de vue correctement commenté, mais visiblement pas assez pour que @thierrya76 puisse le modifier tout seul.
Sur le dernier point, rien que pour cela je te souhaite que le meilleur, afin que tu puisse rester disponible pour tout les projets auxquels tu participe.
C'est donc bien le problème principal des programmes tout fait, cela n'est viable que si cette personne peut assister le bénéficière :wink:

Bonjour terwal

Tu est sérieux???

Je n'écris pas mes programmes en chinois, mais en langage Arduino, donc à la portée de tout les gens, qui comme toi, interviennent sur ce forum.
Si l'on suit ton "raisonnement", cela signifie que toute personne qui fournit la moindre ligne de code doit être à disposition de ces lignes à perpétuité?

Cordialement
jpbbricole

Bonjour thierrya76

Comme tout les ordres concernant les LED passent par void ledAllumer(int ledNum), on peut intercepter les ordres concernant ledV et, ainsi, ne pas exécuter cet ordre si ledR est allumée et ça donne ceci:

	if (ledNum == ledV && digitalRead(ledPin[ledR]) == HIGH)     // Si commande pour ledV et ledR déjà allumée
	{
		Serial.println("LED ledV bloquee par ledR");
		return;     // On quitte sans rien faire
	}

La nouvelle mouture de ledAllumer(int ledNum)`:


void ledAllumer(int ledNum)
{
	if (ledOnMillis[ledNum] != 0)     // Si déjà allumée (chrono en route)
	{
		return;     // On ne fait rien
	}

	if (ledNum == ledV && digitalRead(ledPin[ledR]) == HIGH)     // Si commande pour ledV et ledR déjà allumée
	{
		Serial.println("LED ledV bloquee par ledR");
		return;     // On quitte sans rien faire
	}

	Serial.println("LED ON\t" + String(ledNum));
	digitalWrite(ledPin[ledNum], HIGH);
	ledOnMillis[ledNum] = millis();     // Démarrage du chrono
}

A+
jpbbricole

oui

oui :japanese_ogre:

Sans vouloir t'offenser car je pense que dû bien de toi, les programmes que tu fais son "simple" à lire ou à modifier.
Mais je ne vois pas le rapport, la personne ne sera pas plus autonome et donc aura peut être du mal, à appliquer ou comprendre nos conseilles, sachant qu'il n'aura pas compris ce que faisait chaque ligne de code et que l'on ne lui écrira pas non plus son programme à sa place?

On n'aura pas vraiment avancer depuis le moment ou tu lui a bâcler le travaille.
Donc pourquoi vouloir repousser le problème et ne pas le résoudre maintenant?

Je ne sais pas si tu vois ce que je veux dire ?
C'est exactement le cas présent, si tu ne lui répondais plus, il y aura forcément du monde pour lui expliquer ce que tu as fait dans ton programme et lui indiquer comment le modifier.
Mais il ne peut pas le faire tout seul.
Alors que si tu lui avait indiquer et expliquer comment produire ce même code, il n'aurait surement besoin de personne pour faire la modification.

pour la beauté de la chose au lieu de

on préfèrera écrire

	if (ledNum == ledV && digitalRead(ledPin[ledR]) == HIGH)     // Si commande pour ledV et ledR déjà allumée

Désolé les gars, ne vous prenez pas la tête. Je suis novice dans la programmation. Mais je vais arriver a comprendre en reprenant ligne par ligne. Par contre, il y a des commandes ou des subtilités que je ne connais pas encore.
Je vais faire des essais demain avec les dernières infos que vous m'avez envoyé. Merci beaucoup de votre aide.

c'est pour cela que je proposais de bien mettre == HIGH

:slight_smile:

Bonsoir J-M-L

Ce n'était pas un "exercice de style" de ma part, mais un oubli :woozy_face:, merci!
C'est corrigé.

Bonne soirée
jpbbricole

Bonsoir thierrya76

Tu peux poser des question(s) pour chaque ligne, si nécessaire, l'important est que tu comprennes.

Je te mets la dernière version:

// C++ code
// Post #33
enum {ledb, ledV, ledB, ledJ, ledR};     // Enumération des LE 0, 1, 2...
const int ledPin[] = {4, 5, 6, 7, 8};     // Tableau des pin des LED
const int ledNombre = sizeof(ledPin) / sizeof(ledPin[0]);    // Nombre de LED

//int ledb = 4;
//int ledV = 5;
//int ledB = 6;
//int ledJ = 7;
//int ledR = 8;

int masseA = 9;
int toucheA = 10;
int masseB = 11;
int toucheB = 12;
int Sabre = A3;
int Epee = A4;
int Fleuret = A5;

unsigned long ledOnMillis[] = {0, 0, 0, 0, 0};     // Tableau des temporisations des LED, si 0 = désactivée

unsigned long tempotouche = 50;
unsigned long tempoled = 3000;

int etattoucheA = LOW;
unsigned long tempsAppuiA = 0;
int etattoucheB = LOW;
unsigned long tempsAppuiB = 0;
int etatEpee = LOW;

void setup()
{
	Serial.begin(115200);

	for (int l = 0; l < ledNombre; l ++)
	{
		pinMode(ledPin[l], OUTPUT);     // Initialisation des pin des LED
		digitalWrite(ledPin[l], LOW);     // Eteindre la LED
	}
	//pinMode(ledb, OUTPUT);
	//pinMode(ledV, OUTPUT);
	//pinMode(ledB, OUTPUT);
	//pinMode(ledJ, OUTPUT);
	//pinMode(ledR, OUTPUT);
	pinMode(masseA, INPUT_PULLUP);
	pinMode(toucheA, INPUT);
	pinMode(masseB, INPUT_PULLUP);
	pinMode(toucheB, INPUT);
	pinMode(Sabre, INPUT);
	pinMode(Epee, INPUT);
	pinMode(Fleuret, INPUT);
}

void loop()
{
	// Contrôle si des LED à éteindre
	for (int l = 0; l < ledNombre; l ++)
	{
		if (ledOnMillis[l] != 0 && (millis() - ledOnMillis[l] >= tempoled))     // Si échéence de cette LED
		{
			digitalWrite(ledPin[l], LOW);     // Eteindre cette LED
			ledOnMillis[l] = 0;     // Désactiver le chrono de cette LED
			Serial.println("LED off\t" + String(l));
		}
	}

	etattoucheA = digitalRead(toucheA);
	if (etattoucheA == LOW)
	{
		tempsAppuiA = millis();
	}
	etattoucheB = digitalRead(toucheB);
	
	if (etattoucheB == LOW)
	{
		tempsAppuiB = millis();
	}
	
	if (etattoucheA == HIGH && millis() - tempsAppuiA >= tempotouche)
	
	{
		ledAllumer(ledV);

		ledAllumer(ledb);
		//delay(tempoled);
	}
	else
	{
		//digitalWrite(ledV, LOW);
		//digitalWrite(ledb, LOW);
	}
	etattoucheB = digitalRead(toucheB);
	if (etattoucheB == LOW)
	{
		tempsAppuiB = millis();
	}
	if (etattoucheB == HIGH && millis() - tempsAppuiB >= tempotouche)
	
	{
		ledAllumer(ledR);

		ledAllumer(ledb);
		//delay(tempoled);
	}
	else
	{
		//digitalWrite(ledR, LOW);
		//digitalWrite(ledb, LOW);
	}
	
	if (etattoucheA == HIGH && etattoucheB == HIGH && (millis() - tempsAppuiA) < tempotouche)
	
	{
		ledAllumer(ledV);

		ledAllumer(ledR);

		//delay(tempoled);
	}
	else
	{
		//digitalWrite(ledV, LOW);
		//digitalWrite(ledR, LOW);
	}
	
	if (digitalRead(masseA) == LOW )
	
	{
		ledAllumer(ledB);
		//delay(tempoled);
	}
	else
	{
		//digitalWrite(ledB, LOW);
	}
	if (digitalRead(masseB) == LOW )
	
	{
		ledAllumer(ledJ);
		//delay(tempoled);
	}
	else
	{
		//digitalWrite(ledJ, LOW);
	}
	//}
	if (digitalRead(ledB) == HIGH || digitalRead(ledV) == HIGH || digitalRead(ledJ) == HIGH ||digitalRead(ledR) == HIGH)
	{
		ledAllumer(ledb);
		//delay(tempoled);
	}
	else
	{
		//digitalWrite(ledb, LOW);
	}
}

void ledAllumer(int ledNum)
{
	if (ledOnMillis[ledNum] != 0)     // Si déjà allumée (chrono en route)
	{
		return;     // On ne fait rien
	}

	if (ledNum == ledV && digitalRead(ledPin[ledR]) == HIGH)     // Si commande pour ledV et ledR déjà allumée
	{
		Serial.println("LED ledV bloquee par ledR");
		return;     // On quitte sans rien faire
	}

	Serial.println("LED ON\t" + String(ledNum));
	digitalWrite(ledPin[ledNum], HIGH);
	ledOnMillis[ledNum] = millis();     // Démarrage du chrono
}

A+
Bonne soirée.
jpbbricole

Le câblage des armes est ici :

Je ne connais pas tous les détails de l'arbitrage, mais la touche est acquise aux deux épéistes s'il y a double touche séparée de moins de 1/25 s . Ça semble court mais c'est assez fréquent.

2 Likes

Ah, bien,Merci👍

Jpbbricole, la nouvelle consigne est contradiction avec la double touche.[quote="jpbbricole, post:33, topic:1219179"]

if (etattoucheB == HIGH && millis() - tempsAppuiB >= tempotouche)
	

[/quote]
Comment peut on ajouter ledV=low sur la ligne ci dessus.

En mettant sous cette ligne entre les accolades de cet if
digitalWrite(ledPin[ledV], LOW); // Eteindre cette LED

Je vous remercie de votre aide,
Je viens de tester en physique et cela fonction.

// C++ code
//
enum {ledb, ledV, ledB, ledJ, ledR};     // Enumération des LE 0, 1, 2...
const int ledPin[] = {4, 5, 6, 7, 8};     // Tableau des pin des LED
const int ledNombre = sizeof(ledPin) / sizeof(ledPin[0]);    // Nombre de LED

int masseA = 9;
int toucheA = 10;
int masseB = 11;
int toucheB = 12;
int Sabre = A3;
int Epee = A4;
int Fleuret = A5;

unsigned long ledOnMillis[] = {0, 0, 0, 0, 0};     // Tableau des temporisations des LED, si 0 = désactivée

unsigned long tempotouche = 40;
unsigned long tempoled = 3000;

int etattoucheA = LOW;
unsigned long tempsAppuiA = 0;
int etattoucheB = LOW;
unsigned long tempsAppuiB = 0;
int etatEpee = LOW;

void setup()
{
	Serial.begin(115200);
	for (int l = 0; l < ledNombre; l ++)
	{
	pinMode(ledPin[l], OUTPUT);     // Initialisation des pin des LED
	digitalWrite(ledPin[l], LOW);     // Eteindre la LED
	}
	pinMode(masseA, INPUT_PULLUP);
	pinMode(toucheA, INPUT);
	pinMode(masseB, INPUT_PULLUP);
	pinMode(toucheB, INPUT);
	pinMode(Sabre, INPUT);
	pinMode(Epee, INPUT);
	pinMode(Fleuret, INPUT);
}

void loop()
{
	// Contrôle si des LED à éteindre
	for (int l = 0; l < ledNombre; l ++)
	{
		if (ledOnMillis[l] != 0 && (millis() - ledOnMillis[l] >= tempoled))     // Si échéence de cette LED
		{
			digitalWrite(ledPin[l], LOW);     // Eteindre cette LED
			ledOnMillis[l] = 0;     // Désactiver le chrono de cette LED
			Serial.println("LED off\t" + String(l));
		}
	}
	etattoucheA = digitalRead(toucheA);
	if (etattoucheA == LOW) 
	{
		tempsAppuiA = millis();
	}
	etattoucheB = digitalRead(toucheB);	
	if (etattoucheB == LOW) 
	{
		tempsAppuiB = millis();
	}
	if (digitalRead(ledPin[ledR]) == LOW && etattoucheA == HIGH && millis() - tempsAppuiA >= tempotouche)
	{ 
		ledAllumer(ledV);
		ledAllumer(ledb);
	} 
		else 
	{	}
	if (digitalRead(ledPin[ledV]) == LOW && etattoucheB == HIGH && millis() - tempsAppuiB >= tempotouche)
	{ 
		ledAllumer(ledR);
   	    ledAllumer(ledb);
	} 
	else 
	{	}
	if (etattoucheA == HIGH && etattoucheB == HIGH && (millis() - tempsAppuiA) < tempotouche)
		{ 
		ledAllumer(ledV);
		ledAllumer(ledR);
        ledAllumer(ledb);
	} 
	else 
	{	}
	if (digitalRead(masseA) == LOW )
	{ 
		ledAllumer(ledB);
        ledAllumer(ledb);
	} 
	else 
	{	}
	if (digitalRead(masseB) == LOW )
	{ 
		ledAllumer(ledJ);
        ledAllumer(ledb);
	} 
	else 
	{	}
}    
void ledAllumer(int ledNum)
{
	if (ledOnMillis[ledNum] != 0)     // Si déjà allumée (chrono en route)
	{
		return;     // On ne fait rien
      
	}
	Serial.println("LED ON\t" + String(ledNum));
	digitalWrite(ledPin[ledNum], HIGH);
	ledOnMillis[ledNum] = millis();     // Démarrage du chrono
}

Bonsoir thierrya76

La touche a été bonne :wink:

Bonne continuation!

Cordialement
jpbbricole

tous ces

ne servent à rien