Éviter la répétition de long passage de mon programme

Bonjour, j'ai ici réalisé un code avec pour but de le simuler dans proteus. Le but est de mesurer un intervalle de temps entre deux contacts qui sont représentés par deux relais (les relais sont activés par des appuis sur des boutons poussoir). J'aimerais maintenant pouvoir le faire pour plusieurs paires de contacts. Auriez vous une idée de comment faire pour ne pas reécrire le même code 25 fois avec juste la paire de contact qui change ? J'aimerais en effet pour éviter de m'emmêler les pinceaux. J'ai posté mon code juste en dessous. Dites moi si vous avez des pistes pour m'aider. Merci d'avance.

const int dcy = 8;
const int signal1 = 16;
const int signal2 = 14;
const int rouge = 10;
const int vert = 12;

enum {start,release,test,couleur} banc;

unsigned long ecart ;
unsigned long temps_contact1 ;
unsigned long temps_contact2 ;

void setup() {

Serial.begin(9600);
pinMode(dcy, INPUT);
pinMode(signal1, INPUT);
pinMode(signal2, INPUT);
pinMode(rouge, OUTPUT);
pinMode(vert, OUTPUT);

int banc = start;

}

void loop() {

switch(banc){

  case start:

    Serial.println("start");
    while (digitalRead(dcy) == LOW);{
    }
    banc =  release;
    break; 

  case release:

    Serial.println("release");
    while (digitalRead(dcy) == HIGH);{
    }
    banc = test;
    break;

  case test:

    
    while (digitalRead(signal1) == LOW && digitalRead(signal2) == LOW){
    }
    if (digitalRead(signal1) == HIGH){
      temps_contact1 = micros();
      while(digitalRead(signal2) == HIGH){
      }
      temps_contact2 = micros();
      Serial.print("ecart = ");
      ecart = temps_contact2 - temps_contact1;
      Serial.println(ecart);
      }

    if (digitalRead(signal2) == LOW){
      temps_contact2 = micros();
      while(digitalRead(signal1) == LOW){
      }
      temps_contact1 = micros();
      Serial.print("ecart = ");
      ecart = temps_contact1 - temps_contact2;
      Serial.println(ecart);
      }
      
      break;
  
  case couleur: 

  Serial.println("couleur");
  if (ecart > 100000){
    digitalWrite(rouge, HIGH);
  }
  else {
    digitalWrite(vert, HIGH);
  }
  break;
  }
}

`

Je n'ai pas regardé ton programme, mais l'utilisation d'un tableau me semble indiqué.

Dis donc ”l’étudiant ” tu n’as pas eu de cours sur les fonctions ?
Les passages de paramètres dans une fonction cela ne te dis rien ?

C’est quand même très basique et se trouve facilement dans un tuto de C/C++ et même d’autres langages, le principe est universel. .

Bonjour étant étudiant en électromécanique nous n'avons que peu de cours portés sur les langages et le code manière générale. Le maximum que nous ayons fait a été de refaire une senseo.

D'un autre coté c'est pas comme si tu vivais dans les années 80 et que internet n'existait :laughing:

Par exposé l'utilisation d'un tableau dans ton cas, j'ai fait un wokwi
Bien sûre pour il faudra un peu adapter à ton code et l'utilisation d'une fonction ne peut être qu'un plus :slight_smile:

1 Like

Bonjour etu50003

Tu dois axer ça autour de tableaux et fonction avec transfert de paramètre(s).
On va appeler chaque mesure un test. Chaque test a besoin de 2 entrées (signal1 et signal2). La mise en tableau de ces 2 paramètres se fait ainsi:

enum {sign1, sign2};
const int testPin[][2] = {{16, 14}, {5, 6}, {7, 8}};     // Tableau des pin des tests
const int testNombre = sizeof(testPin) / sizeof(testPin[0]);     // Nombre de tests

Ces ports sont initialisés ainsi:

	for (int t = 0; t < testNombre; t ++)
	{
		pinMode(testPin[t][sign1], INPUT);
		pinMode(testPin[t][sign2], INPUT);
	}

Pour ce qui est de la fonction avec passage de paramètre, j'ai pris un extrait de ta mesure que j'ai inclus dans la fonction long tempsEcart(int testNum). Ainsi, pour avoir la mesure du test 1, par exemple, tu fais:
long nouveauTest = tempsEcart(1);

La fonction:

long tempsEcart(int testNum)
{
	if (digitalRead(testPin[testNum][sign1]) == HIGH){
		temps_contact1 = micros();
		while(digitalRead(testPin[testNum][sign2]) == HIGH){
		}
		temps_contact2 = micros();
		Serial.print("ecart = ");
		ecart = temps_contact2 - temps_contact1;
		Serial.println(ecart);
	}
	return ecart;
}

Je n'ai pas essayé "en vrai" mais suis à ta disposition pour toutes questions :wink:

A+
Cordialement
jpbbricole

Bonjour merci pour les conseils sur les tableaux, j'ai essayé de m'en servir selon ce que j'en ai compris et avec mes connaissances actuelles. Voila mon code final, j'y ai placé 3 paires de contacts mais maintenant que ça fonctionne j'ai juste à l'adapter au nombre de paires dont j'aurais besoin réellement.
Voici mon code :

const int dcy = 8;
const int m_moins_1 = 14;
const int m_moins_2 = 15;
const int m_plus_1 = 16;
const int m_plus_2 = 17;
const int f_direct_1 = 18;
const int f_direct_2 = 19;
const int vert = 10;
const int rouge = 12;

unsigned long ecart ;
unsigned long temps_contact1 ;
unsigned long temps_contact2 ;

int tabcontact1[3] = {m_moins_1, m_plus_1,f_direct_1}; 
int tabcontact2[3] = {m_moins_2, m_plus_2,f_direct_2};

enum {start,release,test} banc;


void setup() {
Serial.begin(9600);
pinMode(dcy,INPUT);
pinMode(m_moins_1,INPUT);
pinMode(m_moins_2,INPUT);
pinMode(m_plus_1,INPUT);
pinMode(m_plus_2,INPUT);
pinMode(f_direct_1,INPUT);
pinMode(f_direct_2,INPUT);
pinMode(rouge, OUTPUT);
pinMode(vert, OUTPUT);

int banc = start;
}

void loop() {

switch(banc){  

case start:

    Serial.println("start");
    while (digitalRead(dcy) == LOW);{
    }
    banc =  release;
    break; 

  case release:

    Serial.println("release");
    while (digitalRead(dcy) == HIGH);{
    }
    banc = test;
    break;

  case test: 

  Serial.println("test");
  for(int a=0, j=0; a<3 && j<3; a++, j++){
    
    while (digitalRead(tabcontact1[a]) == LOW && digitalRead(tabcontact2[j]) == HIGH){
        }
        if (digitalRead(tabcontact1[a]) == HIGH){
          temps_contact1 = micros();
          while(digitalRead(tabcontact2[j]) == HIGH){
          }
          temps_contact2 = micros();
          Serial.print("ecart = ");
          ecart = temps_contact2 - temps_contact1;
          Serial.println(ecart);
          goto skip;
          }
          

        if (digitalRead(tabcontact2[j]) == LOW){
          temps_contact2 = micros();
          while(digitalRead(tabcontact1[a]) == LOW){
          }
          temps_contact1 = micros();
          Serial.print("ecart = ");
          ecart = temps_contact1 - temps_contact2;
          Serial.println(ecart);
          }
          skip:
        Serial.println("ecart suivant");
  }
  Serial.println("fin des mesures");
  break;

Je trouve la partie sur la déclaration/initialisation des pins super intéressante car je n'avais pas du tout pensé à faire comme ça. J'étais resté sur ce que j'ai appris à l'école mais je me rends compte que j'ai encore énormément à apprendre

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.