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 :

Utiliser Processing avec Arduino, communication série.


Sujet :

Arduino

  1. #21
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 711
    Points : 5 390
    Points
    5 390
    Par défaut
    Il manque le else ! Et vous pouvez ne conserver qu’un seul appel à text() une fois la valeur de la String définie

    (et ça serait bien de donner une valeur initiale à valeurInString - même si par défaut c’est 0, ça fait plus propre)

    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
    import processing.serial.*; 
    Serial myPort;
    int valeurInString=0;
    String afficheEtat="OFF" ;
     
    void setup () {
      size(400, 300);
      myPort = new Serial(this, Serial.list()[0], 115200);
      myPort.bufferUntil ('\n'); 
      textFont(createFont("Grenoble SF", 24));
    }
     
    void draw() { 
      background(0); 
      if (valeurInString == 1) { 
        afficheEtat = "ON" ; 
      } else {
        afficheEtat = "OFF" ;
      }
      text("Etat led =  " + afficheEtat, 50, 100); // Affiche la valeur de valeurInString
    }
     
    void serialEvent (Serial myPort) {
      String inString = myPort.readStringUntil ('\n'); 
      if (inString != null) {.
        inString = trim (inString); // Supprime les caractères d'espace (blanc, tab, CR, LF,...) du début et de la fin de la chaîne
        valeurInString = (int (inString)) ;
      }
    }
    vous pourriez bien sûr définir afficheEtat dans serialEvent() et vous passer de valeurInString (en donnant une valeur initiale à afficheEtat) ou alors appeler text() avec le texte complet directement dans le if et dans le else

  2. #22
    Nouveau membre du Club
    Homme Profil pro
    loisirs
    Inscrit en
    Février 2020
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 77
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : loisirs

    Informations forums :
    Inscription : Février 2020
    Messages : 118
    Points : 25
    Points
    25
    Par défaut Utiliser Arduino avec Processing etc..
    Bonsoir

    Le programme
    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
    // Programme tiré de l'exemple grahp de l'Ide Arduino
    import processing.serial.*; // Import la bibliothèque communication série + classes associées.
    Serial myPort; // Contient N° port utilisé ici 0.
    int valeurInString; // Variable globale, car je ne savais pas où la placer en variable locale.
    String afficheEtat ; // Variable pour l'affichage.
     
    void setup () {
      size(400, 300); // Taille de la fenêtre d'affichage en pixels / Format size(width, height).
      printArray(Serial.list());
      myPort = new Serial(this, Serial.list()[0], 115200);
      myPort.bufferUntil ('\n'); // Ne rien faire sur le port série, tant qu'une donnée nouvelle ligne n'est pas dans le tampon( pas sûr tout ça).
      textFont(createFont("Grenoble SF", 24));
      background(0); // Définir le noir pour la fenêtre de visualisation.
    }
    void draw() { // Appelle fonction dessin. On constate que l’axe des x représente le temps, l’axe des y la valeur de la donnée.
      background(0); // Rafraîchissement de la fenêtre pour éviter d'écrire les valeurs l'un sur l'autre.
      if (valeurInString == 1) { // Test si la donnée lue sur le port série et stockée dans valeurInString est égale à 1.
        afficheEtat = "ON" ; // True Demande affichage ON
        text("Etat led = " + afficheEtat, 50, 100); // Affiche la valeur de afficheEtat.
      } else {
     
        afficheEtat = "OFF" ; // False Demande affichage OFF
      }
      background (0) ; // C'est là qu'il fallait placer ce p.. de truc; juste avant d'afficher un nouvel état
      text("Etat led =   " + afficheEtat, 50, 100); // Affiche la valeur de afficheEtat.
    }
    void serialEvent (Serial myPort) {
      String inString = myPort.readStringUntil ('\n'); // Acquisition de la donnée en code ASCII.
      if (inString != null) { // Vérifie si une donnée est présente sur myPort.
        inString = trim (inString); // Elimine les blancs ?
        print (inString) ; // Affiche bien 0 et 1 dans la console.
        valeurInString = (int (inString)) ;
      }
    }
    La vidéo


    Je pense que le problème venait de la position du rafraîchissement d'écran.
    Pour le else j'avais cru lire qu'on pouvait l'omettre dans certains cas.

  3. #23
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 711
    Points : 5 390
    Points
    5 390
    Par défaut
    Jolie vidéo encore - merci du partage

    Le else est nécessaire quand in veut faire un traitement différent si la condition et vraie ou fausse. On ne met pas de else quand quand on ne veut rien faire quand la condition est fausse.

    Sino le code n’est pas idéal ...

    Votre code d’affichage dit

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Effacer l’écran
    Si valeur vaut 1 (mémoriser message ON et afficher ON) Sinon (mémoriser message Off)
    Effacer l’écran
    Afficher la valeur mémorisée
    Il n’y a pas besoin d’effacer deux fois l’écran ni dans un cas de mémoriser et afficher ou juste de mémoriser

    Pourquoi ne pas faire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Si valeur vaut 1 (mémoriser message ON) Sinon (mémoriser message Off)
    Effacer l’écran
    Afficher la valeur mémorisée
    C’est plus simple non ?

    (Pour éviter tout clignotement de l’écran il ne faudrait faire l’effacement que si la valeur a changé - là c’est pas grave de tout effacer et repeindre car ça va vite et on ne le voit pas mais si la scène était plus complexe ça clignoterait)

  4. #24
    Nouveau membre du Club
    Homme Profil pro
    loisirs
    Inscrit en
    Février 2020
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 77
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : loisirs

    Informations forums :
    Inscription : Février 2020
    Messages : 118
    Points : 25
    Points
    25
    Par défaut Utiliser Arduino avec Processing etc..
    Bonjour

    J'ai bien avancé dans mes études.
    Simulation du clignotement dans Processing, sauvegarde des données clignotement dans un tableau et affichage du tableau.
    Création de methods (fonction); que du bonheur!

    Avant d'entamer l'étape suivante utilisation avec Arduino en live, je me suis documenté sur la façon de sauvegarder mes données Processing dans un fichier CSV.

    Résultat: On peut par la commande saveTable() sauvegarder les données d'une table en Csv, dans un fichier, pour utilisation ultérieure avec Excel.
    Qu'en est-il d'un tableau?
    Le Web est assez pauvre en la matière.

    Si on ne peut pas sauver directement les données du tableau, doit-on transformer le tableau en table ou stocker directement les données dans une table.

    Des pi...............stes "pretty please"

  5. #25
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 711
    Points : 5 390
    Points
    5 390
    Par défaut
    Avec un tableau il faut le faire à la main...

    regardez les fonctions createWriter() et createReader() pour relire

    vous faites une boucle sur les éléments du tableau et écrivez dans le 'writer'

    tenez, j'ai rédigé un exemple avec des fonctions pour chacune des opérations (pour faire bien il faudrait dire aux fonctions appelante si ça s'est bien passé - à faire ultérieurement)

    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    final int nombreDeRangs = 10;
    final int nombreDeColonnes = 5;
     
    void remplirTableauAleatoirement(int[][] t)
    {
      int nbRangs = t.length;  
      int nbColonnes = t[0].length; 
     
      for (int l=0; l<nbRangs; l++) {
        for (int c=0; c<nbColonnes; c++) {
          t[l][c] = (int) random(100);
        }
      }
    }
     
    void imprimerTableau(int[][] t)
    {
      int nbRangs = t.length;  
      int nbColonnes = t[0].length; 
     
      for (int l=0; l<nbRangs; l++) {
        for (int c=0; c<nbColonnes; c++) {
          print(t[l][c]);
          if (c != nombreDeColonnes-1) print(", "); 
          else println();
        }
      }
    }
     
    void sauverTableau(String nomFichier, int[][] source)
    {
      int nbRangs = source.length;  
      int nbColonnes = source[0].length; 
     
      PrintWriter fichier = createWriter(nomFichier); // dans le répertoire du sketch
      for (int l=0; l<nbRangs; l++) {
        for (int c=0; c<nbColonnes; c++) {
          fichier.print(source[l][c]);
          if (c != nbColonnes-1) fichier.print(", "); 
          else fichier.println();
        }
      }
      fichier.flush(); // on s'assure que tout est bien écrit
      fichier.close(); // on ferme le fichier
    }
     
     
    void lireTableau(String nomFichier, int[][] destination)
    {
      int nbRangs = destination.length;  
      int nbColonnes = destination[0].length; 
      int ligneEnCours = 0;
      BufferedReader fichier = createReader(nomFichier);
      String ligne = null;
     
      // on parcourt le fichier ligne par ligne
      try {
        while ((ligne = fichier.readLine()) != null) {
          String[] valeurs = split(ligne, ','); // on sépare chacun des éléments de la ligne
          if (valeurs.length == nbColonnes) {
            if (ligneEnCours < nbRangs) {
              for (int i=0; i<nbColonnes; i++) 
                  destination[ligneEnCours][i] = int(valeurs[i].trim());
              ligneEnCours++; // on passe à la ligne suivante
            } else {
              println("Erreur - Trops de lignes -> ", ligne);
              break;
            }
          } else {
            if (valeurs.length != 0)
              println("Erreur -trop de données sur la ligne ", ligneEnCours, " -> ", ligne);
            break;
          }
        }
        fichier.close();
      } 
      catch (IOException e) {
        e.printStackTrace();
      }
    }
     
    void setup() {
      // on ceée un tableau 
      int[][] tableau2DEcriture = new int[nombreDeRangs][nombreDeColonnes];
     
      // on le remplit aléatoirement
      remplirTableauAleatoirement(tableau2DEcriture);
     
      // on l'affiche
      println("\nTableau créé");
      imprimerTableau(tableau2DEcriture);
     
      // on l'écrit dans un fichier
      sauverTableau("aleatoire.csv", tableau2DEcriture);
     
      // on ceée un second tableau 
      int[][] tableau2DLecture = new int[nombreDeRangs][nombreDeColonnes];
     
      // on relit le fichier dans ce nouevau tableau
      lireTableau("aleatoire.csv", tableau2DLecture);
     
      // on l'affiche (il doit être identique)
      println("\nNouveau tableau lu");
      imprimerTableau(tableau2DLecture);
     
      // on arrête là
      exit();
    }
     
     
    void draw() {
    }
    quand je lance ce code, la console me dit:

    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
    Tableau créé
    21, 27, 53, 55, 68
    90, 85, 85, 53, 88
    19, 69, 64, 41, 14
    82, 51, 75, 3, 51
    82, 8, 75, 17, 65
    96, 30, 75, 44, 6
    50, 71, 1, 47, 7
    34, 68, 22, 16, 10
    63, 65, 45, 48, 6
    2, 76, 49, 1, 44
    
    Nouveau tableau lu
    21, 27, 53, 55, 68
    90, 85, 85, 53, 88
    19, 69, 64, 41, 14
    82, 51, 75, 3, 51
    82, 8, 75, 17, 65
    96, 30, 75, 44, 6
    50, 71, 1, 47, 7
    34, 68, 22, 16, 10
    63, 65, 45, 48, 6
    2, 76, 49, 1, 44
    et j'ai bien un fichier dans le répertoire de mon sketch qui s'appelle aleatoire.csv et qui contient les mêmes valeurs tabulées
    Nom : fichier.png
Affichages : 772
Taille : 69,1 Ko

  6. #26
    Nouveau membre du Club
    Homme Profil pro
    loisirs
    Inscrit en
    Février 2020
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 77
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : loisirs

    Informations forums :
    Inscription : Février 2020
    Messages : 118
    Points : 25
    Points
    25
    Par défaut Utiliser Arduino avec Processing etc..
    Bonsoir
    merci Jay M

    Je vais essayer de comprendre le code, mais c'est tout à fait ce qu'il me faut.


  7. #27
    Nouveau membre du Club
    Homme Profil pro
    loisirs
    Inscrit en
    Février 2020
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 77
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : loisirs

    Informations forums :
    Inscription : Février 2020
    Messages : 118
    Points : 25
    Points
    25
    Par défaut Utiliser Processing avec Arduino
    [QUOTE=Jay M;11655945]Avec un tableau il faut le faire à la main...

    regardez les fonctions createWriter() et createReader() pour relire

    vous faites une boucle sur les éléments du tableau et écrivez dans le 'writer'

    Bonjour

    Après avoir réfléchi toute la nuit:

    Si on peut sauver une table direct; j'aurais peut être intérêt à sauver mes données dans une table au lieu d'un tableau (Plus simple? et puis, tout le monde sait que les informaticiens en herbe sont des paresseux)?

    J'ai découvert sur le web, une macro pour Excel qui permet la sauvegarde directe dans un fichier Csv à partir de la carte Arduino; piste à explorer.

  8. #28
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 711
    Points : 5 390
    Points
    5 390
    Par défaut
    bien sûr rien de mal à ne pas réinventer la roue. réutiliser des classes déjà testées est un bon moyen d'avoir moins de code, donc moins de risques de bugs.

    C'est donc tout à fait envisageable d'utiliser la classe Table. C'est plus "couteux" qu'un tableau (en mémoire/resources) mais sur un Mac/PC c'est moins un problème que sur un Arduino Uno et il y a plein de fonctions pré-programmées bien sympathiques (pas forcément toutes utiles pour ce que vous voulez faire mais qui peut le plus...)

    (--> doc détaillée en anglais ici)

    J'ai découvert sur le web, une macro pour Excel qui permet la sauvegarde directe dans un fichier Csv à partir de la carte Arduino; piste à explorer.
    Oui avec VBA on peut aussi injecter dans excel (faut qu'il soit ouvert) directement la sortie de l'arduino, voir envoyer aussi des commandes et créer une interface directement dans excel. Si @jpbricole repasse sur le forum, j'ai cru comprendre c'est une technique qu'il maîtrise bien, il pourra vous aider sans doute.

  9. #29
    Nouveau membre du Club
    Homme Profil pro
    loisirs
    Inscrit en
    Février 2020
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 77
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : loisirs

    Informations forums :
    Inscription : Février 2020
    Messages : 118
    Points : 25
    Points
    25
    Par défaut Utiliser Processing avec Arduino
    Bonjour

    Bonne avancée du projet, j'ai fini l'étude des tables; pas facile malgré deux livres achetés qui en fait parlent très peu des tables.
    Une bonne aide trouvée dans un extrait du livre "learning Processing" + les références langage.
    C'est tout bon, j'ai réussi à créer une table avec une boucle for et des variables pour les paramètres. Bientôt dans un post!

    Néanmoins, deux problèmes à vous soumettre:
    1 - j'ai sauvegardé un fichier .csv, mais lorsque je l'ouvre dans excel, les données sont en vrac, on dirait que les "," ne servent à rien??
    2- Y a t'il un ordre pour lancer Processing lorsque l'on veut l'utiliser avec Arduino. Hier mon programme validé par la vidéo postée ici même, ne voulait pas fonctionner; aucune lecture sur le port série.
    Après moult vérification, relance de la carte et de Processing dans un ordre différent, enfin le programme a fonctionné; mais je ne sais pas pourquoi??

    Si vous avez des pistes?

    A suivre

  10. #30
    Nouveau membre du Club
    Homme Profil pro
    loisirs
    Inscrit en
    Février 2020
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 77
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : loisirs

    Informations forums :
    Inscription : Février 2020
    Messages : 118
    Points : 25
    Points
    25
    Par défaut Utiliser Processing avec Arduino
    Réponse question 1

    J'ai fait des recherches, trouvé la solution et cela fonctionne.

    Les fichiers .csv et Excel
    Pour visualiser dans Excel, un fichier .csv écrit dans une autre langue, par exemple Anglais avec Processing, il y a de forte chance que le séparateur lu par Excel soit un ";" et pas une ",". Ceci est dû aux options linguistiques du système d'exploitation.
    La solution: Importer les données dans Excel.
    Insertion / A partir du texte / nom du fichier à insérer.
    Bien sélectionner la "," comme séparateur.
    Test: c'est good.

  11. #31
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 711
    Points : 5 390
    Points
    5 390
    Par défaut
    OK pour le 1, oui il faut faire importer et s'assurer des options. le ';' est du au fait qu'en français vous utilisez la virgule pour les nombre décimaux et donc c'était pas génial...

    pour le 2, lorsque le programme Processing ouvre le port série Arduino, ça fait rebooter l'Arduino. Comme cela prend un peu de temps de démarrer et exécuter le setup() arduino, si le programme processing balance immédiatement des commandes, elles en seront pas reçues par le programme Arduino.

    donc assurez vous qu'après l'ouverture du port série, le programme processing attende une ou deux secondes avant de faire quoi que ce soit avec le port série. une autre option c'est que l'Arduino quand il a fini de bosser (à la fin du setup() par exemple) envoie un message sur le port série pour dire "READY". Processing pour alors se mettre en attente de ce message avant de faire quoi que ce soit.

  12. #32
    Nouveau membre du Club
    Homme Profil pro
    loisirs
    Inscrit en
    Février 2020
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 77
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : loisirs

    Informations forums :
    Inscription : Février 2020
    Messages : 118
    Points : 25
    Points
    25
    Par défaut Utiliser Processing avec Arduino
    Bonjour

    Merci Jay M. fidèle au poste!

    J'avais remarqué que le démarrage de Processing faisait rebooter Arduino; je vais introduire un delay de 3 secondes.
    Donc les fois ou cela a fonctionné, c'était le hasard!

    A suivre!

  13. #33
    Nouveau membre du Club
    Homme Profil pro
    loisirs
    Inscrit en
    Février 2020
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 77
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : loisirs

    Informations forums :
    Inscription : Février 2020
    Messages : 118
    Points : 25
    Points
    25
    Par défaut
    Bonjour

    Une petite ébauche du test N°5; dans lequel j'ai intégré la création de la table; pour la création des colonnes, j'aurais pu utiliser une boucle, solution plus élégante, mais je ne sais pô faire.
    Le programme est surchargé de commentaires, mais pour le développement cela m'aide.

    Le problème se trouve dans l'utilisation de text à l'intérieur de la boucle for.
    Pour le fun, en plus de l'affichage dans la console (qui s'affiche correctement), je voulais afficher les mêmes données dans la fenêtre de visualisation.
    Le résultat est bizarre; le texte ne s'affiche qu'à la fin de la boucle, et non à chaque tour de boucle; serait ce une incompatibilité des deux instructions.
    Je me suis laissé un peu aller avec le texte, mais ça soulage.
    Des pistes?

    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    // Chargement bibliothèque et variable port série.
    import processing.serial.* ;
    Serial myPort ; // Contient N° port utilisé ici 0.
    // Crée la table vide?????.
    Table dataLdc ;
    // Variables pour l'acquisition des data.
    int ldcState = 0 ; // Etat Ldc 1 ou 0.
    int cpteTemps = 0 ; // Temps écoulé depuis le début du programme millis().
    int preCpteTemps = 0 ; // Temps au dernier changement d'état de Ldc.
    int tempsLdcState = 0 ; // Temps calculé d'un état donné.
    // Variables pour la table.
    String titreCol0 = "Pas" ; // N° de ligne.
    String titreCol1 = "Temps" ; // cpteTemps.
    String titreCol2 = "Temps précédent" ; // preCpteTemps.
    String titreCol3 = "Durée" ; // tempsLdcState.
    String titreCol4 = "Premier chiffre" ; // Premier chiffre du code.
    String titreCol5 = "Deuxième chiffre" ; // Deuxième chiffre du code.
    String titreCol6 = "Code" ; // Code en chaîne de carctères.
    int valPas = 0 ; // Numéro de ligne, stockée dans "Pas", pour remplissage colonne
    int digit1 = 0 ; // Valeur lue convertie.
    int digit2 = 0 ; // Valeur lue convertie.
    String CODE = "" ; // Valeur convertie de digit1 et digit2.
    // Utilisation de la police de caractères par défaut.
    void setup (){ // Début setup.
    size (1000, 600) ; // Taille de la fenêtre de visualisation.
    // Préparation de la table??
    dataLdc = new Table () ;
    //Ajout des colonnes; une boucle serait préférable.
    dataLdc.addColumn (titreCol0) ;
    dataLdc.addColumn (titreCol1) ;
    dataLdc.addColumn (titreCol2) ;
    dataLdc.addColumn (titreCol3) ;
    dataLdc.addColumn (titreCol4) ;
    dataLdc.addColumn (titreCol5) ;
    dataLdc.addColumn (titreCol6) ;
    // Ajout des lignes et remplssage de la colonne "Pas".
     
    int i = 0 ;
    int h = 0 ;
    background (255); 
    for (valPas = 0; valPas<261; valPas++) { // Début boucle for 1.
     
    TableRow newRow = dataLdc.addRow () ;
    newRow.setInt (titreCol0, valPas) ;
     
    fill (0) ;
    textSize (50) ;
    text ("m.....e", i, h) ;
    i=+150 ; // Pour décaler l'affichage à chaque tour de boucle; Quel affichage!!
    h=+100 ;
    println (titreCol0, "=", valPas) ;
     
    delay (20) ;
     
    } // Fin boucle for 1.
    } // Fin setup.

  14. #34
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 711
    Points : 5 390
    Points
    5 390
    Par défaut
    Une petite aide :

    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
    35
    36
    37
    38
    39
    //déclaration d'une variable de type table (elle est vide et non existante)
    Table dataLdc ;
     
    // Variables pour la table.
    String titreCol[] = {
      "Pas", // N° de ligne.
      "Temps", // cpteTemps.
      "Temps précédent", // preCpteTemps.
      "Durée", // tempsLdcState.
      "Premier chiffre", // Premier chiffre du code.
      "Deuxième chiffre", // Deuxième chiffre du code.
      "Code" // Code en chaîne de carctères.
    };
     
    // Utilisation de la police de caractères par défaut.
    void setup () { // Début setup.
      size (1000, 600) ; // Taille de la fenêtre de visualisation.
      dataLdc = new Table () ;   // allocation de la mémoire pour la table
     
      //Ajout des colonnes
      for (int i=0; i<titreCol.length; i++)  dataLdc.addColumn (titreCol[i]) ;
     
      // Ajout des lignes par remplssage de la 1ère colonne "Pas".
      for (int valPas = 0; valPas<261; valPas++) { // Début boucle for 1.
        TableRow newRow = dataLdc.addRow () ;
        newRow.setInt (titreCol[0], valPas) ;
        println (titreCol[0], "=", valPas) ;
      } // Fin boucle for valPas.
     
      background (255); // fond blanc
      fill (0) ;        // texte noir
      textSize (20) ;   // taille de la police
     
      // affichage statique de nos titres en lignes
      for (int i=0; i<titreCol.length; i++) text (titreCol[i], 10, 25*(i+1)) ; // 25*(i+1) pour séparer de 25 points chaque ligne (la police fait 20 de haut)
     
    } // Fin setup.
     
    void draw() {} // on ne change rien
    (j'ai enlevé tout ce qui ne servait pas)

    => Pour initialiser avec une boucle for, il faut que les titres soient dans un tableau afin que vous puissiez aller chercher le bon texte en fonction de la colonne en cours d'ajout

    => on ne met pas généralement l'affichage dans le setup(), on le garde dans draw(). ici j'ai juste affiché en superposé (lignes) les titres de vos colonnes et on ne change rien donc draw() est vide.

    Nom : ecran.png
Affichages : 717
Taille : 100,3 Ko

    PS/ dans ce code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      for (int valPas = 0; valPas<261; valPas++) { // Début boucle for 1.
    je ne sais pas ce que vous voulez dire avec le commentaire, tel que c'est écrit, on commence bien à 0, pas à 1....

  15. #35
    Nouveau membre du Club
    Homme Profil pro
    loisirs
    Inscrit en
    Février 2020
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 77
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : loisirs

    Informations forums :
    Inscription : Février 2020
    Messages : 118
    Points : 25
    Points
    25
    Par défaut Utiliser Processing avec Arduino
    Bonjour

    +1000 pour Jay M.

    Ok je teste ça cet après midi; mais il va falloir que, par comparaison des 2 codes, je vois où j'ai m...dé.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for (int valPas = 0; valPas<261; valPas++) { // Début boucle for 1.
    Ce n'est que le numéro de la boucle, en cas de boucles imbriquées pour ne pas oublier l'accolade de fermeture; un truc de grand débutant.

  16. #36
    Nouveau membre du Club
    Homme Profil pro
    loisirs
    Inscrit en
    Février 2020
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 77
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : loisirs

    Informations forums :
    Inscription : Février 2020
    Messages : 118
    Points : 25
    Points
    25
    Par défaut Utiliser Arduino avec Processing etc..
    Bonjour

    De retour, le canard est toujours vivant.

    Phase finale avant les essais sur le terrain, je sèche sur une difficulté.

    Dans le programme suivant, la variable "ldcState" de type int, s'affiche correctement dans la console Processing valeurs 0 / 1, valeurs cohérentes avec les valeurs envoyées par Arduino.
    Je sauvegarde cette valeur dans une table. A la lecture de la table, toutes les valeurs de "ldcState" enregistrées dans la table sont -1.

    Des pistes?

    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    /* lecture_defauts_test_9_004.pde
     * Fonctionne avec sketch_test_9_F_000.ino.
     * Fermer le port série et afficher le message "Fin Test" au bout de 330 changements d'état de Ldc.
     * Le message "Fin Test" reste affiché jusqu'à l'appui d'une touche; le programme est ensuite fermé.
     * Toutes les variables de la version finale sont déclarées.
     * Les variables non utilisées dans cette version sont annulées comme des commentaires.
     * Affichage des titres en statique, dans la fonction setup puisqu'ils n'ont besoin d'être affichée qu'une seule fois.
     * Utilisation du tableau façon M.Jay pour l'affichage des titres.
     * Affichages des messages; Attente Test; Test en Cours; Fin de test.
     * Le message "Attente Test" s'affiche tant qu'il n'y a pas de donnée à lire sur le port série.
     * Le message "Test en cours" s'affiche tant qu'il y a des données à lire sur le port série.
     * Le message "Fin Test" reste affiché jusqu'à l'appui d'une touche puis exit du programme.
     * Utilisation du drapeau FLAG1 qui prends les valeurs suivantes: 0 Attente Test; 1 Test en Cours; 2 Fin de test.
     * Affichage des messages par fonction afficheMessage (). * Utilisation de if + compteur à la place de switch case.
     * Affichage des messages dans un rectangle dessiné par le fonction afficheRectMessage ().
     * --------------Fonctionnement du programme ---------------------------------
     * Appel de la fonction afficheMessage () FLAG1 == 0 (1ère boucle de draw).
     * Affiche le message "Attente Test".
     * Test si une donnée est présente sur le port série D7 LOW.
     * TRUE Mets le drapeau message à 1. Appel de la fonction rempliSauveDataLdc ().
     * Appel suivant de afficheMessage () FLAG1 == 1; le message "Test en Cours" est affiché.
     * rempliSauveDataLdc () lit; sauve; et affiche les données. Vérifie la valeur de valeur pas si >=330 FLAG1 = 2 pour fin de test.
     * Appel suivant de afficheMessage () FLAG1 == 2; le message "Fin Test" est affiché le port série est fermé et on attend ESC pour sortir du programme.
     */
    // Déclaration
    // Utilisation de la police de caractères par défaut.
    import processing.serial.* ; // Import la bibliothèque communication série + classes associées.
    Serial myPort ; // Contient N° port utilisé ici 0 pour COM1.
    int FLAG1 = 0; // Drapeau pour affichage des messages de test.
    Table dataLdc; // Déclaration d'une variable de type table (table vide et non existante).
    String titreColonnes[] = { // Tableau d'une seule ligne, qui contient sous forme string, les titres à afficher .
      "Pas", "Etat Ldc", "Temps Réel", "Temps Précédent", "Durée Etat Précédent", } ;
    // Variables pour l'acquisition des data. 
    int ldcState;// Dans cet indice représente toutes les valeurs lues sur le port série.
    int cpteTemps = 0 ; // Temps écoulé depuis le début du programme.
    int preCpteTemps = 0 ; // Temps au dernier changement d'état de led Ldc
    int dureeLdcState = 0 ; // Durée calculé d'un état donné non utilisé dans cet indice.
    int valeurPas = 0 ; // Numéro de ligne pour compteur acquisition données, utilisé pour la création de la table.
    // Variables pour le calcul des codes. Non utilisé dans cet indice.
    // int CODE = 0 ;// Valeur code défaut.
     
    void setup () {
      size (600, 600); // Taille de la fenêtre d'affichage.
      background (255) ; // Couleur de fond de la fenêtre blanc.
      textSize (20) ;
      fill (0) ; // Couleur du texte noire.
      //frameRate (5);
      dataLdc=new Table (); // Allocation de la mémoire pour la table.
      // Création de la table et ajout des colonnes de titre.
      for (int i = 0; i <titreColonnes.length; i++) dataLdc.addColumn (titreColonnes[i]);
      afficheTitresDataLdcState ();
      afficheRectMessage ();
      //printArray (Serial.list()) ; // Affiche la liste des port série disponibles.
      myPort = new Serial (this, Serial.list () [0], 115200) ; // Port série utilisé et vitesse de transmission.
      myPort.bufferUntil ('\n');
    }
     
    void draw () {
      afficheMessage ();
      println ("  Flag  ", FLAG1);
    }
    // Lecture port série.
    void serialEvent (Serial myPort) {
      String lireLdcState = myPort.readStringUntil ('\n'); // Acquisition de la donnée en code ASCII.
      //print (lireLdcState) ; // Affiche bien 0 et 1 dans la console.
      if (lireLdcState != null) { // Vérifie si une donnée est présente sur myPort.
          lireLdcState = trim (lireLdcState); // Elimine les blancs ?
        //print (lireLdcState) ; // Affiche bien 0 et 1 dans la console.
        ldcState = (int (lireLdcState)) ;
        println (ldcState) ;
        rempliSauveDataLdc ();
      }
    } 
    void afficheTitresDataLdcState () { // Appel de la fonction pour l'affichage des titres.
      fill (0);
      smooth ();
      for (int i =0; i<titreColonnes.length; i++) text(titreColonnes[i], 20, 50*(i+1)) ; // 25*(i+1) pour séparer de 25 points chaque ligne (la police fait 20 de haut)
      strokeWeight (3); 
      stroke (#FA0808);
      line( 20, 300, 550, 300);
    }
     
    void   afficheRectMessage () {
      fill (#FAB6EA);
      noStroke ();
      rect (178, 435, 244, 30);
    }
     
    void afficheMessage () {
      if (FLAG1 == 0) {
        fill (0);
        text ("Attente Test", 250, 457 );
      } else if (FLAG1 == 1) {
        afficheRectMessage ();
        fill (0);
        text ("Test en Cours", 250, 457 );
      } else if (FLAG1 == 2) {
        afficheRectMessage ();
        fill (0);
        text ("Fin Test", 250, 457 );
        myPort.stop ();
        // Le message Fin de test reste affiché jusqu'à l'appui de la touche 1 du clavier numérique.
        if (keyPressed) {
          if (key == ESC) 
            exit () ;
        }
      }
    }
    void rempliSauveDataLdc () {
      ldcState = myPort.read ();
      print (ldcState);
      cpteTemps = millis () ;
      TableRow newRow = dataLdc.addRow () ;
      newRow.setInt (titreColonnes [0], valeurPas) ;
      newRow.setInt (titreColonnes [1], ldcState) ;
      newRow.setInt (titreColonnes [2], cpteTemps) ;
      newRow.setInt (titreColonnes [3], preCpteTemps) ;
      newRow.setInt (titreColonnes [3], (cpteTemps - preCpteTemps)) ;
      saveTable ( dataLdc, "data/newdataLdc.csv") ;
      preCpteTemps = cpteTemps ;
      valeurPas ++ ;
      if (valeurPas !=20) {
        FLAG1 = 1; // Indique que les acquisitions de données sont en cours.
      }
      if (valeurPas >= 20) { // Pour fin de test.
        FLAG1 = 2;
      }
    }
    Cela doit être simple mais je ne vois pas.

    @+

  17. #37
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 711
    Points : 5 390
    Points
    5 390
    Par défaut
    une fois que vous avez lu la donnée sur le port série, elle n'y est plus. Votre fonction serialEvent() va donc venir vider le buffer série et Affiche bien 0 et 1 dans la console quand il les trouve je suppose, mais quand vous appelez rempliSauveDataLdc(), les données ne sont plus dans le buffer série (puisque vous venez de les enlever) et donc le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      ldcState = myPort.read ();
    qui est au début de cette fonction rempliSauveDataLdc() n'a plus rien à lire, ce qui retourne -1 et c'est donc cela qui est stocké.

    ==> passez ldcState en paramètre à votre fonction rempliSauveDataLdc()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        rempliSauveDataLdc (ldcState);
    et modifiez la fonction pour en tenir compte
    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
    void rempliSauveDataLdc (int valeur) {
      print (valeur);
      cpteTemps = millis () ;
      TableRow newRow = dataLdc.addRow () ;
      newRow.setInt (titreColonnes [0], valeurPas) ;
      newRow.setInt (titreColonnes [1], valeur) ;
      newRow.setInt (titreColonnes [2], cpteTemps) ;
      newRow.setInt (titreColonnes [3], preCpteTemps) ;
      newRow.setInt (titreColonnes [3], (cpteTemps - preCpteTemps)) ;
      saveTable ( dataLdc, "data/newdataLdc.csv") ;
      preCpteTemps = cpteTemps ;
      valeurPas ++ ;
      if (valeurPas !=20) {
        FLAG1 = 1; // Indique que les acquisitions de données sont en cours.
      }
      if (valeurPas >= 20) { // Pour fin de test.
        FLAG1 = 2;
      }
    }

  18. #38
    Nouveau membre du Club
    Homme Profil pro
    loisirs
    Inscrit en
    Février 2020
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 77
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : loisirs

    Informations forums :
    Inscription : Février 2020
    Messages : 118
    Points : 25
    Points
    25
    Par défaut Utiliser Processing avec Arduino
    Merci Jay M.

    J'ai déjà supprimé la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ldcState = myPort.read ();
    de la fonction sauvegarde qui me semblait faire double emploi.
    Cela marche un peu mieux.

    Je vais analyser vos suggestions pour comprendre puis essayer.

    Juste une question: pourquoi dans la fonction rempliSauveDataLdc(), faut-il mettre une variable et pas le nom du paramètre transféré?

  19. #39
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 711
    Points : 5 390
    Points
    5 390
    Par défaut
    pourquoi dans la fonction rempliSauveDataLdc(), faut-il mettre une variable et pas le nom du paramètre transféré
    On donne un nom aux paramètres et généralement on utilise quelque chose qui n'est pas en conflit avec le nom d'une variable globale.

    ==> c'est pour bien voir que c'est un paramètre de la fonction et que c'est cela qui sera utilisé dans la fonction: sa valeur sera remplacée lors de l'appel par le paramètre donné

    si vous faites une fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    void imprimer(int toto) {
      print(toto);
    }
    vous pouvez l'appeler avec imprimer(4) ou imprimer(25) ou imprimer(x) (si x est un entier). dans l'exécution de la fonction toto vaudra respectivement 4, 25 ou la valeur de x.

    ---
    dans votre cas ldcState est une variable globale, on pourrait donc ne pas passer de paramètre du tout - mais dans ce cas à l'exécution c'est la valeur courante de cette variable qui sera utilisée

  20. #40
    Nouveau membre du Club
    Homme Profil pro
    loisirs
    Inscrit en
    Février 2020
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 77
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : loisirs

    Informations forums :
    Inscription : Février 2020
    Messages : 118
    Points : 25
    Points
    25
    Par défaut Utiliser Arduino avec Processing etc..
    Encore et toujours moi.

    Je crois que je n'ai rien compris, les modifications ne fonctionne pas.

    J'ai mis des messages de contrôle qui s'affiche dans la console, et je me rend compte que serialEvent (myPort) n'est jamais exécutée.
    On dirait que draw tourne en boucle, vous me direz c'est son rôle; mais là il abuse quand même.

    Faut-il appeler d'une manière quelconque la fonction serialEvent (myPort)

    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
     
    /* lecture_defauts_test_9_004.pde
     * Fonctionne avec sketch_test_9_F_000.ino.
     * Fermer le port série et afficher le message "Fin Test" au bout de 330 changements d'état de Ldc.
     * Le message "Fin Test" reste affiché jusqu'à l'appui d'une touche; le programme est ensuite fermé.
     * Toutes les variables de la version finale sont déclarées.
     * Les variables non utilisées dans cette version sont annulées comme des commentaires.
     * Affichage des titres en statique, dans la fonction setup puisqu'ils n'ont besoin d'être affichée qu'une seule fois.
     * Utilisation du tableau façon M.Jay pour l'affichage des titres.
     * Affichages des messages; Attente Test; Test en Cours; Fin de test.
     * Le message "Attente Test" s'affiche tant qu'il n'y a pas de donnée à lire sur le port série.
     * Le message "Test en cours" s'affiche tant qu'il y a des données à lire sur le port série.
     * Le message "Fin Test" reste affiché jusqu'à l'appui d'une touche puis exit du programme.
     * Utilisation du drapeau FLAG1 qui prends les valeurs suivantes: 0 Attente Test; 1 Test en Cours; 2 Fin de test.
     * Affichage des messages par fonction afficheMessage (). * Utilisation de if + compteur à la place de switch case.
     * Affichage des messages dans un rectangle dessiné par le fonction afficheRectMessage ().
     * --------------Fonctionnement du programme ---------------------------------
     * Appel de la fonction afficheMessage () FLAG1 == 0 (1ère boucle de draw).
     * Affiche le message "Attente Test".
     * Test si une donnée est présente sur le port série D7 LOW.
     * TRUE Mets le drapeau message à 1. Appel de la fonction rempliSauveDataLdc ().
     * Appel suivant de afficheMessage () FLAG1 == 1; le message "Test en Cours" est affiché.
     * rempliSauveDataLdc () lit; sauve; et affiche les données. Vérifie la valeur de valeur pas si >=330 FLAG1 = 2 pour fin de test.
     * Appel suivant de afficheMessage () FLAG1 == 2; le message "Fin Test" est affiché le port série est fermé et on attend ESC pour sortir du programme.
     */
    // Déclaration
    // Utilisation de la police de caractères par défaut.
    import processing.serial.* ; // Import la bibliothèque communication série + classes associées.
    Serial myPort ; // Contient N° port utilisé ici 0 pour COM1.
    int FLAG1 = 0; // Drapeau pour affichage des messages de test.
    Table dataLdc; // Déclaration d'une variable de type table (table vide et non existante).
    String titreColonnes[] = { // Tableau d'une seule ligne, qui contient sous forme string, les titres à afficher .
      "Pas", "Etat Ldc", "Temps Réel", "Temps Précédent", "Durée Etat Précédent", } ;
    // Variables pour l'acquisition des data. 
    int ldcState;// Dans cet indice représente toutes les valeurs lues sur le port série.
    int cpteTemps = 0 ; // Temps écoulé depuis le début du programme.
    int preCpteTemps = 0 ; // Temps au dernier changement d'état de led Ldc
    int dureeLdcState = 0 ; // Durée calculé d'un état donné non utilisé dans cet indice.
    int valeurPas = 0 ; // Numéro de ligne pour compteur acquisition données, utilisé pour la création de la table.
    // Variables pour le calcul des codes. Non utilisé dans cet indice.
    // int CODE = 0 ;// Valeur code défaut.
     
    void setup () {
      size (600, 600); // Taille de la fenêtre d'affichage.
      background (255) ; // Couleur de fond de la fenêtre blanc.
      textSize (20) ;
      fill (0) ; // Couleur du texte noire.
      //frameRate (5);
      dataLdc=new Table (); // Allocation de la mémoire pour la table.
      // Création de la table et ajout des colonnes de titre.
      for (int i = 0; i <titreColonnes.length; i++) dataLdc.addColumn (titreColonnes[i]);
      afficheTitresDataLdcState ();
      afficheRectMessage ();
      //printArray (Serial.list()) ; // Affiche la liste des port série disponibles.
      myPort = new Serial (this, Serial.list () [0], 115200) ; // Port série utilisé et vitesse de transmission.
      myPort.bufferUntil ('\n');
    }
     
    void draw () {
      afficheMessage ();
     println ("  Flag  ", FLAG1);
      //if (myPort.available () >0) { // Début condition 1; Vérifie si il y a une donnée à lire.
        // TRUE.
       // FLAG1 = 1;
     }
     
    void serialEvent (Serial myPort) {
       println ("Où suis-je");
      String lireLdcState = myPort.readStringUntil ('\n'); // Acquisition de la donnée en code ASCII.
      //print (lireLdcState) ; // Affiche bien 0 et 1 dans la console.
      if (lireLdcState != null) { // Vérifie si une donnée est présente sur myPort.
          lireLdcState = trim (lireLdcState); // Elimine les blancs ?
        //print (lireLdcState) ; // Affiche bien 0 et 1 dans la console.
        ldcState = (int (lireLdcState)) ;
        println (ldcState) ;
        rempliSauveDataLdc (ldcState);
      }
    } 
    void afficheTitresDataLdcState () { // Appel de la fonction pour l'affichage des titres.
      fill (0);
      smooth ();
      for (int i =0; i<titreColonnes.length; i++) text(titreColonnes[i], 20, 50*(i+1)) ; // 25*(i+1) pour séparer de 25 points chaque ligne (la police fait 20 de haut)
      strokeWeight (3); 
      stroke (#FA0808);
      line( 20, 300, 550, 300);
    }
     
    void   afficheRectMessage () {
      fill (#FAB6EA);
      noStroke ();
      rect (178, 435, 244, 30);
    }
     
    void afficheMessage () {
      if (FLAG1 == 0) {
        fill (0);
       smooth ();
        text ("Attente Test", 250, 457 );
        println ("T'es là con!");
      } else if (FLAG1 == 1) {
        afficheRectMessage ();
        fill (0);
        text ("Test en Cours", 250, 457 );
      } else if (FLAG1 == 2) {
        afficheRectMessage ();
        fill (0);
        text ("Fin Test", 250, 457 );
        myPort.stop ();
        // Le message Fin de test reste affiché jusqu'à l'appui de la touche 1 du clavier numérique.
        if (keyPressed) {
          if (key == ESC) 
            exit () ;
        }
      }
    }
    void rempliSauveDataLdc (int valeur) {
     // ldcState = myPort.read ();
     // print (ldcState);
      cpteTemps = millis () ;
      TableRow newRow = dataLdc.addRow () ;
      newRow.setInt (titreColonnes [0], valeurPas) ;
      newRow.setInt (titreColonnes [1], valeur) ;
      newRow.setInt (titreColonnes [2], cpteTemps) ;
      newRow.setInt (titreColonnes [3], preCpteTemps) ;
      newRow.setInt (titreColonnes [3], (cpteTemps - preCpteTemps)) ;
      saveTable ( dataLdc, "data/newdataLdc.csv") ;
      preCpteTemps = cpteTemps ;
      valeurPas ++ ;
      FLAG1 = 1;
      if (valeurPas ==20) {
        FLAG1 = 2; // Indique que les acquisitions de données sont en cours.
      }
     
      }
    Pour l'exemple, j'ai une autre version qui elle fonctionne, mais me donne les code ASCII 48 et 49 au lieu des caractères. Mais j'aimerai comprendre comment on utilise serialEvent.
    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    /* lecture_defauts_test_9_003.pde
     * Fonctionne avec sketch_test_9_F_000.ino.
     * Fermer le port série et afficher le message "Fin Test" au bout de 330 changements d'état de Ldc.
     * Le message "Fin Test" reste affiché jusqu'à l'appui d'une touche; le programme est ensuite fermé.
     * Toutes les variables de la version finale sont déclarées.
     * Les variables non utilisées dans cette version sont annulées comme des commentaires.
     * Affichage des titres en statique, dans la fonction setup puisqu'ils n'ont besoin d'être affichée qu'une seule fois.
     * Utilisation du tableau façon M.Jay pour l'affichage des titres.
     * Affichages des messages; Attente Test; Test en Cours; Fin de test.
     * Le message "Attente Test" s'affiche tant qu'il n'y a pas de donnée à lire sur le port série.
     * Le message "Test en cours" s'affiche tant qu'il y a des données à lire sur le port série.
     * Le message "Fin Test" reste affiché jusqu'à l'appui d'une touche puis exit du programme.
     * Utilisation du drapeau FLAG1 qui prends les valeurs suivantes: 0 Attente Test; 1 Test en Cours; 2 Fin de test.
     * Affichage des messages par fonction afficheMessage (). * Utilisation de if + compteur à la place de switch case.
     * Affichage des messages dans un rectangle dessiné par le fonction afficheRectMessage ().
     * --------------Fonctionnement du programme ---------------------------------
     * Appel de la fonction afficheMessage () FLAG1 == 0 (1ère boucle de draw).
     * Affiche le message "Attente Test".
     * Test si une donnée est présente sur le port série D7 LOW.
     * TRUE Mets le drapeau message à 1. Appel de la fonction rempliSauveDataLdc ().
     * Appel suivant de afficheMessage () FLAG1 == 1; le message "Test en Cours" est affiché.
     * rempliSauveDataLdc () lit; sauve; et affiche les données. Vérifie la valeur de valeur pas si >=330 FLAG1 = 2 pour fin de test.
     * Appel suivant de afficheMessage () FLAG1 == 2; le message "Fin Test" est affiché le port série est fermé et on attend ESC pour sortir du programme.
     */
    // Déclaration
    // Utilisation de la police de caractères par défaut.
    import processing.serial.* ; // Import la bibliothèque communication série + classes associées.
    Serial myPort ; // Contient N° port utilisé ici 0 pour COM1.
    int FLAG1 = 0; // Drapeau pour affichage des messages de test.
    Table dataLdc; // Déclaration d'une variable de type table (table vide et non existante).
    String titreColonnes[] = { // Tableau d'une seule ligne, qui contient sous forme string, les titres à afficher .
      "Pas", "Etat Ldc", "Temps Réel", "Temps Précédent", "Durée Etat Précédent", } ;
    // Variables pour l'acquisition des data. 
    int ldcState;// Dans cet indice représente toutes les valeurs lues sur le port série.
    int cpteTemps = 0 ; // Temps écoulé depuis le début du programme.
    int preCpteTemps = 0 ; // Temps au dernier changement d'état de led Ldc
    int dureeLdcState = 0 ; // Durée calculé d'un état donné non utilisé dans cet indice.
    int valeurPas = 0 ; // Numéro de ligne pour compteur acquisition données, utilisé pour la création de la table.
    // Variables pour le calcul des codes. Non utilisé dans cet indice.
    // int CODE = 0 ;// Valeur code défaut.
     
    void setup () {
      size (600, 600); // Taille de la fenêtre d'affichage.
      background (255) ; // Couleur de fond de la fenêtre blanc.
      textSize (20) ;
      fill (0) ; // Couleur du texte noire.
      //frameRate (5);
      dataLdc=new Table (); // Allocation de la mémoire pour la table.
      // Création de la table et ajout des colonnes de titre.
      for (int i = 0; i <titreColonnes.length; i++) dataLdc.addColumn (titreColonnes[i]);
      afficheTitresDataLdcState ();
      afficheRectMessage ();
      printArray (Serial.list()) ; // Affiche la liste des port série disponibles.
      myPort = new Serial (this, Serial.list () [0], 115200) ; // Port série utilisé et vitesse de transmission.
    }
     
    void draw () {
      afficheMessage ();
      // Lecture port série.
      if (myPort.available () >0) { // Début condition 1; Vérifie si il y a une donnée à lire.
        // TRUE.
        FLAG1 = 1;
       // myPort.clear ();
        rempliSauveDataLdc ();
      }
    }
     
    void afficheTitresDataLdcState () { // Appel de la fonction pour l'affichage des titres.
      fill (0);
      smooth ();
      for (int i =0; i<titreColonnes.length; i++) text(titreColonnes[i], 20, 50*(i+1)) ; // 25*(i+1) pour séparer de 25 points chaque ligne (la police fait 20 de haut)
      strokeWeight (3); 
      stroke (#FA0808);
      line( 20, 300, 550, 300);
    }
     
    void   afficheRectMessage () {
      fill (#FAB6EA);
      noStroke ();
      rect (178, 435, 244, 30);
    }
    void rempliSauveDataLdc () {
      ldcState = myPort.read ();
      print (ldcState);
      cpteTemps = millis () ;
      TableRow newRow = dataLdc.addRow () ;
      newRow.setInt (titreColonnes [0], valeurPas) ;
      newRow.setInt (titreColonnes [1], ldcState) ;
      newRow.setInt (titreColonnes [2], cpteTemps) ;
      newRow.setInt (titreColonnes [3], preCpteTemps) ;
      newRow.setInt (titreColonnes [3], (cpteTemps - preCpteTemps)) ;
      saveTable ( dataLdc, "data/newdataLdc.csv") ;
      preCpteTemps = cpteTemps ;
      valeurPas ++ ;
      FLAG1 = 1; // Indique que les acquisitions de données sont en cours.
      if (valeurPas >= 329) { // Pour fin de test.
        FLAG1 = 2;
      }
    }
    void afficheMessage () {
      if (FLAG1 == 0) {
        fill (0);
        text ("Attente Test", 250, 457 );
      } else if (FLAG1 == 1) {
        afficheRectMessage ();
        fill (0);
        text ("Test en Cours", 250, 457 );
      } else if (FLAG1 == 2) {
        afficheRectMessage ();
        fill (0);
        text ("Fin Test", 250, 457 );
        myPort.stop ();
        // Le message Fin de test reste affiché jusqu'à l'appui de la touche 1 du clavier numérique.
       if (keyPressed) {
        if (key == ESC) 
             exit () ;
        }
      }
    }

Discussions similaires

  1. [Embarqué] Communication avec le port série vers Arduino
    Par YannGTT dans le forum Plateformes
    Réponses: 0
    Dernier message: 05/04/2020, 04h45
  2. communication série via rs232 avec vb.net
    Par lemabs dans le forum Windows Forms
    Réponses: 1
    Dernier message: 16/11/2009, 16h35
  3. Problème de communication avec un port série
    Par hélène2 dans le forum C#
    Réponses: 8
    Dernier message: 22/04/2009, 09h26
  4. Code VBA pour communication avec un port série dans EXCEL
    Par Fbroom dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 30/05/2008, 10h14
  5. Problèmes avec la communication série
    Par rzayani dans le forum Windows
    Réponses: 3
    Dernier message: 18/06/2007, 11h57

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