Auteur Sujet: Récupération de données à partir d'une chaîne de caractère sur port Série  (Lu 12013 fois)

TOTOarduino

  • Newbie
  • *
  • Messages: 6
    • Voir le profil
Bonjour,

Débutant sur arduino j'ai beaucoup à apprendre.

Je m'adresse humblement à vous car je débute sur Arduino et je souhaite peser un train afin de l'aiguiller vers une voie ou l'autre.
Je récupère la valeur de la balance :"        56.2300 g S       "
Pour comparer la valeur de la balance et faire un test je ne suis intéressé que par 56.23 et pas les espaces ni l'unité ni le S ni les espaces qui suivent"
J'ai essayé substring.  toFloat. mais en vain
Il semblerait que je sois obligé de décomposer toute la chaine de caractère et reconstruire la partie qui m'intéresse.
Est ce que quelqu'un a déjà réussi à extraire un float d'une chaine de caractère ?
Faut il utiliser plutôt string ou char ?
Merci si vous avez des exemples
Cordialement :D :D :D


#include  <SoftwareSerial.h>
float toto;
String Txt_Toto ;
char data[10] ;
// string data ;

SoftwareSerial mySerial(10, 11,true); // RX, TX

void setup()
{
  Serial.begin(9600);
   while (!Serial) {
   
  }

  mySerial.begin(9600);
}

void loop()
{
  if (mySerial.available())
  {

   data[1] = mySerial.read();
   //Serial.write(mySerial.read());
 
 
  }
}

Jean-Luc

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1691
    • Voir le profil
Je peux vous demander quel dispositif vous utilisez pour peser un train ?  ;D

Vous pouvez filtrer les caractères dans un premier temps. Si le caractère n'est ni un chiffre ni le point, il est ajouté à la chaîne sinon on considère que la chaine contient un nombre flottant si elle n'est pas vide.

Quelque chose comme (code pas compilé et donc pas testé) :

String mesure;

...

void loop()
{
  if (mySerial.available()) {
    char caractere = mySerial.read();
    if ((caractere >= '0' && caractere <= '9') || caractere == '.') {
      /* Chiffre de la mesure */
      mesure += caractere;
    }
    else {
      /* Si mesure n'est pas vide alors une valeur a été récupérée */
      if (mesure.length() > 0) {
        float valeurMesure = mesure.toFloat();
        /* faire ce qu'on a à faire de la valeur en flottant */
        ...
        /* remet mesure à la chaine vide */
        mesure = "";
      }
    }
  }
}

Et je confirme que quelqu'un a déjà réussi à extraire un float d'une chaine  :-*
« Modifié: avril 13, 2019, 06:35:07 pm par Jean-Luc »
Cordialement

TOTOarduino

  • Newbie
  • *
  • Messages: 6
    • Voir le profil
Merci

Pour peser un vielle balance mettler.
J'essaie le code et je réfléchis dessus. Et vous fais un retour.

Le code marche nickel c'est parfait merci beaucoup !
Je vais pouvoir continuer

Cordialement
« Modifié: avril 13, 2019, 08:25:48 pm par TOTOarduino »

Dominique

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 2889
  • 100% Arduino et N
    • Voir le profil
C’est original, cette méthode de détection  ;D

Une de plus !

Ce serait sympa de nous montrer une photo ou deux.

Cordialement
Dominique
Cordialement,
Dominique

TOTOarduino

  • Newbie
  • *
  • Messages: 6
    • Voir le profil
Bonjour,

Le projet est pas encore très abouti, il faudra attendre un peu pour les photos du train de marchandise.

Sans vouloir abuser j'ai une question. Je pensais que les sorties RS232 avaient des niveaux trop élevés pour les arduino.
En fait j'ai acheter un module max3232 mais impossible de récupérer les données du port série dessus.
Est ce que quelqu'un sait pourquoi.

Je ne trouve pas d'exemple de code qui marche avec un tel convertisseur RS232 TTL.

Cordialement



Dominique

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 2889
  • 100% Arduino et N
    • Voir le profil
Les broches Tx et Rx de l'Arduino sont au niveau TTL (0..5v)

Pour le RS232, un niveau logique "0" est représenté par une tension de +3V à +25V et un niveau logique "1" par une tension de -3V à -25V (codage NRZ). D'ordinaire, des niveaux de +12V et -12V sont utilisés. DE QUOI TUER UN ARDUINO A COUP SUR.

Il faut bien, effectivement utiliser un convertisseur Max232 entre le signal RS232 et l'Arduino.

Exemple : http://www.roboticus.org/articles/4-description-de-lrs232-et-mise-en-place-dun-max232-
Cordialement,
Dominique

TOTOarduino

  • Newbie
  • *
  • Messages: 6
    • Voir le profil
Bonjour merci pour cette réponse mais quand je branche le convertisseur , il ne ressort rien alors qu'en direct cela marche au poil.

Quelle bibliothèque utiliser ou quelle partie du code modifier ?
 

#include  <SoftwareSerial.h>
String mesure;

SoftwareSerial mySerial(50, 52,true); // RX, TX
void setup()
{
  Serial.begin(9600);
   while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }

  mySerial.begin(9600);
}

void loop()
{
  if (mySerial.available()) {
    char caractere = mySerial.read();
    if ((caractere >= '0' && caractere <= '9') || caractere == '.')
    {
      /* Chiffre de la mesure */
      mesure += caractere;
    }
    else {
      /* Si mesure n'est pas vide alors une valeur a été récupérée */
      if (mesure.length() > 0) {
        float valeurMesure = mesure.toFloat();
        /* faire ce qu'on a à faire de la valeur en flottant */
       Serial.println(valeurMesure,3);
         mesure = "";
      if (valeurMesure > 10)
       {
        Serial.println("Ca marche !!!!!!");
        delay(1000);
       }
        /* remet mesure à la chaine vide */
       
      }
    }
  }
}

TOTOarduino

  • Newbie
  • *
  • Messages: 6
    • Voir le profil
J'ai essayé ça mais marche pas  :-\

 
#define RX 52 // affectation des broches
#define TX 50

#include <SoftwareSerial.h> // appel de la bibliothèque
SoftwareSerial RS232(RX, TX); // création de l'objet RS232

String mesure ;

void setup()
{
Serial.begin(9600); // initialisation du moniteur série
RS232.begin(9600); // initialisation de la liaison série RS232
}

void loop()
{
  if (RS232.available())
    {
    char caractere = RS232.read();
    if ((caractere >= '0' && caractere <= '9') || caractere == '.')
    {
      /* Chiffre de la mesure */
      mesure += caractere;
    }
    else {
      /* Si mesure n'est pas vide alors une valeur a été récupérée */
      if (mesure.length() > 0) {
        float valeurMesure = mesure.toFloat();
        /* faire ce qu'on a à faire de la valeur en flottant */
       Serial.println(valeurMesure,3);
         mesure = "";
     
       
      }
    }
  }
}

Dominique

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 2889
  • 100% Arduino et N
    • Voir le profil
Il va falloir montrer un schéma et expliquer ce que vous comptez faire et comment, avec un système de pesée pour un projet de modélisme ferroviaire.

Il faut au moins savoir d’abord si ce n’est pas une fausse piste. Avez-vous considéré les autres moyens de detection décrits complètement dans Locoduino ?

Merci aussi d’utiliser la balise pour le code.
Cordialement,
Dominique

msport

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 2218
  • HO avec DCC++ en DIY Réseaux très éphémères
    • Voir le profil
Il faut du +12V et du -12V par rapport à la masse pour faire fonctionner du RS232.
Sinon on peut bricoler une interface de type Minitel (schéma joint) si les tensions sont présentes sur l'interface de la balance.
Attention quelques résistances de limitation à rajouter ... (sur TX et pullup sur RX)
« Modifié: avril 17, 2019, 11:43:17 am par msport »
Cordialement

Jean-Luc

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1691
    • Voir le profil
À ma connaissance le MAX232 intègre un convertisseur DC-DC pour, à partir de l'alimentation, de 5V, engendrer du +12V/-12V sur les lignes de communication.

http://www.ti.com/lit/ds/symlink/max232.pdf

Le MAX3232 fait de même mais avec une alimentation entre 3,3 et 5V

http://www.ti.com/lit/ds/symlink/max3232.pdf
https://www.sparkfun.com/products/11189

Il n'est donc pas nécessaire de disposer d'une alimentation -12/+12
Cordialement

TOTOarduino

  • Newbie
  • *
  • Messages: 6
    • Voir le profil
Bonjour,

Effectivement, la balance ne s'avère pas très pratique à intégrer, dommage car c'était très précis pour les faibles grammages.
En tout cas cela a marché. Et merci pour le éléments de code (pardon d'avoir surchargé le fil de la discussion)
J'ai juste du résoudre des problèmes de connexions sur la carte méga 2560 car toutes E/S digitales ne se valent pas.

En tout cas merci pour tous ces conseils. Ils me sont précieux.

Cordialement.