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 :

Aide pour I2C Arduino


Sujet :

Arduino

  1. #21
    Membre habitué

    Homme Profil pro
    employé administratif
    Inscrit en
    Juillet 2016
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Belgique

    Informations professionnelles :
    Activité : employé administratif
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juillet 2016
    Messages : 40
    Points : 141
    Points
    141
    Par défaut
    Merci Delias,

    Je comprends déjà un peu mieux les références, ça avance petit à petit...
    le division / est pour l'entier comme Vincent l'a expliqué donc 15/10 = 1 (dizaine)
    le modulo % est le reste de la division 15/10 = 5 (10/10 + 5)
    le | compare les binaires et lorsqu'une des "colonne" contient un 1, le résultat sera = 1
    Exemple :
    Value = 62 (pour -62dB)
    tens = 62/10 = 6
    ones = 62/10 = 2

    Wire.write = (0xD0 | tens);
    Wire.write = (0xE0 | ones);

    0xD0 = 11010000 0xE0 = 11100000
    Tens = 11010110 Ones = 11100010
    -------------------------------------------------
    0xD6 = 11010110 0xE2 = 11100010

    Si c'est correct, c'est que j'ai enfin compris !!!

    Maintenant pour le code sans utiliser le switch bien entendu, Value plutôt que de mettre 0, 1, 2,... jusque 39, il vaut mieux 79, 76, 74, 72,... jusque 0

    Ouf, ça rends les choses plus claires dans ma p'tite tête !

    Reste à déclarer et appeler les valeurs sans le switch, et ça je ne sais pas encore le faire car c'est encore une partie que je ne comprends pas...

    au démarrage (void setup()), Value = 42 (équivalent à -42dB)
    Comment dois-je dire au système que si je pousse sur Volume + Value = 40 ou sur Volume - Value = 44 (dans le void loop()) ?

    En tout cas, super tes explications, c'est encore un grand pas pour moi !!!

    Bonne soirée,

    Aegnor

  2. #22
    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
    Citation Envoyé par Aegnor1975 Voir le message
    0xD0 = 11010000 0xE0 = 11100000
    Tens = 11010110 Ones = 11100010
    -------------------------------------------------
    0xD6 = 11010110 0xE2 = 11100010

    Si c'est correct, c'est que j'ai enfin compris !!!
    Tu as peut-être compris, mais tu as fait une erreur. 6 et 2, cela s'écrit comment en binaire?

    Citation Envoyé par Aegnor1975 Voir le message
    au démarrage (void setup()), Value = 42 (équivalent à -42dB)
    Comment dois-je dire au système que si je pousse sur Volume + Value = 40 ou sur Volume - Value = 44 (dans le void loop()) ?
    Et la fois d'après, tu feras quoi?
    C'est quelle opération mathématique que tu opères sur la variable Value?

    Je te donne la réponse en question, histoire que tu y arrives par toi même.

    Delias

  3. #23
    Modérateur

    Avatar de Vincent PETIT
    Homme Profil pro
    Consultant en Systèmes Embarqués
    Inscrit en
    Avril 2002
    Messages
    3 187
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant en Systèmes Embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 187
    Points : 11 568
    Points
    11 568
    Par défaut
    Attention
    Citation Envoyé par Aegnor1975 Voir le message
    Value = 62 (pour -62dB)
    tens = 62/10 = 6
    ones = 62/10 = 2
    ones = 62%10 = 2
    En complément de ce qu'a écrit Delias et concernant ton interrogation sur l'algorithme a créer, je me demande si ta question n'est pas plus profonde que ça.

    J'ai l'impression que tu n'as pas de problème avec l'algorithme en question mais plutôt sur les fondements du C ? Créer une fonction, l'appeler, passages des arguments dans la fonction, portée des variables ? Je me trompe ?

    Ce qui me fait dire ça c'est que tu avais trouvé la solution avec un long switch case (pas vraiment optimisé), tu as décortiquer l'algo avec la division entière et le moduo sans trop de problème et je vois que tu 'étais bloqué là :
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void loop(){
     
      // OOOOOOOPSSSSSS encore une fois perdu ici...
     
    }



    J'ai l'impression que ce que tu ne comprenais pas dans cette fonction ci dessous, ce n'était pas tant ce qu'il y a dedans mais plutôt comment on l'appelle et comment on s'en sert dans le loop() ?
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    void set_volume(uint8_t value) {
      uint8_t tens = value / 10;
      uint8_t ones = value % 10;
      Wire.beginTransmission(PT2258);
      Wire.write(0x80 | tens);   // voie 1
      Wire.write(0x90 | ones);   // voie 1
      Wire.endTransmission();
    }
    La science ne nous apprend rien : c'est l'expérience qui nous apprend quelque chose.
    Richard Feynman

  4. #24
    Membre habitué

    Homme Profil pro
    employé administratif
    Inscrit en
    Juillet 2016
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Belgique

    Informations professionnelles :
    Activité : employé administratif
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juillet 2016
    Messages : 40
    Points : 141
    Points
    141
    Par défaut
    Bonjour à tous,

    Pour Delias,
    Oui, je vois où j'ai fait l'erreur pour le binaire :
    6 = 00000110, et le 2 = 00000010
    La conversion doit se faire sur le décimal, et pas sur le HEX
    Ici, le résultat est le même, mais ça pourrait ne pas toujours être le cas ! merci beaucoup

    Pour Vincent,
    C'est exactement cela !
    Ce qui est chouette, c'est que grâce à vous tous je comprends le fonctionnement de l'I²C, je comprends la fonction des tens et des ones qui permet de faire un comparatif sur l'atténuation à appliquer entre l'atténuation 0 et l'atténuation voulue (ça aussi le l'ai compris on na parle pas d'augmentation de volume car on est pas dans l'amplification !)

    Sur quelques jours ce sont des pas de géant que j'ai réalisé grâce à vous !

    Concernant l'appel de la fonction Volume + et Volume -, l'opération arithmétique a réaliser est quelque chose comme : Value -- pour diminuer l'atténuation, et Value ++ pour augmenter l'atténuation
    Donc, logiquement dans le void setup() après avoir écrit sur le PT2258 que la valeur initiale est de -42, je dois dire à la variable Value = 42, c'est bien ça ?

    Mais... comme les pas sont de 2 (sauf le dernier pour passer à 76 à 79 qui est de 3) je pars toujours de ma valeur 42, je fais Value --, la variable sera égale à 41 et pas 40, non ?

    Merci à tous encore !

    Aegnor

  5. #25
    Expert éminent sénior
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 647
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 647
    Points : 11 136
    Points
    11 136
    Par défaut
    Simplement pour dire que cela fait plaisir de voir quelqu'un comme Aegnor1975 aussi enthousiaste et qui cherche à comprendre ce qu'il fait.


    Fin de la parenthèse

  6. #26
    Modérateur

    Avatar de Vincent PETIT
    Homme Profil pro
    Consultant en Systèmes Embarqués
    Inscrit en
    Avril 2002
    Messages
    3 187
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant en Systèmes Embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 187
    Points : 11 568
    Points
    11 568
    Par défaut
    Ça change de trucs du genre :
    Je veux contrôler un ventilateur en fonction de la température avec un Arduino.... Et il me faut ça très vite

    Malheureusement, pour certain message, j'exagère à peine !

    Je réponds ce soir.
    La science ne nous apprend rien : c'est l'expérience qui nous apprend quelque chose.
    Richard Feynman

  7. #27
    Membre habitué

    Homme Profil pro
    employé administratif
    Inscrit en
    Juillet 2016
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Belgique

    Informations professionnelles :
    Activité : employé administratif
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juillet 2016
    Messages : 40
    Points : 141
    Points
    141
    Par défaut
    Merci Auteur et Vincent

    En attendant, je vais bien relire tous les messages et vérifier les références sur Arduino.cc
    Puis commencer une traduction :p

    Aegnor

  8. #28
    Membre habitué

    Homme Profil pro
    employé administratif
    Inscrit en
    Juillet 2016
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Belgique

    Informations professionnelles :
    Activité : employé administratif
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juillet 2016
    Messages : 40
    Points : 141
    Points
    141
    Par défaut
    Bien le bonjour,

    toujours dans la même idée pour le PT2258, que pensez-vous de ce code ci ?

    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 "Wire.h"
    #define PT2258 0x44
    #define PT2323 0X4A
     
    uint8_t Value;
     
    void setup() {
      Wire.begin();
     
      // pt2258
      Wire.beginTransmission(PT2258);
      Wire.write(0xC0); // Vider le cache
      Wire.endTransmission();
      Wire.beginTransmission(PT2258); // programmer volume de depart
      Wire.write(0xd4); // -40dB
      Wire.write(0x2e); // -2dB
      Wire.endTransmission(); // = -42 dB volume de départ
      Value = 42;
     
     
    }
     
    void loop(){
     
     // PT2258
     
     if(Serial2.available()){
        if(message == "0x76 0x2b 0x2e"){ // Volume +
          Value = Value-2;
          set_volume(Value);
     
        }
        if(message == "0x76 0x2d 0x2e"){ // Volume -
          Value = Value+2;
          set_volume(Value);
        }      
      }
     
      if(Serial3.available()){
        if(inByte == 'B'){ // Volume+
          Value = Value-2;
          set_volume(Value);
        }
        if(inByte == 'C'){ // Volume -
          Value = Value+2;
          set_volume(Value);
        }      
      }
      if(Value <= 0){ // pour reprendre les conseils de Delias et éviter de planter le PT2258...
        Value = 0;
        set_volume(Value);
        Serial.println("VOLUME MAX !!!");
      }
      if(Value >= 79){
        Value = 79;
        set_volume(Value);
        Serial.println("VOLUME MIN !!!");
      }
    }
     
    void set_volume(uint8_t Value) {
      uint8_t tens = Value / 10;
      uint8_t ones = Value % 10;
      Wire.beginTransmission(PT2258);
      Wire.write(0xd0 | tens);
      Wire.write(0xe1 | ones);
      Wire.endTransmission();
    }
    J'espère avoir encore avancé un peu

    Aegnor

  9. #29
    Membre habitué

    Homme Profil pro
    employé administratif
    Inscrit en
    Juillet 2016
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Belgique

    Informations professionnelles :
    Activité : employé administratif
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juillet 2016
    Messages : 40
    Points : 141
    Points
    141
    Par défaut
    Citation Envoyé par Vincent PETIT Voir le message
    Ça change de trucs du genre :


    Malheureusement, pour certain message, j'exagère à peine !
    J'ai lu quelques demandes sur le forum, et je comprends tout à fait... tu exagère à peine !!! même pas du tout !!!
    Il y en a quelques unes qui m'ont fait pouffé de rire...

  10. #30
    Modérateur

    Avatar de Vincent PETIT
    Homme Profil pro
    Consultant en Systèmes Embarqués
    Inscrit en
    Avril 2002
    Messages
    3 187
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant en Systèmes Embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 187
    Points : 11 568
    Points
    11 568
    Par défaut
    Salut,
    Est ce que tu peux rappeler ce que doit faire ce programme ? Ou en faire un synoptique ? Je vois des Serial il y a une interaction avec le PC ?
    C'est pour être bien sur qu'on se comprenne. Bien souvent c'est très clair dans la tête de celui qui écrit le programme car il connaît le contexte et il suit son plan mais pour celui qui ne fait que le lire c'est pas si simple.

    Quelques remarques :

    Code C : 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 setup() {
      Wire.begin();
     
      // pt2258
      Wire.beginTransmission(PT2258);
      Wire.write(0xC0); // Vider le cache
      Wire.endTransmission();
      Wire.beginTransmission(PT2258); // programmer volume de depart
      Wire.write(0xd4); // -40dB
      Wire.write(0x2e); // -2dB
      Wire.endTransmission(); // = -42 dB volume de départ
      Value = 42;
     
    }
    Je n'ai pas trouvé cette la commande 0xC0 dans la datasheet du PT2258, tu l'as vu a quelle page ?

    Une idée a explorer : Tu as vu sur la page 10 que tu peux mettre les 6 voies en MUTE en envoyant la commande 0xF9 puis les sortir de MUTE avec la commande 0xF8. Peut être que lors de l'initialisation, il est possible de mettre toutes les voies en MUTE, ensuite régler le volume puis sortir les voies de MUTE. Ça pourrait éviter un ressenti désagréable du genre j'allume le système, ça hurle et quelques ms après le volume passe à -42 dB.

    L'idée que j'ai, mais la doc n'en parle pas et je trouve que c'est inacceptable, c'est que dès la mise sous tension du système, le PT2258 est forcément dans un certain état mais le quel ? Est ce que par défaut le volume est à 0 dB ? Est ce que les sorties sont en MUTE ? Est ce que le composant est simplement désactivé ? Si un jour tu lis la datasheet d'un microcontrôleur, tu verras qu'il donne l'état des registres au démarrage (avant que ton programme ne démarre) par exemple, toutes les broches sont en entrées, l'oscillateur démarre de telle façon, etc...




    Code C : 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 loop(){
     
     // PT2258
     
     if(Serial2.available()){
        if(message == "0x76 0x2b 0x2e"){ // Volume +
          Value = Value-2;
          set_volume(Value);
     
        }
        if(message == "0x76 0x2d 0x2e"){ // Volume -
          Value = Value+2;
          set_volume(Value);
        }      
      }

    Je ne sais pas ce que c'est sensé faire mais je vois que tu regardes si des données sont présentes dans l'UART n°2 du micro (d'ailleurs tu utilises quel Arduino ?) mais je ne vois pas à quel moment tu lis les données dans l'UART pour les mettre dans la variable message afin de la comparer avec une chaîne de caractère ?

    C'est normal que la chaîne de caractères "0x76 0x2b 0x2e" soit la même dans les 2 tests if ?

    Attention, ce n'est pas si simple une comparaison de chaîne de caractères.

    J'attends tes réponses avant de regarder plus loin
    Notamment ce que le programme est sensé faire.

    A+
    La science ne nous apprend rien : c'est l'expérience qui nous apprend quelque chose.
    Richard Feynman

  11. #31
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 600
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 600
    Points : 56 698
    Points
    56 698
    Billets dans le blog
    40
    Par défaut
    Salut à tous ,

    Citation Envoyé par Vincent PETIT Voir le message
    Je n'ai pas trouvé cette la commande 0xC0 dans la datasheet du PT2258, tu l'as vu a quelle page ?
    C'est en haut de la page 9 :
    Nom : clearRegister0Ch.JPG
Affichages : 333
Taille : 38,1 Ko

  12. #32
    Membre habitué

    Homme Profil pro
    employé administratif
    Inscrit en
    Juillet 2016
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Belgique

    Informations professionnelles :
    Activité : employé administratif
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juillet 2016
    Messages : 40
    Points : 141
    Points
    141
    Par défaut
    Bonjour Vincent,
    Et grand merci pour ta réponse

    Je vais reprendre chacun de tes points dans l'ordre :
    Serial2 = Ecran Nextion
    Serial3 = Module HC-05
    Normalement le Nextion comporte un message d'origie de type : "0x65 0x01 0x01 0x01 0xff 0xff 0xff"
    Comme je n'utilise la librarie que pour le texte, j'ai fais mon propre protocole d'envoi qui lorsque le message finis par 0x2e (.) c'est la fin du message
    ça m'a fait gagner quelques octets en SRAM, l'event pour lire le message est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    String message;
     
    void serialEvent() {
      while (Serial2.available()) {
        char inChar = (char)Serial2.read();
        message += inChar;
        if (message.endsWith(".")){   //Looking for end char 0x2e   
          Serial.println(message);
          message = "";
        }
      }
    }
    Pour le HC-05, j'ai fait beaucoup plus simple :
    J'envoie un caractère entre 0 et 9, ou de a à z, ou de A à Z ça me donne 62 fonctions ce qui est suffisant ici


    Par contre, j'ai recopier la même erreur dans le setup... pour -42dB c'est 0xd4, et 0xe2 et pas 0x2e...

    Pour le 0xc0, il s'agit d'un clear register au début de la page 9 de la doc qui comme tu l'as souligné est vraiment tordue !!!

    Nom : Capture.PNG
Affichages : 344
Taille : 17,6 Ko

    Pour les canaux en mute au démarrage, je prends !!! ça évitera les "patch" dans les hauts-parleurs, et en effet la mauvaise surprise d'avoir le volume à fond...
    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
     
    void setup() {
      Wire.begin();
     
      // pt2258
      Wire.beginTransmission(PT2258);
      Wire.write(0xC0); // Vider le cache
      Wire.write(0xf9); // mute
      Wire.endTransmission();
      Wire.beginTransmission(PT2258); // programmer volume de depart
      Wire.write(0xd4); // -40dB
      Wire.write(0xe2); // -2dB
      Wire.write(0xf8); // unmute
      Wire.endTransmission(); // = -42 dB volume de départ
      Value = 42;
     
    }
    Pour cette partie :

    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
     
    void loop(){
     
     // PT2258
     
     if(Serial2.available()){
        if(message == "0x76 0x2b 0x2e"){ // Volume +
          Value = Value-2;
          set_volume(Value);
     
        }
        if(message == "0x76 0x2d 0x2e"){ // Volume -
          Value = Value+2;
          set_volume(Value);
        }      
      }
    Il s'agit simplement du code envoyé par le Nextion, je t'attache les images de l'éditeur, et du simulateur :

    Nom : Capture1.PNG
Affichages : 372
Taille : 80,7 Ko
    Nom : Capture2.PNG
Affichages : 322
Taille : 61,3 Ko

    J'avais mis le code complet dans les premiers messages, mais comme F-Leb le disait, près de 2000 lignes, ça fait long à lire surtout pour les quelques lignes de l'I²C

    Par contre, les 2 chaînes de caractères ne sont pas identiques, il y a
    "0x76 0x2b 0x2e" (v+.)
    et
    "0x76 0x2d 0x2e" (v-.)

    Je vais te répondre dans un autre commentaire pour expliquer le montage complet et ce que fait le programme, ça permettra de mieux comprendre

    Aegnor

  13. #33
    Membre habitué

    Homme Profil pro
    employé administratif
    Inscrit en
    Juillet 2016
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Belgique

    Informations professionnelles :
    Activité : employé administratif
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juillet 2016
    Messages : 40
    Points : 141
    Points
    141
    Par défaut
    Montage complet :

    Platine MEGA2560
    Alim 12v 30A
    Alim 5v 10A
    BK8002 Module audio Bluetooth sur Serial1 (sera changé par la suite car il ne permet pas l'affichage des données (titre, artiste, album,...)
    Lecteur micro SD branché en SPI sur le BK8002
    Port USB branché sur l'entrée USB du BK 8002
    Module HC-05 pour les commandes depuis la tablette Android sur Serial3
    RTC DS3231 sur i²c
    Radio module TEA5767 sur i²c
    SN74HC125 pour mettre les réceptions des modules BK8002 et HC-05 en 3.3v
    AMS1117 pour abaisser la tension d'alimentation du BK8002 en 3.3v
    PT2323 i²c sélecteur d'entrées audio (BK8002, TEA5767, Baladeur MP3 externe, Aux, décodeur 5.1)
    PT2258 i²c réglage de volume numérique (avec la magnifique doc très explicite )
    TDA7294 (10 pièces) Amplificateur (2 par canaux)
    24 relais 10A 240v ( pour 6 HDD externes, les différentes pompes des aquariums, Leds,...)
    Selecteur HDMI 5 en 1 avec led IR pour le contrôler depuis l'Arduino
    Convertisseur HDMI vers SPDIF
    Décodeur 5.1 (sélecteur 2 SPDIF en entrée, sortie en 6 canaux vers le PT2323) pas encore reçu, mais sera hacké pour une sélection SPDIF automatique suivant si la TV est en réception, ou les HDMI
    TV Box Andoid (avec mini clavier bluetooth)
    Et bien entendu l'écran Nextion 3.5" sur Serial2
    Un maker ne serait pas un vrai maker sans un minimum de récup, et donc le tout sera dans un ancien boitier PC modifié

    En gros... voilà... je crois que c'est déjà pas mal...

    Au début, j'utilisais la librairie Nextion pour les boutons, texte, ... mais j'étais loin d'avoir fini le code qu'il mangeait 96% de la SRAM, donc j'ai modifié tout le code et je n'utilise la librairie Nextion que pour le texte... le résultat est que le code est presque fini, et il n'utilise plus que 39% de la SRAM...

    Pour le code... il se sépare en 3 parties...

    1) Audio/Vidéo
    Différentes pages(13) pour commander tous les périphériques
    2) Mini Domotique
    Commande les Leds, et les ventilos pour le PC et la partie Audio/Vidéo par des capteur DS18B20, et affiche la t° du mini PC (Beelink BT7) mis dans un boitier maison, et la t° du boitier de l'ampli
    Commande les 6 disques durs (on/off)
    Affiche les données du genre Date/heure, t° et humidité de la pièce,...
    3) Gestion Aquariums :
    3a) 1er bac qui est le principal :
    Allumage et extinction des pompes (2) pompe à air, chauffage, et éclairage
    Affichage de la température, et réglage t° mini et maxi
    Eclairage, dimmer automatique suivant l'heure, ou manuel

    3b) 2ème bac qui est le bac hôpital, et la crèche des bébés Guppy
    Idem, mais pour l'instant une seule pompe, pas de pompe à air, et pas d'éclairage

    Voilà... dans un premier temps, c'est déjà pas mal je crois

    Une fois tout fini, je posterai un beau tuto, si ça peut en inspirer d'autres, rien ne me fera plus plaisir !

    Pour ceux qui le désirent, je peux envoyer par mail le fichier HMI de l'éditeur Nextion


    Aegnor

  14. #34
    Modérateur

    Avatar de Vincent PETIT
    Homme Profil pro
    Consultant en Systèmes Embarqués
    Inscrit en
    Avril 2002
    Messages
    3 187
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant en Systèmes Embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 187
    Points : 11 568
    Points
    11 568
    Par défaut
    Citation Envoyé par f-leb Voir le message
    C'est en haut de la page 9 :
    Merci Fabien !

    Citation Envoyé par Aegnor1975 Voir le message
    Par contre, les 2 chaînes de caractères ne sont pas identiques, il y a
    "0x76 0x2b 0x2e" (v+.)
    et
    "0x76 0x2d 0x2e" (v-.)
    J'avais lu trop vite désolé
    Ok pour l'explication du projet ! Balaise le truc

    Du coup :
    Citation Envoyé par Aegnor1975 Voir le message
    que pensez-vous de ce code ci ?
    Code C : 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 "Wire.h"
    #define PT2258 0x44
    #define PT2323 0X4A
     
    uint8_t Value;
     
    void setup() {
      Wire.begin();
     
      // pt2258
      Wire.beginTransmission(PT2258);
      Wire.write(0xC0); // Vider le cache
      Wire.endTransmission();
      Wire.beginTransmission(PT2258); // programmer volume de depart
      Wire.write(0xd4); // -40dB
      Wire.write(0x2e); // -2dB
      Wire.endTransmission(); // = -42 dB volume de départ
      Value = 42;
     
     
    }
     
    void loop(){
     
     // PT2258
     
     if(Serial2.available()){
        if(message == "0x76 0x2b 0x2e"){ // Volume +
          Value = Value-2;
          set_volume(Value);
     
        }
        if(message == "0x76 0x2d 0x2e"){ // Volume -
          Value = Value+2;
          set_volume(Value);
        }      
      }
     
      if(Serial3.available()){
        if(inByte == 'B'){ // Volume+
          Value = Value-2;
          set_volume(Value);
        }
        if(inByte == 'C'){ // Volume -
          Value = Value+2;
          set_volume(Value);
        }      
      }
      if(Value <= 0){ // pour reprendre les conseils de Delias et éviter de planter le PT2258...
        Value = 0;
        set_volume(Value);
        Serial.println("VOLUME MAX !!!");
      }
      if(Value >= 79){
        Value = 79;
        set_volume(Value);
        Serial.println("VOLUME MIN !!!");
      }
    }
     
    void set_volume(uint8_t Value) {
      uint8_t tens = Value / 10;
      uint8_t ones = Value % 10;
      Wire.beginTransmission(PT2258);
      Wire.write(0xd0 | tens);
      Wire.write(0xe1 | ones);
      Wire.endTransmission();
    }
    Dans le contexte de ton projet, je n'ai rien à dire
    La science ne nous apprend rien : c'est l'expérience qui nous apprend quelque chose.
    Richard Feynman

  15. #35
    Membre habitué

    Homme Profil pro
    employé administratif
    Inscrit en
    Juillet 2016
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Belgique

    Informations professionnelles :
    Activité : employé administratif
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juillet 2016
    Messages : 40
    Points : 141
    Points
    141
    Par défaut
    Attention aux voisins :

    EUREKAAAAAAAAAAA !!!!!!!

    Plus qu'à transférer, et faire les premiers test avec des p'tits "Serial.println()"

    Un tout grand merci à tous pour votre patience, votre soutient, et votre aide !!!!!

    Je reviens avec le tuto dès que tout marche à la perfection


    Aegnor

  16. #36
    Expert éminent sénior
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 647
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 647
    Points : 11 136
    Points
    11 136
    Par défaut
    Citation Envoyé par Aegnor1975 Voir le message
    Je reviens avec le tuto dès que tout marche à la perfection
    ça serait parfait

  17. #37
    Membre habitué

    Homme Profil pro
    employé administratif
    Inscrit en
    Juillet 2016
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Belgique

    Informations professionnelles :
    Activité : employé administratif
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juillet 2016
    Messages : 40
    Points : 141
    Points
    141
    Par défaut
    Bien le bonjour,

    Eh oui... je reviens encore pour l'I²C... après quelques trouble résolus avec l'écran Nextion, je me rends compte que le volume ne s'affiche pas dans le serial monitor...
    Pour rappel,
    Voici 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
     
    #include <Wire.h>
     
    #define PT2323 0x4a
    #define PT2258 0X44
    uint8_t Value;
     
    void setup() {
      // Start Services
      Serial.begin(9600);
      Serial1.begin(9600);
      myNextion.begin(9600);
      Serial3.begin(57600);
      Wire.begin();
      // pt2258
      Wire.beginTransmission(PT2258);
      Wire.write(0xC0); // Vider le cache
      Wire.write(0xf9); // mute
      Wire.endTransmission();
      Wire.beginTransmission(PT2258); // programmer volume de depart
      Wire.write(0xd4); // -40dB
      Wire.write(0xe2); // -2dB
      Wire.write(0xf8); // unmute
      Wire.endTransmission(); // = -42 dB volume de départ
      Value = 42;
      set_volume(Value);
    }
     
    void loop(){
     
          if(message == "*v+."){
            Value = Value-2;
            set_volume(Value);
            Serial.println(Value);
          }
          if(message == "*v-."){
            Value = Value+2;
            set_volume(Value);
            Serial.println(Value);
          }      
    }
     
    void set_volume(uint8_t Value) {
      uint8_t tens = Value / 10;
      uint8_t ones = Value % 10;
      Wire.beginTransmission(PT2258);
      Wire.write(0xd0 | tens);
      Wire.write(0xe0 | ones);
      Wire.endTransmission();
    }
    J'ai essayé à peu près toutes les manières pour le uint8_t Value
    de l'enlever du set_volume()
    de le mettre dans le setup()
    ...
    ...

    j'ai bien le code de la touche *v+. qui s'affiche dans le moniteur série, mais pas le "Value" du volume...

    Quelle erreur ai-je encooooooore commise ?
    Des idées ?

    Grand merci d'avance,

    Aegnor

  18. #38
    Membre habitué

    Homme Profil pro
    employé administratif
    Inscrit en
    Juillet 2016
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Belgique

    Informations professionnelles :
    Activité : employé administratif
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juillet 2016
    Messages : 40
    Points : 141
    Points
    141
    Par défaut
    Après avoir revérifié tout... tous les périphériques i²c fonctionnent
    J'ai eu un problème avec un des capteurs DS18B20, je l'ai changé.
    Tout compile comme il faut, mais je n'ai toujours pas l'affichage de "Value"... suis un peu perdu pour le coup...

Discussions similaires

  1. De l'aide pour programmation Arduino
    Par Arthurie dans le forum Arduino
    Réponses: 3
    Dernier message: 01/07/2014, 13h51
  2. [TP]besoin d'aide pour commandes inconnues
    Par Upal dans le forum Turbo Pascal
    Réponses: 15
    Dernier message: 03/10/2002, 10h48
  3. Besoin d'aide pour l'I.A. d'un puissance 4
    Par Anonymous dans le forum C
    Réponses: 2
    Dernier message: 25/04/2002, 17h05
  4. Une petite aide pour les API ?
    Par Yop dans le forum Windows
    Réponses: 2
    Dernier message: 04/04/2002, 21h45

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