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" ) ;
}
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.
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.
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.
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.
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.
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 .
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 .
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.