incrémenter,décrémenter,multiplier,diviser une variable compteur.

Bonjour, je souhaiterais incrémenter,décrémenter,multiplier et
diviser une variable compteur.

J'arrive à incrémenter,décrémenter,mais pour la multiplication
et la division je ne sais pas comment faire .

Et je pensais que les 7 dernières lignes de code feraient ralentir
le comptage car lors de l'appui cela compte de 10 en 10
environ, j'aimerais le ralentir.
Voici mon code.

Merci de votre aide.

   int BPA = 2 ; // addition
   int BPB = 4 ; // soustraction
   int BPC = 3 ; // multiplication
   int BPD = 5 ; // division

   int etat_BPA ;
   int etat_BPB ;
   int etat_BPC ;
   int etat_BPD ;

   float compteur =0  ;
 
   void setup ( ) 
   {
   Serial.begin ( 9600 ) ;
   
   pinMode ( BPA , INPUT_PULLUP ) ;
   pinMode ( BPB , INPUT_PULLUP ) ;
   pinMode ( BPC , INPUT_PULLUP ) ;
   pinMode ( BPD , INPUT_PULLUP ) ;
   }
   void loop ( ) 
   {
   etat_BPA  =  digitalRead ( BPA ) ;
   if ( etat_BPA == LOW )
   {
   compteur ++ ;
   }
   etat_BPB = digitalRead ( BPB ) ;
   if ( etat_BPB == LOW ) 
   {
   compteur -- ;
   }
   etat_BPC = digitalRead ( BPC ) ;
   if ( etat_BPC == LOW )
   {
  compteur *10  ;
   }
   etat_BPD = digitalRead ( BPD ) ;
   {
   if ( etat_BPD == LOW )
   compteur /10  ;
   }
   Serial.println ( compteur ) ;
   }
   // void counting ( )
   // {
   // noInterrupts ( ) ;
   // compteur ++ ;
   // delay ( 10 ) ;
   //  interrupts ( ) ;
   // }

Bonjour!
Parle Englais!

compteur * 10;should be compteur *= 10;
You made the same mistake for the division.

Further,
1)
Buttons bounce so you will have to implement a form of a short delay.
2)
You probably want to detect when a button becomes pressed, not when it is pressed. Look at the state change detection example that comes with the IDE.

Bonsoir merci de prendre un peu de votre temps
pour me répondre j'avais essayé aussi *= 10 et /= 10
mais cela ne fonctionnait pas.
quand j'appuie sur le BP + cela incrémente bien le -
aussi, mais quand j'appuie sur multiplier ou diviser
rien ne se passe je ne vois rien dans le port série.
je ne sais pas d'où ça vient.
Avez-vous une modification pour que mon code
fonctionne.
MERCI de votre patience je débute
dans l'arduino.

if (digitalRead(BPC) == LOW) compteur *= 10  ;
if (digitalRead(BPD) == LOW) compteur /= 10  ;

attention aux rebonds des boutons et faut attendre le relâchement du bouton avant de refaire l'opération...

Pardon , mais ça ne fonctionne toujours pas quand j'incrémente
dans le port série environ 1000, si j'appuie une fois sur divisé /10
j'ai 0 , je devrais avoir même avec les rebonds une valeur inférieure
à 1000 mais pas 0 au premier appui,je ne comprends pas.
Quand je multiplie en premier j'ai sur le port série ovf et inf.
MERCI pour m'avoir consacré un peu de votre temps.

J-M-L:

if (digitalRead(BPC) == LOW) compteur *= 10  ;

if (digitalRead(BPD) == LOW) compteur /= 10  ;




Excusez moi je ne maîtrise pas trop le forum.
Pardon , mais ça ne fonctionne toujours pas quand j'incrémente
dans le port série environ 1000, si j'appuie une fois sur divisé /10
j'ai 0 , je devrais avoir même avec les rebonds une valeur inférieure
à 1000 mais pas 0 au premier appui,je ne comprends pas.
Quand je multiplie en premier j'ai sur le port série ovf et inf.
MERCI pour m'avoir consacré un peu de votre temps.

pour bien débuter avec l’arduino, un bon point de départ c’est de lire les tutos d’eskimon

Regardez les boutons

Je le lis depuis quelques semaines
Avez vous trouvé ce qui ne va pas dans mon code
Merci.

azerthuiop:
Avez vous trouvé ce qui ne va pas dans mon code

Oui je vous l’ai dit ci dessus

  • Corriger les formules pour multiplier et diviser
  • Gérer le rebond des boutons
  • Attendre le relâchement avant de reprendre en compte l’appui (a la vitesse ou tourne votre arduino un appui d’une demi seconde sur diviser et vous avez diviser plusieurs centaines, voire des milliers de fois par 10 par exemple d’où votre 0...)

Bonsoir, je n’ai pas réussi à le faire fonctionner en comparant

les états appui BP , et pas appui BP , et ancien appui BP ,avec

millis, unsigned long temps ,etc…(trop débutant je pense).

Si une personne à ce code je suis preneur.

Mais j’ai réussi à le faire fonctionner beaucoup plus simplement

avec juste un delay.

Le code fonctionne parfaitement sans rebonds il incrémente de

1 en 1 , décrémente de 1 en 1 aussi et multiplie et divise par 10

Je le poste si ça peut servir à quelqu’un .

Merci à J- M-L pour le coup de main.

   int LED = 13 ;
   int BPA =  2 ; // addition
   int BPB =  4 ; // soustraction
   int BPC =  3 ; // multiplication
   int BPD =  5 ; // division

   int etat_BPA = 0 ;
   int etat_BPB = 0 ;
   int etat_BPC = 0 ;
   int etat_BPD = 0 ;
   
   float compteur = 0 ;
   
   void setup ( ) 
   {
   Serial.begin ( 9600 )    ;
   pinMode ( LED , OUTPUT ) ;
   pinMode ( BPA , INPUT_PULLUP ) ;
   pinMode ( BPB , INPUT_PULLUP ) ;
   pinMode ( BPC , INPUT_PULLUP ) ;
   pinMode ( BPD , INPUT_PULLUP ) ;
   }
   void loop ( ) 
   {
   if ( digitalRead ( BPA ) == LOW ) compteur ++ ;
   
   if ( digitalRead ( BPB ) == LOW ) compteur -- ;
   
   if ( digitalRead ( BPC ) == LOW ) compteur *= 10 ;
   
   if ( digitalRead ( BPD ) == LOW ) compteur /= 10 ;

   Serial.println ( compteur ) ;
   delay ( 125 ) ;
   if ( compteur == 260 ) 
   {
   digitalWrite ( LED , HIGH ) ; // quand le compteur arrive à 260 la LED s'allume.
   Serial.print ( " t'as trouvé c'est pas trop tôt  " ) ;
   }
   else
   {
   digitalWrite ( LED , LOW ) ;
   }}

Et si vous tenez le bouton appuyé un peu longtemps il se passe quoi ?:wink:

sinon pour simplifier votre gestion des boutons, éventuellement utilisez la librairie de @bricoleau ou alors la librairie OneButton de Matthias Hertel.

Vous pourrez regarder dans leur code comment c’est géré

Bonsoir , quand je le tiens appuyé il se produit un défilement + ou -

comme je le souhaité et si j'appui 1 fois sur divisé par 10 sa fonctionne

cela me fait bien une division par 10 et la multiplication pareil.

C'est exactement ce que je voulais , exemple pouvoir allumé une LED

au numéro de de compteur voulu.

MERCI encore à vous bonne soirée et bon weekend .

Bonjour , j'ai trouvé un code pour faire à peu près la

même chose ( 12 lignes de code de plus quand même ).

Pour le premier code si je reste appuyer sur le BPA ou BPB

le + et le - défile et s'arrête au relâchement .

(mais on peut quand même faire + 1 ou - 1 avec un seul appui relâché)

Et pour BPC et BPD un appui relâché multiplie et

divise par 10 une fois il faut faire un autre appui relâché

pour refaire une multiplication ou division par 10 .

Dans ce code ci c'est différent si on appui sur le BPA et BPB en maintenant

l'appui il n'y a pas de défilement , l’inconvénient de ce code est qu'au relâchement

il compte une fois de plus.

La solution que j'ai trouvé si on veut une action sur un comptage pair en faisant un

appui relâché on laisse float compteur à 0.

Si on veut une action sur un comptage impair en faisant un appui relâché on

met float compteur à - 1 .

Pour BPC et BPD c'est pareil l’inconvénient lors d'un appui cela divise par 10 ,

mais au relâché cela divise une fois de plus par 10 , pareil pour multiplier.

Mais si ce code nous est utile rien ne nous empêche pour faire une division ou

une multiplication par 10 avec un appui relâché de prendre en compte la double

commande dans nos calculs.

Je ne sais pas si c'est clair comme explication,mais si ça peut servir à quelqu'un.

je vous laisse le code.

Merci de vôtre attention . :o

   int LED = 13 ;
   int BPA =  2 ; // addition
   int BPB =  4 ; // soustraction
   int BPC =  3 ; // multiplication
   int BPD =  5 ; // division

   int etat_BPA ;
   int etat_BPB ;
   int etat_BPC ;
   int etat_BPD ;
   
   int ancien_etat_BPA ;
   int ancien_etat_BPB ;
   int ancien_etat_BPC ;
   int ancien_etat_BPD ;
   
   float compteur = 0 ;
   
   void setup ( ) 
   {
   Serial.begin ( 9600 )    ;
   pinMode ( LED , OUTPUT ) ;
   pinMode ( BPA , INPUT_PULLUP ) ;
   pinMode ( BPB , INPUT_PULLUP ) ;
   pinMode ( BPC , INPUT_PULLUP ) ;
   pinMode ( BPD , INPUT_PULLUP ) ;
   }
   void loop ( ) 
   {
    etat_BPA = digitalRead ( BPA ) ;
    if ( etat_BPA != ancien_etat_BPA ) compteur ++ ;
    ancien_etat_BPA = etat_BPA ;
   
   etat_BPB = digitalRead ( BPB ) ;  
   if ( etat_BPB != ancien_etat_BPB )  compteur -- ;
   ancien_etat_BPB = etat_BPB ;
   
   etat_BPC = digitalRead ( BPC ) ;
   if ( etat_BPC != ancien_etat_BPC ) compteur *= 10 ;
   ancien_etat_BPC = etat_BPC ;
   
   etat_BPD = digitalRead ( BPD ) ;
   if (etat_BPD != ancien_etat_BPD ) compteur /= 10 ;
   ancien_etat_BPD = etat_BPD ;

   Serial.println ( compteur ) ;
  
   if ( compteur == 26 )
   {
   digitalWrite ( LED , HIGH ) ;
   Serial.print ( " t'as trouvé c'est pas trop tôt  " ) ;
   }
   else
   {
   digitalWrite ( LED , LOW ) ;
   }}