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

Arduino Discussion :

Comprendre un programme


Sujet :

Arduino

  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2019
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2019
    Messages : 15
    Par défaut Comprendre un programme
    Bonjour à tous,
    je possède un programme arduino réalisé par mon professeur sauf que je dois présenté se programme à l’oral bientôt. j'aurais donc vraiment besoin que vous m'aidiez a comprendre ce programme et de savoir l'expliquer.
    but du programme : il me sert dans un projet pour répondre a une commande/demande de labview, labview est donc mon maitre et larduino l'esclave

    Sans nom ard.pdf


    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    #include <Wire.h>
     
    int x;
    char f[2];
    void setup() {
      Wire.begin(8);                // join i2c bus with address #8
      Wire.onReceive(receiveEvent); // register event
        Wire.onRequest(requestEvent); // register event
      Serial.begin(9600);           // start serial for output
     
     
    }
     
    void loop() {
      delay(100);
    }
     
    // function that executes whenever data is received from master
    // this function is registered as an event, see setup()
    void receiveEvent(int howMany) {
     while (1 < Wire.available()) { // loop through all but the last
        char c = Wire.read(); // receive byte as a character
        Serial.print(c);         // print the character
     
      }
      x = Wire.read();    // receive byte as an integer
     // Serial.println(x);         // print the integer 
     
    }
    void requestEvent() {
      itoa(x,f,16);
          Wire.write(f);
           Serial.println(f);  
    }

  2. #2
    Expert confirmé
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 660
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 660
    Par défaut
    Bonjour,

    Quelles sont les lignes de code que tu ne comprends pas ? Le code est commenté, pour les fonctions un peu spécifiques de la bibliothèque Wire tu as la documentation Arduino : https://www.arduino.cc/en/Reference/Wire
    et pour l'objet Serial c'est ici :https://www.arduino.cc/reference/en/...cation/serial/

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2019
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2019
    Messages : 15
    Par défaut
    merci bien

    la fonction Itoa j'aimerais savoir ce qu'elle fais, son rôle

  4. #4
    Membre éclairé
    Inscrit en
    Mai 2006
    Messages
    384
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 384
    Par défaut
    Citation Envoyé par baptiste.0809 Voir le message
    merci bien

    la fonction Itoa j'aimerais savoir ce qu'elle fais, son rôle
    elle convertit ton int x en une chaine de 2 caracteres f en base 16. (après une recherche google vu que je la connaissait pas)

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2019
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2019
    Messages : 15
    Par défaut
    Merci beaucoup

  6. #6
    Rédacteur

    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Novembre 2006
    Messages
    503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Transports

    Informations forums :
    Inscription : Novembre 2006
    Messages : 503
    Par défaut
    Bonjour,

    Ma première recherche pour arduino itoa() m'a donné https://forum.arduino.cc/index.php?topic=472698.0
    Pour un débutant .... quel "salade"! Il faut donc chercher ailleurs.

    Regarde aussi: http://www.cplusplus.com/reference/cstdlib/itoa/

    Ce n'est ni de l'ANSI-C ni du C++. La note du sizeof() est importante. Ton f[2] pourrait poser de gros problèmes.
    Je l'ai essayé sur un ESP32 avec l'IDE de l'Arduino, f[2] et des x > 15 grandissant dans la loop(). Pas de plantage ... mais c'est faux!

    Bon travail avec l'Arduino.

  7. #7
    Expert confirmé
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 660
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 660
    Par défaut
    Bonjour,

    de mon côté je passe par la méthode toCharArray de l'objet String. Voici un exemple :
    Code Arduino : 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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    const int BUF_SIZE = 10; // taille du buffer, 10 caractères
    const int D2 = 2; //voie numérique 2
     
    char str[255]; // tableau de caractères contenant la chaîne finale
    char strA0[BUF_SIZE], strD2[BUF_SIZE]; 
     
    int dA0, dD2;
     
    // fonction de conversion de int vers char[]
    void intToString(int d, char buf[])
    {
      String str;
      str = String(d);
      str.toCharArray(buf, BUF_SIZE);
    }
     
    void setup()
    {
      // configuration des voies
      pinMode(A0, INPUT);
      pinMode(D2, INPUT);
      Serial.begin(9600);
    }
     
    void loop()
    {
      // code
      // lecture des données des voies A0 et D2
      dA0 = analogRead(A0);
      dD2 = digitalRead(D2);
     
      // conversion du int en tableau de char
      intToString(dA0, strA0);
      intToString(dD2, strD2);
     
      // mise en forme de la chaîne
      sprintf(str,"%s, %s\n", strA0, strD2);
     
      // affichage
        Serial.print(str);
    }

    Dans l'exemple, je lis les données provenant de la voie analogique A0 et de la voie numérique D2. J'utilise ensuite la fonction toCharArray de l'objet string qui me permet de transformer un entier en chaîne de caractères. J'utilise ensuite la fonction sprintf() pour la mise en forme d'une chaîne de caractères que j'affiche ensuite sur la console Arduino avec Serial.print(). Pour Arduino UNO attention à ne pas utiliser les voies numériques 0 et 1 lorsque l'objet Serial est implémenté dans le code !

  8. #8
    Expert confirmé
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 660
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 660
    Par défaut
    Le code posté par virginieh ne me choque pas. N'oublie pas que les fonctions receiveEvent et requestEvent sont appelées lors d'une interruption et donc ne retournent pas de résultat.
    Visiblement il s'agit d'un composant à qui on envoie une commande et en retour donne le résultat : cas typique de certains capteurs multifonctions qui retournent un résultat d'une température, de l'humidité etc..
    La variable f[2] est sans doute sous-dimensionnée car normalement une chaîne de caractères en C++ se termine par un '\0'.

Discussions similaires

  1. comprendre ce programme
    Par diamentelle dans le forum Windows Forms
    Réponses: 5
    Dernier message: 08/04/2009, 15h33
  2. Comprendre un programme Matlab?
    Par nejm59 dans le forum MATLAB
    Réponses: 22
    Dernier message: 12/12/2008, 20h32
  3. Comprendre un programme
    Par Konala dans le forum Débuter avec Java
    Réponses: 4
    Dernier message: 27/10/2008, 12h21
  4. Comprendre un programme C simple décompilé
    Par _jeez_ dans le forum x86 32-bits / 64-bits
    Réponses: 2
    Dernier message: 07/10/2007, 16h06
  5. Réponses: 1
    Dernier message: 25/08/2007, 23h14

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