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
}
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).
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
}
Si cela fonctionne forcément
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
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?
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"
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.