Pb conversion ascii to entier pour calcul et affichage lcd

Bonjour à tous,
Encore un problème de conversion dont j’ai du mal à comprendre. :
Je veux pouvoir entrée un nombre de 3 chiffres ex :752 à partir d’un clavier , faire un calcul et l’afficher sur un lcd.
Je reçois un premier caractère ASCCI codé en décimale ex : 53 pour le chiffre 5, je veux faire une calcul ex : 5 x 8 =40. Donc je soustrais -48 qui est le « 0 » j’ ai donc mon chiffre 5 x 8 je range le résultat dans une variable d’abord le caractère reçu est un CHAR et pour un calcul je vais avoir besoin d’un INT ? mais comment faire repasser en Ascii pour mon affichage de mon résultat sur le lcd ?
Faut-il convertir chaque chiffre en ASCII, dans mon exemple, le 7, puis le etc.. sachant que je souhaite conserver le résultat pour d’éventuels autres calculs.
Je pense que c’est courant mais il est complètement paumé le débutant. Existe-t-il un bibli, j’ai essayé de voir avec atoi et autres ! je vous joins ce que j'ai essayé. merci de votre compréhension
J’espère avoir été assez clair dans mes explications
Merci pour votre aide et conseil. Très bonne journée

#include <Wire.h>
#include <Keypad.h>
#include <LiquidCrystal_I2C.h>

const byte ROWS = 4; //four rows
const byte COLS = 4; //four columns
char keys[ROWS][COLS] = {
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};
// valeur
uint16_t valeur [] = {500,750}; // valeur par défaut

byte rowPins[ROWS] = {9,8,7,6,}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {5,4,3,2}; //connect to the column pinouts of the keypad

Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

LiquidCrystal_I2C lcd(0x27,16, 2);  // SET I2C Address
char key;
uint16_t valor[]= {000,000,000};

byte compt=0;
 int resul=0;
 //int chiffre2=0;
 //int chiffre3=0;
char carac;

void setup(){
    Serial.begin(9600);
    lcd.init();
    lcd.backlight();
    lcd.print("  exercice ");
    delay(1000);
}  
//debut programme ###########################################################
void loop(){
  

char key = keypad.getKey();
  if (key){
 if (key != 'A' and key != 'B' and key != 'C' and key != 'D' and key  != '*' and key != '#') {
     }
     /* je pourrai utiliser une boule For pour lafaire le calcul, j'aimerai surtout savoir comment je 
     dois faire pour coder mon resultat pour mon lcd, */
     
      if (compt<=3){ 
              if( compt==0) {;carac= (key-48)*100;  Serial.println(carac);
              valor[1]=carac;Serial.println(valor[1]);compt+1;}
                  if( compt==1) {carac=(key-48)*10;valor[2]=carac;compt+1; Serial.println(valor[2]);}
                       if( compt==2) {;carac=(key-48)*100;valor[3]=carac;compt+1;Serial.println(valor[3]);}
                       resul=valor[1]+valor[2]+valor[3];
                       lcd.print (resul);Serial.println(resul) ;
      }
      else{compt=0;lcd.clear();}
  }                 
  } //fin """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""

c'est illisible... la touche passage à la ligne est cassée sur votre ordi ?

compt+1; ne fait rien. si vous voulez incrémenter le compteur c'est compt++; ou compt = compt+1;

Merci Jacson
C'est le texte qui est illisible ? je recommence.
Bonjour à tous, j'ai un pb de conversion dont j'ai du mal à comprendre malgré mes recherches sur internet. Mon pb est le suivant: je veux pourvoir entrée un nombre de 3 chiffres à partir d'un clavier, faire des calculs sur cette valeur et l'afficher sur un écran lcd.
Je reçois le premier caractère ASCII code decimal Ex: 53 pour le chiffre 5 , pour cela j'enlève -48 et je veux faire 5 x 85 , ranger le résultat dans une variable et l'envoyer sur mon LCD. Mon caractère reçu est en CHAR et la variable du résultat en INT, j'ai un résultat qui est n'importe quoi. Je ne comprends pas comment faire ? existe-il une blibli.
pour faire c'est convertion ? je suis allé voir atoi et autres mais sans succes. je débute et j'ai un peu de mal à comprendre. je vous renvoie le code, j'ai modifie le
compt++
Merci pour votre aide et compréhension.

#include <Wire.h>
#include <Keypad.h>
#include <LiquidCrystal_I2C.h>

const byte ROWS = 4; //four rows
const byte COLS = 4; //four columns
char keys[ROWS][COLS] = {
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};
// valeur
uint16_t valeur [] = {500,750}; // valeur par défaut

byte rowPins[ROWS] = {9,8,7,6,}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {5,4,3,2}; //connect to the column pinouts of the keypad

Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

LiquidCrystal_I2C lcd(0x27,16, 2);  // SET I2C Address
char key;
uint16_t valor[]= {000,000,000};

byte compt=0;
 int resul=0;
 //int chiffre2=0;
 //int chiffre3=0;
char carac;

void setup(){
    Serial.begin(9600);
    lcd.init();
    lcd.backlight();
    lcd.print("  exercice ");
    delay(1000);
}  
//debut programme ###########################################################
void loop(){
  

char key = keypad.getKey();
  if (key){
 if (key != 'A' and key != 'B' and key != 'C' and key != 'D' and key  != '*' and key != '#') {
     }
     /* je pourrai utiliser une boule For pour lafaire le calcul, j'aimerai surtout savoir comment je 
     dois faire pour coder mon resultat pour mon lcd, */
     
      if (compt<=3){ 
              if( compt==0) {;carac= (key-48)*100;  Serial.println(carac);
              valor[1]=carac;Serial.println(valor[1]);compt++;}
                  if( compt==1) {carac=(key-48)*10;valor[2]=carac;compt++; Serial.println(valor[2]);}
                       if( compt==2) {;carac=(key-48)*100;valor[3]=carac;compt++;Serial.println(valor[3]);}
                       resul=valor[1]+valor[2]+valor[3];
                       lcd.print (resul);Serial.println(resul) ;
      }
      else{compt=0;lcd.clear();}
  }                 
  } //fin """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""

Non c'est

(je lis sur mon iPhone)

Non malheureusement, c'est de mettre 4 instructions sur une seul ligne.

tu as la fonction atoi qui fait ça directement.

pas sur un char, il faudrait une cstring

@djypya

tenez jetez un oeil à ce code et simulation.

le code

/* ============================================
  code is placed under the MIT license
  Copyright (c) 2024 J-M-L
  For the Arduino Forum : https://forum.arduino.cc/u/j-m-l

  Permission is hereby granted, free of charge, to any person obtaining a copy
  of this software and associated documentation files (the "Software"), to deal
  in the Software without restriction, including without limitation the rights
  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  copies of the Software, and to permit persons to whom the Software is
  furnished to do so, subject to the following conditions:

  The above copyright notice and this permission notice shall be included in
  all copies or substantial portions of the Software.

  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  THE SOFTWARE.
  ===============================================
*/

#include <Keypad.h>

const uint8_t ROWS = 4;
const uint8_t COLS = 4;
char keys[ROWS][COLS] = {
  { '1', '2', '3', 'A' },
  { '4', '5', '6', 'B' },
  { '7', '8', '9', 'C' },
  { '*', '0', '#', 'D' }
};

uint8_t colPins[COLS] = { 5, 4, 3, 2 }; // Pins connected to C1, C2, C3, C4
uint8_t rowPins[ROWS] = { 9, 8, 7, 6 }; // Pins connected to R1, R2, R3, R4

Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);

long lireNombre(const byte nbChiffres) {
  static byte digitsCount = 0;
  static long number = 0;
  char key = keypad.getKey();

  if (key != NO_KEY) {
    if (key >= '0' && key <= '9') {
      number = number * 10 + (key - '0'); // Construire le nombre
      digitsCount++;

      if (digitsCount >= nbChiffres) {
        digitsCount = 0; // Réinitialiser le compteur pour la prochaine entrée
        long result = number;
        number = 0; // Réinitialiser le nombre
        return result; // Retourner le nombre
      }
    } else {
      // on ignore les autres touches mais on pourrait coder autre chose ici
      // ...
    }
  }

  return -1; // Retourne -1 tant que nbChiffres n'ont pas été tapés
}

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

void loop() {
  long recu = lireNombre(3);
  if (recu >= 0) Serial.println(recu); // Affiche le nombre
}

la fonction lireNombre() prend un paramètre qui est le nombre de chiffres à taper (donc ici 3) et retourne le nombre lu quand on a eu les 3 chiffres et sinon ça retourne -1 si on n'a pas encore tout tapé

oui, il faut reconstituer au préalable le cstring

autant bâtir le nombre au fil de l'eau (valeur = valeur * 10 + (key - '0')) plutôt que de s'embêter avec un buffer non ?

Oui et non, moi j'aurais bâtis le nombre au fil de l'eau, mais ca serait peut être plus simple pour @djypya

La traduction de l'ASCII en nombre entier est toujours un exercice difficile pour moi. Il faut isoler le caractère, le transformer en nombre entier, le multiplier par sa puissance de dix, puis additionner toutes les valeurs, par exemple :

7 * 10 ^ 2 = 700
5 * 10 ^ 1 = 50
3 * 10 ^ 0 = 3
700 + 50 + 3 = 753 fin.

Un code autonome

// Verify all values do not overflow their "type"
// Vérifiez que les valeurs ne dépassent pas leur « type »

char chars[] = {"753"}; // ASCII
byte charlen = sizeof(chars) / sizeof(chars[0]) - 1; // length of chars[] minus <CR>
long accumulator; // accumulator

void setup() {
  Serial.begin(115200);
  for (byte i = 0; i < charlen; i++) { // count through characters
    long digit = chars[i] - 48; // change ASCII to INT
    int power = charlen - i - 1; // local variable
    digit = digit * placevalue(power); // digit * 10 ^ place
    accumulator += digit; // add result of digit * 10 ^ place
  }
  Serial.print("result ");
  Serial.println(accumulator);
}

void loop() {}

long placevalue(int exponent) {
  long power = 1; // reset local power
  for (int i = 0; i < exponent; i++) { // count backwards 3, 2, 1
    power *= 10; // accumulate the exponents
  }
  return (power);
}

Merci a tous pour votre aide. J'ai testé l'exemple envoyé par TERWAL ca fonctionne. je pense avoir compris, je le tester dans mon programme. Merci, heureusement qu'il existe cette belle communauté et des mecs sympas.
bonne soirée a tous

Merci xfpd, je vais aussi essayer ça, j'ai besoin de faire des exercices pour comprendre.

quel exemple ?

je pense qu'il parle du code de @xfpd

ben non puisqu'il lui a fait une autre réponse ensuite...

bref...

Celui de TERWAL, je l'ai intégré dans mon exercice C'est tout bon Merci

Effectivement, cela restera un mystère :slight_smile:

Entraînez-vous jusqu'à ce que vos doigts saignent, puis entraînez-vous un peu plus. Posez n'importe quelle question about the code in Post #11.

mais il ne vous a donné aucun code ? donc on ne sait pas trop ce que vous utilisez...