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 :

Problème IF et transfert de valeur entre VOID


Sujet :

Arduino

  1. #1
    Membre confirmé
    Homme Profil pro
    pompier
    Inscrit en
    Janvier 2020
    Messages
    86
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : pompier

    Informations forums :
    Inscription : Janvier 2020
    Messages : 86
    Par défaut Problème IF et transfert de valeur entre VOID
    Bonjour,

    je suis en train de faire une programmation dans le cadre d'un projet d'affichage d'informations pour simulateur de vol.

    J'utilise DCS-BIOS pour récupérer la valeur et ensuite je la traite.

    Histoire que vous compreniez bien, on utilise un ADF pour se guider.
    J'ai trois plages d'ADF: 190-400 , 400-850 et 850-1750

    J'utilise la fonction map() pour modifier la donnée brute et obtenir l'ADF.

    Mon problème c'est que j'arrive à dire quelle bande est utilisée, j'arrive à utiliser map() mais je n'arrive pas à faire interagir les 2.

    c'est à dire que :
    - si je change la bande (valeur 0 ,1 ou 2), je n'arrive pas à actualiser l'affichage de l'ADF
    - si je change la fréquence (valeur ADF), je n'arrive pas à prendre en compte la valeur de la bande

    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
    /*PANEL By HUGO
     * Avec Arduino MEGA 2560
     * je laisse les PIN 20/21 disponibles pour utiliser un liquidcrystal I2C (ultérieurement)
    -module ADF
    -module FM
    -module ARMEMENT
    -module FLARE
    -module LIGHT
    -module MASTER ARM
    */
     
    //Bibliotheques utilisées
    #include <Wire.h>
    #include <LiquidCrystal_I2C.h>
    #define DCSBIOS_IRQ_SERIAL
    #include "DcsBios.h"
     
    /* paste code snippets from the reference documentation here */
     
    //module ADF
    DcsBios::RotaryEncoder adfMode("ADF_MODE", "DEC", "INC", 2, 3);
    DcsBios::RotaryEncoder adfTune ("ADF_TUNE", "-3200", "+3200", 4, 5);
    DcsBios::Switch3Pos adfBand("ADF_BAND", 6, 7);
    DcsBios::Switch2Pos intNavSw("INT_NAV_SW", 8);//bouton volume ADF à insérer PIN_8
     
     
    //liquidcrystal_I2C
    LiquidCrystal_I2C lcd(0x27,16,2);
    //modification de la bande
    void onAdfBandChange(unsigned int newValue) {
      if (newValue=='0'){
        void onAdfFreqChange(unsigned int newValue) {
     
    newValue = map(newValue,0,65477,190, 400);
        lcd.setCursor(0,1);
        lcd.print("ADF:");
        lcd.setCursor(4,1);
        lcd.print("     ");
        lcd.setCursor(4,1);
        lcd.print(newValue);
    }
    DcsBios::IntegerBuffer adfFreqBuffer(0x1426, 0xffff, 0, onAdfFreqChange);
    }
        if (newValue=='1'){
       void onAdfFreqChange(unsigned int newValue) {
     
    newValue = map(newValue,0,65477,400, 850);
        lcd.setCursor(0,1);
        lcd.print("ADF:");
        lcd.setCursor(4,1);
        lcd.print("     ");
        lcd.setCursor(4,1);
        lcd.print(newValue);
    }
    DcsBios::IntegerBuffer adfFreqBuffer(0x1426, 0xffff, 0, onAdfFreqChange);
      }
      if (newValue=='2'){
       void onAdfFreqChange(unsigned int newValue) {
     
    newValue = map(newValue,0,65477,850, 1750);
        lcd.setCursor(0,1);
        lcd.print("ADF:");
        lcd.setCursor(4,1);
        lcd.print("     ");
        lcd.setCursor(4,1);
        lcd.print(newValue);
    }
    DcsBios::IntegerBuffer adfFreqBuffer(0x1426, 0xffff, 0, onAdfFreqChange);
    }
        /* lcd.setCursor(9,1);
        lcd.print("bande");
        lcd.setCursor(13,1);
        lcd.print("   ");
        lcd.setCursor(13,1);
        lcd.print(newValue);*/
    }
    DcsBios::IntegerBuffer adfBandBuffer(0x14fc, 0x00c0, 6, onAdfBandChange);
    //frequence ADF
    void onAdfFreqChange(unsigned int newValue) {
       //SI BANDE = 0
       newValue = map(newValue,0,65477,190, 400);
      //SI BANDE = 1
      //newValue = map(newValue,0,65477,400, 850);
      // SI BANDE = 2
      //newValue = map(newValue,0,65477,850, 1750);
        lcd.setCursor(0,1);
        lcd.print("ADF:");
        lcd.setCursor(4,1);
        lcd.print("     ");
        lcd.setCursor(4,1);
        lcd.print(newValue);
    }
    DcsBios::IntegerBuffer adfFreqBuffer(0x1426, 0xffff, 0, onAdfFreqChange);
     
     
    void setup() { 
    lcd.init();
    lcd.backlight();
    lcd.clear();
        DcsBios::setup();
     
    } 
     
    void loop() {
     
      DcsBios::loop();
    }

  2. #2
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 884
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 884
    Par défaut
    vous ne pouvez pas définir une fonction dans une fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void onAdfBandChange(unsigned int newValue) {
      if (newValue == '0') {
        void onAdfFreqChange(unsigned int newValue) {
    ...
    si j'ai bien compris ...
    vous devez mémoriser la bande en cours dans onAdfBandChange() et définir une seule fonction onAdfFreqChange()() qui utilise la dernière bande reçue pour décider quel map() effectuer

    un truc de ce genre (pas pu tester, j'ai tapé cela ici à partir de votre 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
    /*PANEL By HUGO
       Avec Arduino MEGA 2560
       je laisse les PIN 20/21 disponibles pour utiliser un liquidcrystal I2C (ultérieurement)
      -module ADF
      -module FM
      -module ARMEMENT
      -module FLARE
      -module LIGHT
      -module MASTER ARM
    */
     
    //Bibliotheques utilisées
    #include <Wire.h>
    #include <LiquidCrystal_I2C.h>
    #define DCSBIOS_IRQ_SERIAL
    #include "DcsBios.h"
     
    /* paste code snippets from the reference documentation here */
     
    //module ADF
    DcsBios::RotaryEncoder adfMode("ADF_MODE", "DEC", "INC", 2, 3);
    DcsBios::RotaryEncoder adfTune ("ADF_TUNE", "-3200", "+3200", 4, 5);
    DcsBios::Switch3Pos adfBand("ADF_BAND", 6, 7);
    DcsBios::Switch2Pos intNavSw("INT_NAV_SW", 8);//bouton volume ADF à insérer PIN_8
     
    // LCD  Screen (I2C)
    LiquidCrystal_I2C lcd(0x27, 16, 2);
     
    unsigned int bande = '0'; // devrait être un char si c'est bien cela que vous recevez
     
     
    //modification de la bande
    void onAdfBandChange(unsigned int newValue) {
      if ((newValue >= '0') && (newValue <= '2')) bande = newValue;
    }
     
    void onAdfFreqChange(unsigned int newValue) {
      switch (bande) {
        case '0':
          lcd.setCursor(0, 1);      lcd.print("ADF:");
          lcd.setCursor(4, 1);      lcd.print("     ");
          lcd.setCursor(4, 1);      lcd.print(map(newValue, 0, 65477, 190, 400));
          break;
     
        case '1':
          lcd.setCursor(0, 1);      lcd.print("ADF:");
          lcd.setCursor(4, 1);      lcd.print("     ");
          lcd.setCursor(4, 1);      lcd.print(map(newValue, 0, 65477, 400, 850));
          break;
     
        case '2':
          lcd.setCursor(0, 1);      lcd.print("ADF:");
          lcd.setCursor(4, 1);      lcd.print("     ");
          lcd.setCursor(4, 1);      lcd.print(map(newValue, 0, 65477, 850, 1750));
          break;
     
        default: break;
      }
    }
     
    DcsBios::IntegerBuffer adfBandBuffer(0x14fc, 0x00c0, 6, onAdfBandChange);
    DcsBios::IntegerBuffer adfFreqBuffer(0x1426, 0xffff, 0, onAdfFreqChange);
     
    void setup() {
      lcd.init();
      lcd.backlight();
      lcd.clear();
      DcsBios::setup();
    }
     
    void loop() {
      DcsBios::loop();
    }

  3. #3
    Membre confirmé
    Homme Profil pro
    pompier
    Inscrit en
    Janvier 2020
    Messages
    86
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : pompier

    Informations forums :
    Inscription : Janvier 2020
    Messages : 86
    Par défaut
    Oui il fallait appeler une fonction.

    J'ai testé des choses et ça fonctionne parfaitement maintenant. Je suis trop content d'y être parvenu plutôt seul.

    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
    /*PANEL By HUGO
     * Avec Arduino MEGA 2560
     * je laisse les PIN 20/21 disponibles pour utiliser un liquidcrystal I2C (ultérieurement)
    -module ADF
     
    */
     
    //Bibliotheques utilisées
    #include <Wire.h>
    #include <LiquidCrystal_I2C.h>
    #define DCSBIOS_IRQ_SERIAL
    #include "DcsBios.h"
    //Variables
    unsigned int band, signal, rawFreq, freq;
     
    /* paste code snippets from the reference documentation here */
     
    //module ADF
    DcsBios::RotaryEncoder adfMode("ADF_MODE", "DEC", "INC", 2, 3);
    DcsBios::RotaryEncoder adfTune ("ADF_TUNE", "-3200", "+3200", 4, 5);
    DcsBios::Switch3Pos adfBand("ADF_BAND", 6, 7);
    DcsBios::Switch2Pos intNavSw("INT_NAV_SW", 8);//bouton volume ADF à insérer PIN_8
     
     
    //liquidcrystal_I2C
    LiquidCrystal_I2C lcd(0x27,16,2);
    //modification de la bande
    void onAdfBandChange(unsigned int newValue) {
      band = newValue;
      calculateFreq();
    }
    DcsBios::IntegerBuffer adfBandBuffer(0x14fc, 0x00c0, 6, onAdfBandChange);
    //frequence ADF
    void onAdfFreqChange(unsigned int newValue) {
      rawFreq= newValue;
      calculateFreq();
    }
    DcsBios::IntegerBuffer adfFreqBuffer(0x1426, 0xffff, 0, onAdfFreqChange);
     
    //Calcul de la fréquence
    void calculateFreq() {
      switch(band){
        case 0:{ //190-450
          if (rawFreq < 5759){
            freq = map(rawFreq,0,5759,190, 200);
          }
          if (rawFreq >5758){
            freq = map(rawFreq,5759,65477,200, 400);
          }
          lcd.setCursor(0,1);
        lcd.print("ADF:");
        lcd.setCursor(4,1);
        lcd.print("     ");
        lcd.setCursor(4,1);
        lcd.print(freq);
          break;}
          case 1:{ //400-850
            if (rawFreq < 5759){
            freq = map(rawFreq,0,5759,400, 420);
          }
          if (5760<rawFreq < 12799){
            freq = map(rawFreq,5760,12799,420, 450);
          }if (rawFreq > 12800){
            freq = map(rawFreq,12800,65477,450, 850);
          }
     
          lcd.setCursor(0,1);
        lcd.print("ADF:");
        lcd.setCursor(4,1);
        lcd.print("     ");
        lcd.setCursor(4,1);
        lcd.print(freq);
          break;}
          case 2:{ //850-1800
            if (rawFreq < 5759){
              freq = map(rawFreq,0,5759,850, 900);
            }
            if (rawFreq> 5758){
          freq = map(rawFreq,5759,65477,900, 1800);
            }
          lcd.setCursor(0,1);
        lcd.print("ADF:");
        lcd.setCursor(4,1);
        lcd.print("     ");
        lcd.setCursor(4,1);
        lcd.print(freq);
          break;}
        }
     
    }
     
    void setup() { 
    lcd.init();
    lcd.backlight();
    lcd.clear();
        DcsBios::setup();
     
    } 
     
    void loop() {
     
      DcsBios::loop();
    }
    Je ne sais pas s'il y a moyen de faire quelque chose de plus propre concernant l'affichage?
    En tout cas ça fonctionne et c'est bien là l'essentiel.

  4. #4
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 884
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 884
    Par défaut
    bravo !

    il y a une erreur, on ne teste pas l'appartenance à un intervalle de cette façon
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
          if (5760<rawFreq < 12799){
    il faut deux tests liés par un ET logique (&& ou and)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
          if ((5760<rawFreq) && (rawFreq < 12799)) {
    cependant vous pouvez améliorer un peu la présentation et les tests en utilisant un if - else

    Un truc comme cela sera plus lisible (j'ai passé les variables globales en long parce que suivant l'arduino un unsigned int ne va pas au de la de 65535 et j'affiche qu'une seul fois ADF sur le LCD puisque vous le récriviez en permanence, ce n'est pas la peine et vous pouvez factoriser l'affichage plutôt que de le répéter dans chaque case)

    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
    /*PANEL By HUGO
       Avec Arduino MEGA 2560
       je laisse les PIN 20/21 disponibles pour utiliser un liquidcrystal I2C (ultérieurement)
      -module ADF
     
    */
     
    //Bibliotheques utilisées
    #include <Wire.h>
    #include <LiquidCrystal_I2C.h>
    #define DCSBIOS_IRQ_SERIAL
    #include "DcsBios.h"
     
    //Variables
    long band, rawFreq, freq;
     
    //module ADF
    DcsBios::RotaryEncoder adfMode("ADF_MODE", "DEC", "INC", 2, 3);
    DcsBios::RotaryEncoder adfTune ("ADF_TUNE", "-3200", "+3200", 4, 5);
    DcsBios::Switch3Pos adfBand("ADF_BAND", 6, 7);
    DcsBios::Switch2Pos intNavSw("INT_NAV_SW", 8);//bouton volume ADF à insérer PIN_8
    DcsBios::IntegerBuffer adfBandBuffer(0x14fc, 0x00c0, 6, onAdfBandChange);
    DcsBios::IntegerBuffer adfFreqBuffer(0x1426, 0xffff, 0, onAdfFreqChange);
     
    //liquidcrystal_I2C
    LiquidCrystal_I2C lcd(0x27, 16, 2);
     
    //Calcul et affichage de la fréquence
    void calculateFreq() {
      switch (band) {
        case 0: //190-450
          if (rawFreq < 5759)   freq = map(rawFreq, 0, 5759, 190, 200);
          else                  freq = map(rawFreq, 5759, 65477, 200, 400);
          break;
     
        case 1: //400-850
          if (rawFreq < 5759)   freq = map(rawFreq, 0, 5759, 400, 420);
          if (rawFreq < 12799)  freq = map(rawFreq, 5760, 12799, 420, 450);
          else                  freq = map(rawFreq, 12800, 65477, 450, 850);
          break;
     
        case 2: //850-1800
          if (rawFreq < 5759) freq = map(rawFreq, 0, 5759, 850, 900);
          else freq = map(rawFreq, 5759, 65477, 900, 1800);
          break;
      }
      lcd.setCursor(4, 1);        lcd.print("     ");
      lcd.setCursor(4, 1);        lcd.print(freq);
    }
     
    //modification de la bande
    void onAdfBandChange(unsigned int newValue) {
      band = newValue;
      calculateFreq();
    }
     
    //modific frequence ADF
    void onAdfFreqChange(unsigned int newValue) {
      rawFreq = newValue;
      calculateFreq();
    }
     
    void setup() {
      DcsBios::setup();
      lcd.init();
      lcd.backlight();
      lcd.clear();
      lcd.setCursor(0, 1);        lcd.print("ADF:");
    }
     
    void loop() {
      DcsBios::loop();
    }

  5. #5
    Membre confirmé
    Homme Profil pro
    pompier
    Inscrit en
    Janvier 2020
    Messages
    86
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : pompier

    Informations forums :
    Inscription : Janvier 2020
    Messages : 86
    Par défaut
    Merci @Jay M , c'est vrai que c'est plus lisible.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Transfert de valeurs entre deux fenêtres
    Par DynamX dans le forum Débuter
    Réponses: 3
    Dernier message: 13/03/2018, 10h41
  2. [AC-2007] Transfert de valeur entre formulaires
    Par Alain92110 dans le forum Access
    Réponses: 25
    Dernier message: 05/08/2017, 16h40
  3. Transfert de valeur entre formulaires
    Par Sodangbe dans le forum IHM
    Réponses: 2
    Dernier message: 15/12/2006, 17h59
  4. Transfert de Valeurs entre 2 fichiers PHP ?
    Par caviar dans le forum Langage
    Réponses: 4
    Dernier message: 27/04/2006, 12h10
  5. transfert de valeurs entre fonctions js et asp
    Par ericmart dans le forum ASP
    Réponses: 5
    Dernier message: 10/03/2005, 16h18

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