Télérupteur - Afficheur 7 segments

Dans le cadre d'un projet qui consiste (en gros) à répondre à un QCM à l'aide d'un bouton poussoir, d'incrémenter un nombre en fonction des réponses choisies, et d'afficher le résultat en direct, je suis bloqué par mais faibles connaissances.

En effet mon code actuel me permet d'afficher mon résultat mais seulement si je reste appuyé sur le bouton. Afin d'avoir le résultat total après avoir répondu à 4 questions, il faudrait donc que je reste appuyé sur 4 boutons en même temps (pas du tout pratique...).

J'aurais donc besoin de votre aide pour améliorer mon code et créer une sorte de mémoire de l'état du bouton pour juste avoir à appuyer chaque bouton une seule fois.

const int L1 = 30; 
const int L2 = 31; 
const int L3 = 32;
const int L4 = 33;
const int L5 = 34;
const int L6 = 35;
const int L7 = 36;
const int L8 = 37;
//////Question a : 4 réponses possibles///////
const int a1 = 9;
const int a2 = 8;
const int a3 = 7;
const int a4 = 6;
//////Question b : 4 réponses possibles///////
const int b1 = 5;
const int b2 = 4;
const int b3 = 3;
const int b4 = 2;
int nombre_points = 0; // nombre incrémenté 
int points_q1; //nombre de points à la question 1
int points_q2; //nombre de points à la question 2
byte etat1; // etat du bouton Question a : réponse 1
byte etat2; // etat du bouton Question a : réponse 2
byte etat3; // ...
byte etat4; // ...
byte etat5; // etat du bouton Question b : réponse 1
byte etat6; // etat du bouton Question b : réponse 2
byte etat7; // ...
byte etat8; // ...
//////////////////////////////////////////////////////Fonction Setup/////////////////////////////////////////////
void setup()
{
  for (int n=2; n<=9; n++){
    pinMode(n, INPUT);}
  for (int n=30; n<=37;n++) {
    pinMode(n, OUTPUT);}
} 
/////////////////////////////Déclaration des différents segments à allumer pour afficher les chiffres////////////
void zero(){ 
  digitalWrite(L1,LOW);
  digitalWrite(L2,HIGH);
  digitalWrite(L3,HIGH);
  digitalWrite(L4,HIGH); 
  digitalWrite(L5,LOW);
  digitalWrite(L6,HIGH); 
  digitalWrite(L7,HIGH);
  digitalWrite(L8,HIGH);}
void un(){
  digitalWrite(L1,LOW);
  digitalWrite(L2,LOW);
  digitalWrite(L3,LOW);
  digitalWrite(L4,HIGH); 
  digitalWrite(L5,LOW);
  digitalWrite(L6,HIGH); 
  digitalWrite(L7,LOW);
  digitalWrite(L8,LOW);}
void deux(){
  digitalWrite(L1,HIGH);
  digitalWrite(L2,LOW);
  digitalWrite(L3,HIGH);
  digitalWrite(L4,HIGH);
  digitalWrite(L5,LOW);
  digitalWrite(L6,LOW);
  digitalWrite(L7,HIGH);
  digitalWrite(L8,HIGH);}
void trois(){  
  digitalWrite(L1,HIGH);
  digitalWrite(L2,LOW);
  digitalWrite(L3,HIGH);
  digitalWrite(L4,HIGH);
  digitalWrite(L5, LOW);
  digitalWrite(L6,HIGH);
  digitalWrite(L7,HIGH);
  digitalWrite(L8,LOW);}
void quatre(){
  digitalWrite(L1,HIGH);
  digitalWrite(L2,HIGH);
  digitalWrite(L3, LOW);
  digitalWrite(L4,HIGH);
  digitalWrite(L5, LOW);
  digitalWrite(L6,HIGH);
  digitalWrite(L7, LOW);
  digitalWrite(L8, LOW);}
void cinq(){
  digitalWrite(L1,HIGH);
  digitalWrite(L2,HIGH);
  digitalWrite(L3,HIGH);
  digitalWrite(L4, LOW);
  digitalWrite(L5,HIGH);
  digitalWrite(L6,HIGH);
  digitalWrite(L7,HIGH);
  digitalWrite(L8, LOW);}
void six(){
  digitalWrite(L1,HIGH);
  digitalWrite(L2,HIGH);
  digitalWrite(L3,HIGH);
  digitalWrite(L4,LOW);
  digitalWrite(L5,LOW);
  digitalWrite(L6,HIGH);
  digitalWrite(L7,HIGH);
  digitalWrite(L8,HIGH);}
void sept(){
  digitalWrite(L1,LOW);
  digitalWrite(L2,LOW);
  digitalWrite(L3,HIGH);
  digitalWrite(L4,HIGH);
  digitalWrite(L5,HIGH);
  digitalWrite(L6,HIGH);
  digitalWrite(L7,LOW);
  digitalWrite(L8,LOW);}
void huit(){
  digitalWrite(L1,HIGH);
  digitalWrite(L2,HIGH);
  digitalWrite(L3,HIGH);
  digitalWrite(L4,HIGH);
  digitalWrite(L5,HIGH);
  digitalWrite(L6,HIGH);
  digitalWrite(L7,HIGH);
  digitalWrite(L8,HIGH);}
/////////////////////////////////////////////////////Fonction boucle principale loop//////////////////////////////////
void loop() {
  int etat1 = digitalRead(a1);
  int etat2 = digitalRead(a2);
  int etat3 = digitalRead(a3);
  int etat4 = digitalRead(a4);
  int etat5 = digitalRead(b1);
  int etat6 = digitalRead(b2);
  int etat7 = digitalRead(b3);
  int etat8 = digitalRead(b4);
  ///Nombre de points à incrémenter en fonction du bouton appuyé
  if (etat1==HIGH) {
      points_q1=1;}
  else if (etat2==HIGH) {
      points_q1 = 2;}
  else if (etat3==HIGH) {
      points_q1 = 3;}
  else if (etat4==HIGH) {
      points_q1 =  4;}
  else points_q1 = 0;
  
  if (etat5==HIGH) {
      points_q2 = 1;}
  else if (etat6==HIGH) {
      points_q2 = 2;}
  else if (etat7==HIGH) {
      points_q2 = 3;}
  else if (etat8==HIGH) {
      points_q2 = 4;}
  else points_q2 = 0;

  nombre_points = points_q1 + points_q2 ;
/////////////////////////////////Affichages en fonction du résultat de nombre_points/////////////////////////////////:
  if (nombre_points == 0){
    zero();}              // chiffre 0
  if (nombre_points == 1){
    un();}                // chiffre 1
  if (nombre_points == 2){
    deux();}              // chiffre 2
  if (nombre_points == 3){
    trois();}             // chiffre 3
  if (nombre_points == 4){
    quatre();}            // chiffre 4
  if (nombre_points == 5){
    cinq();}              // chiffre 5
  if (nombre_points == 6){
    six();}               // chiffre 6
  if (nombre_points == 7){
    sept();}              // chiffre 7
  if (nombre_points == 8){
    huit();}              // chiffre 8
}

Bonjour,

Je ne comprend pas bien ce que tu veux faire. Tu veux appuyer sur le bouton correspondant à réponse à la question 1 puis sur le bouton de la question 2 puis afficher le résultat?
Si oui, il ne faut pas tester l'état des boutons, mais le fait que le bouton vient d'être enfoncé.

C'est exactement ça.
Un exemple : la réponse 1 de la question A et de la question B vaut 1 point.
Lorsque j'appuis sur le bouton correspondant à la question A, mon afficheur "affiche" un 1.
Si maintenant j'appuis sur le bouton correspondant à la question B, mon afficheur donnera instantanément un 2.

Je ne vois pas trop la différence entre "tester l'état des boutons et le fait que le bouton vient d'être enfoncé" d'un point de vue programmation.

Bonjour

Ceci devrait pouvoir t'aider

Salut ; AlexandreC;
Je salue ta mise en pratique dans ton code qui a débouché a un résultat.
Belle effort de programmation !! Bravo!
Pour la peine voici un petit outil sympa !! Qui t’épargnera a l'avenir de réitéré de multitudes lignes de codes.

Pour ton afficheur tu devrais utiliser un tableau bidimensionnel.
Cela ressemble à ça!
bool num [X] [Y] ={};
X est le nombre de lignes de ton tableau et Y le nombres de donnée par ligne.

bool num [12] [8] = { /*Ce tableau nous donnes l'état que doit
  avoir chaque leds allumé ou éteinte, sur l'afficheur 7 segments.*/
  {1, 1, 1, 1, 1, 1, 0, 0}, // chiffre 0.
  {0, 1, 1, 0, 0, 0, 0, 0}, // Chiffre 1.
//Et ainsi de suite => A toi de continuer !
  {0, 0, 0, 0, 0, 0, 0, 0},//11 Extinction de l'afficheur.
};//Fin du tableau.

//Ceci te permet de lire le contenu du tableau.
  if (resultat > 9) { //Conditionnement de l'affichage sous la valeur de neuf si supperieur extinction.
    resultat = 11;//ligne du tableau contenant que des zéro.
  }
  /*Mise en place de la boucle pour incrémenter les données du tableau*/
  for (int i = 0; i < 8; i++) {
    /*!!ATTENTION!! à ajouter plus deux à "i"pour ne pas exploiter les broches zéro et un.
      Allumage ou extinction des leds en fonction des données du tableau.
      Chaque données de la ligne actuelle est interrogé pour savoir quelle est l'action à éxecuter à la leds
      HIGH=Allumage : LOW=Extinction */
    digitalWrite (i + 2, (num[resultat][i] == 1) ?  HIGH : LOW );
  }//fin de la boucle.
  delay(800);

Pour commencer avec les tableaux c'est déjà pas mal.
Essai de comprendre le tableau et de l’intégrer à ton programme.

A plus!!

Salut;

Une fois que tu as maitriser le fonctionnement des tableaux, tu peut également déclarer un autre tableau qui contient les numéros des broches de chaque LEDs de segment de l’afficheur et le faire évoluer dans la boucle "for".
int leds [8] = {2,3,4,5,6,7,8,9};

Ce qui supprimera le risque d'exploiter la broche 0 et 1. Donc remplacer " i+2 " par leds [ i ]

A plus!

Merci Manumanu !

Je vais m'y mettre de ce pas. Cependant pourrais tu m'expliquer ce que test/fait la ligne
" digitalWrite (i + 2, (num[resultat] == 1) ? HIGH : LOW ); " ?
Cordialement,
Alex

 digitalWrite (i + 2, (num[resultat] == 1) ?  HIGH : LOW );

c'est une version "réduite" d'un if()else, si tu la traduits en if/else, ca donne ceci :

if ( num[resultat]==1 )
{
   digitalWrite(i+2, HIGH);
}
else
{
  digitalWrite(i+2, LOW);
}

Salut;

Je vais m'y mettre de ce pas. Cependant pourrais tu m'expliquer ce que test/fait la ligne
" digitalWrite (i + 2, (num[resultat] == 1) ? HIGH : LOW ); " ?

Zorro a raison !

Pour activer une sortie tu utilise Exemple digitalWrite (4, HIGH); soit =>
digitalWrite (broche de sortie, état à lui appliquer);

Dans l'instruction ci dessus tu fait la même chose sauf que tu interroge par le biais de "?" la variable entre parentes.
Si c'est égale a 1 tu lui applique HIGH si non LOW par le biais de ":".
Si LOW est placer avant les : tu fera l'inverse.

Amuse toi a l’exploiter de façon divers.

Juste au cas ou te ne connaitrais pas voici un lien très utiles pour chercher les outils utiles au montage d'un programme.
http://www.mon-club-elec.fr/pmwiki_reference_arduino/pmwiki.php?n=Main.ReferenceEtendue

Une fois que tu aura maitriser ce qui a dessus tu peut essayer d'utiliser beatRead cette instruction te permettra de comprendre pas mal de chose sur le traitement de données en "integer" (int) .

A plus !