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 :

Fonction avec tableau en argument ne fonctionne pas


Sujet :

Arduino

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Électricien
    Inscrit en
    Février 2018
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Électricien

    Informations forums :
    Inscription : Février 2018
    Messages : 15
    Points : 7
    Points
    7
    Par défaut Fonction avec tableau en argument ne fonctionne pas
    Bonjour, j'ai créé un petit système à base d'arduino pour commandé ma climatisation à distance.
    En gros j'ai :
    - un raspberry avec Domoticz installé.
    - un émetteur RF 433 sur le RPI
    - un Arduino nano avec récepteur RF + led IR

    Grâce à l'émetteur j'envoi une commande type "lgChaud18fast"
    le récepteur capte l'info et envoi la trame infra rouge correspondant à l'ordre "Chauffage à 18 degrés en vitesse rapide"

    Le problème étant : je veux passer la trame infra rouge qui est un tableau d'entiers entre 59 et 69 valeurs, à la fonction qui va émettre la trame infra rouge.

    Voilà 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
    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
     
     
    #include <IRremote.h>
    #include <avr/pgmspace.h>
    #include <VirtualWire.h>
     
     
    /**
     * Module de reception radio pour envoi d'ordre infra rouge à climatisation LG
     */
     
     
    IRsend irsend;
    int khz=38;
    const unsigned int PROGMEM tlgChaud22fast[] = { 444, 14876, 104, 11372, 184, 9016, 364, 1724, 232, 30844, 3208, 9880, 500, 1576, 500, 564, 476, 540, 496, 560, 472, 1596, 476, 556, 476, 556, 472, 568, 476, 560, 476, 560, 472, 556, 476, 556, 476, 556, 476, 1588, 448, 576, 496, 556, 476, 556, 476, 1588, 476, 1584, 476, 1604, 476, 556, 472, 1588, 476, 556, 476, 556, 476, 1588, 476, 1580, 496, 1588, 476, 1588, 476 };
    const unsigned int PROGMEM tlgChaud18fast[] = { 3208, 9848, 476, 1600, 504, 540, 504, 544, 496, 532, 496, 1604, 476, 540, 504, 552, 476, 532, 500, 556, 476, 556, 476, 532, 496, 540, 500, 544, 504, 1596, 476, 536, 504, 552, 476, 532, 500, 532, 500, 1588, 476, 1584, 476, 536, 504, 1588, 476, 536, 504, 532, 496, 1596, 476, 532, 500, 1584, 476, 1596, 476 };
    const unsigned int PROGMEM tlgSwingOn[]     = { 3232, 9832, 496, 1584, 500, 556, 476, 556, 476, 552, 476, 1612, 476, 540, 496, 560, 472, 556, 476, 556, 476, 556, 476, 556, 476, 1600, 452, 572, 500, 556, 476, 1588, 476, 1576, 500, 564, 476, 564, 476, 556, 476, 1584, 476, 556, 476, 1588, 476, 540, 496, 556, 476, 1588, 476, 564, 452, 572, 500, 1584, 476 };
    const unsigned int PROGMEM tlgSwingOff[]    = { 3204, 9848, 500, 1584, 500, 556, 476, 556, 472, 556, 480, 1584, 476, 540, 500, 556, 472, 560, 472, 556, 476, 556, 476, 556, 476, 1584, 476, 560, 472, 556, 452, 1612, 500, 1584, 476, 564, 476, 540, 500, 548, 500, 564, 472, 1604, 476, 540, 500, 556, 476, 1588, 476, 1576, 476, 1612, 500, 556, 476, 1600, 476 };
    const unsigned int PROGMEM tlgFroid25fast[] = { 3208, 9848, 472, 1616, 504, 532, 500, 532, 500, 528, 504, 1568, 500, 536, 504, 536, 504, 536, 504, 524, 504, 532, 500, 532, 500, 540, 500, 532, 500, 532, 500, 528, 500, 536, 504, 1568, 504, 536, 504, 1584, 476, 532, 500, 532, 500, 1576, 504, 532, 504, 532, 500, 1612, 476, 1572, 504, 1564, 500, 540, 500 };
    const unsigned int PROGMEM tlgFroid25auto[] = { 3208, 9860, 532, 1592, 480, 532, 504, 532, 500, 532, 500, 1576, 500, 544, 496, 564, 452, 568, 504, 528, 504, 528, 504, 528, 504, 536, 500, 532, 500, 532, 500, 556, 476, 536, 504, 1584, 476, 536, 504, 1592, 480, 536, 500, 532, 500, 1592, 480, 532, 500, 1584, 476, 1568, 504, 1572, 504, 1588, 476, 1600, 480 };
    const unsigned int PROGMEM tlgFroid26auto[] = { 3288, 9876, 500, 1596, 504, 540, 500, 536, 504, 528, 504, 1584, 480, 528, 500, 532, 500, 532, 500, 528, 504, 532, 496, 532, 500, 536, 504, 532, 500, 532, 500, 528, 504, 528, 504, 1564, 496, 532, 500, 1576, 504, 1560, 500, 540, 500, 1576, 504, 532, 508, 1584, 476, 532, 500, 532, 500, 528, 500, 532, 500 };
    const unsigned int PROGMEM tlgFroid26fast[] = { 3288, 9880, 476, 1600, 504, 536, 500, 532, 504, 528, 500, 1564, 500, 536, 504, 532, 472, 568, 504, 532, 500, 532, 500, 532, 500, 536, 504, 528, 504, 528, 500, 532, 500, 536, 504, 1584, 480, 532, 504, 1596, 476, 1568, 504, 536, 500, 1572, 500, 536, 504, 528, 504, 1584, 476, 1596, 476, 1584, 476, 1604, 476 };
    const unsigned int PROGMEM tlgFan[]         = { 3368, 9860, 528, 1596, 476, 536, 504, 528, 504, 528, 500, 1604, 476, 536, 504, 536, 500, 536, 496, 544, 504, 532, 500, 532, 500, 532, 500, 532, 504, 532, 500, 1596, 480, 532, 504, 528, 504, 528, 500, 1576, 496, 1568, 504, 532, 504, 532, 500, 532, 500, 528, 504, 540, 500, 1592, 476, 532, 500, 1596, 476 };
    const unsigned int PROGMEM tlgFanOff[]      = { 3368, 9860, 528, 1596, 476, 536, 504, 528, 504, 528, 500, 1604, 476, 536, 504, 536, 500, 536, 496, 544, 504, 532, 500, 532, 500, 532, 500, 532, 504, 532, 500, 1596, 480, 532, 504, 528, 504, 528, 500, 1576, 496, 1568, 504, 532, 504, 532, 500, 532, 500, 528, 504, 540, 500, 1592, 476, 532, 500, 1596, 476 };
     
    void setup() {
      vw_setup(2000);
      vw_set_rx_pin(2);
      vw_rx_start(); // On peut maintenant recevoir des messages
      Serial.begin(9600);
        Serial.println("go");
        Serial.print(tlgChaud18fast[0]);
        Serial.print(" ,");
        Serial.print(tlgChaud18fast[1]);
        Serial.print(" ,");
        Serial.print(tlgChaud18fast[2]);
        Serial.print(" ,");
    }
    void SendIR(unsigned int ordre[]) 
    {
      Serial.print("trame = ");
     
    for (int i = 0; i < 3; i++)
    {
       Serial.print(ordre[0]);
        Serial.print(" ,");
    }
    Serial.println(" ,");
    //  irsend.sendRaw(ordre, sizeof(ordre) / sizeof(ordre[0]), khz); //Note the approach used to automatically calculate the size of the array
    }
     
    void loop() {
      byte message[VW_MAX_MESSAGE_LEN];
      byte taille_message = VW_MAX_MESSAGE_LEN;
     
     vw_wait_rx();
     
      if (vw_get_message(message, &taille_message)) {
     
        if (strcmp((char*) message, "lgChaud22fast") == 0)
        {
           SendIR(tlgChaud22fast);
        }
        else if (strcmp((char*) message, "lgChaud18fast") == 0)
        {
          SendIR(tlgChaud18fast);
        }
        else if (strcmp((char*) message, "lgSwingOn") == 0)
        {
          SendIR(tlgSwingOn);
        }
        else if (strcmp((char*) message, "lgSwingOff") == 0)
        {
          SendIR(tlgSwingOff);
        }
        else if (strcmp((char*) message, "lgFroid25fast") == 0)
        {
         SendIR(tlgFroid25fast);
        }
        else if (strcmp((char*) message, "lgFroid25auto") == 0)
        {
          SendIR(tlgFroid25auto);
        }
        else if (strcmp((char*) message, "lgFroid26auto") == 0)
        { 
          SendIR(tlgFroid26auto);
        }
        else if (strcmp((char*) message, "lgFroid26fast") == 0)
        {
          SendIR(tlgFroid26fast);
        }
        else if (strcmp((char*) message, "lgFan") == 0)
        {
         SendIR(tlgFan);
        }
        else if (strcmp((char*) message, "lgFanOff") == 0)
        {
          SendIR(tlgFanOff);
        }
      }
    }
    Pour contrôler mes tableau dans la fonction setup j'affiche les 3 premières valeurs de la trame lgChaud18fast
    qui correpond à : 3208 ,9848 ,476

    Et l'affiche de nouveau dans au départ de la fonction SendIR et le résultat est : 24934 ,29811 ,25344

    J'ai essayé d'utiliser un pointeur, mais je n'ai pas assez de notions en pointeurs... D'après ce que j'ai lu je devrais appeler SendIR(&tlgChaud18fast); de cette manière ( ça ne compile pas...)
    et déclaré la fonction
    void SendIR(const unsigned int (*ordre)[])
    et appel SendIR(tlgChaud18fast);

    mais j'obtient les érreurs :


    recepteurv2:38: error: parameter 'ordre' includes pointer to array of unknown bound 'const unsigned int []'

    void SendIR(const unsigned int (*ordre)[])

    ^

    recepteurv2:38: error: parameter 'ordre' includes pointer to array of unknown bound 'const unsigned int []'

    void SendIR(const unsigned int (*ordre)[])

    ^
    \recepteurv2.ino: In function 'void loop()':

    recepteurv2:64: error: cannot convert 'const unsigned int (*)[69]' to 'const unsigned int (*)[]' for argument '1' to 'void SendIR(const unsigned int (*)[])'

    SendIR(&tlgChaud22fast);

    ^

    recepteurv2:68: error: cannot convert 'const unsigned int (*)[59]' to 'const unsigned int (*)[]' for argument '1' to 'void SendIR(const unsigned int (*)[])'

    SendIR(&tlgChaud18fast);

    ^

    exit status 1
    parameter 'ordre' includes pointer to array of unknown bound 'const unsigned int []'


    Je suis perdu j'ai essayé plusieurs autre façon de programmer le pointeurs déclaré à l'initialisation de la fonction mais rien n'y fait...

    Merci d'avance ! bonne journée

    EDIT : Fait complètement dingue :
    si je ne laisse qu'une seule condition :

    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
     
    #include <IRremote.h>
    #include <avr/pgmspace.h>
    #include <VirtualWire.h>
     
     
    /**
     * Module de reception radio pour envoi d'ordre infra rouge à climatisation LG
     */
     
     
    IRsend irsend;
    int khz=38;
    const unsigned int PROGMEM tlgChaud22fast[] = { 444, 14876, 104, 11372, 184, 9016, 364, 1724, 232, 30844, 3208, 9880, 500, 1576, 500, 564, 476, 540, 496, 560, 472, 1596, 476, 556, 476, 556, 472, 568, 476, 560, 476, 560, 472, 556, 476, 556, 476, 556, 476, 1588, 448, 576, 496, 556, 476, 556, 476, 1588, 476, 1584, 476, 1604, 476, 556, 472, 1588, 476, 556, 476, 556, 476, 1588, 476, 1580, 496, 1588, 476, 1588, 476 };
    const unsigned int PROGMEM tlgChaud18fast[] = { 3208, 9848, 476, 1600, 504, 540, 504, 544, 496, 532, 496, 1604, 476, 540, 504, 552, 476, 532, 500, 556, 476, 556, 476, 532, 496, 540, 500, 544, 504, 1596, 476, 536, 504, 552, 476, 532, 500, 532, 500, 1588, 476, 1584, 476, 536, 504, 1588, 476, 536, 504, 532, 496, 1596, 476, 532, 500, 1584, 476, 1596, 476 };
    const unsigned int PROGMEM tlgSwingOn[]     = { 3232, 9832, 496, 1584, 500, 556, 476, 556, 476, 552, 476, 1612, 476, 540, 496, 560, 472, 556, 476, 556, 476, 556, 476, 556, 476, 1600, 452, 572, 500, 556, 476, 1588, 476, 1576, 500, 564, 476, 564, 476, 556, 476, 1584, 476, 556, 476, 1588, 476, 540, 496, 556, 476, 1588, 476, 564, 452, 572, 500, 1584, 476 };
    const unsigned int PROGMEM tlgSwingOff[]    = { 3204, 9848, 500, 1584, 500, 556, 476, 556, 472, 556, 480, 1584, 476, 540, 500, 556, 472, 560, 472, 556, 476, 556, 476, 556, 476, 1584, 476, 560, 472, 556, 452, 1612, 500, 1584, 476, 564, 476, 540, 500, 548, 500, 564, 472, 1604, 476, 540, 500, 556, 476, 1588, 476, 1576, 476, 1612, 500, 556, 476, 1600, 476 };
    const unsigned int PROGMEM tlgFroid25fast[] = { 3208, 9848, 472, 1616, 504, 532, 500, 532, 500, 528, 504, 1568, 500, 536, 504, 536, 504, 536, 504, 524, 504, 532, 500, 532, 500, 540, 500, 532, 500, 532, 500, 528, 500, 536, 504, 1568, 504, 536, 504, 1584, 476, 532, 500, 532, 500, 1576, 504, 532, 504, 532, 500, 1612, 476, 1572, 504, 1564, 500, 540, 500 };
    const unsigned int PROGMEM tlgFroid25auto[] = { 3208, 9860, 532, 1592, 480, 532, 504, 532, 500, 532, 500, 1576, 500, 544, 496, 564, 452, 568, 504, 528, 504, 528, 504, 528, 504, 536, 500, 532, 500, 532, 500, 556, 476, 536, 504, 1584, 476, 536, 504, 1592, 480, 536, 500, 532, 500, 1592, 480, 532, 500, 1584, 476, 1568, 504, 1572, 504, 1588, 476, 1600, 480 };
    const unsigned int PROGMEM tlgFroid26auto[] = { 3288, 9876, 500, 1596, 504, 540, 500, 536, 504, 528, 504, 1584, 480, 528, 500, 532, 500, 532, 500, 528, 504, 532, 496, 532, 500, 536, 504, 532, 500, 532, 500, 528, 504, 528, 504, 1564, 496, 532, 500, 1576, 504, 1560, 500, 540, 500, 1576, 504, 532, 508, 1584, 476, 532, 500, 532, 500, 528, 500, 532, 500 };
    const unsigned int PROGMEM tlgFroid26fast[] = { 3288, 9880, 476, 1600, 504, 536, 500, 532, 504, 528, 500, 1564, 500, 536, 504, 532, 472, 568, 504, 532, 500, 532, 500, 532, 500, 536, 504, 528, 504, 528, 500, 532, 500, 536, 504, 1584, 480, 532, 504, 1596, 476, 1568, 504, 536, 500, 1572, 500, 536, 504, 528, 504, 1584, 476, 1596, 476, 1584, 476, 1604, 476 };
    const unsigned int PROGMEM tlgFan[]         = { 3368, 9860, 528, 1596, 476, 536, 504, 528, 504, 528, 500, 1604, 476, 536, 504, 536, 500, 536, 496, 544, 504, 532, 500, 532, 500, 532, 500, 532, 504, 532, 500, 1596, 480, 532, 504, 528, 504, 528, 500, 1576, 496, 1568, 504, 532, 504, 532, 500, 532, 500, 528, 504, 540, 500, 1592, 476, 532, 500, 1596, 476 };
    const unsigned int PROGMEM tlgFanOff[]      = { 3368, 9860, 528, 1596, 476, 536, 504, 528, 504, 528, 500, 1604, 476, 536, 504, 536, 500, 536, 496, 544, 504, 532, 500, 532, 500, 532, 500, 532, 504, 532, 500, 1596, 480, 532, 504, 528, 504, 528, 500, 1576, 496, 1568, 504, 532, 504, 532, 500, 532, 500, 528, 504, 540, 500, 1592, 476, 532, 500, 1596, 476 };
     
    void setup() {
      vw_setup(2000);
      vw_set_rx_pin(2);
      vw_rx_start(); // On peut maintenant recevoir des messages
      Serial.begin(9600);
        Serial.println("go");
        Serial.print(tlgChaud18fast[0]);
    Serial.print(" ,");
    Serial.print(tlgChaud18fast[1]);
    Serial.print(" ,");
    Serial.print(tlgChaud18fast[2]);
    Serial.print(" ,");
    }
    void SendIR(const unsigned int ordre[]) 
    {
      Serial.print("trame = ");
     
    for (int i = 0; i < 3; i++)
    {
       Serial.print(ordre[i]);
        Serial.print(" ,");
    }
    //Serial.println(" ,");
    //  irsend.sendRaw(ordre, sizeof(ordre) / sizeof(ordre[0]), khz); //Note the approach used to automatically calculate the size of the array
    }
     
    void loop() {
      byte message[VW_MAX_MESSAGE_LEN];
      byte taille_message = VW_MAX_MESSAGE_LEN;
      // N.B. La constante VW_MAX_MESSAGE_LEN est fournie par la lib VirtualWire
     
      // On attend de recevoir un message
      vw_wait_rx();
     
      if (vw_get_message(message, &taille_message)) {
        // On copie le message, qu'il soit corrompu ou non
    //    if (strcmp((char*) message, "lgChaud22fast") == 0)
    //    {
    //      Serial.println("c22");
    //          SendIR(tlgChaud22fast);
    //    }
         if (strcmp((char*) message, "lgChaud18fast") == 0)
        {
          SendIR(tlgChaud18fast);
        }
    //    else if (strcmp((char*) message, "lgSwingOn") == 0)
    //    {
    //      SendIR(tlgSwingOn);
    //    }
    //    else if (strcmp((char*) message, "lgSwingOff") == 0)
    //    {
    //      SendIR(tlgSwingOff);
    //    }
    //    else if (strcmp((char*) message, "lgFroid25fast") == 0)
    //    {
    //     SendIR(tlgFroid25fast);
    //    }
    //    else if (strcmp((char*) message, "lgFroid25auto") == 0)
    //    {
    //      SendIR(tlgFroid25auto);
    //    }
    //    else if (strcmp((char*) message, "lgFroid26auto") == 0)
    //    { 
    //      SendIR(tlgFroid26auto);
    //    }
    //    else if (strcmp((char*) message, "lgFroid26fast") == 0)
    //    {
    //      SendIR(tlgFroid26fast);
    //    }
    //    else if (strcmp((char*) message, "lgFan") == 0)
    //    {
    //     SendIR(tlgFan);
    //    }
    //    else if (strcmp((char*) message, "lgFanOff") == 0)
    //    {
    //      SendIR(tlgFanOff);
    //    }
      }
    }
    la variable ordre me retourne les bonnes valeurs...... J'ai utilisé PROGMEM pour ne pas encombré la mémoire... un problème de stabilité ?
    une fois compilé j'ai :

    Le croquis utilise 3684 octets (11%) de l'espace de stockage de programmes. Le maximum est de 30720 octets.
    Les variables globales utilisent 556 octets (27%) de mémoire dynamique, ce qui laisse 1492 octets pour les variables locales. Le maximum est de 2048 octets.

    Donc il a de la marge pour tourner correctement..

    Merci !!

  2. #2
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Salut,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    void SendIR(unsigned int ordre[]) 
    {
      Serial.print("trame = ");
     
    for (int i = 0; i < 3; i++)
    {
       Serial.print(ordre[0]);
        Serial.print(" ,");
    }
    Serial.println(" ,");
    //  irsend.sendRaw(ordre, sizeof(ordre) / sizeof(ordre[0]), khz); //Note the approach used to automatically calculate the size of the array
    }
    Es-tu sûr d'afficher les 3 premiers bytes ? Ou est-ce que tu affiches 3 fois le premier byte ?


    Je suis perdu j'ai essayé plusieurs autre façon de programmer le pointeurs déclaré à l'initialisation de la fonction mais rien n'y fait...
    Non mais ça c'est pas une bonne idée ! Il faut comprendre les types que tu mets et les messages d'erreur. Mettre des prototypes au pif a une probabilité faible de fonctionner et surtout ça ne te fait pas progresser

    EDIT : Fait complètement dingue :
    si je ne laisse qu'une seule condition :
    Je n'ai pas d'Arduino alors j'ai fait fonctionné ce code en C++ en bouchonnant quelques fonctions, et ça fonctionne même avec toutes les conditions... Il doit y avoir autre chose dans ton 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
    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
    #include <iostream>
    #include <cstring>
     
    #define PROGMEM
    #define Serial_print(x)        std::cout << (x)
    #define Serial_println(x)        std::cout << (x) << '\n'
    #define byte std::uint8_t
    #define VW_MAX_MESSAGE_LEN 10
     
    bool vw_get_message(byte* message, byte* taille_message) {
    	std::cout << "Message ? " << std::endl;
    	std::cin >> message;
    	*taille_message = strlen((const char*) message);
    	return true;
    }
     
     
    const unsigned int PROGMEM tlgChaud22fast[] = {444, 14876, 104, 11372, 184, 9016, 364, 1724, 232, 30844, 3208, 9880,
    		500, 1576, 500, 564, 476, 540, 496, 560, 472, 1596, 476, 556, 476, 556, 472, 568, 476, 560, 476, 560, 472, 556,
    		476, 556, 476, 556, 476, 1588, 448, 576, 496, 556, 476, 556, 476, 1588, 476, 1584, 476, 1604, 476, 556, 472,
    		1588, 476, 556, 476, 556, 476, 1588, 476, 1580, 496, 1588, 476, 1588, 476};
    const unsigned int PROGMEM tlgChaud18fast[] = {3208, 9848, 476, 1600, 504, 540, 504, 544, 496, 532, 496, 1604, 476, 540,
    		504, 552, 476, 532, 500, 556, 476, 556, 476, 532, 496, 540, 500, 544, 504, 1596, 476, 536, 504, 552, 476, 532,
    		500, 532, 500, 1588, 476, 1584, 476, 536, 504, 1588, 476, 536, 504, 532, 496, 1596, 476, 532, 500, 1584, 476,
    		1596, 476};
    const unsigned int PROGMEM tlgSwingOn[] = {3232, 9832, 496, 1584, 500, 556, 476, 556, 476, 552, 476, 1612, 476, 540,
    		496, 560, 472, 556, 476, 556, 476, 556, 476, 556, 476, 1600, 452, 572, 500, 556, 476, 1588, 476, 1576, 500, 564,
    		476, 564, 476, 556, 476, 1584, 476, 556, 476, 1588, 476, 540, 496, 556, 476, 1588, 476, 564, 452, 572, 500,
    		1584, 476};
    const unsigned int PROGMEM tlgSwingOff[] = {3204, 9848, 500, 1584, 500, 556, 476, 556, 472, 556, 480, 1584, 476, 540,
    		500, 556, 472, 560, 472, 556, 476, 556, 476, 556, 476, 1584, 476, 560, 472, 556, 452, 1612, 500, 1584, 476, 564,
    		476, 540, 500, 548, 500, 564, 472, 1604, 476, 540, 500, 556, 476, 1588, 476, 1576, 476, 1612, 500, 556, 476,
    		1600, 476};
    const unsigned int PROGMEM tlgFroid25fast[] = {3208, 9848, 472, 1616, 504, 532, 500, 532, 500, 528, 504, 1568, 500, 536,
    		504, 536, 504, 536, 504, 524, 504, 532, 500, 532, 500, 540, 500, 532, 500, 532, 500, 528, 500, 536, 504, 1568,
    		504, 536, 504, 1584, 476, 532, 500, 532, 500, 1576, 504, 532, 504, 532, 500, 1612, 476, 1572, 504, 1564, 500,
    		540, 500};
    const unsigned int PROGMEM tlgFroid25auto[] = {3208, 9860, 532, 1592, 480, 532, 504, 532, 500, 532, 500, 1576, 500, 544,
    		496, 564, 452, 568, 504, 528, 504, 528, 504, 528, 504, 536, 500, 532, 500, 532, 500, 556, 476, 536, 504, 1584,
    		476, 536, 504, 1592, 480, 536, 500, 532, 500, 1592, 480, 532, 500, 1584, 476, 1568, 504, 1572, 504, 1588, 476,
    		1600, 480};
    const unsigned int PROGMEM tlgFroid26auto[] = {3288, 9876, 500, 1596, 504, 540, 500, 536, 504, 528, 504, 1584, 480, 528,
    		500, 532, 500, 532, 500, 528, 504, 532, 496, 532, 500, 536, 504, 532, 500, 532, 500, 528, 504, 528, 504, 1564,
    		496, 532, 500, 1576, 504, 1560, 500, 540, 500, 1576, 504, 532, 508, 1584, 476, 532, 500, 532, 500, 528, 500,
    		532, 500};
    const unsigned int PROGMEM tlgFroid26fast[] = {3288, 9880, 476, 1600, 504, 536, 500, 532, 504, 528, 500, 1564, 500, 536,
    		504, 532, 472, 568, 504, 532, 500, 532, 500, 532, 500, 536, 504, 528, 504, 528, 500, 532, 500, 536, 504, 1584,
    		480, 532, 504, 1596, 476, 1568, 504, 536, 500, 1572, 500, 536, 504, 528, 504, 1584, 476, 1596, 476, 1584, 476,
    		1604, 476};
    const unsigned int PROGMEM tlgFan[] = {3368, 9860, 528, 1596, 476, 536, 504, 528, 504, 528, 500, 1604, 476, 536, 504,
    		536, 500, 536, 496, 544, 504, 532, 500, 532, 500, 532, 500, 532, 504, 532, 500, 1596, 480, 532, 504, 528, 504,
    		528, 500, 1576, 496, 1568, 504, 532, 504, 532, 500, 532, 500, 528, 504, 540, 500, 1592, 476, 532, 500, 1596,
    		476};
    const unsigned int PROGMEM tlgFanOff[] = {3368, 9860, 528, 1596, 476, 536, 504, 528, 504, 528, 500, 1604, 476, 536, 504,
    		536, 500, 536, 496, 544, 504, 532, 500, 532, 500, 532, 500, 532, 504, 532, 500, 1596, 480, 532, 504, 528, 504,
    		528, 500, 1576, 496, 1568, 504, 532, 504, 532, 500, 532, 500, 528, 504, 540, 500, 1592, 476, 532, 500, 1596,
    		476};
     
    void SendIR(const unsigned int ordre[]) {
    	Serial_print("trame = ");
     
    	for (int i = 0; i < 3; i++) {
    		Serial_print(ordre[0]);
    		Serial_print(" ,");
    	}
    	Serial_println(" ,");
    //  irsend.sendRaw(ordre, sizeof(ordre) / sizeof(ordre[0]), khz); //Note the approach used to automatically calculate the size of the array
    }
     
    void loop() {
    	byte message[VW_MAX_MESSAGE_LEN];
    	byte taille_message = VW_MAX_MESSAGE_LEN;
     
    	if (vw_get_message(message, &taille_message)) {
     
    		if (strcmp((char*) message, "lgChaud22fast") == 0) {
    			SendIR(tlgChaud22fast);
    		} else if (strcmp((char*) message, "lgChaud18fast") == 0) {
    			SendIR(tlgChaud18fast);
    		} else if (strcmp((char*) message, "lgSwingOn") == 0) {
    			SendIR(tlgSwingOn);
    		} else if (strcmp((char*) message, "lgSwingOff") == 0) {
    			SendIR(tlgSwingOff);
    		} else if (strcmp((char*) message, "lgFroid25fast") == 0) {
    			SendIR(tlgFroid25fast);
    		} else if (strcmp((char*) message, "lgFroid25auto") == 0) {
    			SendIR(tlgFroid25auto);
    		} else if (strcmp((char*) message, "lgFroid26auto") == 0) {
    			SendIR(tlgFroid26auto);
    		} else if (strcmp((char*) message, "lgFroid26fast") == 0) {
    			SendIR(tlgFroid26fast);
    		} else if (strcmp((char*) message, "lgFan") == 0) {
    			SendIR(tlgFan);
    		} else if (strcmp((char*) message, "lgFanOff") == 0) {
    			SendIR(tlgFanOff);
    		}
    	}
    }
     
    int main() {
    	Serial_println("go");
    	Serial_print(tlgChaud18fast[0]);
    	Serial_print(" ,");
    	Serial_print(tlgChaud18fast[1]);
    	Serial_print(" ,");
    	Serial_print(tlgChaud18fast[2]);
    	Serial_print(" ,");
     
    	loop();
    }

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Électricien
    Inscrit en
    Février 2018
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Électricien

    Informations forums :
    Inscription : Février 2018
    Messages : 15
    Points : 7
    Points
    7
    Par défaut
    Bonjour ! Oui désolé j'ai essayé pas mal de choses... Donc j'avais oublié de replacer ordre[i] à la place de ordre[0]

    Je pense que c'est plutôt lié à la "puissance" de l'arduino... Puisque si je place qu'une seule condition cela fonctionne. Mais avec la série d'else if sa ne marche plus....
    Il faudrait que je modifie les conditions ?

  4. #4
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Je doute très sincèrement de cette hypothèse... La "puissance" jouerait sur la capacité à faire beaucoup de calculs peu de temps, pas à enchainer des strcmp() (on pourrait le faire à vitesse de tortue et ça fonctionnerait). Je pense simplement que ton code a des problèmes et que n'avoir une seule condition le masque. Mais comme je ne reproduis pas le problème sur PC, dur de t'aider plus...

    PS : peux-tu tenter d'enlever les PROGMEM pour voir ?

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Électricien
    Inscrit en
    Février 2018
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Électricien

    Informations forums :
    Inscription : Février 2018
    Messages : 15
    Points : 7
    Points
    7
    Par défaut
    D'acc, si je retire les progmem la mémoire dynamique est rempli à 100% du coup la il y aura des problèmes de stabilité.
    Autre question, je ne vois pas trop ce que pourrait masquer qu'une seule condition, puisque la condition est bien rempli puisque la fonction sendir est appelée. Il a un problème vraiment sur le passage de l'argument. Qu'en penses tu ?
    Merci pour tes réponses !

  6. #6
    Modérateur

    Homme Profil pro
    Ingénieur électricien
    Inscrit en
    Septembre 2008
    Messages
    1 267
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur électricien

    Informations forums :
    Inscription : Septembre 2008
    Messages : 1 267
    Points : 4 829
    Points
    4 829
    Par défaut
    Bonjour

    Sauf que l'on ne peut pas récupérer le contenu d'une constante placée dans la mémoire programme aussi simplement que cela. Il faut appeler une fonction spécifique comme par exemple: pgm_read_byte()!
    Voir les docs : Storing and Retrieving Data in the Program Space - - AVR Libc Reference Manual et Arduino Reference.

    Donc que cela marche dans le cas d'une seule conditions, c'est un peu du bol, cela ne devrait pas.

    Bonne suite

    Delias

    Edit: Il existe plusieurs fonctions pgm_read_xyz() en fonction du type à récupérer dans la mémoire programme de même que plusieurs fonctions standard de copie des chaines dont _P à été ajouté à la fin du nom (par exemple strcpy_P();), j'avais lu la doc un peut vite

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Électricien
    Inscrit en
    Février 2018
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Électricien

    Informations forums :
    Inscription : Février 2018
    Messages : 15
    Points : 7
    Points
    7
    Par défaut
    Ahh j'avais raté ce détail sur le progmem ! Effectivement ça pourrait bien venir de la ! J'essaie ce soir je te tiens au courant, merci pour tes lumières !

    Petite question en plus d'après ce que je lis dans les différents articles. Pour récupérer un tableau progmem il va falloir lire une à une les case du tableau ?
    Ou est ce que pgm_read_word lit le tableau complet ?
    Merci encore pour tes réponses, je gagne un temps fou grâce à toi... Je fais ça le soir une heure ou deux alors ça passe vite pour tester des trucs !

  8. #8
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Ecko- Voir le message
    D'acc, si je retire les progmem la mémoire dynamique est rempli à 100% du coup la il y aura des problèmes de stabilité.
    Qu'entends-tu par "stabilité" ? Normalement, si ton programme est trop gros (soit parce qu'il y a trop de lignes de code et qu'il a besoin de beaucoup de flash ; soit parce qu'il créé beaucoup de données et qu'il a besoin de beaucoup de RAM), alors ton compilateur (ton éditeur de liens ou linker pour être exact) doit refuser de générer ton programme.

    Citation Envoyé par Ecko- Voir le message
    Autre question, je ne vois pas trop ce que pourrait masquer qu'une seule condition, puisque la condition est bien rempli puisque la fonction sendir est appelée. Il a un problème vraiment sur le passage de l'argument
    Non puisque ça fonctionne sur PC. Et je ne vois aucun problème dans ton code. Je n'ai pas la science infuse mais je fais confiance au compilateur qui n'en voit pas non plus

    D'ailleurs, "il n'y a pas de raison" n'est malheureusement pas ce que l'expérience nous montre. J'ai eu des tas de codes qui ne présentaient pas de bonnes raisons d'avoir un comportement erroné....et qui pourtant ne produisait pas le résultat attendu ! D'ailleurs comme le dit Delias :
    Citation Envoyé par Delias Voir le message
    Donc que cela marche dans le cas d'une seule conditions, c'est un peu du bol, cela ne devrait pas.


    Citation Envoyé par Delias Voir le message
    Sauf que l'on ne peut pas récupérer le contenu d'une constante placée dans la mémoire programme aussi simplement que cela. Il faut appeler une fonction spécifique: pgm_read_byte()!
    Voilà qui explique bien des choses

  9. #9
    Futur Membre du Club
    Homme Profil pro
    Électricien
    Inscrit en
    Février 2018
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Électricien

    Informations forums :
    Inscription : Février 2018
    Messages : 15
    Points : 7
    Points
    7
    Par défaut
    Citation Envoyé par Bktero Voir le message
    Qu'entends-tu par "stabilité" ? Normalement, si ton programme est trop gros (soit parce qu'il y a trop de lignes de code et qu'il a besoin de beaucoup de flash ; soit parce qu'il créé beaucoup de données et qu'il a besoin de beaucoup de RAM), alors ton compilateur (ton éditeur de liens ou linker pour être exact) doit refuser de générer ton programme.
    J'entends que si je n'utilise pas PROGMEM et que je met les trames dans une variable classique genre const unsigned int, la mémoire dynamique est saturé à 100% et ne laisse plus de place pour les variables locales par exemples et la sa pose des problèmes de stabilité enfin, je suppose que l'arduino va planter


    Je vous rapporte la suite des mes test :
    - dans la fonction SendIR avec la boucle for j'affiche la trame avec : Serial.print(pgm_read_word_near(tlgChaud18fast + i )); cela fonctionne bien ! Les valeurs affichés sont les bonnes !
    - Lorsque je remplace tlgChaud18fast par l'argument ordre : Serial.print(pgm_read_word_near(ordre + i )); la sa dérape les valeurs ne sont pas bonne du tout

    je n'arrive pas à trouver des exemples avec des tableau int et progmem. Il n'y a que des exemples avec des char :s

    Du coup j'étais tombé sur un forum ou il y avait une façon de déclarer une fonction avec un argument du type tableau progmem mais je n'arrive plus à remettre la main dessus ! Je suppose que c'est la d'où vient le problème

    Je continue de chercher, merci de votre aide !

    Voilà j'ai trouvé une solution, ne me félicitez pas c'est pas jolie jolie.... Mais j'ai besoin que ce soit fonctionnel ! Alors pour l'instant je vais laissé comme ça et si par le futur j'améliores mes compétences j'optimiserais, juste pour le plaisir !

    Du coup j'ai fais à la barbare CTRL+C + CTRL+V ...
    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
     
        if (strcmp((char*) message, "lgChaud22fast") == 0)
        {
          int i = (sizeof(tlgChaud22fast) / sizeof(pgm_read_word(&tlgChaud22fast + 0)));
          unsigned int ordre[i];
          for (int k = 0; k < i; k++)
          {
            ordre[k] = pgm_read_word_near(tlgChaud22fast + k);
          }
          irsend.sendRaw(ordre, sizeof(ordre) / sizeof(ordre[0]), khz);
        }
        else if (strcmp((char*) message, "lgChaud18fast") == 0)
        {
          int i = (sizeof(tlgChaud18fast) / sizeof(pgm_read_word(&tlgChaud18fast + 0)));
          unsigned int ordre[i];
          for (int k = 0; k < i; k++)
          {
            ordre[k] = pgm_read_word_near(tlgChaud18fast + k);
     
          }
          irsend.sendRaw(ordre, sizeof(ordre) / sizeof(ordre[0]), khz);
        }
    Malgré tout si vous avez des idées je peux tester ! J'aimerais bien juste pour m'améliorer trouver une solution qui soit pas trop dégueu !

    Merci pour votre aide !! Bonne soirée !

  10. #10
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Un code qui fait le boulot, c'est le but premier du développeur !

    Après, il y a plein de façons d'améliorer. Ma première idée serait de ne pas faire suite de if / else if / else mais sans doute de faire une table de correspondance (lookup table en anglais). Ce serait bien plus simple pour rajouter des commandes. Voici à quoi cela pourrait ressembler :

    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
    #include <cstring>
    #include <iostream>
     
    #define Serial_print(x)      std::cout << (x)
    #define Serial_println(x)    std::cout << (x) << '\n'
    #define REQUEST_LENGTH       20
     
    const unsigned int tlgChaud22fast[] = {444, 14876, 104};
    const unsigned int tlgChaud18fast[] = {3208, 9848, 476};
    const unsigned int tlgSwingOn[] = {3232, 9832, 496};
    const unsigned int tlgSwingOff[] = {3204, 9848, 500};
     
    struct Matching {
    	const char* const request;
    	const unsigned int* const order;
    };
     
    const Matching look_up_table[] = {
    		{"lgChaud22fast", tlgChaud22fast},
    		{"lgChaud18fast", tlgChaud18fast},
    		{"lgSwingOn",     tlgSwingOn},
    		{"lgSwingOff",    tlgSwingOff}
    };
     
    void send_order(const unsigned int* order) {
    	Serial_print("Order = ");
     
    	for (int i = 0; i < 3; i++) {
    		Serial_print(order[i]);
    		Serial_print(" ,");
    	}
    	Serial_println(" ,");
    }
     
    void get_request(char* request) {
    	std::cout << "Request ? " << std::endl;
    	std::cin >> request;
    }
     
    int main() {
    	char request[REQUEST_LENGTH] = {0};
    	get_request(request);
     
    	for (unsigned int i = 0; i < (sizeof(look_up_table) / sizeof(look_up_table[0])); ++i) {
    		const Matching& matching = look_up_table[i];
    		if (strcmp(request, matching.request) == 0) {
    			send_order(matching.order);
    			break;
    		}
    	}
    }

  11. #11
    Futur Membre du Club
    Homme Profil pro
    Électricien
    Inscrit en
    Février 2018
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Électricien

    Informations forums :
    Inscription : Février 2018
    Messages : 15
    Points : 7
    Points
    7
    Par défaut
    Ah ouais super, j'étais justement en train de penser à une structure. C'est vraiment bien ce que tu as fait.
    Merci, je vais essayer d'adapter ça ! Je te tiendrai au courant.
    Le fait d'avoir une structure avec l'ordre et la trame "en face" ça règle le problème d'envoyer un argument!
    Super merci encore

    Suite :

    Voilà tout est opérationnel !!

    Je vous montre mon code final :
    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
     
    #include <IRremote.h>
    #include <avr/pgmspace.h>
    #include <VirtualWire.h>
     
     
    /**
       Module de reception radio pour envoi d'ordre infra rouge à climatisation LG
    */
     
     
    IRsend irsend;
    int khz = 38;
    const unsigned int PROGMEM tlgChaud22fast[] = { 3228, 9828, 500, 1588, 500, 556, 472, 556, 476, 556, 476, 1568, 500, 560, 476, 556, 476, 556, 476, 552, 476, 556, 476, 552, 480, 560, 476, 556, 476, 1584, 472, 556, 476, 556, 476, 552, 476, 1596, 472, 1576, 500, 1588, 472, 564, 476, 1576, 500, 556, 476, 552, 476, 1584, 476, 1596, 476, 1588, 480, 1592, 472 };
    const unsigned int PROGMEM tlgChaud18fast[] = { 3208, 9848, 476, 1600, 504, 540, 504, 544, 496, 532, 496, 1604, 476, 540, 504, 552, 476, 532, 500, 556, 476, 556, 476, 532, 496, 540, 500, 544, 504, 1596, 476, 536, 504, 552, 476, 532, 500, 532, 500, 1588, 476, 1584, 476, 536, 504, 1588, 476, 536, 504, 532, 496, 1596, 476, 532, 500, 1584, 476, 1596, 476 };
    const unsigned int PROGMEM tlgSwingOn[]     = { 3232, 9832, 496, 1584, 500, 556, 476, 556, 476, 552, 476, 1612, 476, 540, 496, 560, 472, 556, 476, 556, 476, 556, 476, 556, 476, 1600, 452, 572, 500, 556, 476, 1588, 476, 1576, 500, 564, 476, 564, 476, 556, 476, 1584, 476, 556, 476, 1588, 476, 540, 496, 556, 476, 1588, 476, 564, 452, 572, 500, 1584, 476 };
    const unsigned int PROGMEM tlgSwingOff[]    = { 3204, 9848, 500, 1584, 500, 556, 476, 556, 472, 556, 480, 1584, 476, 540, 500, 556, 472, 560, 472, 556, 476, 556, 476, 556, 476, 1584, 476, 560, 472, 556, 452, 1612, 500, 1584, 476, 564, 476, 540, 500, 548, 500, 564, 472, 1604, 476, 540, 500, 556, 476, 1588, 476, 1576, 476, 1612, 500, 556, 476, 1600, 476 };
    const unsigned int PROGMEM tlgFroid25fast[] = { 3208, 9848, 472, 1616, 504, 532, 500, 532, 500, 528, 504, 1568, 500, 536, 504, 536, 504, 536, 504, 524, 504, 532, 500, 532, 500, 540, 500, 532, 500, 532, 500, 528, 500, 536, 504, 1568, 504, 536, 504, 1584, 476, 532, 500, 532, 500, 1576, 504, 532, 504, 532, 500, 1612, 476, 1572, 504, 1564, 500, 540, 500 };
    const unsigned int PROGMEM tlgFroid25auto[] = { 3208, 9860, 532, 1592, 480, 532, 504, 532, 500, 532, 500, 1576, 500, 544, 496, 564, 452, 568, 504, 528, 504, 528, 504, 528, 504, 536, 500, 532, 500, 532, 500, 556, 476, 536, 504, 1584, 476, 536, 504, 1592, 480, 536, 500, 532, 500, 1592, 480, 532, 500, 1584, 476, 1568, 504, 1572, 504, 1588, 476, 1600, 480 };
    const unsigned int PROGMEM tlgFroid26auto[] = { 3288, 9876, 500, 1596, 504, 540, 500, 536, 504, 528, 504, 1584, 480, 528, 500, 532, 500, 532, 500, 528, 504, 532, 496, 532, 500, 536, 504, 532, 500, 532, 500, 528, 504, 528, 504, 1564, 496, 532, 500, 1576, 504, 1560, 500, 540, 500, 1576, 504, 532, 508, 1584, 476, 532, 500, 532, 500, 528, 500, 532, 500 };
    const unsigned int PROGMEM tlgFroid26fast[] = { 3288, 9880, 476, 1600, 504, 536, 500, 532, 504, 528, 500, 1564, 500, 536, 504, 532, 472, 568, 504, 532, 500, 532, 500, 532, 500, 536, 504, 528, 504, 528, 500, 532, 500, 536, 504, 1584, 480, 532, 504, 1596, 476, 1568, 504, 536, 500, 1572, 500, 536, 504, 528, 504, 1584, 476, 1596, 476, 1584, 476, 1604, 476 };
    const unsigned int PROGMEM tlgChaud23auto[] = { 3208, 9848, 532, 1592, 476, 532, 504, 528, 504, 528, 504, 1596, 476, 536, 504, 536, 504, 540, 504, 532, 500, 528, 500, 528, 504, 532, 508, 528, 500, 1584, 476, 540, 508, 528, 500, 1592, 476, 536, 504, 532, 496, 556, 476, 528, 500, 1592, 476, 532, 500, 1584, 476, 536, 504, 532, 496, 532, 500, 1572, 504 };
    const unsigned int PROGMEM tlgOff[] = { 3132, 9824, 524, 1556, 496, 540, 500, 540, 508, 528, 500, 1592, 476, 532, 500, 552, 480, 552, 476, 1572, 504, 1588, 504, 532, 508, 532, 504, 556, 472, 556, 476, 540, 508, 552, 476, 552, 480, 552, 476, 532, 500, 552, 476, 556, 476, 1592, 476, 536, 504, 1584, 504, 556, 476, 552, 476, 556, 476, 1584, 476 };
    struct Matching {
      const char* const request;
      const unsigned int* const order;
    };
     
    const Matching look_up_table[] = {
      {"lgChaud22fast",    tlgChaud22fast},
      {"lgChaud18fast",    tlgChaud18fast},
      {"lgSwingOn",        tlgSwingOn},
      {"lgSwingOff",       tlgSwingOff},
      {"lgFroid25fast",    tlgFroid25fast},
      {"lgFroid25auto",    tlgFroid25auto},
      {"lgFroid26auto",    tlgFroid26auto},
      {"lgFroid26fast",    tlgFroid26fast},
      {"lgChaud23autot",   tlgChaud23auto},
      {"lgOff",            tlgOff}
    };
     
    void setup() {
      vw_setup(2000);
      vw_set_rx_pin(2);
      vw_rx_start(); // On peut maintenant recevoir des messages
    }
     
    void loop() {
      byte message[VW_MAX_MESSAGE_LEN];
      byte taille_message = VW_MAX_MESSAGE_LEN;
      // On attend de recevoir un message
      vw_wait_rx();
     
      if (vw_get_message(message, &taille_message)) {
        for (unsigned int i = 0; i < (sizeof(look_up_table) / sizeof(look_up_table[0])); ++i) {
          const Matching& matching = look_up_table[i];
          if (strcmp(message, matching.request) == 0) {
            unsigned int ordre[59];
            unsigned int trame[59];
            for (int k = 0; k < 59; k++)
            {
              ordre[k] = pgm_read_word_near(matching.order + k);
            }
            irsend.sendRaw(ordre, sizeof(ordre) / sizeof(ordre[0]), khz);
            break;
          }
        }
      }
    }
    Du coup je n'ai pas réutilisé la fonction send_order de Bktero car je n'arrivais toujours pas à passer en argument le tableau progmem... J'avais lu une fois sur un forum qu'il fallait envoyé l'adresse du tableau en argument et pour le réutilisé je ne sais plus... Du coup j'ai intégré la fonction dans la boucle for de matching !

    Merci encore Bktero pour l'optimisation et à Delias pour m'avoir appris qu'il fallait utilisé pgm_read !

    Je vais me replonger dans les cours de C, j'en avais fait pas mal à une époque mais je n'en avait plus fait depuis longtemps et ça m'a remotivé j'ai de nouveau projet en tête

    Bonne soirée merci encore !

    PS: si quelqu'un est intérréssé par mon système je peux fournir plan de la carte émetteur et récepteur RF, le code de l'émetteur ainsi que le code python pour lancer l'ordre

  12. #12
    Membre actif

    Inscrit en
    Octobre 2010
    Messages
    168
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 168
    Points : 241
    Points
    241
    Par défaut Tableau en argument
    Stl une réponse rapide d'un tél portable.

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Void ma_fonction( int tableau[ ] ){
    }
     
    Int T[ 2 ] = {10, 20};
     
    ma_fonction( T );

Discussions similaires

  1. Macro de tableau croisé dynamique ne fonctionne pas avec excel 2007
    Par Sherman750 dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 15/10/2012, 22h42
  2. Réponses: 3
    Dernier message: 05/12/2007, 14h27
  3. Réponses: 6
    Dernier message: 04/09/2007, 00h11
  4. fonction onClick= dans IE6 ok Firefox fonctionne pas
    Par rejy_l'Édimestre dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 06/08/2007, 21h58
  5. histoire de fonction avec problème sur arguments
    Par bébé dans le forum Langage
    Réponses: 5
    Dernier message: 07/01/2006, 11h29

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