calculatrice moniteur série

Bonjour,je souhaite faire une calculatrice avec le moniteur série en tapant sur le clavier PC.
quand je tape + , - , * , / , = , et les nombres, tout s'affiche dans la barre de saisie
sauf le résultat,quand je tape entrée après le = pour avoir le résultat tout s'efface dans
la barre de saisie et dans le port série rien ne s'affiche à part nbActuel.
Quelqu'un aurait-il une solution.
Merci de votre réponse.

  // variable globale retenant l'opérateur sélectionné
  char operateur = 0 ;
  
  // variable globale retenant le précédent nombre
  int nbPrecedent = 0 ;

  // variable globale retenant le nombre actuel
  int nbActuel = 0 ;
  
  int key      = 0 ;
  
  void setup ( )
  {
  Serial . begin ( 9600 ) ;
  }
  void loop ( ) 
  {
  // si on tape sur une touche 
  if ( key >= '0' && key <= '9' )
  {
  // alors on l'ajoute au nombre
  nbActuel = ( ( nbActuel * 10 ) + ( key - '0' ) ) ;
  }
  // si on tape sur '+' , '-' , '*' , '/'
  if ( key == '+' || key == '-' || key == '*' || key == '/' )
  // on sauvegarde le nombre et l'opérateur puis revient à 0
  {
  nbPrecedent = nbActuel ;
  operateur   = key      ;
  nbActuel    = 0        ;
  }
  // si on tape sur '=' , on fait les calculs
  if ( key == '=' )
  {
  // si on tape sur '+' , c'est une addition
  if ( operateur == '+' )
  {
  nbActuel = nbPrecedent + nbActuel ;
  }
  // si on tape sur '-' , c'est une soustraction
  if ( operateur == '-' ) 
  {
  nbActuel = nbPrecedent - nbActuel ;
  }
  // si on tape sur '*' , c'est une multiplication
  if ( operateur == '*' )
  {
  nbActuel = nbPrecedent * nbActuel ;
  }
  // si on tape sur '/' , c'est une division
  if ( operateur == '/' )
  {
  nbActuel = nbPrecedent / nbActuel ;
  } }
  Serial . println ( "nbActuel" ) ;
  }
  Serial . println ( nbActuel ) ;

Il ne faut pas mettre les guillemets

Merci de votre réponse mais cela ne fonctionne toujours pas.
maintenant dans le port série s'affiche 0 en continu quoique
je fasse.

Ta variable key est un int, ça devrait être un char. De plus, elle n'est pas mise à jour, on ne voit nulle part la manière de lire le clavier...

Donc tu l'initialises à 0,elle reste à 0.

Merci de votre réponse pourriez me donner le code à modifier
pour que cela fonctionne
Merci.

Il faut utiliser Serial.read() pour acquérir les caractères au clavier. Cherche un tuto, je ne peux pas aider en ce moment.

Tuto ici

Quelqu'un a t-il le temps pour mon problème
Merci.

Toi, tu as le temps de t'occuper de ton problème.

As-tu lu le tuto donné en lien par lesept?

Tu as déjà fait des applications utilisant la liaison série donc tu as toutes les billes pour réussir

Bonjour j'ai fini un peu tard hier soir au boulot , mais je n'ai pas
laissé tomber mon problème de code de calculatrice.
J'ai trouvé, donc sa veut dire qu'il doit y avoir mieux en logique
et écriture de code , surtout au niveau de la remise à 0
ça va vous piquer les yeux mais ça fonctionne. :o
( ci vous avez une astuce moins barbare je suis preneur ).

Merci à by lesept pour le coup de main. :slight_smile:
Bonne journée à tous A+

je vous laisse le code ça peut toujours servir.

// variable globale retenant l'opérateur sélectionné
  char operateur   ;
  
  // variable globale retenant le précédent nombre
  int nbPrecedent  ;

  // variable globale retenant le nombre actuel
  float nbActuel   ;
  
  void setup ( )
  {
  Serial . begin ( 9600 ) ;
  }
  void loop ( ) 
  {
  if ( Serial . available ( ) )
  {
  char key = Serial . read (  ) ;
  
  // si on tape sur une touche 
  if ( key >= '0' && key <= '9' )
  {
  // alors on l'ajoute au nombre
  nbActuel = ( ( nbActuel * 10 ) + ( key - '0' ) ) ;
  }
  // si on tape sur '+' , '-' , '*' , '/'
  if ( key == '+' || key == '-' || key == '*' || key == '/' )
  // on sauvegarde le nombre et l'opérateur revient à 0 .
  {
  nbPrecedent = nbActuel ;
  operateur   = key      ;
  nbActuel    = 0        ;
  }
  // si on tape sur '=' , on fait les calculs
  if ( key == '=' )
  {
  // si on tape sur '+' , c'est une addition
  if ( operateur == '+' )
  {
  nbActuel = nbPrecedent + nbActuel ;
  }
  // si on tape sur '-' , c'est une soustraction
  if ( operateur == '-' ) 
  {
  nbActuel = nbPrecedent - nbActuel ;
  }
  // si on tape sur '*' , c'est une multiplication
  if ( operateur == '*' )
  {
  nbActuel = nbPrecedent * nbActuel ;
  }
  // si on tape sur '/' , c'est une division
  if ( operateur == '/' )
  {
  nbActuel = nbPrecedent / nbActuel  ;
  } } }
  Serial . println ( nbActuel , 12 ) ;
  // par défaut sans ( , 12 ) 2 chiffres après la virgule.
  // ( , et 12 ) définissent le nb de chiffres après 
  // la virgule , ici  12 chiffres après la virgule .
  }
  // astuce que j'ai trouvé pour revenir à 0 sans 
  // redémarrer le moniteur série , une fois le résultat
  // affiché on tape - autant de nb de 0 que de chiffres 
  // AVANT la virgule puis entrée et la calculatrice
  // revient à 0.
  // ex :   123 * 456 = 56088 - 00000 puis entrée et le
  // moniteur série revient à 0
  // cela fonctionne aussi en décimale.
  // ex :  10 / 3 = 3.333333333333 - 0 puis entrée et le
  // moniteur série revient à 0.

C'est tout bon!

Eventuellement pour alléger le code tu pourrais utiliser un switch..case.. à la place des if pour la gestion des caractères reçus. C'est purement esthétique le résultat sera le même, mais à mon sens je trouve que c'est plus facile à lire.

A la fin, tu pourrais faire comme sur une calculette. Tu laisses le résultat dans nbActuel ce qui permet d'enchainer les opérations et tu ajoutes la gestion du caractères C qui permet d'effacer nbActuel pour repartir de 0.

Merci de votre réponse j'ai essayé ça
mais cela ne fonctionne pas je pense qu'il
faut déclarer une autre variable pour les lettres
je sais pas.

if ( operateur == 'c')
nbActuel = 0 ;

C'est normal. Selon ce test :

  if ( key == '+' || key == '-' || key == '*' || key == '/' )
  // on sauvegarde le nombre et l'opérateur revient à 0 .
  {
  nbPrecedent = nbActuel ;
  operateur   = key      ;
  nbActuel    = 0        ;
  }

la variable operateur ne peut être que +-*/

Teste avec

if ( key == 'c') nbActuel = 0 ;

je n'y arrive pas c'est pas grave, aller au boulot
merci encore et bonne journée à vous.

que se passe-t-il si vous tapez 100*-10= :grin:

lesept:
C'est normal. Selon ce test :

  if ( key == '+' || key == '-' || key == '*' || key == '/' )

// on sauvegarde le nombre et l'opérateur revient à 0 .
  {
  nbPrecedent = nbActuel ;
  operateur  = key      ;
  nbActuel    = 0        ;
  }



la variable operateur ne peut être que +-*/

Teste avec 


if ( key == 'c') nbActuel = 0 ;

D'où l'intérêt d'utiliser un switch.. case.. qui permet d'éviter ce genre de problème.

Bonsoir JML , ma femme me dit de prendre une VRAI calculatrice pour ce calcul
elle ne comprend pas pourquoi je passe autant de temps avec ça.
l'autre jour elle m a dit que j'avais du boulot à la maison à faire et que c'était
aussi instructif et ludique que l'arduino , elle veut me le mettre au four
thermostat 12 sur la pizza entre les olives et les champignons. :confused:

Bon plus sérieusement j'ai finalisé le code maintenant une seule ligne s'affiche
lors du résultat c'est quand même mieux.
Et le code de lesept fonctionne parfaitement quand je tape c= puis entrée
j'ai bien une remise à 0 . pour moi le code est TOP.
Merci à lesept et à fdufnews pour le coup de main. :slight_smile:
Bonne soirée et bon week end à tous.
Je laisse le code final.

// variable globale retenant l'opérateur sélectionné
  char operateur   ;
  
  // variable globale retenant le précédent nombre
  int nbPrecedent  ;

  // variable globale retenant le nombre actuel
  float nbActuel   ;
  
  void setup ( )
  {
  Serial . begin ( 9600 ) ;
  }
  void loop ( ) 
  {
  if ( Serial . available ( ) )
  {
  char key = Serial . read (  ) ;
  
  // si on tape sur une touche 
  if ( key >= '0' && key <= '9' )
  {
  // alors on l'ajoute au nombre
  nbActuel = ( ( nbActuel * 10 ) + ( key - '0' ) ) ;
  }
  // si on tape sur '+' , '-' , '*' , '/' 
  // ou c pour remise à 0 .
  if ( key == '+' || key == '-' || key == '*' || key == '/' || key == 'c' )
  // on sauvegarde le nombre et l'opérateur revient à 0 .
  {
  nbPrecedent = nbActuel ;
  operateur   = key      ;
  nbActuel    = 0        ;
  
  // si on tape c = puis entrée sur le clavier , remise à 0 .
  if ( key == 'c') nbActuel = 0 ; 
  }
  // si on tape sur '=' , on fait les calculs
  if ( key == '=' )
  {
  // si on tape sur '+' , c'est une addition
  if ( operateur == '+' )
  {
  nbActuel = nbPrecedent + nbActuel ;
  }
  // si on tape sur '-' , c'est une soustraction
  if ( operateur == '-' ) 
  {
  nbActuel = nbPrecedent - nbActuel ;
  }
  // si on tape sur '*' , c'est une multiplication
  if ( operateur == '*' )
  {
  nbActuel = nbPrecedent * nbActuel ;
  }
  // si on tape sur '/' , c'est une division
  if ( operateur == '/' )
  {
  nbActuel = nbPrecedent / nbActuel  ;
  } 
  Serial . println ( nbActuel , 12 ) ;
  } } }
  // par défaut sans ( , 12 ) 2 chiffres après la virgule.
  // ( , et 12 ) définissent le nb de chiffres après 
  // la virgule , ici  12 chiffres après la virgule .

Super !
Tu peux simplifier ton code source en ne mettant pas les accolades autour des blocs lorsqu'ils ne font qu'une seule ligne :

 if ( operateur == '*' )
 {
 nbActuel = nbPrecedent * nbActuel ;
 }

devient

 if ( operateur == '*' ) nbActuel = nbPrecedent * nbActuel ;

De même, un opérateur de calcul appliqué à uen variable peut se simplifier comme suit :

nbActuel = nbPrecedent * nbActuel ;

peut s'écrire plus simplement

nbActuel *= nbPrecedent ;

Ça ne change rien au code compilé, c'est purement esthétique...

Voici ton code avec une belle indentation automatique (CTRL T dans l'IDE):

// variable globale retenant l'opérateur sélectionné
char operateur   ;

// variable globale retenant le précédent nombre
int nbPrecedent  ;

// variable globale retenant le nombre actuel
float nbActuel   ;

void setup ( ) {
  Serial . begin ( 9600 ) ;
}

void loop ( ) {
  if ( Serial . available ( ) ) {
    char key = Serial . read (  ) ;

    // si on tape sur une touche
    if ( key >= '0' && key <= '9' )
    {
      // alors on l'ajoute au nombre
      nbActuel = ( ( nbActuel * 10 ) + ( key - '0' ) ) ;
    }
    // si on tape sur '+' , '-' , '*' , '/'
    // ou c pour remise à 0 .
    if ( key == '+' || key == '-' || key == '*' || key == '/' || key == 'c' )
      // on sauvegarde le nombre et l'opérateur revient à 0 .
    {
      nbPrecedent = nbActuel ;
      operateur   = key      ;
      nbActuel    = 0        ;

      // si on tape c = puis entrée sur le clavier , remise à 0 .
      if ( key == 'c') nbActuel = 0 ;
    }
    // si on tape sur '=' , on fait les calculs
    if ( key == '=' )
    {
      // si on tape sur '+' , c'est une addition
      if ( operateur == '+' ) nbActuel += nbPrecedent ;
      // si on tape sur '-' , c'est une soustraction
      if ( operateur == '-' ) nbActuel -= nbPrecedent ;
      // si on tape sur '*' , c'est une multiplication
      if ( operateur == '*' ) nbActuel *= nbPrecedent ;
      // si on tape sur '/' , c'est une division
      if ( operateur == '/' ) nbActuel /= nbPrecedent  ;
    }
    Serial . println ( nbActuel , 12 ) ;
  }
}
}
// par défaut sans ( , 12 ) 2 chiffres après la virgule.
// ( , et 12 ) définissent le nb de chiffres après
// la virgule , ici  12 chiffres après la virgule .

:slight_smile:

Dieu vous bénisse mon ami , j'adore ce site vous êtes tous de bon profs.
Même si en classe j'étais plutôt du coté du radiateur maintenant j'essaie
de faire au mieux avec un niveau scolaire très bas, j'ai commencé l'arduino
pendant le confinement.