Go Down

Topic: Problème double boucle For (Read 942 times) previous topic - next topic

kamill

Ben, pourquoi tu ne fais pas le même chose dans ton programme du post #54?

nerixs

#61
Nov 07, 2019, 01:58 pm Last Edit: Nov 07, 2019, 02:27 pm by nerixs
Bon il y a du mieux!

J'ai de l'affichage et mes calcules semblent bon (hormis la gestion des nombres a virgule, mais nous y reviendrons).

Code: [Select]
while (!Serial.available());
clearSerialBuffer();

Cette vérification\action ne doit pas être placée au bonne endroit car me bloque la 1ere saisie.
Pouvez-vous me guider?

Code: [Select]
#include <Servo.h>

const byte ServoPin = 10;
const int LowerPos = 520 ; //Butée Mini du servo
const int UpperPos = 2480 ; //Butée Maxi du servo
const int Range = 173 ; //Plage de déplacement en degrés
const int T180 = LowerPos + (((UpperPos - LowerPos) / Range) * 180) ; //Extrapolation à 180° = 2559,306358381503
const int UsRange = (T180 - LowerPos) / 180 ; // 1° = 11,32944444444444 µS

Servo myservo;  // create servo object to control a servo
void setup() {
  Serial.begin(115200);
  myservo.attach(ServoPin, LowerPos, T180);
  Serial.println("Bienvenue sur le moniteur série.");
  Serial.println(T180);
  Serial.println(UsRange);

//  while (!Serial.available());
//  clearSerialBuffer();

}

void loop() {
  int PosDeg = Serial.parseInt(); // PosDeg = la position saisie dans le moniteur série de 0 à 173°
  int PosUs = LowerPos + (PosDeg * UsRange); // degré en µS
  if (Serial.available() > 0) {
    Serial.print(PosDeg);
    Serial.print("° = ");
    Serial.print(PosUs);
    Serial.println(" µS");
  }
}

void clearSerialBuffer() {
  //clear serial buffer (but do nothing with it)
  while (Serial.available())
  {
    Serial.read();
  }
}

fdufnews

#62
Nov 07, 2019, 02:53 pm Last Edit: Nov 07, 2019, 03:05 pm by fdufnews
Qu'est-ce qui bloque:
  • le while ?
  • clearSerialBuffer ?


Edit: question idiote, c'est le while qui bloque puisqu'il attend qu'il y ait un caractère de reçu pour passer.
D'ailleurs à ce sujet, ce n'est pas plutôt ça que tu voulais faire dans le setup()
Code: [Select]
while (!Serial);  // wait for Serial to initialize
Cette ligne de code attend que Serial soit actif sur les processeurs ayant l'USB intégré nativement

nerixs

Indépendamment ça fonctionne c'est ensemble que ça bloque la 1 ère saisi !
A la seconde saisi ça passe.

fdufnews

En l'état, tu n'afficheras aucun flottants.
Toutes les constantes et toutes les variables sont de type entier.

nerixs

Pour le problème de blocage, je pense que c'est bon:

Code: [Select]
#include <Servo.h>

const byte ServoPin = 10;
const int LowerPos = 520 ; //Butée Mini du servo
const int UpperPos = 2480 ; //Butée Maxi du servo
const int Range = 173 ; //Plage de déplacement en degrés
const int T180 = LowerPos + (((UpperPos - LowerPos) / Range) * 180) ; //Extrapolation à 180° = 2559,306358381503
const int UsRange = (T180 - LowerPos) / 180 ; // 1° = 11,32944444444444 µS

Servo myservo;  // create servo object to control a servo
void setup() {
  Serial.begin(115200);
  myservo.attach(ServoPin, LowerPos, T180);
  Serial.println("Bienvenue sur le moniteur série.");
  Serial.println(T180);
  Serial.println(UsRange);

}

void loop() {
  int PosDeg = Serial.parseInt(); // PosDeg = la position saisie dans le moniteur série de 0 à 173°
  int PosUs = LowerPos + (PosDeg * UsRange); // degré en µS
  if (Serial.available() > 0) {
    Serial.print(PosDeg);
    Serial.print("° = ");
    Serial.print(PosUs);
    Serial.println(" µS");

  }
    clearSerialBuffer(); 
}

void clearSerialBuffer() {
  //clear serial buffer (but do nothing with it)
  while (Serial.available())
  {
    Serial.read();
  }
}


Pour l'affichage en flottants, avec un arrondie au plus proche à 2 chiffres après la virgule.
Pourriez-vous me guider? Je ne sais pas trop par où commencer.

fdufnews

#66
Nov 07, 2019, 03:48 pm Last Edit: Nov 07, 2019, 03:55 pm by fdufnews
Pour l'affichage en flottants, avec un arrondie au plus proche à 2 chiffres après la virgule.
Pourriez-vous me guider? Je ne sais pas trop par où commencer.
Pour l'affichage, tout est . Mais il faudrait déjà faire des calculs en flottants pour ça.

nerixs

Comment procéderiez-vous pour ces calcules flottants?

Dans le sketch du début de ce poste j'avais utilisé ce qu'on appelle de la "virgule fixe" en travaillant avec des entiers multipliés par 10 pour 1 chiffre après la virgule. Ici je pourrais utiliser 100 pour avoir mes deux chiffres après la virgule.

Mais après comment gérer l'arrondie au plus proche à 2 chiffres après la virgule.

nerixs

Les valeurs affichées sont bonnes:

Code: [Select]
Bienvenue sur le moniteur série.
L'extrapolation à 180°, de 173° entre la butée mini: 520 µS et la butée maxi: 2480 µS est égale à: 2559.31 µS.
1° est égale à 11.33 µS.

0° = 520.00 µS
1° = 531.33 µS
173° = 2480.00 µS
180° = 2559.31 µS


Je ne suis vraiment pas sûr que ma gestion soit faite dans les règles de l'art.

Code: [Select]
#include <Servo.h>

const byte ServoPin = 10;
const int LowerPos = 520 ; //Butée Mini du servo
const int UpperPos = 2480 ; //Butée Maxi du servo
const int Range = 173 ; //Plage de déplacement en degrés
const float T180 = LowerPos + (((float)(UpperPos - LowerPos) / Range) * 180) ; //Extrapolation à 180° = 2559,306358381503
const float UsRange = (T180 - LowerPos) / 180 ; // 1° = 11,32944444444444 µS

Servo myservo;  // create servo object to control a servo
void setup() {
  Serial.begin(115200);
  myservo.attach(ServoPin, LowerPos, T180);
  Serial.println("Bienvenue sur le moniteur série.");
 
  Serial.print("L'extrapolation à 180°, de ");
  Serial.print(Range);
  Serial.print("° entre la butée mini: ");
  Serial.print(LowerPos);
  Serial.print(" µS et la butée maxi: ");
  Serial.print(UpperPos);
  Serial.print(" µS est égale à: ");
  Serial.print (T180);
  Serial.println(" µS.");

  Serial.print("1° est égale à ");
  Serial.print(UsRange);
  Serial.println(" µS.");
  Serial.println();

}

void loop() {
  int PosDeg = Serial.parseInt(); // PosDeg = la position saisie dans le moniteur série de 0 à 173°
  float PosUs = LowerPos + (PosDeg * UsRange); // degré en µS
  if (Serial.available() > 0) {
    Serial.print(PosDeg);
    Serial.print("° = ");
    Serial.print(PosUs,2);
    Serial.println(" µS");

  }
    clearSerialBuffer(); 
}

void clearSerialBuffer() {
  //clear serial buffer (but do nothing with it)
  while (Serial.available())
  {
    Serial.read();
  }
}

nerixs

Bonjour,
Aucun avis / conseil ?  :-*

Go Up