Sélectionner programme

Bonjour,

Je suis sur une projet de piste escrime et j'ai 3 type d'arme différente et donc 3 programmes différent
Je voudrai activer le programme suivant si A5 et HIGH

// 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 tempomasse = 5;
unsigned long tempoled = 3000;

int etattoucheA = LOW;
unsigned long tempsAppuiA = 0;
int etattoucheB = LOW;
unsigned long tempsAppuiB = 0;
int etatEpee = LOW;
int etatmasseA = HIGH;
unsigned long tempsmasseA = 0;
int etatmasseB = HIGH;
unsigned long tempsmasseB = 0;

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();
	}
	etatmasseA = digitalRead(masseA);
	if (etatmasseA == LOW) 
	{
		tempsmasseA = millis();
	}
	etatmasseB = digitalRead(masseB);
	if (etatmasseB == LOW) 
	{
		tempsmasseB = millis();
	}

 	if (etattoucheA == HIGH)
    { 
		ledAllumer(ledV);
		ledAllumer(ledb);
	} 

   	if (etattoucheB == HIGH)
	
	{ 
		ledAllumer(ledR);
   	    ledAllumer(ledb);
	}
	if (digitalRead(etatmasseA) == HIGH && millis() - tempsmasseA >= tempomasse )
	{ 
		ledAllumer(ledB);
        ledAllumer(ledb);
	} 
	if (digitalRead(etatmasseB) == HIGH && millis() - tempsmasseB >= tempomasse  )
	{ 
		ledAllumer(ledJ);
        ledAllumer(ledb);
	} 

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

:warning:
Post mis dans la mauvaise section, on parle anglais dans les forums généraux. déplacé vers le forum francophone.

Merci de prendre en compte les recommandations listées dans Les bonnes pratiques du Forum Francophone

Que veux-tu dire ?

Sur un arduino, en C, tu ne peux avoir qu'un seul programme. Il est lancé à la mise sous tension de la carte.

Tu ne peux pas activer un programme sur un niveau de GPIO. Par contre, tu peux avoir dans ton programme des fonctions qui sont appelées et exécutées selon l'état d'un GPIO. Ca c'est possible. C'est peut-être ce que tu veux dire. Mais, ces fonctions n'auront pas la forme que tu donnes (avec un setup et une loop).

Un peu de lecture sur les fonctions :

La structure de mon programme ne change pas
C'est juste la partie ci-dessous que je veux activer si A5 est HIGH

Dans ce cas, tu déclares une variable qui va contenir l'état du fleuret, tu fais un test et tu mets les lignes à activer dans la bloc qui suit le test :

int etatFleuret = digitalRead(Fleuret);
if (etatFleuret == HIGH) {
// Mettre ici les lignes que tu veux activer
}

Merci lesept, mais j'ai déja essayer et cela ne fonctionne pas.

// 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 tempomasse = 5;
unsigned long tempoled = 3000;

int etattoucheA = LOW;
unsigned long tempsAppuiA = 0;
int etattoucheB = LOW;
unsigned long tempsAppuiB = 0;
int etatSabre = LOW;
int etatEpee = LOW;
int etatFleuret = LOW;
int etatmasseA = HIGH;
unsigned long tempsmasseA = 0;
int etatmasseB = HIGH;
unsigned long tempsmasseB = 0;

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();
	}
	etatmasseA = digitalRead(masseA);
	if (etatmasseA == LOW) 
	{
		tempsmasseA = millis();
	}
	etatmasseB = digitalRead(masseB);
	if (etatmasseB == LOW) 
	{
		tempsmasseB = millis();
	}
etatFleuret = digitalRead(Fleuret);
	if (etatFleuret == HIGH)
    
    {
 		if (etattoucheA == HIGH)
    	{ 
			ledAllumer(ledV);
			ledAllumer(ledb);
		} 

   		if (etattoucheB == HIGH)
		{ 
			ledAllumer(ledR);
   	    	ledAllumer(ledb);
		}
		if (digitalRead(etatmasseA) == HIGH && millis() - tempsmasseA >= tempomasse )
		{ 
			ledAllumer(ledB);
	        ledAllumer(ledb);
		} 
		if (digitalRead(etatmasseB) == HIGH && millis() - tempsmasseB >= tempomasse  )
		{ 
			ledAllumer(ledJ);
	        ledAllumer(ledb);
		}
      
etatEpee = digitalRead(Epee);
	if (etatEpee == HIGH)
    	{  
		if (digitalRead(ledPin[ledR]) == LOW && etattoucheA == HIGH && millis() - tempsAppuiA >= tempotouche)
		{ 
			ledAllumer(ledV);
			ledAllumer(ledb);
		}	
		if (digitalRead(ledPin[ledV]) == LOW && etattoucheB == HIGH && millis() - tempsAppuiB >= tempotouche)
		{ 
			ledAllumer(ledR);
	   	    ledAllumer(ledb);
		}
		if (etattoucheA == HIGH && etattoucheB == HIGH && (millis() - tempsAppuiA) < tempotouche)
			{ 
			ledAllumer(ledV);
			ledAllumer(ledR);
	        ledAllumer(ledb);
		}	
		if (digitalRead(masseA) == LOW )
		{ 
			ledAllumer(ledB);
	        ledAllumer(ledb);
		}	
		if (digitalRead(masseB) == LOW )
		{ 
			ledAllumer(ledJ);
	        ledAllumer(ledb);
		}      
      
      }

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

ça semble être lié à votre autre post

le mieux serait de fusionner les 2 non ? (pour avoir tout le contexte)

si je comprends bien vous avez 3 types d'armes et vous voulez dire quelle est l'arme en cours d'utilisation sur la piste

dans le code vous avez

➜ qu'est-ce qui est connecté sur ces 3 pins et comment est-ce utilisé ?

Si cela fonctionne forcément :slight_smile:
Si ce n'est pas le cas, c'est que l'on n'a pas compris ce que tu veux vraiment faire.

Dans ton post 4#, tu indique que tu veux exécuter le code que tu as posté si A5 est à HIGH.
La réponse sera forcément un paraphrase de celle de @lesept

Le code que tu as donné en #7 me semble mal indenté.
A la vu de ton code, il me semble que les lignes que tu précises ne sont bien exécutées uniquement si etatEppe est à HIGH :frowning:
Peut tu donner un peu plus d'information que ça ne marche pas?
Ne peut tu pas insérer dans ton code des sorties de débogage sur le moniteur séries?

Je crois que j'ai fait un mauvais cable, je n'ai pas relier le GND sur A5.
Et oui j'ai un défaut sur mon code #7 ,Je regarde mieux demain.

regardez aussi le post 8. En pratique on aime conserver les conversation qui ont trait au même projet au même endroit pour conserver le contexte

Bonjour,

Pouvez-vous m'aider encore une fois
Je programme fonctionnais mais maintenant il ne veut plus compiler.

// C++ code
//
enum {buz, ledJ, ledB, ledV, 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 COM1 = A4;
int COM2 = 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 tempomasse = 5;
unsigned long tempoled = 3000;

int etattoucheA = LOW;
unsigned long tempsAppuiA = 0;
int etattoucheB = LOW;
unsigned long tempsAppuiB = 0;
int etatSabre = LOW;
int etatEpee = LOW;
int etatFleuret = LOW;
int etatmasseA = HIGH;
unsigned long tempsmasseA = 0;
int etatmasseB = HIGH;
unsigned long tempsmasseB = 0;

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(COM1, INPUT);
	pinMode(COM2, 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();
	}
	etatmasseA = digitalRead(masseA);
	if (etatmasseA == LOW) 
	{
		tempsmasseA = millis();
	}
	etatmasseB = digitalRead(masseB);
	if (etatmasseB == LOW) 
	{
		tempsmasseB = millis();
	}
if (digitalRead(COM1)==LOW && digitalRead(COM2)==HIGH) "fleuret"
        {
 		if (etattoucheA == HIGH )
    	{ 
			ledAllumer(ledV);
			ledAllumer(buz);
		} 
   		if (etattoucheB == HIGH )
		{ 
			ledAllumer(ledR);
   	    	ledAllumer(buz);
		}
		if (etatmasseA == HIGH && millis() - tempsmasseA >= tempomasse )
		{ 
			ledAllumer(ledB);
	        ledAllumer(buz);
		} 
		if (etatmasseB == HIGH && millis() - tempsmasseB >= tempomasse  )
		{ 
			ledAllumer(ledJ);
	        ledAllumer(buz);
		}
      }
  
if(digitalRead(COM1)==LOW && digitalRead(COM2)==LOW) "Epée"
    	{  
		if (digitalRead(ledPin[ledR]) == LOW && etattoucheA == HIGH)
		{ 
			ledAllumer(ledV);
			ledAllumer(buz);
		}	
		if (digitalRead(ledPin[ledV]) == LOW && etattoucheB == HIGH)
		{ 
			ledAllumer(ledR);
	   	    ledAllumer(buz);
		}	
		if (digitalRead(masseA) == LOW )
		{ 
			ledAllumer(ledB);
	        ledAllumer(buz);
		}	
		if (digitalRead(masseB) == LOW )
		{ 
			ledAllumer(ledJ);
	        ledAllumer(buz);
		} 
      }
if(digitalRead(COM1)==HIGH && digitalRead(COM2)==LOW); "Sabre"
    {
 		if (etattoucheA == HIGH)
    	{ 
			ledAllumer(ledV);
			ledAllumer(buz);
		} 
   		if (etattoucheB == HIGH)
		{ 
			ledAllumer(ledR);
   	    	ledAllumer(buz);
		}
    }
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
}

Merci d'avance.
saisissez ou collez du code ici

Je pense que c'est une erreur de syntaxe

Et le message d'erreur est ....

Arduino : 1.8.19 (Windows Store 1.8.57.0) (Windows 10), Carte : "Arduino Uno"

projet_escrime_fleuret_et_ep_e1\projet_escrime_fleuret_et_ep_e1.ino: In function 'void loop()':

projet_escrime_fleuret_et_ep_e1:78:9: error: expected ';' before '{' token

     {

     ^

projet_escrime_fleuret_et_ep_e1:101:6: error: expected ';' before '{' token

  {

  ^

projet_escrime_fleuret_et_ep_e1:124:5: error: expected ';' before '{' token

 {

 ^

projet_escrime_fleuret_et_ep_e1:137:1: error: a function-definition is not allowed here before '{' token

{

^

projet_escrime_fleuret_et_ep_e1:146:1: error: expected '}' at end of input

}

^

exit status 1

expected ';' before '{' token

Ce rapport pourrait être plus détaillé avec
l'option "Afficher les résultats détaillés de la compilation"
activée dans Fichier -> Préférences.

// C++ code
//
enum {buz, ledJ, ledB, ledV, 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 COM1 = A4;
int COM2 = 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 tempomasse = 5;
unsigned long tempoled = 3000;

int etattoucheA = LOW;
unsigned long tempsAppuiA = 0;
int etattoucheB = LOW;
unsigned long tempsAppuiB = 0;
int etatmasseA = HIGH;
unsigned long tempsmasseA = 0;
int etatmasseB = HIGH;
unsigned long tempsmasseB = 0;

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(COM1, INPUT);
	pinMode(COM2, 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();
	}
	etatmasseA = digitalRead(masseA);
	if (etatmasseA == LOW) 
	{
		tempsmasseA = millis();
	}
	etatmasseB = digitalRead(masseB);
	if (etatmasseB == LOW) 
	{
		tempsmasseB = millis();
	}
if (digitalRead(COM1)==LOW && digitalRead(COM2)==HIGH) "fleuret"
        {
 		if (etattoucheA == HIGH )
    	{ 
			ledAllumer(ledV);
			ledAllumer(buz);
		} 
   		if (etattoucheB == HIGH )
		{ 
			ledAllumer(ledR);
   	    	ledAllumer(buz);
		}
		if (etatmasseA == HIGH && millis() - tempsmasseA >= tempomasse )
		{ 
			ledAllumer(ledB);
	        ledAllumer(buz);
		} 
		if (etatmasseB == HIGH && millis() - tempsmasseB >= tempomasse  )
		{ 
			ledAllumer(ledJ);
	        ledAllumer(buz);
		}
      }  
if(digitalRead(COM1)==LOW && digitalRead(COM2)==LOW) "Epée"
    	{  
		if (digitalRead(ledPin[ledR]) == LOW && etattoucheA == HIGH)
		{ 
			ledAllumer(ledV);
			ledAllumer(buz);
		}	
		if (digitalRead(ledPin[ledV]) == LOW && etattoucheB == HIGH)
		{ 
			ledAllumer(ledR);
	   	    ledAllumer(buz);
		}	
		if (digitalRead(masseA) == LOW )
		{ 
			ledAllumer(ledB);
	        ledAllumer(buz);
		}	
		if (digitalRead(masseB) == LOW )
		{ 
			ledAllumer(ledJ);
	        ledAllumer(buz);
		} 
      }
if(digitalRead(COM1)==HIGH && digitalRead(COM2)==LOW); "Sabre"
    {
 		if (etattoucheA == HIGH)
    	{ 
			ledAllumer(ledV);
			ledAllumer(buz);
		} 
   		if (etattoucheB == HIGH)
		{ 
			ledAllumer(ledR);
   	    	ledAllumer(buz);
		}
    }
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
}

Bonjour thierrya76

Un peu plus :wink:

Les remarques, c'est bien, mais dans les règles de l'art:
if (digitalRead(COM1)==LOW && digitalRead(COM2)==HIGH) // fleuret
est mieux que
if (digitalRead(COM1)==LOW && digitalRead(COM2)==HIGH) "fleuret"

et il manque cette accolade ici:

}
	void ledAllumer(int ledNum)

Cordialement
jpbbricole

Merci jpbbricole

Bonjour,
J'ai une nouvelle question.
Je veux allumer un buzzer pendant 1 second sur un front montant avec la fonction millis
Mais là il s'éteint avant les 1 second.

  etatbuz = digitalRead(ledPin[buz]);
  if(etatbuz != membuz && etatbuz == HIGH )
  { 
    digitalWrite(buzzer, HIGH);
    tempobuz = millis();
    } 
   if(digitalRead(buzzer) == HIGH && millis() - tempsetatbuz >= tempobuz )
 {
    digitalWrite(buzzer, LOW);
  } 
   membuz = etatbuz;

mon buz reste a l'état haut pendant 3 seconds.

Cordialement,