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 :

Cherche expert arduino et écran 4D system pour projet mémoire d'ingénieur


Sujet :

Arduino

  1. #101
    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
    Ce n’est sans doute pas le soucis mais il y a incohérence entre ces 2 lignes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
            genie.WriteStr(affCr[numPoussoir + 16], "OK");
          } else {
            genie.WriteStr(affCr[i + 16], "NOK");
    Le premier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     evenement = lireEvenement(&numPoussoir);
    Juste avant le do-while ne sert à rien

    Je ne connais pas cet écran, ce qui m’étonne un peu c’est que nulle part vous changez numPoussoir
    Comment indiquez vous que c’est un bouton particulier que vous voulez écouter ??

  2. #102
    Futur Membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2017
    Messages
    77
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Meuse (Lorraine)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Février 2017
    Messages : 77
    Points : 8
    Points
    8
    Par défaut
    Citation Envoyé par Jay M Voir le message
    Ce n’est sans doute pas le soucis mais il y a incohérence entre ces 2 lignes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
            genie.WriteStr(affCr[numPoussoir + 16], "OK");
          } else {
            genie.WriteStr(affCr[i + 16], "NOK");
    Normal en fait le numPoussoir n'est pas forcément égal à i donc au final je ne connais pas la valeur de numPoussoir avant d'avoir appuyé dessus et donc la boucle for est indépendante du résultat de numPoussoir, je sais juste que je dois tester 8 boutons... Ce qui fait que dans le cas où j'ai un bouton HS je ne sais pas lequel c'est et donc je fais écrire au programme que si je connais le numéro du bouton sur lequel j'ai appuyé, c'est qu'il et bon et que a fortiori ceux que je n'ai pas détectés sont mauvais... d'où pourquoi c'est le i qui signifie le fonctionnement mauvais (NOK).
    Citation Envoyé par Jay M Voir le message
    Le premier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     evenement = lireEvenement(&numPoussoir);
    Juste avant le do-while ne sert à rien
    C'est vrai et je pense l'avoir supprimé depuis le post...
    Citation Envoyé par Jay M Voir le message
    Je ne connais pas cet écran, ce qui m’étonne un peu c’est que nulle part vous changez numPoussoir
    Comment indiquez vous que c’est un bouton particulier que vous voulez écouter ??
    En fait le numPoussoir écoute l'appui sur un fil. En fonction de la tension mesurée je connais le bouton sur lequel j'ai appuyé. Ca vient du fait que j'ai du réduire le nombre de mes contacts pour pouvoir mettre tous mes fils dans une prise imposée. Et donc je passe de 8 fils à 1 et j'utilise un pont diviseur de tension pour mes 8 boutons. La logique veut qu'on appui sur les 8 boutons dans l'ordre mais le montage et le code permettent d'appuyer sur n'importe lequel et donc de dire lesquels sont bons. ceux qui n'ont pas étés détectés sont marqués NOK par défaut. Si je met une condition if (i == numPoussoir) je me fais avoir dans le cas où ils sont différents... et comme je ne connais le numPoussoir que si j'appuie dessus et que si j'ai un poussoir HS je ne peux le savoir que par élimination en fait... Après je suis ouvert aux idées...

  3. #103
    Futur Membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2017
    Messages
    77
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Meuse (Lorraine)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Février 2017
    Messages : 77
    Points : 8
    Points
    8
    Par défaut
    J'ai modifié le code comme suit:
    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
     
    //Autotest commandes boite de raccordement EV:
      for (int i = 0; i < nombreCommandes; i++) {
        genie.WriteStr(9, "appuyer sur Cde bte raccord EV");
        tempo = millis();
        do {
          evenement = lireEvenement(&numPoussoir);
          delay(20);
          if (evenement == EVENEMENT_PRESSE) { //si on appuie sur une commande du boitier de raccordement EV
            resultatAT++;
            genie.WriteStr(affCr[numPoussoir + 16], "OK");
          } else {
            genie.WriteStr(affCr[i + 16], "NOK");
          }
        } while ((millis() - tempo <= 20000) && (evenement != EVENEMENT_PRESSE));
      }
     
     
      //autotest des commandes déportées:
     
      for ( int i = 0; i < 7 ; i + 2 ) {
        genie.WriteStr(9, "appuyer sur Cde deportee EV");
        etatCev[i] = digitalRead(pinCEV[i]);
        etatCev[i + 1] = digitalRead(pinCEV[i + 1]);
        tempo = millis();
        do {
          etatCev[i] = digitalRead(pinCEV[i]);
          delay(20);
          if (etatCev[i] == 0 ) {
            resultatAT++;
            genie.WriteStr(affCr[i + 24], "OK");
          }
        } while ((millis() - tempo <= 20000) && (etatCev[i] == 1));
        tempo = millis();
        do {
          etatCev[i + 1] = digitalRead(pinCEV[i + 1]);
          delay(20);
          if (etatCev[i + 1] == 0 ) {
            resultatAT++;
            genie.WriteStr(affCr[i + 25], "OK");
          }
        } while ((millis() - tempo <= 20000) && (etatCev[i + 1] == 1));
        if ((etatCev[i] == 1) && (etatCev[i + 1] == 1) {
          resultatAT + 2;
          genie.WriteStr(affCr[i + 24], "NC");
          genie.WriteStr(affCr[i + 25], "NC");
        } else {
          genie.WriteStr(affCr[i + 24], "NOK");
          genie.WriteStr(affCr[i + 25], "NOK");
        }
      }
    j'ai la détection des boutons et si la paire de commandes déportées fonctionne c'est que la télécommande est branchée, si les 2 sont HS c'est qu'il y a fort a parier que la télécommande n'est pas branchée. pour être sur de bien être compris, les commandes de la boite de raccordement sont sur un seul fil, et les commandes déportées sont sur 4 télécommandes de 2 boutons et ces télécommandes sont optionnelles donc ne sont pas obligatoirement branchées mais je souhaiterais pouvoir faire la différence entre une télécommande débranchée et une télécommande dont l'un des boutons (ou les 2) sont HS.

  4. #104
    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 - compris. c'est la fonction lireEvenement() qui met à jour le pointeur passé en paramètre (&numPoussoir)

    est-ce que l'appel à lireEvenement() est bloquant ?

    s'il n'est pas bloquant (ce que j'imagine sinon le timing ne fonctionnerait pas) vous envoyez 100 fois par seconde le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    genie.WriteStr(affCr[i + 16], "NOK");
    tant qu'on n'a pas appuyé. De plus si on ne clique pas dans l'ordre, vous risquez d'effacer un OK précédent.

    je mettrais un tableau de 8 booléens qui mémorise qu'un des boutons a été pressé et je bouclerais pendant x secondes en lecture ou jusqu'à ce que le tableau soit plein de "true". comme cela en sortie de boucle vous savez quel bouton n'a pas été pressé. (en pratique je ne prendrais pas un tableau de 8 booléen mais juste un byte et j'utiliserai les 8 bits du byte comme mémoire. Je mettrais le bit i à 1 quand j'appuie sur le bouton i. ça simplifie le test pour savoir si tous les boutons sont appuyés, on compare cet octet avec 255 (0b11111111 tous les bits à 1)


    les commandes déportées sont sur 4 télécommandes de 2 boutons et ces télécommandes sont optionnelles donc ne sont pas obligatoirement branchées mais je souhaiterais pouvoir faire la différence entre une télécommande débranchée et une télécommande dont l'un des boutons (ou les 2) sont HS
    sans bidouillage hardware supplémentaire ce n'est pas simple à détecter. Si rien n'est branché et que vos pins ne sont pas en INPUT_PULLUP alors la broche va flotter. vous pourriez essayer de détecter ce flottement (changement rapide et aléatoire de valeurs). Si vous avez un pull-up ou pull-down alors vous ne pourrez pas détecter la différence entre pas d'appui et pas de présence du boîtier. il faudrait des connecteurs avec une broche de plus ou un petit interrupteur qui s'enclenche quand vous enfichez la prise.

  5. #105
    Futur Membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2017
    Messages
    77
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Meuse (Lorraine)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Février 2017
    Messages : 77
    Points : 8
    Points
    8
    Par défaut
    Pour la détection des commandes branchées je m'aperçois que ca servait pour l'ancienne version du logiciel. En effet je mettais juste un résultat global du test et si l'opérateur avait besoin de vérifier l'élément en panne, il devait relancer un test et passer sur la page rapport d'autotest qui détails tous les tests... Or depuis ce résultat de test ne présente plus d'intérêt car l'opérateur souhaite qu'au démarrage de l'autotest, l'écran affiche le compte rendu de test avec tous les points testés... du coup le résultat global ne présente plus d'intérêt...
    Et donc savoir si les commandes sont branchées ou pas non plus. le test mettra juste si c'est bon ou pas... à l'opérateur de savoir si la commande est branchée...

    Pour la tempo vous mettriez un tableau qui va prendre la valeur des 8 boutons et qui va les affichés après? ca se traduirait comment pour le code? et avec le byte?

  6. #106
    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
    Citation Envoyé par harkilius Voir le message
    Pour la tempo vous mettriez un tableau qui va prendre la valeur des 8 boutons et qui va les affichés après? ca se traduirait comment pour le code? et avec le byte?
    un truc comme ça
    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
    bool testBoutons()
    {
      uint8_t numPoussoir;
      uint32_t startChrono = millis();
      uint8_t bountonsActifs = 0; // 0000 0000 chaque bit va représenter l'état d'un bouton (numérotés de 0 à 7)
      genie.WriteStr(9, "appuyez sur Cde bte raccord EV");
    
      while ((bountonsActifs != 0b11111111) && (millis() - startChrono <= 20000)) { // timeout au bout de 20s
        evenement = lireEvenement(&numPoussoir);
        if (evenement == EVENEMENT_PRESSE) { //si on appuie sur une commande du boitier de raccordement EV
          bitSet(bountonsActifs, numPoussoir); // EN SUPPOSANT QUE numPoussoir EST ENTRE 0 et 7
          genie.WriteStr(affCr[numPoussoir + 16], "OK");
        }
      }
      return (bountonsActifs == 0b11111111); // retourne vrai si tous les boutons on été appuyés
    }
    je ne connais pas la fonction lireEvenement, j'ai supposé qu'elle retourne dans numPoussoir un nombre entre 0 et 7. Si ce n'est pas le cas il faut ajuster le bitSet() (cf sa documentation)

    en C ou C++ la notation 0b11111111 représente un nombre en binaire, ici un octet avec tous ses bits à 1. j'aurais pu aussi comparer avec 255 ou 0xFF c'est la même valeur.

    Si vous avez plus de boutons, vous pouvez prendre un uint16_t (16 bits) ou un uint32_t (32 bits) et ça fonctionne pareil. il faut juste ajuster le masque de test - par exemple si vous aviez 12 boutons tester avec 0b0000111111111111 sur un entier 16 bits.

  7. #107
    Futur Membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2017
    Messages
    77
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Meuse (Lorraine)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Février 2017
    Messages : 77
    Points : 8
    Points
    8
    Par défaut
    Citation Envoyé par Jay M Voir le message
    OK - compris. c'est la fonction lireEvenement() qui met à jour le pointeur passé en paramètre (&numPoussoir)

    est-ce que l'appel à lireEvenement() est bloquant ?

    s'il n'est pas bloquant (ce que j'imagine sinon le timing ne fonctionnerait pas) vous envoyez 100 fois par seconde le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    genie.WriteStr(affCr[i + 16], "NOK");
    tant qu'on n'a pas appuyé. De plus si on ne clique pas dans l'ordre, vous risquez d'effacer un OK précédent.
    En fait j'ai remodifier mon code suite à la suppression du résultat global:
    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
     
    //Autotest commandes boite de raccordement EV:
      for (int i = 0; i < nombreCommandes; i++) {
        genie.WriteStr(9, "appuyer sur Cde bte raccord EV");
        tempo = millis();
        do {
          evenement = lireEvenement(&numPoussoir);
          delay(20);
          if (evenement == EVENEMENT_PRESSE) { //si on appuie sur une commande du boitier de raccordement EV
            genie.WriteStr(affCr[numPoussoir + 16], "OK");
          } else {
            genie.WriteStr(affCr[i + 16], "NOK");
          }
        } while ((millis() - tempo <= 50000) && (evenement != EVENEMENT_PRESSE));
      }
     
     
      //autotest des commandes déportées:
     
      for ( int i = 0; i < 8 ; i++ ) {
        genie.WriteStr(9, "appuyer sur Cde deportee EV");
        tempo = millis();
        do {
          etatCev[i] = digitalRead(pinCEV[i]);
          delay(20);
          if (etatCev[i] == 0 ) {
            genie.WriteStr(affCr[i + 24], "OK");
          }else{
            genie.WriteStr(affCr[i + 24], "NOK");
          }
        } while ((millis() - tempo <= 50000) && (etatCev[i] == 1));
       }
    et je n'affiche NOK que si je n'ai rien capté, sauf que la tempo ne fonctionne pas, je vois les NOK s'affiché toutes les secondes quasiment et je n'ai même pas le temps d'appuyer sur les boutons...
    Citation Envoyé par Jay M Voir le message
    je mettrais un tableau de 8 booléens qui mémorise qu'un des boutons a été pressé et je bouclerais pendant x secondes en lecture ou jusqu'à ce que le tableau soit plein de "true". comme cela en sortie de boucle vous savez quel bouton n'a pas été pressé. (en pratique je ne prendrais pas un tableau de 8 booléen mais juste un byte et j'utiliserai les 8 bits du byte comme mémoire. Je mettrais le bit i à 1 quand j'appuie sur le bouton i. ça simplifie le test pour savoir si tous les boutons sont appuyés, on compare cet octet avec 255 (0b11111111 tous les bits à 1)
    Ce que je vois c'est qu'on devrait faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    do{
    for(i=0;i<8;i++){
    evenement = lireEvenement(&numPoussoir);
          delay(20);
          if (evenement == EVENEMENT_PRESSE) { //si on appuie sur une commande du boitier de raccordement EV
            tableauPoussoir[i]=numPoussoir;
          } else {
            tableauPoussoir[i] = 0;
          }
    } while ((millis() - tempo <= 10000) && (tableau poussoir != 255));
    Je suis pas sur du code complet mais ca doit ressembler a ça?

  8. #108
    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
    j'avais mis une réponse ci dessous - vous aviez vu ?

  9. #109
    Futur Membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2017
    Messages
    77
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Meuse (Lorraine)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Février 2017
    Messages : 77
    Points : 8
    Points
    8
    Par défaut
    Citation Envoyé par Jay M Voir le message
    un truc comme ça
    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
    bool testBoutons()
    {
      uint8_t numPoussoir;
      uint32_t startChrono = millis();
      uint8_t bountonsActifs = 0; // 0000 0000 chaque bit va représenter l'état d'un bouton (numérotés de 0 à 7)
      genie.WriteStr(9, "appuyez sur Cde bte raccord EV");
    
      while ((bountonsActifs != 0b11111111) && (millis() - startChrono <= 20000)) { // timeout au bout de 20s
        evenement = lireEvenement(&numPoussoir);
        if (evenement == EVENEMENT_PRESSE) { //si on appuie sur une commande du boitier de raccordement EV
          bitSet(bountonsActifs, numPoussoir); // EN SUPPOSANT QUE numPoussoir EST ENTRE 0 et 7
          genie.WriteStr(affCr[numPoussoir + 16], "OK");
        }
      }
      return (bountonsActifs == 0b11111111); // retourne vrai si tous les boutons on été appuyés
    }
    C'est une fonction qui va me renvoyer vrai si tous les boutons sont bon mais ca va me renvoyer faux s'il y a des boutons HS, est ce que ca va me renvoyer les mauvais?

    Citation Envoyé par Jay M Voir le message
    je ne connais pas la fonction lireEvenement, j'ai supposé qu'elle retourne dans numPoussoir un nombre entre 0 et 7. Si ce n'est pas le cas il faut ajuster le bitSet() (cf sa documentation)
    voici le code de lireEvenement et LirePoussoir:
    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
     
    int lirePoussoirs() {
      int numPoussoir = ((analogRead(pinPoussoirs) + 64) / 128);
      int numPoussoirMem;
      numPoussoirMem = numPoussoir;
      int nouvelEtatPoussoir;
      nouvelEtatPoussoir = etatPoussoir;
      switch (etatAutomate) {
        case NON_PRESSE:
          if (numPoussoir < 8)
            etatAutomate = ENFONCE;
          break;
        case ENFONCE:
          if (numPoussoir < 8) {
            etatAutomate = PRESSE;
            nouvelEtatPoussoir = numPoussoir;
          } else {
            etatAutomate = NON_PRESSE;
          }
          break;
        case PRESSE:
          if (numPoussoir == 8) {
            etatAutomate = NON_PRESSE;
            nouvelEtatPoussoir = -1;
          }
          break;
      }
      return nouvelEtatPoussoir;
    }
     
    byte lireEvenement(int *numPoussoir) {
      byte evenement;
      int nouvelEtatPoussoir = lirePoussoirs();
      if (nouvelEtatPoussoir == etatPoussoir) {
        evenement = AUCUN_EVENEMENT;
      } else if (nouvelEtatPoussoir >= 0 && etatPoussoir == -1) {
        evenement = EVENEMENT_PRESSE;
      } else if (nouvelEtatPoussoir == -1 && etatPoussoir >= 0) {
        evenement = EVENEMENT_RELACHE;
      }
      etatPoussoir = nouvelEtatPoussoir;
      *numPoussoir = etatPoussoir;
     
      return evenement;
    }
    Ca pour but de mesurer la tension du pinPoussoir et d'en déduire le numéro du poussoir en évitant les transitoires.
    je n'ai que 8 boutons donc ca retourne effectivement une valeur entre 0 et 7.

    Votre code ressemble assez au mien au final je ne comprend donc pas pourquoi la valeur de ma tempo ne fonctionne pas?

    Si j'utilise ce code:
    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
    loop{
      uint32_t startChrono = millis();
      uint8_t bountonsActifs = 0; // 0000 0000 chaque bit va représenter l'état d'un bouton (numérotés de 0 à 7)
      uint8_t tbxPoussoir[8] = 0;
      genie.WriteStr(9, "appuyez sur Cde bte raccord EV");
    
      while ((bountonsActifs != 0b11111111) && (millis() - startChrono <= 20000)) { // timeout au bout de 20s
        evenement = lireEvenement(&numPoussoir);
        if (evenement == EVENEMENT_PRESSE) { //si on appuie sur une commande du boitier de raccordement EV
          bitSet(bountonsActifs, numPoussoir); // EN SUPPOSANT QUE numPoussoir EST ENTRE 0 et 7
          tbxPoussoir[numPoussoir] = 1;
         }
       for(int i=0; i<8;i++){
         if(tbxPoussoir[i] == 1){     
          genie.WriteStr(affCr[i + 16], "OK");
        }else{
          genie.WriteStr(affCr[i + 16], "NOK");
      }
    }
    dans ce cas j'ai un compte rendu correct mais je ne sais pas au fur et a mesure si les boutons sont bons... peut être que je n'ai pas appuyé sur le bon ou pas a temps...

  10. #110
    Futur Membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2017
    Messages
    77
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Meuse (Lorraine)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Février 2017
    Messages : 77
    Points : 8
    Points
    8
    Par défaut
    Citation Envoyé par Jay M Voir le message
    j'avais mis une réponse ci dessous - vous aviez vu ?
    au moment de ma réponse la votre n'était pas encore visible

  11. #111
    Futur Membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2017
    Messages
    77
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Meuse (Lorraine)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Février 2017
    Messages : 77
    Points : 8
    Points
    8
    Par défaut
    Ah! je viens peut-être de comprendre, vous utilisez un uint32_t tandis que moi j'utilise un int. je ne maitrise pas mais je pense que j'ai peut-être un problème de format de temps, d'où mon problème de tempo non?

  12. #112
    Futur Membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2017
    Messages
    77
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Meuse (Lorraine)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Février 2017
    Messages : 77
    Points : 8
    Points
    8
    Par défaut
    En effet cela semble venir de la car avec le code:
    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
     
    //Autotest commandes boite de raccordement EV:
      for (int i = 0; i < nombreCommandes; i++) {
        genie.WriteStr(9, "appuyer sur Cde bte raccord EV");
        tempo = millis();
        do{
          evenement = lireEvenement(&numPoussoir);
          delay(20);
          if (evenement == EVENEMENT_PRESSE) { //si on appuie sur une commande du boitier de raccordement EV
            genie.WriteStr(affCr[numPoussoir + 16], "OK");
          } else {
            genie.WriteStr(affCr[i + 16], "NOK");
          }
        }while ((millis() - tempo <= 10000) && (evenement != EVENEMENT_PRESSE)); 
      }
     
      //autotest des commandes déportées:
     
      for ( int i = 0; i < nombreCommandes ; i++ ) {
        genie.WriteStr(9, "appuyer sur Cde deportee EV");
        tempo = millis();
        do{
          etatCev[i] = digitalRead(pinCEV[i]);
          if (etatCev[i] == 0 ) {
            genie.WriteStr(affCr[i + 24], "OK");
          }else{
            genie.WriteStr(affCr[i + 24], "NOK");
          }
        }while ((millis() - tempo <= 10000) && (etatCev[i] == 1)); 
       }
    et en aillant mis dans les déclaration de variable l'autotest se déroule correctement.
    Le programme m'affiche par défaut NOK et dés que j'appui sur le bouton il m'affiche OK, ou alors il reste sur NOK si la tempo est dépassée.
    J'ai baissé la tempo a 10 s car 20 faisait trop long.
    Merci encore pour votre aide !

  13. #113
    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
    Citation Envoyé par harkilius Voir le message
    Ah! je viens peut-être de comprendre, vous utilisez un uint32_t tandis que moi j'utilise un int. je ne maitrise pas mais je pense que j'ai peut-être un problème de format de temps, d'où mon problème de tempo non?

    pour tout ce qui concerne le temps il faut utiliser des unsigned long - c'est à dire un entier sur 32 bits non signé (qu'on décrit donc plus formellement en uint32_t pour être sûr quelle que soit la plateforme). Un int sur une MEGA ou UNO sera sur 16 bits, signé, donc ne peut pas représenter plus que 32767 --> après 33 secondes la lecture de millis passera en négatif !


    C'est une fonction qui va me renvoyer vrai si tous les boutons sont bons mais ca va me renvoyer faux s'il y a des boutons HS, est ce que ca va me renvoyer les mauvais?
    Si vous voulez récupérer ceux qui n'ont pas été appuyés, il suffit de retourner en paramètre le masque des différents bits. Ceux qui sont à 1 sont OK, les autres n'ont pas répondu à temps

    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
    bool testBoutons(uint8_t & masque)
    {
      uint8_t numPoussoir;
      uint32_t startChrono = millis();
      masque = 0; // 0000 0000 chaque bit va représenter l'état d'un bouton (numérotés de 0 à 7)
      genie.WriteStr(9, "appuyez sur Cde bte raccord EV");
     
      while ((masque != 0b11111111) && (millis() - startChrono <= 20000)) { // timeout au bout de 20s
        evenement = lireEvenement(&numPoussoir);
        if (evenement == EVENEMENT_PRESSE) { //si on appuie sur une commande du boitier de raccordement EV
          bitSet(masque, numPoussoir); // EN SUPPOSANT QUE numPoussoir EST ENTRE 0 et 7
          genie.WriteStr(affCr[numPoussoir + 16], "OK");
        }
      }
      return (masque == 0b11111111); // retourne vrai si tous les boutons on été appuyés
    }
    et vous l'appelez comme cela

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    uint8_t bountonsActifs;
    if (! testBoutons(bountonsActifs)) {
      // certains boutons n'ont pas été appuyés, ce sont ceux dont le bit est à 0 dans  bountonsActifs
      // utiliser bitRead() pour parcourir l'octet (https://www.arduino.cc/reference/en/language/functions/bits-and-bytes/bitread/)
      ....
    }

    Je ne comprends toujours pas pourquoi vous faites cela
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
         if (evenement == EVENEMENT_PRESSE) { //si on appuie sur une commande du boitier de raccordement EV
            genie.WriteStr(affCr[numPoussoir + 16], "OK");
          } else {
            genie.WriteStr(affCr[i + 16], "NOK");
          }
    si on n'a pas eu d'évènement vous balancez un affichage... il y a certes un delay() mais ça va quand même balancer 50 fois par seconde le même message tant que vous n'appuyez pas, et éventuellement dans le mauvais champs si on n'appuie pas les boutons dans l'ordre...

  14. #114
    Futur Membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2017
    Messages
    77
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Meuse (Lorraine)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Février 2017
    Messages : 77
    Points : 8
    Points
    8
    Par défaut
    Citation Envoyé par Jay M Voir le message
    Je ne comprends toujours pas pourquoi vous faites cela
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
         if (evenement == EVENEMENT_PRESSE) { //si on appuie sur une commande du boitier de raccordement EV
            genie.WriteStr(affCr[numPoussoir + 16], "OK");
          } else {
            genie.WriteStr(affCr[i + 16], "NOK");
          }
    si on n'a pas eu d'évènement vous balancez un affichage... il y a certes un delay() mais ça va quand même balancer 50 fois par seconde le même message tant que vous n'appuyez pas, et éventuellement dans le mauvais champs si on n'appuie pas les boutons dans l'ordre...
    Justement si j'ai eu un évenement (numPoussoir) j'affiche lequel des boutons a été appuyé en affichant un OK, en revanche si je n'ai rien eu, je ne peux pas dire quel bouton n'a pas fonctionné étant donné que le bouton ne fonctionne pas il ne peut pas dire qu'il n'a pas fonctionné. d'où afficher à l'endroit où la boucle est un NOK (i). Je m'aperçois en écrivant que ce plan nécessite d'appuyer sur les boutons dans l'ordre... sinon on peu effacer un résultat bon, si par exemple dans l'itération numéro une j'appui sur le bouton 2, il m'affichera un ok en position 2 mais si à la prochaine itération le bouton ne fonctionne pas il va m'afficher un NOK là où j'avais un OK juste avant.

    La faille de votre plan à vous est que je ne sais pas lesquels des boutons ont fonctionnés tant que je n'ai pas appuyé sur tous les boutons... Le soucis est de réussir à avoir numPoussoir égale à i... sauf que je ne peux pas le garantir... a part en demandant à l'opérateur de faire le test en appuyant sur les boutons dans l'ordre. si je met une condition if numPoussoir == i j'affiche ok, dans le cas ou ils sont différents je n'afficherais pas OK bien que mon bouton fonctionne... De plus la tempo que vous utilisez sert pour tous les boutons... Donc j'ai 20s pour appuyé sur tous les boutons et je ne sais qu'a la fin lesquels sont bon ou pas bon si je saisi bien... de mon côté je le sais tout de suite ca me permet de tenter d'insister un peu plus sur le bouton pour être sur avant qu'il passe au prochain. Il faudrait pouvoir assembler nos 2 approches...

  15. #115
    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
    La faille de votre plan à vous est que je ne sais pas lesquels des boutons ont fonctionnés tant que je n'ai pas appuyé sur tous les boutons
    Je ne vous suis pas. Dans mon code il y a un feedback quand vous appuyez le bouton et que c'est reçu.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        if (evenement == EVENEMENT_PRESSE) { //si on appuie sur une commande du boitier de raccordement EV
          bitSet(masque, numPoussoir); 
          genie.WriteStr(affCr[numPoussoir + 16], "OK"); // <<==== ICI JE METS A JOUR L'AFFICHAGE DU BOUTON APPUYE
        }
    De plus la tempo que vous utilisez sert pour tous les boutons
    Oui, il me semblait que c'était suffisant, vous pouvez toujours augmenter ce temps. Sinon ce n'est pas très compliqué de modifier startChrono (le réinitialiser avec millis()) quand un bouton a été appuyé pour vous redonner x secondes en plus.


    Sinon Ce que je dis c'est que ça ne sert à rien de constamment afficher "NOK" à l'endroit "affCr[i + 16]" car d'une part ce n'est pas forcément le bouton en question et d'autre part vous le faites en permanence alors qu'une seule fois suffirait, juste après le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        genie.WriteStr(9, "appuyer sur Cde bte raccord EV");
    .

    Mais comme mentionné précédemment (et comme vous l'avez remarqué aussi) ce message risque d'effacer un message "OK" si l'utilisateur n'appuie pas dans le bon ordre.


    Si vous voulez plus d'interactivité, il faut guider l'utilisateur et vraiment lui demander d'appuyer sur un bouton particulier et ignorer les autres appuis tant que celui là n'est pas effectué.

    A quoi ressemble l'écran ? que fait la fonction "affCr()" concrètement ?

  16. #116
    Futur Membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2017
    Messages
    77
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Meuse (Lorraine)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Février 2017
    Messages : 77
    Points : 8
    Points
    8
    Par défaut
    Désolé du délai de réponse, je ne vous snobais pas j'ai mon PC qui à eu ma bonne idée de me planté ce week-end… du coup j'ai du attendre l'achat d'un autre pour vous répondre.
    Je guiderais l'opérateur pour le test en lui demandant d'appuyer dans l'ordre sur les boutons ca devrait éviter les soucis…
    affCr() n'est pas une fonction mais un tableaux de référence de string en fait…
    Concrètement l'écran est une série de label avec ce qui est testé et un "string" qui affiche le résultat.
    J'appel la modification du string par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    genie.WriteStr("ref du string", "valeur a afficher");
    de la même manière je peux changer la valeur de différent objets par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    genie.WriteObject(GENIE.OBJ."type objet", "index objet", "valeur a afficher");
    Le type d'objet peut être THERMOMETER, COOL_GAGE, 4DBUTTON, WINBUTTON...

  17. #117
    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
    Citation Envoyé par harkilius Voir le message
    J'appel la modification du string par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    genie.WriteStr("ref du string", "valeur a afficher");
    OK. et si j'ai bien compris vous avez une zone de texte '9' qui permet de mettre un message à l'utilisateur

    donc vous pourriez avoir une boucle qui dit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      genie.WriteStr(9, "appuyer sur le bouton 1");
    puis attendre l'appui ou un timeout, puis passer à "
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      genie.WriteStr(9, "appuyer sur le bouton 2");
    etc...

    Au moins l'utilisateur serait guidé

  18. #118
    Futur Membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2017
    Messages
    77
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Meuse (Lorraine)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Février 2017
    Messages : 77
    Points : 8
    Points
    8
    Par défaut
    Oui tout à fait mais ça va augmenter la taille du programme et je serais obliger d’enlever la boucle

  19. #119
    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
    sans doute un peu mais ce ne sera pas gigantesque

Discussions similaires

  1. Cherche un document management system pour s'inspirer
    Par randriano dans le forum Autres Solutions d'entreprise
    Réponses: 0
    Dernier message: 03/12/2014, 10h08
  2. Réponses: 0
    Dernier message: 05/11/2014, 21h11
  3. Trouver un poste pour un mémoire d'ingénieur CNAM
    Par AntoineGael dans le forum Emploi
    Réponses: 2
    Dernier message: 13/01/2014, 14h22
  4. disquette systéme pour windows xp
    Par gilleski2010 dans le forum Windows XP
    Réponses: 1
    Dernier message: 14/10/2005, 22h13

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