Auteur Sujet: À votre avis ...  (Lu 21178 fois)

Thierry

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 810
    • Voir le profil
Re : Re : À votre avis ...
« Réponse #15 le: septembre 17, 2020, 02:33:13 pm »
En réalité les deux erreurs et le warning proviennent du même problème.

Le compilateur relève que vous déclarez un 'int bp[]', donc une matrice d'entiers signés, que vous utilisez comme argument alors que digitalRead() attend un uint8_t, c'est à dire un simple entier non signé . Donc première action, changer votre int bp[] en uint8_t bp[]. Seconde action, à la fois pour le digitalRead et le switch, décider lequel de ces entiers vous voulez utiliser : bp[0], bp[1], bp[2]...

Attention aussi aux rebonds. Un bouton poussoir ou un interrupteur ne passent pas proprement d'un état à l'autre. Pendant quelques millisecondes leur état navigue entre les deux et n'est pas déterminé. c'est pourquoi il faut utiliser une bibliothèque comme 'Bounce2' ou 'OneButton' qui vont introduire un délai
entre le premier changement d'état, et l'état définitif stabilisé: voir l'article "https://www.locoduino.org/spip.php?article176"

Minimir09

  • Jr. Member
  • **
  • Messages: 53
    • Voir le profil
Re : À votre avis ...
« Réponse #16 le: septembre 17, 2020, 03:12:45 pm »
Merci Thierry,
"Seconde action, à la fois pour le digitalRead et le switch, décider lequel de ces entiers vous voulez utiliser : bp[0], bp[1], bp[2]..." ???
 là, je n'assimile pas !
digitalRead ... c'est bien la lecture de l'état du bouton ? si j’appuie sur ce bp, l'état doit passé de 0 à 1 (LOW à HIGH ?)
Je pense que ce "digitalRead" est mal placé et aussi mal défini.
Comment définir l'état d'un (et d'un seul) bp sur lequel on a appuyé parmi les 8 du tableau ?

Il me semble avoir lu que les cartes Arduino géraient maintenant le rebond en interne ? exact ou pas !
merci pour votre aide qui m'est très précieuse
La perfection n’existe pas sur Terre … Mais alors, d’où est-ce que je viens ?

Thierry

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 810
    • Voir le profil
Re : À votre avis ...
« Réponse #17 le: septembre 17, 2020, 04:06:48 pm »
Là on rejoint les bases du développement : digitalRead(broche) retourne l'état d'une et une seule broche. Et l'argument sert à lui dire de quelle broche de l'Arduino on veut récupérer l'état. Si broche vaut 3, on prend l'état de la broche 3. Mais en aucun cas la broche ne peut être multiple ! Il faut donc faire une boucle sur la liste de broches 'bp' pour interroger successivement chacune d'elle. Et ça tombe bien, on a déjà une boucle qui tourne et recommence à l'infini !

digitalRead est bien placé, mais son argument est faux.

On a deux solutions pour la boucle :

Soit on se sert de loop() qui boucle tout le temps, et on traite une broche (ou un bp) à chaque passage :

int i = 0

loop()
{
  buttonState = digitalRead(bp[i]);
  ....
  i++;
  if (i >= 8)
    i = 0;
}

Soit on fait une vraie boucle à chaque loop() :

loop()
{
  for(int i = 0; i < 8; i+)
  {
    buttonState = digitalRead(bp[i]);
    ...
  }
}

Et non, les Arduino ne gèrent pas les rebonds vu qu'ils ne savent pas ce que l'on connecte au bout de leur broches... C'est le programme qui doit gérer ça.

Minimir09

  • Jr. Member
  • **
  • Messages: 53
    • Voir le profil
Re : À votre avis ...
« Réponse #18 le: septembre 17, 2020, 05:23:02 pm »
Ah que ! comme disait le chanteur !
Je commence à comprendre ... que j'ai encore de nombreux jours de lecture sur Locoduino !
Avant de passer à l'anti rebond, j'ai une dernière erreur que je n'arrive pas à solutionner :
=======================
F:\PROGRAMMATION PERSO\TEST_Boutons-poussoirs-et-Aiguillages\TEST_Boutons-poussoirs-et-Aiguillages.ino: In function 'void loop()':
TEST_Boutons-poussoirs-et-Aiguillages:43:17: error: switch quantity not an integer
       switch (bp) // debut de la structure
                 ^
exit status 1
switch quantity not an integer
=======================
Pourtant la variable "bp" est bien en integer !! pourquoi "switch" ne l'accepte pas ? merci pour l'aide, je m'instruis de + en + !

ci-joint le code modifié avec la boucle loop()
// déclaration des boutons poussoirs et des aiguillages
uint8_t bp[] = {5, 6, 7, 8, 9, 10, 11, 12} ; // Boutons poussoirs Normalement Ouvert (NO)
uint8_t aig[] = {22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38} ;

int buttonState = 0 ;
int timer = 50 ;

void setup() {
  // Initialisation
  for (uint8_t bp = 0; bp <= 12; bp++) {
    pinMode(bp, INPUT) ;
  }
  for (uint8_t aig = 0; aig <= 38; aig++) {
    pinMode(aig, OUTPUT) ;
  }

  // initialisation de la gare
  // C1_V1
  digitalWrite(22, HIGH) ; // aiguillage G1 D
  digitalWrite(23, HIGH) ; // aiguillage A1 G
  digitalWrite(28, HIGH) ; // aiguillage A3 G
  // C2_V2
  digitalWrite(31, HIGH) ; // aiguillage B1 G
  digitalWrite(36, HIGH) ; // aiguillage B3 D
  digitalWrite(26, HIGH) ; // aiguillage A2 D
  digitalWrite(29, HIGH) ; // aiguillage A4 G
  // C3_V3
  digitalWrite(34, HIGH) ; // aiguillage B2 D
  digitalWrite(37, HIGH) ; // aiguillage B4 G
}

void loop()
{
  loop() ;
  {
    for (int i = 0; i < 12; i++)
    {
      buttonState = digitalRead(bp[i]) ;


      // l'instruction break est en option

      switch (bp) // debut de la structure
      {
        case 5:           // bouton C1_V1
          digitalWrite(22, HIGH) ;  // aiguillage G1_D
          delay(timer);
          digitalWrite(23, HIGH) ;  // aiguillage A1_G
          delay(timer);
          digitalWrite(28, HIGH) ;  // aiguillage A3_D
          break;
        case 6:         // bouton C1_V2
          digitalWrite(22, HIGH) ;  // aiguillage G1_D
          delay(timer);
          digitalWrite(24, HIGH) ;  // aiguillage A1_D
          delay(timer);
          digitalWrite(30, HIGH) ;  // aiguillage A4_D

          break;
        case 7:           // bouton C2_V1
          digitalWrite(31, HIGH) ;  // aiguillage B1_G
          delay(timer);
          digitalWrite(36, HIGH) ;  // aiguillage B3_D
          delay(timer);
          digitalWrite(25, HIGH) ;  // aiguillage A2_G
          delay(timer);
          digitalWrite(27, HIGH) ;  // aiguillage A3_G

          break;
        case 8:           // bouton C2_V2
          digitalWrite(31, HIGH) ;  // aiguillage B1_G
          delay(timer);
          digitalWrite(36, HIGH) ;  // aiguillage B3_D
          delay(timer);
          digitalWrite(26, HIGH) ;  // aiguillage A2_D
          delay(timer);
          digitalWrite(29, HIGH) ;  // aiguillage A4_G

          break;
        case 9:           // bouton C2_V3
          digitalWrite(32, HIGH) ;  // aiguillage B1_D
          delay(timer);
          digitalWrite(38, HIGH) ;  // aiguillage B4_D

          break;
        case 10:          // bouton C3_V1
          digitalWrite(33, HIGH) ;  // aiguillage B2_G
          delay(timer) ;
          digitalWrite(35, HIGH) ;  // aiguillage B3_G
          delay(timer) ;
          digitalWrite(25, HIGH) ;  // aiguillage A2_G
          delay(timer) ;
          digitalWrite(27, HIGH) ;  // aiguillage A3_G

          break;
        case 11:          // bouton C3_V2
          digitalWrite(33, HIGH) ;  // aiguillage B2_G
          delay(timer) ;
          digitalWrite(35, HIGH) ;  // aiguillage B3_G
          delay(timer) ;
          digitalWrite(26, HIGH) ;  // aiguillage A2_D
          delay(timer) ;
          digitalWrite(29, HIGH) ;  // aiguillage A4_G

          break;
        case 12:          // bouton C3_V3
          digitalWrite(33, HIGH) ;  // aiguillage B2_G
          delay(timer) ;
          digitalWrite(37, HIGH) ;  // aiguillage B4_G

          break;
          // default: // cas par d�faut
          // si aucune condition n'est vraie, le code par d�faut sera ex�cut�
          // le cas default est optionnel (non -obligatoire)
      }
    }
  }
}
La perfection n’existe pas sur Terre … Mais alors, d’où est-ce que je viens ?

msport

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 2217
  • HO avec DCC++ en DIY Réseaux très éphémères
    • Voir le profil
Re : À votre avis ...
« Réponse #19 le: septembre 17, 2020, 06:41:23 pm »
Comme le dit Thierry  Il faut donc faire une boucle sur la liste de broches 'bp' pour interroger successivement chacune d'elle.

c'est bp[n] qui est un entier pas bp

Le switch devra se faire sur un int n que vous aurez testé avec un if ( digitalRead(bp[ i ] == LOW) {n=i;} // 2e proposition de Thierry

pour les bp, voyez l'intérêt de INPUT PULLUP

Une remarque : si vous ne faites pas suivre le
  digitalWrite(37, HIGH) ; // aiguillage B4 G

par un   digitalWrite(37, LOW) ; // aiguillage B4 G
 avec un delay entre, il va griller ...

Vous devriez réfléchir sur l'exemple du site éditorial cité plus haut et bien voir ce qu'il fait.
Cordialement

Minimir09

  • Jr. Member
  • **
  • Messages: 53
    • Voir le profil
Re : À votre avis ...
« Réponse #20 le: septembre 18, 2020, 07:02:02 am »
Bonjour,
Eh ben voilà ... ce soir je vais me mettre au lit, un peu plus instruit  !  8)
Merci pour ces précisions et en particulier sur le faite de ramener à LOW la commande digitalWrite.
pour en revenir à l'origine de cette discussion, je n'avais pas tord en vous demandant votre avis sur le fait de diriger une rame en appuyant sur un seul bouton pour créer un itinéraire ...
Merci encore, à 75 ans j'en apprend toujours et encore !  :D
La perfection n’existe pas sur Terre … Mais alors, d’où est-ce que je viens ?

Thierry

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 810
    • Voir le profil
Re : À votre avis ...
« Réponse #21 le: septembre 18, 2020, 08:43:13 am »
Attention aussi à bien faire une boucle de 0 (premier bouton) à 7 (dernier bouton). Vous la faite de 0 à 12 : vous allez au delà de la fin de la liste qui s'arrête à 7 ! Avec de la chance,  ça marchera probablement, mais le comportement sera indéterminé pour les broches de 8 à 12.
Idem dans le setup pour les initialisations : vous n'avez que 8 broches et 17 aiguillages à initialiser.

Il faut comprendre que 'bp' est un contenant, pas un contenu.
Pour faire une analogie, imaginez une étagère avec des cubes numérotés. L'étagère s'appelle 'bp' et contient 8 cubes. Lorsque vous voulez savoir ce qui se trouve sur l'étagère, vous parcourez les cubes depuis le premier, le 0 (c'est comme ça en C++...) au dernier le 7, puisque ça commence à 0. Peu importe les numéros marqués sur les cubes, vous avez toujours vos huit cubes ! Par contre, pour utiliser l'un des cubes, vous devez préciser lequel. Avec bp[3], vous utilisez la valeur du quatrième cube, quelle qu'elle soit.
« Modifié: septembre 18, 2020, 08:52:12 am par Thierry »

Minimir09

  • Jr. Member
  • **
  • Messages: 53
    • Voir le profil
Re : À votre avis ...
« Réponse #22 le: septembre 18, 2020, 09:56:25 am »
Merci Thierry.
TOUT fonctionne grâce à vous, et un grand merci à msport qui m'a bien "aiguillé" aussi ! ;D
Je constate que quand on a à faire à des maîtres en la matière, on y gagne nécessairement ! 8)

 2 questions pour parfaire l'enseignement !!!!
1) en C++, plusieurs commandes sur une même ligne, commandes séparées par un ";" ... possible ou pas ?

2) serait-il nécessaire de déclarer une vitesse de transmission plus importante que le 9600 du port com ?
Pour le moment, je n'ai encore jamais branché la carte Mega 2560 en USB sur l'ordinateur.
La perfection n’existe pas sur Terre … Mais alors, d’où est-ce que je viens ?

Minimir09

  • Jr. Member
  • **
  • Messages: 53
    • Voir le profil
Re : À votre avis ...
« Réponse #23 le: septembre 18, 2020, 10:03:29 am »
La question n° 2 est sans objet !
le port comme est par défaut à 115200 !
La perfection n’existe pas sur Terre … Mais alors, d’où est-ce que je viens ?

Thierry

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 810
    • Voir le profil
Re : À votre avis ...
« Réponse #24 le: septembre 18, 2020, 01:56:32 pm »
1) oui, mais ce n'est pas lisible. On passe souvent à côté d'une instruction parce qu'elle est au bout de la ligne... Donc en pratique, non.

2) Je ne sais pas quelle est la valeur par défaut, et peu importe d'ailleurs, mais il faut que la console soit à la même valeur que le Serial.begin() !

msport

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 2217
  • HO avec DCC++ en DIY Réseaux très éphémères
    • Voir le profil
Re : Re : À votre avis ...
« Réponse #25 le: septembre 18, 2020, 03:22:21 pm »
... en C++, plusieurs commandes sur une même ligne, commandes séparées par un ";"

N'allons pas trop vite, la syntaxe est celle du C, pour le C++, il faut revenir en 2e année. Moi, je n'y suis pas encore, il ne faut pas me surestimer.

PS : (au cas où) ne pas oublier les résistances pour les LED du TCO.

re PS ; et peut-être qu'il faut réinitialiser n à 0 une fois que l'ordre (les) a été exécuté pour éviter d'y revenir indéfiniment.
« Modifié: septembre 18, 2020, 03:36:09 pm par msport »
Cordialement