Probleme de communication serie

Bonjour,
Je débute, et je tente de réaliser un programme faisant clignoter une del à la fréquence rentrée par l'utilisateur via le protocole série.
Le programme ci-dessous me renvoie des valeurs erronées et la del ne clignote pas.
je ne comprends pas où est l'erreur:

onst int led = 2;
int cligno;

void setup() {
Serial.begin (9600);
pinMode (led,OUTPUT);
Serial.println("give a number and press enter ");
}

int valeur=0;
void loop() {
while (Serial.available())
{

char value = Serial.read();

if (isDigit(value))
{
valeur = (valeur * 10)+(value - 48);

}
else if (value == 10)

{ cligno = valeur;
Serial.print(cligno + "" );
Serial.println(" was your frequency choice" );}

else
{
Serial.println("This is not a number");

}
}

digitalWrite (led, HIGH);
delay (cligno);
digitalWrite (led, LOW);
delay (cligno);

}

Salut,

Pour nous montrer ton code, tu dois le mettre dans les bonnes balises, c'est explique ici. Comme ca c'est plus lisible et on peut mieux t'aider.

Concernant ton code, tu lis un caractère dans ton lien série ce qui veut dire que c'est un "code" qui correspond à la "lettre" qui représente un numéro. C'est un code ASCII qui a une valeur entre 0 et 255 et surtout qui n'a rien à voir avec la valeur réelle de ton chiffre, par exemple, si tu regardes dans le lien avec la table ASCII, tu verras que le chiffre "2" vaut en réalité 50 ! C'est pour ca que dans ton code il y a un "-48" de la valeur lue, pour la convertir.

Tout ca pour dire que dans ton code le 2e "if" est un peu "étrange" :

[...]
 else if (value == 10)
              
                {  cligno = valeur;
                Serial.print(cligno + "" );
                Serial.println(" was your frequency choice" );}
                

                else
[...]

Car en effet, tu compares la valeur ASCII au caractère "NL" (retour à la ligne) ce qui ne veut pas dire grand chose. En conclusion, il me semble que tu devrais utiliser plutôt la variable "valeur" que "value" dans ce "if" pour que ton code soit plus cohérent, même si je ne garantis pas que ca va bien marcher non plus...

Merci de ta réponse,
j'ai changé le if comme suit :
else if (value == '\n')
ce qui permet effectivement à la boucle de fonctionner
Il reste que le clignotement de la del et les valeurs affichées sont incohérentes
La partie du code permettant de convertir une suite de chiffre en un nombre ne fonctionne pas mais je ne comprends pas pourquoi

pourquoi ne pas utiliser : Serial.parseInt()
c'est quand même bien plus simple pour récupérer un entier

Bonjour,

Si tu pouvais commenter un peu, ce serait encore plus facile pour te répondre (principe)

exemple :

if (isDigit(value)) // (value) ??
{
valeur = (valeur * 10)+(value - 48); // 48 = code du zéro DEC (ou 30h)
}
else if (value == 10) // 10 = code du NL (ou 0Ah ou \n)

{ cligno = valeur;
Serial.print(cligno + "" ); // que veux-tu faire ici ?? concaténation ? Problème

Merci de vos réponses
Peut être que mon erreur vient du fait que j'ai mal compris le fonctionnement de Serial.read()
Pour moi cette fonction renvoie le dernier caractère saisi (efface du buffer le précédent et le remplace par celui qui vient d'etre saisi)
Ainsi le principe de mon programme serait de générer en fonction des caractères saisis puis quand on appuie sur enter d'afficher ce nombre et de faire clignoter la del à cette fréquence
voici le code entre balise et commenté

const int led = 2; // patte où est connectée la del
int cligno; //temps entre un etat allumé et éteint de la del

void setup() {
Serial.begin (9600);
pinMode (led,OUTPUT);
Serial.println("give a number and press enter ");
}

cligno=0;// initialisation
void loop() {
while (Serial.available())
{

  char value = Serial.read();//variable recevant le acaractère qui a été saisi en ascii


            if (isDigit(value))//si ce qui a été écrit est un chiffre entre 0 et 9
            {
              valeur = (valeur * 10)+(value - 48);//on construit le nombre au fur et à mesure où les chiffres sont saisis
                 
              }
              else if (value == '\n')//si retour charriot
              
                {  cligno = valeur;
                Serial.println(" votre choix de fréquence est" );
                Serial.print( ""+valeur );}// AFFICHE LA FR2QUENCE DECLIGNOTEMENT
                

                else
                {
                Serial.println("This is not a number"); //si le caractère n'est pas un chiffre
         
                  }
  }

digitalWrite (led, HIGH);// programme de clignotement
delay (cligno);
digitalWrite (led, LOW);
delay (cligno);
  
}

Comme déjà dit par pepe, ta ligne

Serial.print( ""+valeur );

ne fonctionne pas en C/C++, tu ne peux pas convertir une valeur en chaîne en faisant un "+" comme dans d'autres langages...

Pour ce faire, utilise par exemple sprintf() :

    char numeroEnChaine[10];     // Tableau de caractères (chaîne) qui va contenir ta "traduction" en lettres
    int valeurAConvertir = 285;   // valeur entière à convertir en chaîne de caractères

    sprintf(numeroEnChaine, "%d", valeurAConvertir); // conversion, %d veut dire "nombre entier"
    // à partir de là, dans ton tableau numeroEnChaine[] tu vas avoir, selon l'indice :
    // [0] : '2' (ASCII:50) (le caractère ASCII "2")
    // [1] : '8'  (ASCII:56)
    // [2] : '5'  (ASCII:53)
    // [3] : '\0'  (le caractère 0, valeur 0, qui veut dire "fin de chaîne" en C/C++)

    Serial.println(numeroEnChaine);  // là tu vas avoir "285\n" envoyé dans le lien série

Si tu veux plus d'infos sur la façon d'utiliser sprintf() un petit Google dessus et tu vas trouver plus qu'il ne t'en faut...

PS - tu peux aussi éditer ton tout premier message et mettre ton code dans les bonnes balises, ce sera quand même plus lisible...

Bonjour,

Il y a de l'idée, mais ton programme ne compile pas. 'valeur' non définie, 'cligno' affectée en dehors de la fonction.
Je te propose la version corrigée suivante:

const int led = 2; // patte où est connectée la del
int cligno=0; //temps entre un etat allumé et éteint de la del

void setup() {
  Serial.begin (9600);
  pinMode (led, OUTPUT);
  Serial.println("give a number and press enter ");
}

void loop() {
  static int valeur=0;
  while (Serial.available())
  {
    char value = Serial.read();//variable recevant le acaractère qui a été saisi en ascii

    if (isDigit(value))//si ce qui a été écrit est un chiffre entre 0 et 9
    {
      valeur = (valeur * 10) + (value - '0'); //on construit le nombre au fur et à mesure où les chiffres sont saisis
    }
    else if (value == '\n')//si line feed
    {
      cligno = valeur;
      valeur=0;
      Serial.print(" votre choix de frequence est " );
      Serial.println(cligno);
    }// AFFICHE LA FR2QUENCE DECLIGNOTEMENT
    else
    {
      Serial.println("This is not a number"); //si le caractère n'est pas un chiffre
    }
  }

  digitalWrite (led, HIGH);// programme de clignotement
  delay (cligno);
  digitalWrite (led, LOW);
  delay (cligno);

}

Ne pas oublier de sékectioner 'nouvelle ligne' en bas à droite dans le moniteur série.

merci,
le programme fonctionne à merveille
juste une dernière question, quel est l'intérêt de static dans
static int valeur=0;

Ca ser à faire en sorte que valeur garde sa valeur d'un tour sur l'autre de loop().
T'aurais obtenu le même résultat en la déclarant en tant que variable globale en dehors de la fonction, mais c'est moins "propre" comme code...