Jauge LED en fonction de la Température - mbed
Répondre à la discussion
Affichage des résultats 1 à 28 sur 28

Jauge LED en fonction de la Température - mbed



  1. #1
    astronas

    Exclamation Jauge LED en fonction de la Température - mbed


    ------

    Bonjour à tous,

    Dans le cadre d'un projet perso, je dois créer une jauge de température avec un ruban led et une carte pour du mbed.

    C'est assez urgent.

    Je ne sais pas du tout par quoi commencer, avez-vous des idées ?

    Je reste disponible pour toutes vos questions

    -----

  2. #2
    JPL
    Responsable des forums

    Re : Jauge LED en fonction de la Température - mbed

    C’est de l’informatique ou de l’élctronique ? Et dans quel cadres fais-tu cela ?
    Rien ne sert de penser, il faut réfléchir avant - Pierre Dac

  3. #3
    Ikhar84
    Animateur Informatique

    Re : Jauge LED en fonction de la Température - mbed

    Je rajouterais que l'urgence ne nous concerne pas, ce sera même contre-productif d'en insister le caractère, et que c'est nous qui attendons tes questions... et pas l'inverse...

    En attendant, tu as regardé du côté de Mbed Studio et de sa documentation ?

    Connaîs-tu le C++ ?
    Dernière modification par Ikhar84 ; 24/05/2020 à 22h27.
    J'ai glissé Chef !

  4. #4
    astronas

    Re : Jauge LED en fonction de la Température - mbed

    Ce sont les deux mélangés à vrai dire.

    C'est dans un cadre personnel, je me suis lancé là dedans, pour créer moi-même ma jauge LED.

    Côté hardware je dispose :
    - d'une carte NXP FRDM-KL25Z
    - un afficheur i2c
    - un ruban led ws2812b
    - un adxl345
    - une sonde de température
    - un afficheur LCD (optionnel il me semble)

    Il faudrait donc que je réalise un schéma correct électroniquement parlant (j'en ai trouvé un exemple sur le site os.mbed).

    Puis il faut que je code ma carte pour que mon ruban led s'allume, crée un jeu de couleurs en fonction de la température, et affiche la température.

    Je ne connais pas vraiment le C++, mbed est tout nouveau pour moi et je ne sais décidément pas trop par quoi commencer.

  5. A voir en vidéo sur Futura
  6. #5
    umfred

    Re : Jauge LED en fonction de la Température - mbed

    1ère chose: définir clairement et explicitement ce que tu veux réaliser comme fonctionnalités

  7. #6
    astronas

    Re : Jauge LED en fonction de la Température - mbed

    Avec ma bande LED, je souhaite que les leds s'allument et virent du bleu au rouge pour des températures allant du froid au chaud, captée via ma sonde de température, et que mon afficheur i2c affiche cette même température en temps réel

  8. #7
    umfred

    Re : Jauge LED en fonction de la Température - mbed

    c'est quoi comme sonde de température ?
    tu peux essayer de commencer à t'amuser avec le ruban led avec un peu de doc > http://wikitge.cmaisonneuve.profweb....r_LED_WS2812B) et des librairies comme celle-ci https://os.mbed.com/users/DavidEGray...ololuLedStrip/ (il y en a d'autres je crois)

  9. #8
    astronas

    Re : Jauge LED en fonction de la Température - mbed

    Je ne connais pas la référence exacte de ma sonde.

    Merci pour les ressources, cependant je vais avoir besoin d'un peu plus d'aide concernant mon projet parce que je suis vraiment débutant.

    Ma sonde ressemble beaucoup à celle-ci :

    https://atisys-domotique.fr/capteurs...062079006.html

    Je vais avoir besoin de ma carte nxp, de ma sonde de température, de ma bande LED et de mon afficheur i2c.

    Je pense qu'on va diviser le projet en 2.

    Dans un premier temps : - comment gérer l'adressage correct des LEDs en fonction de la température. Ce qu'il faut c'est que toute les LEDs soient allumées en même temps et changent toutes de couleur quand la température varie (du bleu au rouge pour représenter le passage du frois au chaud)

    Dans un deuxième temps : - gérer l'afficheur i2c, qui va afficher la température en temps réel que communique la sonde de température. Je veux que l'afficheur indique la température actuelle, en justifiant la couleur des LEDs.

    Par quoi commencer ?

  10. #9
    umfred

    Re : Jauge LED en fonction de la Température - mbed

    si on ne sait pas le type de sonde (pt100, pt1000, K, .....), ça peut être compliqué. il faudrait mesurer la résistance entre ces 2 fils à 2 températures (0°C (dans la glace) et température ambiante 20/25°C).
    Moi je dirais dans un 1er temps: savoir manipuler les leds
    dans un second temps, savoir afficher quelque chose sur l'écran
    ensuite, lire la température
    enfin, combiner le tout

  11. #10
    Ikhar84
    Animateur Informatique

    Re : Jauge LED en fonction de la Température - mbed

    Idem, je commencerais à me faire les dents sur les LEDs...
    J'ai glissé Chef !

  12. #11
    astronas

    Re : Jauge LED en fonction de la Température - mbed

    Ok bien reçu, je vais me renseigner pour la sonde, je vous tiendrai au courant dès que je sais.

    Focus sur les LEDs.

    Comment bien gérer mon branchement, sachant que je ne veux pas avoir chaque LED indépendante mais bien la bande LED unique ?

    Connaissez-vous la NXP FRDM-KL25Z ?

  13. #12
    umfred

    Re : Jauge LED en fonction de la Température - mbed

    Pour les leds, il y a (par exemple) plein d'infos sur https://www.pololu.com/product/2546 (c'est pour une bande de 30 leds w

  14. #13
    JPL
    Responsable des forums

    Re : Jauge LED en fonction de la Température - mbed

    Cette sonde doit avoir une marque et un modèle, donc une fiche technique.
    Rien ne sert de penser, il faut réfléchir avant - Pierre Dac

  15. #14
    astronas

    Re : Jauge LED en fonction de la Température - mbed

    Bonjour je reviens vers vous.

    Je mets à jour les caractéristiques de mon matériel.

    J'ai donc :

    - une carte NXP FRDM-KL25Z - Infos
    - une sonde de température DS18B20 - Infos
    - un ruban LED WS2812B - Infos
    - un afficheur i2c type SSD1306 OLED (128 x 64 pixels) - Infos

    Je souhaite :

    Dans un 1er temps : Coder correctement mon ruban LED pour que toutes les LEDs s'allument d'une seule couleur à la fois.

    Dans un 2ème temps : Coder correctement ma sonde de température pour qu'elle me renvoie une température en degré Celsius.

    Dans un 3ème temps : Coder correctement mon écran i2c pour qu'il affiche ce qu'on lui demande.

    Concentrons nous sur le premier point. J'ai trafiqué le code disponible ICI de sorte qu'il affiche en continu la même couleur. Sauf que, ce n'est pas ce que je veux faire, il me faut un code bien plus simple pour contrôler mon ruban, inutile de trafiquer un code qui de base fait défiler différentes couleurs RGB pour lui faire défiler que du orange par exemple. Quelqu'un pourrait-il me fournir une base très simple compatible WS2812B ?

    J'apporte plus de précisions à mon projet.

    La sonde de température capte une valeur, qui, communiquée à la carte, permet de renvoyer un code correspondant pour le ruban (en l'occurence changer de couleur si la T° dépasse certains seuils prédéfinis dans le code) et pour l'écran i2c (afichage de cette T° en temps réel, actualisé toutes les minutes).

    Je n'y connais vraiment pas grand chose en Mbed, et malgré toutes mes recherches, mon travail n'a pas été fructueux.

    J'attend donc beaucoup de vous.

  16. #15
    umfred

    Re : Jauge LED en fonction de la Température - mbed

    comment as-tu "trafiqué" ce code ? met nous le code.
    le code n'est pas si complexe, mais dans tous les cas, tu as à remplir et à envoyer un buffer de la taille du nombre de leds *3 (3 couleurs/led)

  17. #16
    astronas

    Re : Jauge LED en fonction de la Température - mbed

    J'ai trafiqué le code d'origine en remplaçant par cela (dans le fichier main.cpp) :

    Code:
    #include "mbed.h"
    #include "WS2812.h"
    #include "PixelArray.h"
    
    #define WS2812_BUF 150
    #define NUM_COLORS 1
    #define NUM_LEDS_PER_COLOR 10
    
    PixelArray px(WS2812_BUF);
    
    // See the program page for information on the timing numbers
    // The given numbers are for the K64F
    WS2812 ws(D9, WS2812_BUF, 0, 5, 5, 0);
    
    int main()
    {
    
        ws.useII(WS2812::PER_PIXEL); // use per-pixel intensity scaling 
    J'ai retiré cette ligne pour enlever le jeu d'intensité
    // set up the colours we want to draw with int colorbuf[NUM_COLORS] = {0x2f0000}; // for each of the colours (j) write out 10 of them // the pixels are written at the colour*10, plus the colour position // all modulus 60 so it wraps around for (int i = 0; i < WS2812_BUF; i++) { px.Set(i, colorbuf[(i / NUM_LEDS_PER_COLOR) % NUM_COLORS]); } // now all the colours are computed, add a fade effect using intensity scaling // compute and write the II value for each pixel for (int j=0; j<WS2812_BUF; j++) { // px.SetI(pixel position, II value) px.SetI(j%WS2812_BUF, 0xf+(0xf*(j%NUM_LEDS_PER_COLOR))); } // Now the buffer is written, rotate it // by writing it out with an increasing offset while (1) { for (int z=WS2812_BUF; z >= 0 ; z--) { ws.write_offsets(px.getBuf(),z,z,z); wait(0.075); } } }
    Le résultat : Mon ruban ne fait plus défiler de couleurs, il s'allume en rouge foncé pour toutes les leds.

  18. #17
    umfred

    Re : Jauge LED en fonction de la Température - mbed

    en regardant la doc de la librairie et ses fichiers cpp et h (https://os.mbed.com/users/bridadan/c...f587/WS2812.h/), on voit que l'on peut simplifier si l'on ne veut pas contrôler la luminosité et ça deviendrait ça:
    Code:
    #include "mbed.h"
    #include "WS2812.h"
    #include "PixelArray.h"
     
    #define WS2812_BUF 150
    #define NUM_COLORS 6
    #define NUM_LEDS_PER_COLOR 150
     
    PixelArray px(WS2812_BUF);
     
    // See the program page for information on the timing numbers
    // The given numbers are for the K64F
    WS2812 ws(D9, WS2812_BUF, 0, 5, 5, 0);
     
    int main()
    {
     
        ws.useII(WS2812::OFF); // Brightness control = OFF 
        
        // set up the colours we want to draw with
        int colorbuf[NUM_COLORS] = {0x2f0000,0x2f2f00,0x002f00,0x002f2f,0x00002f,0x2f002f};
     
        // for each of the colours (j) write out 10 of them
        // the pixels are written at the colour*10, plus the colour position
        // all modulus 60 so it wraps around
        for (int i = 0; i < WS2812_BUF; i++) {
            px.Set(i, colorbuf[(i / NUM_LEDS_PER_COLOR) % NUM_COLORS]);
           // on pourrait simplifier en mettant à la place de la ligne ci-dessus:
           //px.Set(i,colorbuf[0]); // on met la 1ere couleur du tableau
        }
     
        // cette boucle n'est plus utile, je la mets complètement en commentaire (à défaut de l'effacer)
        // now all the colours are computed, add a fade effect using intensity scaling
        // compute and write the II value for each pixel
        //for (int j=0; j<WS2812_BUF; j++) {
            // px.SetI(pixel position, II value)
        //    px.SetI(j%WS2812_BUF, 0xf+(0xf*(j%NUM_LEDS_PER_COLOR)));
        //}
     
     
        // Now the buffer is written, rotate it
        // by writing it out with an increasing offset
        while (1) {
            //for (int z=WS2812_BUF; z >= 0 ; z--) {
            //    ws.write_offsets(px.getBuf(),z,z,z);
            //   wait(0.075);
            //}
        // la boucle for au dessus n'est peut-être pas nécessaire, je crois qu'il suffit d'écrire
         ws.write(px.getBuff());
         wait(1);
        }
     
    }

  19. #18
    astronas

    Re : Jauge LED en fonction de la Température - mbed

    Merci beaucoup pour cette aide ultra précieuse.

    Maintenant, je crois que le code est encore simplifiable.

    Le corps du code a été conçu dans le but d'avoir un "défilement de couleur" sur le ruban.

    Comment en simplifiant encore tout ça je peux obtenir un allumage très simplifié de toutes les LEDs du ruban en une unique couleur (0xFFFFFF par ex) ?

  20. #19
    umfred

    Re : Jauge LED en fonction de la Température - mbed

    Pas plus simplifiable que ce que j'ai posté, c'est déjà assez court comme code (il y a "beaucoup" de commentaires).
    Il te faut la boucle pour charger le buffer avec px.Set() et la dernière boucle while, c'est pour que le processeur continu de tourner et rafraîchisse le buffer du ruban (on peut peut-être mettre la ligne ws.write() avant le while)

  21. #20
    astronas

    Lightbulb Re : Jauge LED en fonction de la Température - mbed

    Bonjour, je reviens encore une fois, j'ai très bien avancé.

    J'ai réussi à afficher la température correctement en temps réel sur l'i2c.

    Cependant il persiste un ultime problème.

    Je n'arrive pas à implémenter le code du ruban au code suivant (il est inclus ci-dessous) :

    Code:
    #include "mbed.h"
    #include "DS1820.h"
    #include "WS2812.h"
    #include "Adafruit_SSD1306.h"
    #include "PixelArray.h"
    
    #define WS2812_BUF 150
    #define NUM_COLORS 4
    #define NUM_LEDS_PER_COLOR 150
    
    PixelArray px(WS2812_BUF);
    
    // Les numéros donnés sont pour le bus K64F (n° correspondants pour WS2812B)
    WS2812 ws(D9, WS2812_BUF, 0, 5, 5, 0);
    
    Serial      pc(USBTX, USBRX); //port série sur lequel seront renvoyées les valeurs de T°
    DS1820      ds1820(D8);  //pin où est connecté DS18B20
    float       temp = 0; //variable flottante pour T° initialisée à 0
    int         result = 0; //variable entière pour le cas de connexion initialisée à 0
    int         a = 0;
    
    class I2CPreInit : public I2C //classe obligatoire à créer pour initier la connexion i2c à l'IDE
    {
    public:
        I2CPreInit(PinName sda, PinName scl) : I2C(sda, scl)
        {
            frequency(400000);
            start();
        };
    };
    I2CPreInit gI2C(PTC2,PTC1); //définition des ports SCL et SDA pour la carte 
    Adafruit_SSD1306_I2c gOled2(gI2C,PTA20,0x78,64,128); // Configure la bibliothèque graphique et démarre.
     
    
    int main(){ //boucle principale     
          
    ws.useII(WS2812::OFF); // Contrôle de la luminosité = OFF
    
    int colorbuf[NUM_COLORS] = {0x0000ff;0xffff00;0xff7f00;0xff0000}; <- ici le compiler m'affiche " Error: Expected a "}" "int colorbuf[NUM_COLORS] = {0x0000ff;0xffff00;0xff7f00;0xff0000};"
    
    
    for (int i = 0; i < WS2812_BUF; i++) {
                    px.Set(i,colorbuf[0]); // on met la 1ere couleur du tableau;
                    }         
                
        if (ds1820.begin()) {
         
            while (1) { //boucle infinie
                gOled2.display();
                ds1820.startConversion();   // démarre la conversion de température de l'analogique au numérique
                wait(1.0);                  // attendre 10s avant la prochaine acquisition de T° (durée min de 1.0s de temporisation pour le calcul de conversion)
                result = ds1820.read(temp); // lire la température du DS18B20 et effectuer un contrôle de redondance cyclique (CRC)
                switch (result) {
                    case 0:                 // aucune erreur -> 'temp' contient la valeur de la température mesurée
                        gOled2.printf("temp = %3.1f%cC\r", temp, 176);
                        gOled2.display();
                        ws.write(px.getBuf()); //on envoie le buffer sur le ruban
                        wait(1); //on attend 1.0s
                        break;
    
                    case 1:                 // aucun capteur présent -> 'temp' n'a pas été mis à jour
                        gOled2.printf("Aucune sonde detectee\n\r");
                        gOled2.display();
                        break;
    
                    case 2:                 // Erreur CRC -> 'temp' n'a pas été mis à jour
                        gOled2.printf("Erreur CRC\r\n");
                        gOled2.display();
            }
            
        }
    }
    }
    A savoir que le compiler ne me renvoie pas d'erreurs si je ne mets qu'une seule couleur dans int colorbuf, autrement dit lorsque je remplace la ligne par int colorbuf[NUM_COLORS] = {0x0000ff};, le code fonctionne parfaitement.

    Maintenant que le code est fonctionnel pour l'acquisition de T° et l'affichage i2c, il faut que la carte différencie 4 cas de températures :
    1. si temp < 10 alors le ruban doit s'allumer en bleu
    2. si temp > 10 alors le ruban doit s'allumer en jaune
    3. si temp > 17 alors le ruban doit s'allumer en orange
    4. si temp > 25 alors le ruban doit s'allumer en rouge

    Comment coder cela proprement à partir du code de base de WS2812B ?
    Dernière modification par astronas ; 10/06/2020 à 12h15.

  22. #21
    umfred

    Re : Jauge LED en fonction de la Température - mbed

    met des virgules et pas des points virgules pour séparer les valeurs des couleurs (comme c'était dans l'original)

    Pour le reste, il faut lancer la boucle de remplissage du buffer (avec px.Set()) avec la bonne couleur dans chacun des cas
    ça peut être par une fonction à laquelle tu passes ou la couleur, ou l'indice de la couleur
    Dernière modification par umfred ; 10/06/2020 à 12h25.

  23. #22
    astronas

    Re : Jauge LED en fonction de la Température - mbed

    Merci ! Premier soucis réglé !

    Comment je peux coder les 4 cas différents maintenant ?

  24. #23
    umfred

    Re : Jauge LED en fonction de la Température - mbed

    j'ai édite ma réponse entre temps ^^

  25. #24
    astronas

    Re : Jauge LED en fonction de la Température - mbed

    Pas de soucis, je pense comprendre ce qu'il faut faire, cependant mes connaissances sont limitées.

    A quoi ressemblerait une telle fonction ?

  26. #25
    umfred

    Re : Jauge LED en fonction de la Température - mbed

    un truc du genre:
    Code:
    void SetColor(int color){
        for (int i = 0; i < WS2812_BUF; i++) { // boucle de remplissage du buffer
             px.Set(i,color);
        }
         ws.write(px.getBuff()); // envoi du buffer au ruban
    }
    et pour l'appeler
    Code:
    SetColor(colorbuff[0]);  //on envoie la 1ère couleur du tableau
    dans ton case 0: à la place de la ligne ws.write()
    Code:
    if(temp<10){
         SetColor(colorbuf[0]);
    }
    elseif(temp<17){
        SetColor(colorbuf[1]);
    }
    elseif(temp<25){
        SetColor(colorbuf[2]);
    }
    else{
        SetColor(colorbuf[3]);
    }
    il y a peut-être d'autres façons de l'écrire, mais c'est la plus lisible il me semble.

  27. #26
    astronas

    Re : Jauge LED en fonction de la Température - mbed

    Le code est fonctionnel, le ruban LED réagit correctement en fonction de la T°, cependant le ruban ne reste pas allumé, il clignote pendant 100ms environ de la couleur correspondantes à intervalle de 1s, le bleu prend le dessus.

    C'est à dire: le ruban est bleu au départ et clignote de la couleur correspondante mais conserve l'affichage bleu en permanence.

    Comment remédier à cela ?

  28. #27
    astronas

    Re : Jauge LED en fonction de la Température - mbed

    J'ai rien dit, tout fonctionne parfaitement.

    Merci pour tout !

    Bonne continuation à vous.

  29. #28
    umfred

    Re : Jauge LED en fonction de la Température - mbed

    ton ruban est alimenté comment ? je soupçonne qu'il consomme trop par rapport à l'alimentation qui lui y est relié. il lui faut une alimentation capable de fournir 4.1A (150 leds en couleur blanche, luminosité maximale) https://www.pololu.com/product/2548/specs

Discussions similaires

  1. microcontroleur MBED NXP LPC1768
    Par iboulb dans le forum Électronique
    Réponses: 1
    Dernier message: 19/01/2024, 13h36
  2. [Programmation] MBED et liaison CAN
    Par iuhaprojet dans le forum Électronique
    Réponses: 0
    Dernier message: 17/12/2018, 10h57
  3. invariance de jauge et fonction d'onde
    Par doul11 dans le forum Physique
    Réponses: 43
    Dernier message: 02/02/2012, 16h50
  4. jauge essence + sonde temperature voiture led
    Par g2g dans le forum Électronique
    Réponses: 19
    Dernier message: 29/07/2011, 21h59
  5. Réponses: 0
    Dernier message: 27/05/2011, 15h46