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 :

Conversion d'un affichage 7 segments vers LiquidCrystal_I2C


Sujet :

Arduino

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 Conversion d'un affichage 7 segments vers LiquidCrystal_I2C
    Bonjour,

    j'ai récupéré ce code qui renvoi vers un affichage 7 segments.

    Ce que je souhaiterai, c'est l'envoyer sur un écran (16*2).

    J'ai beau "bidouiller", rien n'y fait.

    Pourriez vous m'aider?

    Merci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    #include <Servo.h>
    #include <Arduino.h>
    #include <TM1637Display.h>
    #define DCSBIOS_IRQ_SERIAL
    #include <DcsBios.h>
     
     
    // Module connection pins (pines de conexion para la pantalla 7-segment )
    #define CLK 2
    #define DIO 3
     
    //Variables
    unsigned int band, signal, rawFreq;
    double freq;
     
    #define TEST_DELAY 2000
     
    // Configuramos display con los pines anteriormente definidos
    TM1637Display display(CLK, DIO);
     
     
    // Funcion actualizar frecuencia en pantalla
    void refreshScreen() {
    display.showNumberDec(freq,false);
    }
     
    // Aqui calcula los valores de las frecuencias en cada rango
    void calculateFreq() {
    float b;
     
    const float maxValue = 65535;
    switch (band) {
    case 0: { //190-400 kHz (~210kHz)
    //A = desired freq
    //B = freq based on adfCockpitFrequencyRaw
    //(A>200) A = B - ((B * -0.04408) + 18.31) //Creds Paul Marsh
    b = ((float(rawFreq) / maxValue) * 210) + 190;
    freq = b - ((b * -0.04408) + 18.31);
    break;
    }
    case 1: { //400-850 kHz (~450kHz)
    b = ((float(rawFreq) / maxValue) * 450) + 400;
    if (b < 451) {
    //A = B + ((B * -0.44837) + 177.08)
    //freq = b + ((b * -0.44837) + 181.58);
    freq = b + ((b * -0.44837) + 177.08);
    } else {
    //A = B + ((B * 0.11291) - 100.61)
    //freq = b + ((b * 0.11291) - 96.11);
    freq = b + ((b * 0.11291) - 100.61);
    }
    break;
    }
    case 2: { //850-1800 kHz (~950kHz)
    //A = B - ((B * -0.04532) + 91.54)
    b = ((float(rawFreq) / maxValue) * 950) + 850;
    freq = b - ((b * -0.04532) + 91.54);
    break;
    }
    }
     
    }
     
    //Si cambia la banda de frecuencias,recalcula y actualiza valor pantalla
    void onAdfBandChange(unsigned int newValue) {
    band = newValue;
    calculateFreq();
    refreshScreen();
    }
    DcsBios::IntegerBuffer adfBandBuffer(0x14fc, 0x00c0, 6, onAdfBandChange);
     
    //Si cambia la posicion de la rueda de frecuencias, recalcula y actualiza valor pantalla
    void onAdfFreqChange(unsigned int newValue) {
    rawFreq = newValue;
    calculateFreq();
    refreshScreen();
    }
    DcsBios::IntegerBuffer adfFreqBuffer(0x1426, 0xffff, 0, onAdfFreqChange);
     
     
    /////////////////////////////////////////////////////////////////////////
    //default -3200,+3200 menor valor menos movimiento por reten */
    // ADF TUNE
    DcsBios::RotaryEncoder adfTune("ADF_TUNE", "-1600", "+1600", 5, 4);
     
    //ADF Mode OFF / ADF / ANT / LOOP
    const byte adfModePins[7] = { 6, 7, 8, 9};
    DcsBios::SwitchMultiPos adfMode("ADF_MODE", adfModePins, 7);
     
    //Signal Level con Servo en pin 10 (PWM pin)
    DcsBios::ServoOutput adfSignal(0x1428,10, 1800, 840);
    //DcsBios::ServoOutput adfSignal(0x1428,12, 1920, 544); // tope derecha servo apagado ok
     
    //Switch3pos para3 bandas ADF
    DcsBios::Switch3Pos adfBand("ADF_BAND", 11, 12);
     
    // ADF LOOP Left / Right
    DcsBios::RotaryEncoder adfLoopLr("ADF_LOOP_LR", "DEC", "INC", 14, 15);
     
    // BFO Switch
    DcsBios::Switch2Pos adfBfoSw("ADF_BFO_SW",16);
     
    //ADF Gain , volumen
    DcsBios::PotentiometerEWMA<5, 128, 5> adfGain("ADF_GAIN", A3);
     
     
    ///////////////////////////////////////////////////////////////////////
    // SETUP
     
    void setup() {
    // Clear the display:
    display.clear();
    delay(1000);
     
    DcsBios::setup();
     
    freq = 0;
    signal = 0;
     
    }
     
    /////////////////////////////////////////
    // LOOP
     
    void loop() {
    DcsBios::loop();
    // Set the brightness to 5 (0=dimmest 7=brightest)
    // Si no configuras brillo no funciona?
    display.setBrightness(1);
     
     
    }

  2. #2
    Expert confirmé

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

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 921
    Par défaut
    quel est votre écran LCD 16x2? avez vous un backpack I2C?

    je vois l'usage de DcsBios.h - il faudrait savoir si les callbacks (ici la fonction refreshScreen()) est appelée dans le contexte d'une interruption. Cela pourrait compromettre le bon fonctionnement de l'I2C par exemple si les interruptions étaient suspendues

  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
    bonjour;

    c'est un LiquidCrystal_I2C.

    Pour le moment, le code de mon panel auquel je voudrais rajouter la fonction de l'ADF est le suivant. Il fonctionne (sauf pour l'ADF)

    Merci pour votre aide

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    /*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
     
    //module FM uniquement les 2 premiers rotacteurs
    DcsBios::RotaryEncoder vhffmFreq1("VHFFM_FREQ1", "DEC", "INC", 11, 12);
    DcsBios::RotaryEncoder vhffmFreq2("VHFFM_FREQ2", "DEC", "INC", 9, 10);
    DcsBios::Switch2Pos intRcvr1Sw("INT_RCVR1_SW", 13);//bouton volume FM à insérer PIN_13
    DcsBios::RotaryEncoder vhffmMode("VHFFM_MODE", "DEC", "INC", 14, 15);
     
    //module ARMEMENT
    DcsBios::Switch3Pos rocketSel("ROCKET_SEL", 16, 17);
    DcsBios::Switch3Pos gunSel("GUN_SEL", 18, 19);
    DcsBios::Switch3Pos masterArmSw("MASTER_ARM_SW", 42, 43);
    DcsBios::Switch2Pos jtsnBtn("JTSN_BTN", 22);
    DcsBios::RotaryEncoder rocketPair("ROCKET_PAIR", "DEC", "INC", 23, 24);
    DcsBios::LED armedInd(0x1416, 0x0010, 25);
     
    //module contre-mesure
    //DcsBios::Switch2Pos cmArmSw("CM_ARM_SW", 26);
    DcsBios::LED cmArmSw(0x151e, 0x0010, 53);
    DcsBios::Switch2Pos cmFlareBtn("CM_FLARE_BTN", 28);
    ////bouton DISP CONT à insérer PIN_29
     
    //module LIGHT
    DcsBios::Switch3Pos ldgLtCtrl("LDG_LT_CTRL", 30, 31); //commande phare d'atterrissage
    DcsBios::Switch2Pos ldgLightSw("LDG_LIGHT_SW", 32);
    DcsBios::Switch3Pos searchLightSw("SEARCH_LIGHT_SW", 34, 35); // phare de recherche
    DcsBios::Switch3Pos navLtsSw("NAV_LTS_SW", 36, 37);//Feux de navigation
    DcsBios::Switch2Pos anticollLtsSw("ANTICOLL_LTS_SW", 38); //Anticoll
    DcsBios::Switch3Pos domeLightSw("DOME_LIGHT_SW", 40, 41);//Plafonnier
     
    //module MASTER ARM
    DcsBios::LED masterCautionInd(0x1416, 0x0100, 44);
    DcsBios::Switch3Pos clpResetTestSw("CLP_RESET_TEST_SW", 46, 47);//test reset MA
     
    //liquidcrystal_I2C
    LiquidCrystal_I2C lcd(0x27,16,2);
    //frequence ADF
    void onAdfFreqChange(unsigned int newValue) {
        /* your code here */
        //lcd.setCursor(4,1);
        //lcd.print(newValue);
        lcd.setCursor(0,1);
        lcd.print("ADF:");
    }
    DcsBios::IntegerBuffer adfFreqBuffer(0x1426, 0xffff, 0, onAdfFreqChange);
     
    //fréquznce FM
     
    void onVhffmFreq1Change(char* newValue) {
        /* your code here */
         lcd.setCursor(0,0);
        lcd.print("FM :");
        lcd.setCursor(7,0);
        lcd.print("ALT:");
        lcd.setCursor(4,0);
        lcd.print(newValue);
    }
    DcsBios::StringBuffer<1> vhffmFreq1Buffer(0x14ec, onVhffmFreq1Change);
     
    //cap
    void onSbyCompassHdgChange(unsigned int newValue) {
        /* your code here */
        lcd.setCursor(9,1);
        lcd.print("CAP:");
        lcd.setCursor(13,1);
        lcd.print(newValue);
    }
    //DcsBios::IntegerBuffer sbyCompassHdgBuffer(0x153a, 0xffff, 0, onSbyCompassHdgChange);
    void onVhffmFreq2Change(unsigned int newValue) {
        /* your code here */
        lcd.setCursor(5,0);
        lcd.print(newValue);
    }
    DcsBios::IntegerBuffer vhffmFreq2Buffer(0x14e8, 0x0f00, 8, onVhffmFreq2Change);
     
    //altitude
     
    void onAltMslFtChange(unsigned int newValue) {
        /* your code here */
        lcd.setCursor(11,0);
        lcd.print(newValue);
    }
    DcsBios::IntegerBuffer altMslFtBuffer(0x0434, 0xffff, 0, onAltMslFtChange);
    void setup() { 
    lcd.init();
    lcd.backlight();
    lcd.clear();
        DcsBios::setup();
     
    } 
     
    void loop() {
     
      DcsBios::loop();
    }

  4. #4
    Expert confirmé

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

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 921
    Par défaut
    Donc ça fonctionne pour les autres encodeurs rotatifs?

  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
    Dans mon code, les rotateurs fonctionnent. Dans le premier code, je n'ai pas réalisé le montage car je voulais juste récupérer la formule.

    Après, je me suis rendu compte que l'affichage "BRUT" va de 240 à 65535 (chaque clic de rotateur fait augmenter la valeur de 640), pour une plage allant de 190 à 400. la graduation est 190-200-220-240-260...360-380-400
    Il y a 102 positions pour parcourir la plage.


    Du coup, pour connaitre la position x= (fréquence"BRUTE" - 240) / 640

    Pour obtenir la fréquence réelle
    Si 1<x=<11 alors FR= 190+x-1
    Si x>11, il y a 91 positions de 200 à 400.
    Alors FR = 200+ x (200/91)

    Du coup le code serait pour afficher l'ADF:

    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
    void onAdfFreqChange(unsigned int newValue) {
        /* your code here */
     
    if ((newValue-240)/640<12){
    X=((newValue-240)/640);
    } ellse{
    X=(200+ ((newValue-240)/640) (200/91)));
    }
     
        lcd.setCursor(0,1);
        lcd.print("ADF:");
        lcd.setCursor(4,1);
        lcd.print(X);
    }
    DcsBios::IntegerBuffer adfFreqBuffer(0x1426, 0xffff, 0, onAdfFreqChange);

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

Discussions similaires

  1. [HTML] conversion d'un tableau html statique vers excel
    Par More dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 21/08/2008, 17h30
  2. conversion d'un pointeur de données vers un STL vector
    Par velkouby dans le forum SL & STL
    Réponses: 7
    Dernier message: 29/01/2008, 16h22
  3. Conversion d'un programme en C vers Delphi.
    Par jbrg dans le forum Delphi
    Réponses: 1
    Dernier message: 21/03/2007, 12h51
  4. [Joomla!] Modifier l'affichage des liens vers les articles
    Par Nillak dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 5
    Dernier message: 12/02/2007, 13h50
  5. [TP7] Conversion de sources Turbo Pascal 7 vers Delphi 6
    Par M.Tamisier dans le forum Turbo Pascal
    Réponses: 2
    Dernier message: 21/04/2006, 21h08

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