IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Problème envoi de données entre 2 arduinos


Sujet :

C

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Mai 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Mai 2014
    Messages : 3
    Points : 1
    Points
    1
    Par défaut Problème envoi de données entre 2 arduinos
    Bonjour, je m'appelle Clément et suis actuellement en terminale STI2D SIN.

    Je travaille actuellement sur mon projet de bac qui a pour but de connaitre l'état de santé d'une ruche grâce à des capteurs de poids, de température et d'humidité.

    Ma partie consiste à envoyer ces valeurs par bluetooth à un shield ethernet et une arduino, pour ensuite les comparer avec des valeurs seuils entrées par l'apiculteur et les afficher sur un site.

    Etant débutant en C j'ai réussi à envoyer une variable, la recevoir et l'afficher dans le moniteur série, mais je n'y arrive pas lorsque ma variable est un nombre à virgule, le moniteur ne m'affiche que la valeur entière.

    Voici mon code d'envoi:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    #include <SoftwareSerial.h>
     
    SoftwareSerial bluetooth(2,3);
    float e=21.25;
     
    void setup()
    {
      Serial.begin(9600);
     
      bluetooth.begin(9600);
    }
     
     
    void loop()
    {
    bluetooth.write(e);
    delay(5000);
    }
    Et celui qui reçoit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    #include <SoftwareSerial.h>
     
    SoftwareSerial bluetooth(2,3);
     
     
     
    void setup()
    {
      Serial.begin(9600);
     
      bluetooth.begin(9600);
    }
     
     
    void loop()
    {
      float e;
     
      if(bluetooth.available())
      {
        e = bluetooth.read();
        Serial.println(e);
      }
    }
    De plus, je vais devoir envoyer les valeurs de chaque capteur, et à la réception les différencier et mettre chaque valeur dans une variable différente.

    Et je ne sais absolument pas comment faire cela.

    Si quelqu'un a des choses à me proposer

    Merci par avance,

    Clément.

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 372
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 372
    Points : 23 628
    Points
    23 628
    Par défaut
    Bonjour et bienvenue,

    C'est agaçant : Arduino ne précise pas si son API est faite pour le C ou le C++ explicitement. Ils disent « The Arduino language is based on C/C++. It links against AVR Libc and allows the use of any of its functions ».

    Quoi qu'il en soit, .write() propose trois modes : soit l'envoi d'un octet individuel, soit l'envoi d'une chaîne entière (on ne sait pas s'il s'agit de const char * ou d'une string C++), soit l'envoi d'un buffer de n octets. Donc, tant que la valeur de ton entier tenait dans un octet seul ([0;255] ou [-128;+127]), tu auras l'impression que ta valeur est bien passée mais dès que celle-ci dépassera la plage autorisée, les problèmes vont ressurgir.

    C'est donc la troisième option qui t'intéresse puisqu'elle te permet de transmettre virtuellement n'importe quoi. En l'occurence, le buffer concerné sera l'emplacement de la variable en mémoire. Donc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        float e = 21.25;
        bluetooth.write(&e, sizeof e);
    Le « & » donne l'adresse en mémoire de l'expression qui suit (la variable e) et donc renvoie un pointeur. « sizeof » est un mot-clé réservé du C qui te donne la longueur d'un type connu (à ne pas confondre avec la longueur du contenu d'une chaîne par exemple, qui ne peut être déterminé qu'à l'exécution).

    Tu fais ensuite la même chose du côté récepteur avec read.

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Mai 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Mai 2014
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Re-bonjour et merci

    Lorsque je veux compiler j'obtient cette erreur :

    lecture_bluetooth.ino: In function 'void loop()':
    lecture_bluetooth:22: error: no matching function for call to 'SoftwareSerial::read(float*, unsigned int)'

  4. #4
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 372
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 372
    Points : 23 628
    Points
    23 628
    Par défaut
    Malheureusement, l'interface série ne fait que transmettre des octets, l'un après l'autre, sans forme de service supplémentaire. Du côté récepteur, il n'y a rien qui lui indique a priori quelle quantité il doit recevoir. C'est donc à toi de lire un à un les octets que tu reçois pour les déposer dans la variable cible, en espérant que ta machine-cible s'appuie sur la même architecture et que les deux côtés soient bien synchronisés. Sinon, il faudra utiliser ou mettre en place une couche de plus haut niveau qui s'occupe de garantir la validité des transmissions.

  5. #5
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 621
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 621
    Points : 56 866
    Points
    56 866
    Billets dans le blog
    40
    Par défaut
    bonjour,

    regarde du côté de parseFloat() :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    e=Serial.parseFloat();
    Serial.println(e, DEC);
    à voir...

  6. #6
    Nouveau Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Mai 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Mai 2014
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Ok je vais essayer ça, et pour information j'obtiens la même erreur du côté de l'envoi :

    lecture_bluetooth.ino: In function 'void loop()':
    lecture_bluetooth:22: error: no matching function for call to 'SoftwareSerial::write(float*, unsigned int)'

Discussions similaires

  1. Problème lors de l'envoi de données entre servlet et JSP
    Par julia_m dans le forum Servlets/JSP
    Réponses: 44
    Dernier message: 23/08/2012, 12h10
  2. Réponses: 3
    Dernier message: 02/03/2009, 22h34
  3. Problème envoie de données sur le port Serie
    Par petiteso dans le forum C#
    Réponses: 6
    Dernier message: 06/12/2007, 13h33
  4. [C#] problème de type donnée entre Service Web
    Par Cédric B. dans le forum Services Web
    Réponses: 1
    Dernier message: 01/11/2007, 01h19
  5. Réponses: 10
    Dernier message: 07/02/2007, 07h43

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo