Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Arduino] Tableau de fonction

problème pour coder un lecteur de signaux IR

Sujet résolu
    25 octobre 2013 à 23:44:05

    Bonjour Bonjour,

    J'essaye de commander une carte de relais avec arduino par le biais d'une télécommande et d'un récepteur IR.

    Tout fonctionne bien quand j'utilise 4 boutons, mais j'aurais voulu programmer plus proprement et utiliser tous les boutons de ma télécommande du coup j'ai pensé à la solution suivante :

    1 tableau type "long" avec les code IR (j'utilise la bibliothèque ArduinoIR)

    1 tableau de type "char" dans lequel j'ai mis le texte à afficher pour chaque bouton

    1 tableau de type "void" dans lequel j'aurais chaque fonction vers laquelle envoyer en fonction du bouton pressé

    Dans tous ces tableaux tout est organisé dans le même ordre, comme ca quand je reçois un signal, je parcours mon premier tableau pour voir à quoi il correspond, je note l'index, et j'utilise cet index dans les tableaux 2 et 3 pour afficher le texte et lancer la fonction.

    Malheureusement un tableau de void ca ne marche pas, pour des raisons qui me sont obscure malgré les infos que j'ai trouvé :/

    Une idée sur comment je pourrais faire autrement?

    Bonne soirée!!

    Un peu de code quand même pour que ce que je dis soit plus clair

    long code_tc1 []= {16753245,16736925,16769565,16720605,16712445,16761405,16769055,16754775,16748655,16738455,16750695,16756815,16724175,16718055,16743045,16716015,16726215,16734885,16728765,16730805,16732845};
    char* txt_tc1 []= {"Power","Mode","Mute","Lecture-Pause","précédent","suivant","eq","-","+","0","repeat","U-SD","1","2","3","4","5","6","7","8","9"};
    void fct_tc1 []= {b_power(), b_mode(), b_lect(), b_prec(), b_suiv(), b_eq(), b_moins(), b_plus(), b_zero(), b_repeat(), b_usd(), b_un(), b_deux(), b_trois(), b_quatre(), b_cinq(), b_six(), b_sept(), b_huit(), b_neuf()};
    
    if (irrecv.decode(&results)) //Si on revoit un code IR
    { for (int i=0; i<=20; i++) // On va regarder si on connait la valeur (Définir X en tant que le nombre d'élément du tableau (pour l'isntant 20)) { if (results.value == code_tc1[i]) //on regarde dans le tableau qui regroupe les valeur { Serial.println(txt_tc1[i]); fct_tc1[i]; } } irrecv.resume(); }


    -
    Edité par Supernik 25 octobre 2013 à 23:45:54

    • Partager sur Facebook
    • Partager sur Twitter
      26 octobre 2013 à 0:40:25

      void (*fct_tc1[])(void)= {b_power(), b_mode(), b_lect(), b_prec(), b_suiv(), b_eq(), b_moins(), b_plus(), b_zero(), b_repeat(), b_usd(), b_un(), b_deux(), b_trois(), b_quatre(), b_cinq(), b_six(), b_sept(), b_huit(), b_neuf()};
      
      (fct_tc1[i])();
      

      Comme ça, ça devrait mieux marcher.

      -
      Edité par Natalya 26 octobre 2013 à 0:41:17

      • Partager sur Facebook
      • Partager sur Twitter
      64kB de mémoire, c'est tout ce dont j'ai besoin
        27 octobre 2013 à 0:35:30

        Merci beacoup mais ça me donne cette erreur :

        projet_ir_v2.ino:19:226: error: void value not ignored as it ought to be

        la ligne 19 correspondant à la ligne:

        void (*fct_tc1[])(void)= {b_power(), b_mode(), b_lect(), b_prec(), b_suiv(), b_eq(), b_moins(), b_plus(), b_zero(), b_repeat(), b_usd(), b_un(), b_deux(), b_trois(), b_quatre(), b_cinq(), b_six(), b_sept(), b_huit(), b_neuf()};
        • Partager sur Facebook
        • Partager sur Twitter
          27 octobre 2013 à 1:07:40

          Ah oui, pardon, j'ai oublié de retirer tes parenthèses :

          void (*fct_tc1[])(void)= {b_power, b_mode, b_lect, b_prec, b_suiv, b_eq, b_moins, b_plus, b_zero, b_repeat, b_usd, b_un, b_deux, b_trois, b_quatre, b_cinq, b_six, b_sept, b_huit, b_neuf};

          Comme ça, ça devrait mieux marcher.

          Il faut lire la ligne comme suit : je déclare une variable nommée fct_tc1 qui est un tableau de pointeurs sur des fonctions ayant pour prototype void foo(void). Dans ce tableau, mon premier pointeur vaudra b_power, et ainsi de suite.. En toute rigueur, il faudrait écrire que mon premier élément vaudra &b_power(qui est l'adresse de b_power, b_power étant une fonction et non pas une valeur, on ne peut pas, à proprement parler, la ranger dans un tableau), mais le langage C (sur lequel se base le langage Arduino) est un langage de fainéant, quand on peut enlever un caractère, on le fait. L'écriture avec un & marche quand même. Par contre, si on met des parenthèses à b_power(), alors on ne stocke plus l'adresse de b_power, mais le résultat de son appel, qui est void, et qu'on ne peut donc pas mettre dans un tableau.

          • Partager sur Facebook
          • Partager sur Twitter
          64kB de mémoire, c'est tout ce dont j'ai besoin
            27 octobre 2013 à 18:07:03

            Parfait ca fonctionne!

            Et surtout merci pour l'explication!!

            Il va vraiment falloir que je me replonge dans le C/C++, l'utilisation d'objet pourrait peut-être pratique être pratique ici, mais je n'ai pas su faire pour l'instant.

            Bonne soirée et bonne fin de week-end

            • Partager sur Facebook
            • Partager sur Twitter

            [Arduino] Tableau de fonction

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown