Multiples compteurs par BP affichage LCD - amateur largué

Bonjour à tous.
Tout d'abord, je ne tiens pas à prendre le temps de qui que ce soit n'ayant pas la patience d'assister un vrai "naze" de la prog. Je ne vous en voudrai pas de ne pas me répondre si les questions sont trop simplistes et basiques. D'avance toutes mes excuses.

Je présente la situation:
il y a un bon bout de temps, je suis parvenu à réaliser un montage/programme d'afficheur Date/heure/Température/Humidité sur un LCD 16x2; le tout par méthode du copier/coller.
L'inconvénient est que n'ayant plus pratiqués après ce "premier" projet... enfin vous voyez!

Le projet:
Aujourd'hui, je me relance sur un projet pour mon club de Wargame à savoir un compteur de tours et de nombre d'ordres.
Composants:
2 BP pour incrémenter/décrémenter le nombre de tours // entrées 2 et 3
2 BP pour incrémenter/décrémenter le nombre d'ordres
1 BP RESET pour les tours // entrée 6
1 BP RESET pour les ordres
1 afficheur LCD 16x2 // entrée 7, 8, 9, 10, 11 et 12
(le reste est purement fonctionnel: interrupteur ON/OFF et LED rouge si ON)
L'Arduino est une MEGA2560
Le raccordement des BP est souhaité en "direct" avec PULL-UP interne. (sans conviction)

L'objectif est de faire monter/descendre les compteurs indépendamment et de pouvoir les remettre à 0 indépendamment également.

LE(s) PROBLEME(s):
j'ai lu en long, large et en travers tous les tutos sur les incrémentations par BP mais je ne m'y retrouve pas car tous ont des finalités différentes et mon cerveau est à l'état de soupe de termes inconnus plutôt qu'au déchiffrage...

Plutôt que d'essayer de programmer le tout de front, j'essaie d'abord de déblayer le premier compteur de tours et de parvenir à l'afficher et enfin pouvoir le remettre à 0; les ordres seraient alors un "simple" copier/coller.

Merci d'avance pour vos réponses.

Voici mon lambeau de code :

#include <LiquidCrystal.h>                                                    // Inclure la librairie de l'écran
//-----------------------------------------------------------------------------------------------------------------

//Déclaration des connections
const int TOURS_1  = 2;
const int TOURS_2  = 3;
//const int CLEAR  = 6;
//-----------------------------------------------------------------------------------------------------------------

//Déclaration des variables
int x;                                                                     //x variable du compteur TOURS
//int TOURS_1;
//int TOURS_2;
//int BPCLEAR;
//-----------------------------------------------------------------------------------------------------------------

LiquidCrystal lcd(7, 8, 9, 10, 11, 12);                                       //Initialiser lcd avec numéros des connecteurs digitaux utilisés
//-----------------------------------------------------------------------------------------------------------------

void setup() {
  lcd.clear();                                                                    //nettoyage écran
  lcd.setCursor(0, 0);                                                            // Positionnement du curseur colonne 0, ligne 0
  lcd.print("TOURS");                                                             // Affichage "TOURS:"
  lcd.setCursor(6, 0);                                                            // Positionnement du curseur colonne 6, ligne 0
  lcd.print(x);                                                                   // Affichage valeur de x

  pinMode(TOURS_1, INPUT);                                                          // Signal d'entrée
  digitalWrite(TOURS_1, HIGH);                                                      // Ecriture du signal d'entrée
  int x = 0;                                                                        // Déclaration de la valeur de la variable X
  //  TOURS_1 = x++;
  //  TOURS_1 = x--;

}

//-----------------------------------------------------------------------------------------------------------------

void loop() {
  if (digitalRead(TOURS_1) == LOW)
    lcd.setCursor(0, 0);                                                            // Positionnement du curseur colonne 0, ligne 0
  lcd.print("TOURS");                                                             // Affichage "TOURS:"
  lcd.setCursor(6, 0);                                                            // Positionnement du curseur colonne 6, ligne 0
  lcd.print(x);                                                                   // Affichage valeur de x

}
}

Bonjour ludo-44

Je pense, qu'avec tout ces boutons, la première chose à faire, est d'utiliser une bibliothèque comme Button, ça te simplifiera la vie. Tes boutons doivent être connectés au GND d'un côté et sur la pin de l'Arduino de l'autre.

Cordialement
jpbbricole

oui l'usage de bibliothèques quand on débute ou qu'on ne veut pas réinventer la roue c'est pas mal

jetez un oeil aussi à

il y a une bibliothèque bouton incluse et elle offre aussi la possibilité de faire une machine a état

Merci pour ces infos; je vais les lire attentivement et reviendrai vers vous pour un bilan (technique si tout va bien, santé si les nerf ont laché :smiley: )

tenez un example (tapé ici, totalement non testé) avec la bibliothèque easyRun - vous verrez que le code se lit "tout seul"

#include <LiquidCrystal.h>
#include <easyRun.h>

// --------------------
// les boutons: pin---btn---GND (utilisation du pullup interne)
// --------------------
button tourPlus(2);
button tourMoins(3);
button tourReset(6);

button ordrePlus(4);
button ordreMoins(5);
button ordreReset(A0);

// --------------------
// l'écran
// --------------------
LiquidCrystal lcd(7, 8, 9, 10, 11, 12);

long tour = 0, ordre = 0;

// --------------------
// utilitaires
// --------------------
void afficherTour() {
  lcd.setCursor(9, 0); lcd.print("       "); // on efface l'ancienne valeur
  lcd.setCursor(9, 0); lcd.print(tour);
}

void afficherOrdre() {
  lcd.setCursor(9, 1); lcd.print("       "); // on efface l'ancienne valeur
  lcd.setCursor(9, 1); lcd.print(ordre);
}

void afficher() {
  afficherTour();
  afficherOrdre();
}

// --------------------
// gestion des boutons
// --------------------

void gestionBoutons() {
  easyRun();
  if (tourPlus) {    // si le bouton tourPlus est appuyé alors
    tour++;          // on incrémente la valeur de la variable tour
    afficherTour();  // et on affiche la nouvelle valeur
  }

  if (tourMoins) {
    if (tour > 0) {
      tour--;
      afficherTour();
    }
  }

  if (tourReset) {
    tour = 0;
    afficherTour();
  }

  if (ordrePlus) {
    ordre++;
    afficherOrdre();
  }

  if (ordreMoins) {
    if (ordre > 0) { // on ne peut pas être négatif
      ordre--;
      afficherOrdre();
    }
  }

  if (ordreReset) {
    ordre = 0;
    afficherOrdre();
  }
}

void setup() {
  // Serial.begin(115200); Serial.println(); // nécessaire que si vous voulez afficher des trucs dans le moniteur série par exemple pour débuguer
  lcd.begin(16, 2);
  lcd.setCursor(0, 0); lcd.print(F("Tours  : "));
  lcd.setCursor(0, 1); lcd.print(F("Ordres : "));
  afficher();
}

void loop() {
  gestionBoutons();
  // ici vous pouvez faire autre chose du moment que c'est non bloquant
}
1 Like

Bonjour et merci pour ce "bout" de code!!
Fait en moins de temps que je ne lis les sujet sur la question!

Qqes neurones ont chauffé mais je comprends le principe.
Par contre, le "style" d'écriture est bien différent, plus simple, plus clair... et d'une logique imparable.
Ce qui me fait défaut et la connaissance du language et la maitrise des fonctions; il faut que je trouve un moyen d'apprentissage efficace. Les tutos "toutfait", c'est bien beau mais ça met déjà toutes les clés en mains sans réelle maitrise.

Je vais tester ce weekend et tenter de débuguer (si besoin).
Merci.

c'est l'avantage d'avoir une bibliothèque de bouton qui gère tout pour vous

dans la loop vous demandez de mettre à jour l'état des boutons (ça se fait en appelant juste easyRun();) puis vous pouvez simplement demander si le bouton a été appuyé depuis le dernier contrôle alors faire XYZ par exemple
if (tourPlus) { // si le bouton tourPlus est appuyé alors ...

ça simplifie drôlement le code :slight_smile:

1 Like

C'est certain! Génial!

Merci pour ces solutions; j'apprends tous les jours! :wink:

Comme je l'ai dit, je suis un "naze de la prog"; pas que je n'y comprenne rien (j'ai une formation d'électro-mécano et on bonne expérience de terrain) mais je suis toujours resté de l'autre côté de la barrière point de vue automation.
Je maîtrise plutôt bien l'électricité, très bien la mécanique-pneumatique-hydraulique, j'ai les bases en électronique mais la prog n'est jamais entrée dans mon panel de savoir faire, allez savoir pourquoi. :smiley:

vous me direz si ça fonctionne, je n'ai pas ce qu'il faut sous la main pour tester

1 Like

pas de soucis mais ce sera du weekend.

Si le projet tourne, je créerai un post complet sur le sujet pour apporter une pierre à l'édifice! :wink:

J'en ferai de même avec mon projet précédent après l'avoir fait corriger par la même voie que le celui-ci.
(même s'il tourne bien, je me doute qu'on doit pouvoir faire mieux...)

De retour avec un test bien plus tard que prévu...
Alors, j'ai testé le soft sur le montage.
L'afficheur reste muet:

Côté soft, une petite modif a été apportée à savoir l'appel de la boucle dans le setup.
image

C'est parfaitement inutile.
loop() est appelé immédiatement après l'exécution du setup()

1 Like

Vous avez bie noté l’usage de A0?
Est-ce que l’écran fonctionne ?

Bonjour,
Désolé pour le délai de réponse.
Oui, j'ai bien noté le A0 mais il n'était pas raccordé par manque de bp. (Les nouveaux viennent d'arriver)
Pour l'écran, j'en ai également acheté afin de tester.
Je devrais pouvoir de nouveau travailler sur le projet dans le courant de la semaine.
:wink:

Bonjour.
Test du LCD: même résultat avec le nouvel écran.


Voici le câblage:

(Les BP sont câblés en NO.)

Et enfin le programme tel qu'il est actuellement:

#include <LiquidCrystal.h>
#include <easyRun.h>

// --------------------
// les boutons: pin---btn---GND (utilisation du pullup interne)
// --------------------
button tourPlus(2);
button tourMoins(3);
button tourReset(6);

button ordrePlus(4);
button ordreMoins(5);
button ordreReset(A0);

// --------------------
// l'écran
// --------------------
LiquidCrystal lcd(7, 8, 9, 10, 11, 12);

long tour = 0, ordre = 0;

// --------------------
// utilitaires
// --------------------
void afficherTour() {
  Serial.println ("Dans AfficherTour"); //vérification appel
  lcd.setCursor(9, 0); lcd.print(" "); //on efface l'ancienne valeur
  lcd.setCursor(9, 0); lcd.print(tour); //affichage valeur tour
}

void afficherOrdre() {
  Serial.println ("Dans AfficherOrdre"); //vérification appel
  lcd.setCursor(9, 1); lcd.print(" "); //on efface l'ancienne valeur
  lcd.setCursor(9, 1); lcd.print(ordre); //affichage valeur ordre
}

void afficher() {
  afficherTour();
  afficherOrdre();
}

// --------------------
// gestion des boutons
// --------------------

void gestionBoutons() {
  easyRun();
  if (tourPlus) {    // si le bouton tourPlus est appuyé alors
    tour++;          // on incrémente la valeur de la variable tour
    afficherTour();  // et on affiche la nouvelle valeur
  }

  if (tourMoins) {
    if (tour > 0)    // on ne peut pas être négatif
      tour--;
      afficherTour();
    }
  }

  if (tourReset) {
    tour = 0;
    afficherTour();
  }
                        //On recommence pour Ordre
  if (ordrePlus) {
    ordre++;
    afficherOrdre();
  }

  if (ordreMoins) {
    if (ordre > 0) { 
      ordre--;
      afficherOrdre();
    }
  }

  if (ordreReset) {
    ordre = 0;
    afficherOrdre();
  }
}

void setup() {
  // Affichage moniteur série
  Serial.begin(115200);
  Serial.println();
  Serial.println("****PRET****"); 
  Serial.println();
  Serial.println("Ordres:");
  Serial.println(ordre);
  Serial.println("Tours");
  Serial.println(tour);
  Serial.println();

  //SOFT
  lcd.begin(16, 2);
  lcd.setCursor(0, 0); lcd.print(F("Tours  : "));
  lcd.setCursor(0, 1); lcd.print(F("Ordres : "));
  afficher();
}

void loop() {
  gestionBoutons();
  // ici vous pouvez faire autre chose du moment que c'est non bloquant
}

Message d'erreur:
"
Compteur_Soudards_3:60:3: error: expected unqualified-id before 'if'
if (tourReset) {
^~
Compteur_Soudards_3:65:3: error: expected unqualified-id before 'if'
if (ordrePlus) {
^~
Compteur_Soudards_3:70:3: error: expected unqualified-id before 'if'
if (ordreMoins) {
^~
Compteur_Soudards_3:77:3: error: expected unqualified-id before 'if'
if (ordreReset) {
^~
Compteur_Soudards_3:81:1: error: expected declaration before '}' token
}
^
exit status 1
expected unqualified-id before 'if'
"
Et enfin, le résultat sur le moniteur série:
image

ça ne peut pas marcher comme cela:
image

il faut SOUDER les pins à l'écran, la connexion d'un fil Dupont sera trop aléatoire pour fonctionner correctement surtout qu'il y a des transferts avec une fréquence assez importante.

➜ soudez un header femelle par exemple et ensuive venez enfoncer les fils Dupont dedans, un peu comme pour les pins sur un UNO. (ou mieux achetez un adaptateur I2C à souder au dos de l'écran et comme cela vous n'avez pas plein de fils à connecter, plus que 4 - 2 pour l'alimentation et 2 pour les données)

Il manque une accolade.

Toutes les pins avaient été soudées. :wink:
Je suis nul en prog mais j'ai de (très)bonnes notions techniques. :wink:

Mais merci quand même pour la remarque.

bien vu; il en manquait deux. :wink:

Merci

résultat toujours identique:
Rien à l'écran
Répétition sur moniteur série
image