Utilisation de valeurs d'un tableau

Bonjour,

quelqu'un saurait me dire comment passer d'une valeur de tableau à la suivante, sans l'écrire textuellement ?

c'est à dire: j'ai un tableau const int capteur[8] = {10,11,12,13 etc..};

je veux lire l'entrée du capteur correspondant à la case mémoire 0.

vous allez me dire facile, il suffit de faire EtatCapteur = digitalRead(capteur[0]);

alors oui mais non, moi je veux pouvoir lire chaque capteur, les uns après les autres, une fois le précédent lu.

soit : capteur[0], puis le capteur[1],puis le capteur 2 ...etc sans retaper à chaque fois.

j'avais donc essayer de faire :

une variable globale int n=0;

EtatCapteur = digitalRead(capteur[n]);

if (EtatCapteur ==HIGH){

n = n++;

}

et ça, ça ne fonctionne pas du tout, car n prend la valeur 0 puis 1, mais écrase les valeurs tableau, donc les pins à lire, et les remplace par 0,0,0,0etc puis 1,1,1,1etc...

je suis dans une impasse.

Bonjour,

Il suffit de faire une boucle

const byte capteur[] = {10,11,12,13};
//
//...
//
  for (byte n=0; n<sizeof capteur; n++)
  {
    int etatCapteur=digitalRead(capteur[n]);
    if (etatCapteur==HIGH)
    {
      // faire quelque chose
    }
  }
1 Like

ça n'écrase rien du tout

si je comprends bien (pas sûr ??) vous voulez lire tout le tableau et conserver cela aussi dans un tableau, pas une seule variable

const byte capteurs[] = {10,11,12,13};
byte valeurs[sizeof capteur];

...
  for (byte n=0; n<sizeof capteur; n++)
    valeurs[n] = digitalRead(capteur[n]);

// ici le tableau de valeurs[] contient l'état des pins

merci à vous je vais essayer de voir avec vos réponses.
je ne comprends pas ceci : ```
n<sizeof capteur;

voici le code qui ne fonctionne pas:


const byte boutonQuatre = 13;
boolean EtatBoutonQuatre = 0;
int Capteur[3] = {10, 11, 12};
boolean EtatCapteur = 0;
int MemoireEtatCapteur = 0;
int Led[3] = {5, 6, 7};
enum {Test, Bon, Mauvais} scrutation;
int PassageOK = 0;




void setup() {
  for (int i = 0; i < 3; i++)
    pinMode (Capteur[i], INPUT);
  pinMode (boutonQuatre, INPUT);
  pinMode (Led[0], OUTPUT);
  pinMode (Led[1], OUTPUT);
  pinMode (Led[2], OUTPUT);
  Serial.begin(9600);
}

void loop() {
  graph();
}


void graph() {
  switch (scrutation) {
    case Test:
      Serial.println(n);
      Serial.println(Capteur[0]);
      Serial.println(Capteur[1]);
      Serial.println(Capteur[2]);

      EtatCapteur = digitalRead(Capteur[n]);
      if (EtatCapteur != MemoireEtatCapteur) {
        PassageOK = 1;
        MemoireEtatCapteur = EtatCapteur;
        scrutation = Bon;
      }
      EtatBoutonQuatre = digitalRead(boutonQuatre);
      if (EtatBoutonQuatre == HIGH) {
        scrutation = Mauvais;
      }
      break;

    case Mauvais:
      digitalWrite(Led[2], HIGH);
      delay(3000);
      digitalWrite(Led[2], LOW);
      scrutation = Test;
      break;

    case Bon :
      Serial.println(n);
      EtatBoutonQuatre = digitalRead(boutonQuatre);
      if (PassageOK == HIGH && EtatBoutonQuatre == HIGH) {
        digitalWrite(Led[0], HIGH);
        delay(5000);
        PassageOK = 0;
        digitalWrite(Led[0], LOW);
        ++n;
        scrutation = Test;
      }
      break;
  }
}

Merci d'éditer votre post pour rajouter les balises de de code, c'est quasiment illisible tel quel:

  • sélectionner la partie du texte qui correspond au code
  • appuyez sur l'icône </> dans la barre d'outils pour indiquer que c'est du code

(Assurez vous aussi d'indenter le code correctement dans l'IDE avant de le copier pour le coller ici. Cela se fait en pressant ctrlT sur PC ou cmdT sur un Mac)


sizeof capteur est une instruction qui demande au compilateur quelle est la taille du tableau en octets. Comme votre tableau de pins contient des octets, cette valeur correspond au nombre de pins déclarées

voici ce que dit le moniteur série une fois le bouton pin 10 appuyé

en fait, ce que je veux faire, c'est lire les valeurs tableau et attribuer la lecture à un capteur à la fois. puis passer à la valeur suivante pour changer de pin, car le tableau capteur contient les pins de broches d'entrées.

quand j'écris ça, dans ma tête ça devrait faire :
lire le capteur emplacement 0 (puisque n = 0) donc le capteur sur pin 10, une fois fait j'incrémente le n pour passer à l'emplacement 1 soit le pin 11. mais ça c'est dans les rêves , pas dans la vraie vie.

prenez un pas de recul et expliquez en français ce que doit faire le code

ce que devrait faire le code :

un tableau contient par exemple 20 capteurs, je n'ai besoin de lire qu'un seul capteur à la fois.
j'ai donc créé un tableau pour éviter d'écrire 20 variables et 20 déclarations.
mes entrées capteurs ont leur pin enregistrée dans ce tableau, par exemple de 10 à 30.
je veux donc lire le pin de mon premier capteur, et une fois celui ci lu et son action faite, passer au capteur suivant.
c'est donc pour cela que j'avais penser utiliser une vairable n qui serait incrémentée en tant qu'espace mémoire du tableau. mais ça ne fonctionne pas.
je ne comprends pas pourquoi car quand on fait une boucle FOR pour déclarer les pins en INPUT, ça fonctionne très bien.
voilà j’espère avoir été clair.

Si la boucle for fonctionne très bien, pourquoi tu ne fais pas une boucle for pour la lecture des capteurs?

j'ai essayé en premier, mais elle ne s'execute qu'une fois.
du coup après j'avais fait un if (n = 2) { n=0}; pour boucler à l'infini, et ça non plus ça ne fonctionne pas. donc je suis parti sur autre chose.
j'avais même fait deux tableaux, un avec les broches capteurs et un autre avec les états de chaque capteur, mais là c'était pire...

je vais vous montrer en code ce que je veux faire, mais qui est pas intelligent de faire vu qu'il faut répéter autant de fois le bloc qu'il y a de capteurs. je code et je reviens.

essayez ça d'un point de vue "concept"

const byte pinCapteurs[] = {10, 11, 12};
const byte nombreDeCapteurs = sizeof pinCapteurs;

void lecture() {
  for (byte i = 0; i < nombreDeCapteurs; i++)  {
    Serial.print(digitalRead(pinCapteurs[i]) == LOW ? "LOW  " : "HIGH ");
  }
  Serial.println();
}

void setup() {
  for (byte i = 0; i < nombreDeCapteurs; i++)  pinMode (pinCapteurs[i], INPUT);
  Serial.begin(115200);
}

void loop() {
  lecture();
  delay(1000);
}

(avec le terminal série à 115200 bauds)

ça fait ça :
j'ai bêtement recopié et lancé, car je ne comprends pas bien le code.

ça lit toutes les secondes l'état de vos 3 capteurs et ça les affiche...

par contre je n'ai touché à rien, et ça change d'état tout seul ?

oui, une pin en INPUT va être très sensible aux perturbations électromagnétiques ambiantes.

mettez les pins en INPUT_PULLUP si vous voulez leur fixer une valeur HIGH par défaut (ou un pulldown externe si vous voulez LOW par défaut)

oh mon dieu, je viens de voir que depuis ce matin j'appuis sur mes capteurs, mais qu'ils étaient branché sur le mauvais trou de la breadboard............. d'où le changement d'état vu avec votre programme.... bon ça résoud pas tout, mais il va falloir que je re test. pardon.

:wink:

ça nous est tous arrivé au moins une fois...