cohérence : 1 même projet / 3 programmes

Bonjour, J'ai besoin de vos lumières :) Sur un projet très simple: je fais contact sur la borne 2 en entrée de façon à pouvoir alimenter la borne 13 durant une seconde, j'ai 3 programmes différents. Quel est à votre avis le plus cohérent? Merci d'avance et désolé de poser des questions qui sembleront certainement très basiques :) Bien cordialement

Programme 1

 void setup(){
    pinMode(2,INPUT);
    pinMode(13,OUTPUT);
    
}

void loop(){
    
    if(((digitalRead(2))==(1))){
        digitalWrite(13,1);
        delay(1000*1);
        digitalWrite(13,0);
    }
    
}

Programme 2

void setup(){
    pinMode(2,INPUT);
    pinMode(13,OUTPUT);
    
}

void loop(){
    
    if(digitalRead(2)){
        digitalWrite(13,1);
        delay(1000*1);
        digitalWrite(13,0);
    }
    
}

Programme 3

double broche;
void setup(){
    pinMode(2,INPUT);
    pinMode(13,OUTPUT);
    
}

void loop(){
    
    broche = digitalRead(2);
    if(((broche)==(1))){
        digitalWrite(13,1);
        delay(1000*1);
        digitalWrite(13,0);
    }
    
}

Ils sont tous équivalents.

Par contre sur le troisième cette ligne

double broche;

devrait être remplacée par ça

int broche;

Par contre il serait bien de rendre le programme plus lisible et plus facile à maintenir en utilisant des variables pour les entrées/sorties

int LED=13;
int CONTACT=2;

void setup(){
    pinMode(CONTACT,INPUT);
    pinMode(LED,OUTPUT);
    
}

void loop(){
    
    if(digitalRead(CONTACT)){
        digitalWrite(LED,1);
        delay(1000*1);
        digitalWrite(LED,0);
    }
    
}

Bonjour,

C'est quoi cohérent?

Si ça veut dire portable (conforme aux spécifications), aucun des trois. digitalRead() retourne LOW et HIGH. Toutes les versions assument que LOW=0 et HIGH=1, ce qui est vrai dans cette implémentation, mais pourrait changer dans une autre implémentation donc le bon test serait

if (digitalRead(2)==HIGH)
  {
        digitalWrite(13,HIGH);
        delay(1000);
        digitalWrite(13,LOW);
    }

Bon je veux bien reconnaître qu'il y a peu de chances que les valeurs de LOW et HIGH changent

Si cohérent veut dire lisible et maintenable, il faudrait en plus définir les entrées/sorties par de constantes comme le suggère fdufnews.

Si cohérent veut dire 'qui fonctionne correctement' il faudrait que l'on sache ce que le programme doit faire exactement. Dans les versions présentées la led reste allumée au minimum une seconde et continue d'être allumée une seconde supplémentaire si on reste appuyé sur le bouton. Si tu veux que la led reste allumée une seconde et s'éteigne jusqu’à un nouvel appui, il faut tester le changement d'état du bouton.

Si cohérent veut dire efficace, il faudrait éviter d'utiliser des delay()

Bonsoir, merci pour vos réponses qui éclairent bien ma chandelle :) Par rapport à vos commentaires, j'ai quelques éclaircissement à vous demander:)

  • "il faut tester le changement d'état du bouton" quand on faisait du grafcet, on appelait ça les fronts montants et les fronts descendants si ma mémoire ne me fait pas défaut. c'est, je pense, certainement réalisable avec de l'arduino mais comment faites-vous?

  • dans le programme 2 : if(digitalRead(2)) { ... il n'y a aucune condition sur la lecture de 2. Je ne pige pas... On lit s'il y a du courant ou pas sur 2 et ensuite??

  • "il faudrait éviter d'utiliser des delay()" mais comment les remplaces-tu?

Merci d'avance pour vos réponses :) Bien cordialement

Pour détecter un front, il faut comparer l'état actuel d'un signal avec son état à l'instant précédent.

int etat_precedent;
int etat_actuel;

void setup(void){
    etat_precedent = digitalRead(mon_entrée);
}

void loop(void){
    etat_actuel = digitalRead(mon_entrée);
    if (etat_actuel = HIGH && etat_precedent=LOW){     // on détecte un front montant
          digitalWrite(ma_sortie,HIGH);
    }
    etat_precedent = etat_actuel;
}

Pour éviter l'utilisation de delay() il faut exploiter millis() qui compte en permanence le temps qui s'écoule par pas d'une milliseconde. Regarde l'exemple blinkWithoutDelay qui se trouve des les exemples intégrés à l'IDE.