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
C'est malheureusement souvent comme ça avec du code tout fait
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é
Bonjour terwal
Un code tout fait est toujours mieux que pas de code du tout
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
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
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
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
Bonsoir J-M-L
Ce n'était pas un "exercice de style" de ma part, mais un oubli , 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.
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
Bonne continuation!
Cordialement
jpbbricole
tous ces
ne servent à rien