Lire une variable saisie dans la console

Bonsoir,

Je souhaiterais au lancement de mon programme que l'on demande à l'utilisateur de saisir une valeur et tant que la valeur n'est pas saisie, la fonction loop ne se lance pas. J'ai récupéré un bout de code sur internet mais je n'arrive pas à faire le tant que la saisie n'est pas faite.

int incomingByte = 0; // for incoming serial data

void setup() { Serial.begin(9600); // opens serial port, sets data rate to 9600 bps Serial.print("Veuillez saisir une valeur");

// send data only when you receive data: if (Serial.available() > 0) { // read the incoming byte: incomingByte = Serial.read();

// say what you got: Serial.print("I received: "); Serial.print(incomingByte); }

}

void loop() { //fonctions }

Bonjour thomles, A première vue la void loop est vide. Le code est contenu dans void setup, et donc il ne s'execute qu'une fois, il teste ce qui viens du serial et il part dans la void loop. Mets: Serial.print("Coucou ! Tu n'a pas été assez rapide "); dans la void loop Tu aura au moins une réponse du sérial.

Il suffit de rester bloqué dans une boucle tant que tu n'as pas le bon caractère. Exemple :

int incomingByte = 0;   // for incoming serial data
byte SerialOK=0;

void setup() {

         Serial.begin(9600);     // opens serial port, sets data rate to 9600 bps
         Serial.print("Veuillez saisir une valeur");

         while(SerialOK==0) { // tant qu'un A n'est pas reçu 

         if (Serial.available() > 0) 
        {
                 delay(5);
                 incomingByte = Serial.read();
                 if(incomingByte=='A') {
                 Serial.println("Bonne combinaison !");
                SerialOK=1;
                } else Serial.println("Mauvaise combinaison, veuillez saisir une valeur");
            }
    }
}

void loop() 
{
//fonctions
}

Merci, le code de B@tto fonctionne exactement comme il faut. Sauf que ma condition est valeur comprise entre 0 et 5.
J’ai déclaré ma variable de lecture en float mais l’affichage me donne une valeur 52.00 pour une saisie de valeur 4.
Comme je dois faire une comparaison dans ma loop() avec une Analog input, je pense que je dois convertir cette valeur pour obtenir un float. Mais je ne trouve pas la fonction qu’il faut.

int sensorPin = A0;    // select the input pin for the potentiometer
int ledPin = 13;      // select the pin for the LED
int resistor = 52;    //activate the resistor
int sensorValue = 0;  // variable to store the value coming from the sensor
float voltage;
float allume;
float incomingByte;
byte SerialOK=0;


void setup() 
{
  // declare the ledPin as an OUTPUT:

  pinMode(ledPin, OUTPUT);
  pinMode(resistor, OUTPUT);
  Serial.begin(9600);
  
  Serial.print("Saisir la valeur pour allumer la resistance\n");
          while(SerialOK==0) 
          { // tant qu'un A n'est pas reçu 

              if (Serial.available() > 0) 
              {
                       delay(5);
                       incomingByte = Serial.read();
                       if(incomingByte<'5' && incomingByte>'0') 
                       {
                       Serial.println("Bonne combinaison !\n");
                      SerialOK=1;
                      } else Serial.println("Mauvaise valeur, veuillez saisir une valeur\n");
                  }
          }
}


void loop() {

      // read the value from the sensor:
      sensorValue = analogRead(sensorPin);
      voltage = sensorValue * (5.0 / 1023.0);
      Serial.print(voltage);
      Serial.print("\n");
      
      if (voltage > incomingByte)
        {
          // turn the ledPin on
          digitalWrite(ledPin, HIGH);
          digitalWrite(resistor, HIGH);
        }
     if (voltage < incomingByte)
     {
           // turn the ledPin off
          digitalWrite(ledPin, LOW);
          digitalWrite(resistor, LOW); 
     }
    
}

il faut faire incomingByte = Serial.read()-48; car serial.read te retourne la valeur du code ascii mais pas la valeur du nombre exact. tu peux le deviner si tu retire 48 au code ascii ...

ou atoi()

Le problème c'est que je souhaite une valeur à virgule et cette fonction ne permet d'obtenir que des valeurs entières.

thomles: Le problème c'est que je souhaite une valeur à virgule et cette fonction ne permet d'obtenir que des valeurs entières.

avec Serial.parseFloat() ?

void setup()
{
  Serial.begin(9600);
}
void loop()
{
  float SB=Serial.parseFloat(); 
  if (SB >0){ 
    SB=SB+1.51; // ajoute 1.51 pour le test
    Serial.println(SB);
  }
}

atof()

Perso parseFloat j’évite car elle est extrêmement lente

B@tto: atof()

Perso parseFloat j'évite car elle est extrêmement lente

oui c'est que j'ai vu

Attention à atof(), c'est une petite saloperie. Si la valeur texte fournie n'est pas un flottant valable tu ne peut pas le savoir.

Je n’arrive toujours pas a faire ce que je souhaite.
Lorsque je saisi 220 par exemple il ne m’affiche que que 2.
Je pensais enregistrer dans un tableau chaque caractère et les concaténer pour faire mon nombre complet.
Mais je n’arrive pas a trouver le moyen de concaténer plusieurs entiers.

char str[3];
int i;
byte SerialOK=0;
String vitesse;

void setup() 
{

  Serial.begin(9600);
  
  Serial.print("Saisir la valeur pour allumer la resistance\n");
          while(SerialOK==0) 
          { // tant qu'un A n'est pas reçu 

              if (Serial.available() > 0) 
              {
                 delay(5);
                 for(i=0; i<3; i++)
                       {
                       str[i] = Serial.read();
                       str[i]=str[i]-48;
                       Serial.print(str[i]);
                       }
 
                      SerialOK=1;
            }
          }
 
          vitesse = (str[0] + str[1] + str[2]);
          Serial.print("La vitesse moteur est:");
          Serial.print(vitesse);
          Serial.print("rpm\n");
}

Mais je n'arrive pas a trouver le moyen de concaténer plusieurs entiers.

Attention: la concaténation ne s'applique qu'à l'aphanumérique (quand les chiffres sont traités comme étant des caractères, et non comme des valeurs) Il faudra , pour retrouver des valeurs utiliser val( ), ou ce qui y correspond en "C" Pourquoi tiens-tu à utiliser la virgule ? Il te suffit de multiplier (par 10, 100 ou 1000) pour l'éliminer; et de re-diviser quand tu a passé le moment où ça coince..

Oh lala que de confusion ! on reprend … :

char str[10]; // fait pas ton rapia ;)
int i;
byte SerialOK=0;
float vitesse;

void setup() {

  Serial.begin(9600);
  
  Serial.print("Saisir la valeur pour allumer la resistance\n");

          while(SerialOK==0)    { 

              if (Serial.available() > 0)   {

                  delay(5);
                for(i=0;i<10;i++) str[i] = NULL;
                  i=0;

                 while(Serial.available() {
                       
                       str[i++] = Serial.read();
                       Serial.print(str[i]);

                       }

                     if(atof(str)==2.28)   SerialOK=1; //2.28 = pifomètre ;)
            }
          
 
          vitesse = atof(str);
          Serial.print("La vitesse moteur est:");
          Serial.print(vitesse);
          Serial.print("rpm\n");
}

Mais comme évoqué par Skywodd, atof() n’intègre aucune vérification, à l’inverse de strtod() mais qui ne s’emploie pas aussi “simplement”

et on fait comme ça :

float val=-1; // stockera la valeur saisie -1 pour entrer dans la 1ere boucle

void setup() {
         Serial.begin(9600);     // ouvre le port serie à 9600 bps  
 
         while( val<0 || val>5)  { // borne inferieure et supèrieure
           int l=0; // nb de donnée à lire present sur le port serie
           char tampon[10]=""; // mémoire tampon pour la lecture serie            
           Serial.println("Veuillez saisir une valeur entre 0.00 et 5.00:");
           while(!l)  { delay(200); l=Serial.available(); } // attend la saisie d'une donnée   
           for (int i=0; i < l; i++){ tampon[i]=Serial.read(); delay(15); }  // lecture 
           val = atof(tampon); // converti en float     
}}

void loop() 
{  

  Serial.print("la valeur est correcte : ");    Serial.print(val);    Serial.println("");  
  delay(2000);
}

ça marche mais je sais pas si c’est bon point de vu propreté du code …

Eeuuuuhh oué faudrait voir à pas dire n'importe quoi non plus ...

Merci B@tto j'ai reussio a faire ce que je voulais grâce à ton morceau de code. XD